[SCM] advene/master: New upstream version 3.4

oaubert-guest at users.alioth.debian.org oaubert-guest at users.alioth.debian.org
Thu Oct 12 20:45:53 UTC 2017


The following commit has been merged in the master branch:
commit 38d501c400122cf3994cfff8b8baf1677bd99019
Author: Olivier Aubert <contact at olivieraubert.net>
Date:   Thu Oct 12 22:39:39 2017 +0200

    New upstream version 3.4

diff --git a/CHANGES.txt b/CHANGES.txt
index c59c513..033d9fd 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,24 +1,138 @@
+advene (3.4) unstable; urgency=medium
+
+  * A huge memory leak affecting 3.3 (due to python3 migration) has been
+    fixed.
+
+  * Imagecache refactoring - it now uses actual framerate information from
+    the video file to determine the best screenshot for a given timestamp.
+
+  * Import/export filter options are preserved between invocations.
+
+  * Timeline: selection can be extended to all annotations (of the same
+    type or all annotations) in the same time range as the selected
+    annotations.
+
+  * Various bugfixes
+
+ -- Olivier Aubert <contact at olivieraubert.net>  Thu, 12 Oct 2017 12:06:44 +0200
+
+advene (3.3) unstable; urgency=medium
+
+  * Port to Python3! Expect some new interesting bugs...
+
+  * Internal
+
+  - Python3 port. This implies str/bytes and integer division issues.
+
+  - Python3 Cherrypy (for template interpretation) uses python3 HTML
+    parser which is now more strict (esp. TAL instructions are not
+    interpreted in <style> and <script> elements, since they are
+    data). This means that some view templates may need to be reworked.
+
+  - The standard logging API is used throughout all the code, and
+    everything is displayed in the log messages windows as well as saved
+    to a file.
+
+  * Shot validation view: improve shortcuts handling and use Down/Up for
+    previous/next shot navigation.
+
+  * Allow to customize generic player controls shortcut modifier (Control
+    by default) through Edit/Preferences/GUI. It allows to choose a
+    shortcut that does not conflict with other uses, depending on the
+    OS/environment.
+
+  * Integrate concept detection code (courtesy of Christian Hentschel
+    <christian.hentschel at hpi.uni-potsdam.de>). The server code is
+    available as a Docker image.
+
+  * Allow to split a package using a reference annotation type. For every
+    reference annotation, a new package will be created with the
+    annotations that are in the same time range as the reference
+    annotation.
+
+  * Allow to search for text in annotations from all loaded packages (not
+    just the active one) by setting the corresponding option of the Search
+    button (top-right corner in the interface).
+
+  * Audio segmentation extractor: add a minimum silence duration parameter.
+
+ -- Olivier Aubert <contact at olivieraubert.net>  Wed, 02 Aug 2017 12:42:21 +0200
+
+advene (3.1) unstable; urgency=medium
+
+  * Bug fixes.
+
+  * Timeline : improve zoom level setting
+
+  * OWL importer: adapt to new definition structure
+
+ -- Olivier Aubert <contact at olivieraubert.net>  Sun, 18 Jun 2017 23:21:19 +0200
+
+advene (3.0) unstable; urgency=medium
+
+  * Upgrade libs to Gtk3 / Gstreamer 1.0
+
+  * Preferences are now stored in json format, the old preferences file
+    advene.prefs is converted and can be removed.
+
+  * Many bug fixes, probably some bug introduction
+
+  * Completion:
+
+    - Content completion is available when editing through table view or
+      timeline quick edit mode.
+
+    - New global option completion: if there are predefined terms for the
+      annotation type, then use only these terms. Else fallback on dynamic
+      completion.
+
+    - Annotation type predefined terms used only space as separator (and
+      thus could not contain spaces). If a comma is present in the terms
+      field, then it will be considered as separator, allowing to define
+      terms containing spaces.
+
+  * Table view:
+    - new shortcuts Control-< and Control-> to modify begin/end time
+    - export to CSV action
+
+  * WebAnnotation export filter
+
+  * OWL Schema importer
+
+ -- Olivier Aubert <contact at olivieraubert.net>  Thu, 01 Jun 2017 11:17:02 +0200
+
+advene (1.2) unstable; urgency=medium
+
+  * Source-only release. Various bug fixes. The official source repository
+    is now http://github.com/oaubert/advene/
+
+    This should be the last release of the 1.* series (based on gtk2 and
+    gstreamer 0.10). Development is now done on the new version
+    (based on gtk3/gstreamer1).
+
+ -- Olivier Aubert <contact at olivieraubert.net>  Mon, 22 May 2017 16:08:41 +0200
+
 advene (1.1) unstable; urgency=medium
 
   * Source-only release. Various bug fixes. The official source repository
     is now http://github.com/oaubert/advene/
 
   * Compressed (gzipped) text files can be directly imported.
-  
+
   * Option to specify time unit (s or ms) in text import.
-  
+
   * SVG editor
-  
+
     * can edit paths (polylines)
-    
+
     * slider to change background image
-  
+
     * slider to change opacity value
 
   * Export filters
-  
+
     * TurTLe export filter
-  
+
     * Metadataplayer export filter
 
  -- Olivier Aubert <contact at olivieraubert.net>  Wed, 09 Jul 2014 17:13:48 +0200
@@ -30,7 +144,7 @@ advene (1.0) unstable; urgency=low
     enters a maintenance state, while development focuses on the next
     major version (new data model, interface revamp to handle simultaneous
     analysis of multiple video files...).
-  
+
   * See the following 0.47 notes for more details about changes from
     previous release.
 
diff --git a/INSTALL.txt b/INSTALL.txt
index 72ee6ac..b9b14fe 100644
--- a/INSTALL.txt
+++ b/INSTALL.txt
@@ -5,79 +5,77 @@ How to install the Advene prototype
 ** Video player
 
 The video player is implemented on all platforms with the gstreamer
-framework, through the python-gstreamer module (>= 0.10).
+framework, through the python-gstreamer module (>= 1.0).
 
 ** Linux version
 
 You will need the following python packages (the package names are from
 Debian, they may slightly vary on other distributions) :
 
-python >= 2.7
-python-gtk2 (>=2.24)
-python-cherrypy3 (>=3.0.0) [for convenience, a copy of cherrypy may be included in
-this Advene distribution]
-python-simpletal (>=3.12) [for convenience, a copy of simpletal may be
-included in this Advene distribution] 
-
-For the gstreamer plugin:
-python-gst0.10
-gstreamer0.10-plugins-base
-gstreamer0.10-x
-+ other gstreamer packages needed to decode various formats
-(esp. gstreamer0.10-plugins-good and gstreamer0.10-plugins-ugly).
-
-Optionaly:
-python-opencv (for some feature-extraction filters)
-
-Note that all these dependencies are already available in Debian and
-in standard installations of the Ubuntu Feisty Fawn (and later)
-distribution.
+python >= 3.4
+python3-gi
+gir1.2-gstreamer-1.0
+python3-gi-cairo
+gir1.2-gtk-3.0 (>=3.4)
+gir1.2-webkit-3.0
+gir1.2-goocanvas-2.0
+gir1.2-rsvg-2.0
+python3-cherrypy3
+python3-requests
+python3-simpletal (>=3.12) [for convenience, a copy of simpletal may be
+included in this Advene distribution]
+
+For gstreamer, it is useful to also install the gstreamer packages
+needed to decode various formats (esp. gstreamer1.0-plugins-bad and
+gstreamer1.0-plugins-ugly).
+
+Note that all these dependencies - except python3-simpletal - are
+already available in Debian and in standard installations of Ubuntu.
+
+When running on virtual machines (parallels, virtualbox...) : you must
+select the X11 video output in Edit/Preferences/Video Player.
 
 ** Windows version
 
 If you want to run Advene from sources on win32, you should install in this order (note the version numbers) :
 
-Python  >=  v. 2.7 : http://python.org/
+- Python3 v. 3.4 (it could be a later version, but check that the PyGobject bindings support it): http://python.org/
 
-Gstreamer SDK from http://gstreamer.com/ (choosing complete install to
-get python bindings). It will install both Gstreamer and gtk (with
-python bindings).
+- win32process from http://pywin32.sf.net/
 
-win32process from http://pywin32.sf.net/
+- Python bindings for gtk/gstreamer and underlying libs from
+https://wiki.gnome.org/Projects/PyGObject/OldIndex enabling support
+for:
+  - gdk-pixbuf
+  - git2-glib
+  - goocanvas
+  - gstreamer and all gst-* packages
+  - gtk
+  - gtksourceview
+  - pango
+  - webkitgtk
 
-Optionally, 
-python-opencv
-CherryPy: http://download.cherrypy.org/cherrypy/ [for
-convenience, a copy of cherrypy is included in this Advene
-distribution]
+- Cherrypy and requests: use pip (in the Scripts/ directory of the python directory)
 
-SimpleTAL (>=3.12) :
+  pip install cherrypy requests
+
+- SimpleTAL (>=5.2) from
 http://www.owlfish.com/software/simpleTAL/download.html [for
 convenience, a copy of simpletal is included in this Advene
 distribution]
 
-
 ** Mac OS X version
 
-From macports (http://www.macports.org/), install :
-
-    * python26 or later [Note: after its install, make sure that
-      /opt/local/bin/python exists, and that your path begins with
-      /opt/local/bin. Else, the installation of the other packages
-      could use the /usr/bin/python version]
-    * py26-gtk (>= 2.12)
-    * py26-goocanvas
-    * librsvg (optional)
-    * py26-pyobjc2 (optional)
-    * py26-gst-python
-    * gst-plugins-base
-    * gst-plugins-good gst-plugins-bad gst-plugins-ugly
-    * gst-ffmpeg
+The new Advene code has not yet been tested in Mac OS X environement,
+for lack of dedicated hardware. You can consider a donation :-) or try
+yourself to install dependencies (python-gi, gtk, gstreamer) using the
+linux install information.
 
 * Testing
 
 You can run the script ./bin/advene directly from the source
-directory. It will adapt its paths to this location.
+directory. It will detect that it is running from sources and adapt
+its paths to this location.
 
 In a first step, you can try the Advene application without movie player
 support by using the "-pdummy" parameter :
@@ -88,10 +86,6 @@ To force the use of the gstreamer player, specify:
 
   advene -pgstreamer
 
-To force the use of the vlc player, specify:
-
-  advene -pvlctypes
-
 * Installing
 
 To install the application, you can run the setup.py script with
@@ -104,8 +98,25 @@ can be used directly from its sources directory.
 
 * Documentation
 
-An (incomplete) user guide is in the public Advene wiki, feel free to contribute:
-http://liris.cnrs.fr/advene/wiki/index.php/Main_Page
+A user guide is in the public Advene wiki, feel free to contribute:
+http://advene.org/wiki/
 
 A summarized list of changes across versions is available in the
 CHANGES.txt file.
+
+* Debugging
+
+Advene uses the standard python `logging` module for logging
+purposes. The default level is INFO. To activate DEBUG messages for
+specific modules, use the ADVENE_DEBUG environment variable which
+holds a colon-separated list of module names for which to activate
+debug messages. Every module is designated either by its dotted named
+(e.g. advene.core.controller) or (if it is loaded through the plugin
+framework) with undescore separators (e.g. advene_gui_views_timeline).
+
+For instance, to debug the timelime view as well as the controller, you can use
+
+ADVENE_DEBUG=advene.core.controller:advene_gui_views_timeline ./bin/advene
+
+The "-d" option activates some specific code paths. Among other
+things, it loads the advene.util.debug module.
diff --git a/README.txt b/README.txt
index fd4d640..19d2c17 100644
--- a/README.txt
+++ b/README.txt
@@ -5,7 +5,7 @@ The Advene project (Annotate Digital Video, Exchange on the NEt) aims
 at providing a model and a format to share annotations about digital
 video documents (movies, courses, conferences...), as well as tools to
 edit and visualize the hypervideos generated from both the annotations
-and the audiovisual documents.  
+and the audiovisual documents.
 
 With the Advene software, teachers, moviegoers, etc. can exchange
 multimedia comments and analyses about video documents. The project
@@ -58,14 +58,14 @@ Basic use
 
 Sample packages are provided on the Advene website:
 
- http://liris.cnrs.fr/advene/examples.html
+ http://advene.org/examples.html
 
 Both the Nosferatu analysis and the Ted Nelson speech analysis can be
 used as tutorials to go through the Advene features.
 
 A user manual is also available at:
 
-http://liris.cnrs.fr/advene/wiki/index.php/Main_Page
+http://advene.org/wiki/
 
 Copyright Information
 =====================
diff --git a/README.win32 b/README.win32
index b9556c6..c2896ab 100644
--- a/README.win32
+++ b/README.win32
@@ -1,18 +1,16 @@
-This package was downloaded from http://liris.cnrs.fr/advene/
+This package was downloaded from http://advene.org/
 
-This installer was generated by Bertrand Richard <bertrand.richard at liris.cnrs.fr>
+Upstream Authors:
 
-Upstream Authors: 
-
-   Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+   Olivier Aubert <contact at olivieraubert.net>
    Pierre-Antoine Champin <pierre-antoine.champin at liris.cnrs.fr>
-   Yannick Prie <yannick.prie at liris.cnrs.fr>
-   Bertrand Richard <bertrand.richard at liris.cnrs.fr>
+   Yannick Prie <yannick.prie at univ-nantes.fr>
+   Bertrand Richard
 
 Documentation:
 
   A user guide can be found in the public Advene wiki, feel free to contribute:
-  http://liris.cnrs.fr/advene/wiki/index.php/Main_Page
+  http://advene.org/wiki/
 
 Copyright:
 
diff --git a/advene_pad.xml b/advene_pad.xml
index 6fc86b1..87d1939 100644
--- a/advene_pad.xml
+++ b/advene_pad.xml
@@ -11,25 +11,22 @@
     </MASTER_PAD_VERSION_INFO>
     <Company_Info>
         <Company_Name>Advene</Company_Name>
-	<Address_1>LIRIS - Universite Lyon 1</Address_1>
-        <Address_2>UFR Informatique</Address_2>
-        <City_Town>VILLEURBANNE</City_Town>
-	<State_Province></State_Province>
-	<Zip_Postal_Code>69622</Zip_Postal_Code>
-	<Country>France</Country>
-	<Company_WebSite_URL>http://www.advene.org/</Company_WebSite_URL>
+        <City_Town>Nantes</City_Town>
+	    <Zip_Postal_Code>44100</Zip_Postal_Code>
+	    <Country>France</Country>
+	    <Company_WebSite_URL>http://www.advene.org/</Company_WebSite_URL>
         <Contact_Info>
           <Author_First_Name>Olivier</Author_First_Name>
           <Author_Last_Name>Aubert</Author_Last_Name>
-          <Author_Email>olivier.aubert at liris.cnrs.fr</Author_Email>
+          <Author_Email>contact at olivieraubert.net</Author_Email>
           <Contact_First_Name>Olivier</Contact_First_Name>
           <Contact_Last_Name>Aubert</Contact_Last_Name>
-          <Contact_Email>advene at liris.cnrs.fr</Contact_Email>
+          <Contact_Email>contact at olivieraubert.net</Contact_Email>
         </Contact_Info>
         <Support_Info>
-          <Sales_Email>advene at liris.cnrs.fr</Sales_Email>
-          <Support_Email>advene at liris.cnrs.fr</Support_Email>
-          <General_Email>advene at liris.cnrs.fr</General_Email>
+          <Sales_Email>support at advene.org</Sales_Email>
+          <Support_Email>support at advene.org</Support_Email>
+          <General_Email>support at advene.org</General_Email>
           <Sales_Phone></Sales_Phone><Support_Phone></Support_Phone>
           <General_Phone></General_Phone>
           <Fax_Phone></Fax_Phone>
@@ -37,10 +34,10 @@
     </Company_Info>
     <Program_Info>
       <Program_Name>Advene</Program_Name>
-      <Program_Version>1.0.2</Program_Version>
-      <Program_Release_Month>01</Program_Release_Month>
-      <Program_Release_Day>20</Program_Release_Day>
-      <Program_Release_Year>2012</Program_Release_Year>
+      <Program_Version>2.0</Program_Version>
+      <Program_Release_Month>FIXME</Program_Release_Month>
+      <Program_Release_Day>FIXME</Program_Release_Day>
+      <Program_Release_Year>2017</Program_Release_Year>
       <Program_Cost_Dollars>0</Program_Cost_Dollars>
       <Program_Cost_Other_Code></Program_Cost_Other_Code>
       <Program_Cost_Other></Program_Cost_Other>
@@ -50,14 +47,14 @@
       <Program_OS_Support>Linux,Mac OS X,Windows2000,Windows2003,WinXP</Program_OS_Support>
       <Program_Language>English,Esperanto,French</Program_Language>
       <File_Info>
-        <File_Size_Bytes>32211765</File_Size_Bytes>
-	<File_Size_K>31456</File_Size_K>
-	<File_Size_MB>30</File_Size_MB>
+        <File_Size_Bytes>FIXME32211765</File_Size_Bytes>
+	<File_Size_K>FIXME31456</File_Size_K>
+	<File_Size_MB>FIXME30</File_Size_MB>
       </File_Info>
       <Expire_Info>
         <Has_Expire_Info>N</Has_Expire_Info><Expire_Count></Expire_Count><Expire_Based_On></Expire_Based_On><Expire_Other_Info></Expire_Other_Info><Expire_Month></Expire_Month><Expire_Day></Expire_Day><Expire_Year></Expire_Year>
       </Expire_Info>
-      <Program_Change_Info>See the changelog at http://svn.gna.org/viewcvs/advene/trunk/CHANGES.txt</Program_Change_Info>
+      <Program_Change_Info>See the changelog at https://github.com/oaubert/advene/blob/master/CHANGES.txt</Program_Change_Info>
       <Program_Category_Class>Audio & Multimedia::Video Tools</Program_Category_Class>
       <Program_Specific_Category></Program_Specific_Category>
       <Program_System_Requirements></Program_System_Requirements>
diff --git a/bin/advene b/bin/advene
index c402228..33c0919 100755
--- a/bin/advene
+++ b/bin/advene
@@ -1,4 +1,8 @@
-#! /usr/bin/env python
+#! /usr/bin/env python3
+#
+#
+# Advene: Annotate Digital Videos, Exchange on the NEt
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # This file is part of Advene.
 #
@@ -17,45 +21,23 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
 
+# Let's start by configuring logging
+import logging
+import logging.config
+import logging.handlers
+logger = logging.getLogger(__name__)
+
 import sys
 import os
 import time
-import StringIO
-import shutil
-
-#import psyco; psyco.log(); psyco.profile()
-
-# Magic stuff before the instanciation of Advene : we set the
-# sys.path and the various config.data.path
-
-
-class AutoFlush(file):
-    """Auto-flushed file object.
-    """
 
-    def write(self, s):
-        super(AutoFlush, self).write(s)
-        self.flush()
-
-    def writelines(self, l):
-        super(AutoFlush, self).writelines(l)
-        self.flush()
-
-
-def recursive_mkdir(d):
-    parent = os.path.dirname(d)
-    if not os.path.exists(parent):
-        recursive_mkdir(parent)
-    os.mkdir(d)
-
-logfile = None
 # Try to find if we are in a development tree.
 (maindir, subdir) = os.path.split(
     os.path.dirname(os.path.abspath(sys.argv[0])))
-if subdir == 'bin' and  os.path.exists(os.path.join(maindir, "setup.py")):
+if subdir == 'bin' and os.path.exists(os.path.join(maindir, "setup.py")):
     # Chances are that we were in a development tree...
     libpath = os.path.join(maindir, "lib")
-    print "You seem to have a development tree at:\n%s." % libpath
+    logging.warn("You seem to have a development tree at:\n%s." % libpath)
     sys.path.insert(0, libpath)
 
     import advene.core.config as config
@@ -63,31 +45,67 @@ if subdir == 'bin' and  os.path.exists(os.path.join(maindir, "setup.py")):
 else:
     try:
         import advene.core.config as config
-    except ImportError, e:
-        print """Cannot guess a valid directory.
-        Please check your installation or set the PYTHONPATH environment variable."""
-        print str(e)
+    except ImportError as e:
+        logging.error("""Cannot guess a valid directory.
+        Please check your installation or set the PYTHONPATH environment variable.""", exc_info=True)
         sys.exit(1)
-    # If running from a binary version, redirect stdout, stderr to a file
-    logfile = config.data.advenefile('advene.log', 'settings')
-    try:
-        f = AutoFlush(logfile, 'w')
-        print "Advene output is stored into ", logfile
-        sys.stdout = f
-        sys.stderr = f
-    except IOError:
-        # The file cannot be written. Well, let us use the console...
-        pass
+
+logfile = config.data.advenefile('advene.log', 'settings')
+# We have the logfile name. Let's configure RotatingFileHandler logging handler
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': True,
+    'formatters': {
+        'verbose': {
+            'format': '%(levelname)s %(asctime)s %(name)s %(message)s'
+        },
+        'simple': {
+            'format': '%(name)s %(levelname)s %(message)s'
+        },
+    },
+    'handlers': {
+        'console': {
+            'level':'DEBUG',
+            'class':'logging.StreamHandler',
+            'formatter': 'simple'
+        },
+        'logfile': {
+            'level': 'DEBUG',
+            'class': 'logging.handlers.RotatingFileHandler',
+            'filename': logfile,
+            'formatter': 'verbose',
+            'backupCount': 7,
+        },
+    },
+    'root': {
+        'handlers':['console', 'logfile'],
+        'level': 'INFO',
+    },
+    'loggers': {
+        'cherrypy.error': {
+            'handlers': [ 'logfile' ],
+            'propagate': False,
+            'level': 'INFO',
+        },
+    }
+}
+for m in os.environ.get('ADVENE_DEBUG', '').split(':'):
+    LOGGING['loggers'][m] = { 'level': 'DEBUG' }
+logging.config.dictConfig(LOGGING)
+# Do a forced rollover for the RotatingFileHandler
+for h in logging.root.handlers:
+    if hasattr(h, 'doRollover'):
+        h.doRollover()
 
 # Locale selection
 if config.data.preferences['language']:
     # A non-empty value overrides the system default
     os.environ['LANG'] = config.data.preferences['language']
 
-print config.data.version_string, "run at", time.strftime("%d/%m/%y %H:%M:%S %Z"), "on", sys.platform
+logging.warn("%s run at %s on %s", config.data.version_string, time.strftime("%d/%m/%y %H:%M:%S %Z"), sys.platform)
 
-if config.data.os in ('linux') and not 'DISPLAY' in os.environ:
-    print "The DISPLAY environment variable is not set. Cannot continue."
+if config.data.os in ('linux') and 'DISPLAY' not in os.environ:
+    logging.error("The DISPLAY environment variable is not set. Cannot continue.")
     sys.exit(1)
 
 # Maybe we are running from a pyinstaller version
@@ -96,22 +114,21 @@ if not os.path.exists(config.data.path['resources']):
     if os.path.exists(os.path.join(maindir, 'share', 'web')):
         # There is a 'share' directory at the same level as the executable
         # This can mean that we are in a pyinstaller version
-        print "Seemingly running from a pyinstaller version in\n%s" % maindir
+        logging.warn("Seemingly running from a pyinstaller version in\n%s", maindir)
         config.data.fix_paths(maindir)
     else:
         # We can possibly be in a MacOSX .app bundle
         d = os.path.dirname(os.path.abspath(sys.argv[0]))
         if os.path.basename(d) == 'Resources':
-            print "Seemingly running from a .app bundle"
+            logging.warn("Seemingly running from a .app bundle")
 
-            # We will put pangorc, pango.modules and gdk-pixbuf.loaders files in a directory of the user preferences.
+            # We will put pangorc, Pango.modules and gdk-pixbuf.loaders files in a directory of the user preferences.
             userconf = config.data.advenefile('_config', 'settings')
             if not os.path.isdir(userconf):
-                recursive_mkdir(userconf)
+                os.makedirs(userconf)
 
             config.data.fix_paths(d)
             executable_path_dot_dot = os.path.dirname(d)
-            print "Setting GTK_PATH to", d
             os.environ['GTK_EXE_PREFIX'] = d
             os.environ['GTK_PATH'] = d
             os.environ['GDK_PIXBUF_MODULE_FILE'] = os.path.join(userconf, 'gdk-pixbuf.loaders')
@@ -123,31 +140,36 @@ if not os.path.exists(config.data.path['resources']):
             os.environ['XDG_DATA_DIRS'] = d
             os.environ['GST_PLUGIN_PATH'] = os.path.join(d, 'gst-plugins')
 
-            # Let us fix the pango.modules and pixbuf.loaders files if necessary
-            for n in ('pangorc', 'pango.modules', 'gdk-pixbuf.loaders'):
+            # Let us fix the Pango.modules and pixbuf.loaders files if necessary
+            for n in ('pangorc', 'Pango.modules', 'gdk-pixbuf.loaders'):
                 sname = os.path.join(d, n + '.in')
                 dname = os.path.join(userconf, n)
                 data = open(sname, 'r').readlines()
                 # Rewrite only if necessary
                 if [l for l in data if '@executable_path' in l or '@userconf' in l]:
-                    print "Relocating ", n
                     relocated = [l.replace('@executable_path/..', executable_path_dot_dot).replace('@userconf', userconf) for l in data]
-                    f = open(dname, 'w')
+                    f = open(dname, 'w', encoding='utf-8')
                     f.writelines(relocated)
                     f.close()
 
 if config.data.os == 'win32':
-    import _winreg
+    import winreg
 
-    #win32 platform, add the "lib" folder to the system path
+    # win32 platform, add the "lib" folder to the system path
     os.environ['PATH'] += os.path.pathsep + "lib"
-    #add pixbufloader dir in environment
-    if not ('GDK_PIXBUF_MODULE_FILE' in os.environ.keys() and os.path.exists(os.environ['GDK_PIXBUF_MODULE_FILE'])):
-        os.environ['GDK_PIXBUF_MODULE_FILE'] = os.path.join(os.path.abspath(os.path.dirname(sys.executable)), 'lib', 'gdk-pixbuf-2.0','2.10.0', 'loaders', 'loaders.cache')
-    print os.environ['GDK_PIXBUF_MODULE_FILE']
+    # add pixbufloader dir in environment
+    if 'GDK_PIXBUF_MODULE_FILE' in os.environ and os.path.exists(os.environ['GDK_PIXBUF_MODULE_FILE']):
+        os.environ['GDK_PIXBUF_MODULE_FILE'] = os.path.join(
+            os.path.abspath(os.path.dirname(sys.executable)),
+            'lib',
+            'gdk-pixbuf-2.0',
+            '2.10.0',
+            'loaders',
+            'loaders.cache')
     try:
-        import pygtk
-        import gtk
+        import gi
+        gi.require_version('Gtk', '3.0')
+        from gi.repository import Gtk
     except ImportError:
         # Gtk DLLs are not in the PATH. Try to get their directory
         # from the registry
@@ -156,23 +178,25 @@ if config.data.os == 'win32':
             raise ImportError("Couldn't find GTK DLLs.")
         os.environ['PATH'] += os.path.pathsep + path.encode('utf8')
         os.environ['PATH'] += os.path.pathsep + os.path.join(path, 'bin').encode('utf8')
-        print "Using GTK DLLs at %s" % path
+        logging.warn("Using GTK DLLs at %s", path)
         try:
-            import pygtk
-            import gtk
+            import gi
+            from gi.repository import Gtk
         except ImportError:
-            print "Cannot import GTK, try installing visual studio 2008 redist."
+            logging.error("Cannot import GTK, try installing visual studio 2008 redist.")
 else:
-    import gtk
+    import gi
+    gi.require_version('Gtk', '3.0')
+    from gi.repository import Gtk
 
 if __name__ == '__main__':
 
     # Check for directories
     for d in ('resources', 'web'):
         if not os.path.exists(config.data.path[d]):
-            print """Error: the %s directory does not exist.
+            logging.error("""Error: the %s directory does not exist.
 Advene seems to be either badly installed or badly configured (maybe both).
-Aborting.""" % config.data.path[d]
+Aborting.""", config.data.path[d])
             sys.exit(1)
 
     filter = config.data.options.filter
@@ -181,9 +205,11 @@ Aborting.""" % config.data.path[d]
         import advene.core.controller
         c = advene.core.controller.AdveneController()
         c.init()
-        print "Available export filters:\n"
-        for v in c.get_export_filters():
-            print "%s\t: %s (.%s extension)" % (v.id, v.title, v.getMetaData(config.data.namespace, 'extension'))
+        logging.warn("Available export filters:\n%s",
+                     "\n".join("%s\t: %s (.%s extension)" % (v.id,
+                                                             v.title,
+                                                             v.getMetaData(config.data.namespace, 'extension'))
+                               for v in c.get_export_filters()))
         sys.exit(0)
     elif filter is not None:
         # A filter has been specified.
@@ -192,15 +218,15 @@ Aborting.""" % config.data.path[d]
         c.init()
         l = [v for v in c.get_export_filters() if v.id == filter]
         if not l:
-            print "Export filter %s is not defined" % filter
+            logging.error("Export filter %s is not defined", filter)
             sys.exit(1)
         ext = l[0].getMetaData(config.data.namespace, 'extension')
         for f in config.data.args:
             # A filename was provided. Strip the extension.
             output = ".".join((os.path.splitext(f)[0], ext))
-            print "Converting ", f, "into", output
+            logging.warn("Converting %s into %s", f, output)
             c.load_package(f)
-            #FIXME: could trigger events?
+            # FIXME: could trigger events?
             c.apply_export_filter(l[0], output)
         sys.exit(0)
 
@@ -213,34 +239,28 @@ Aborting.""" % config.data.path[d]
     import advene.gui.main
     gui = advene.gui.main.AdveneGUI()
     try:
-        #import hotshot
-        #filename = "/tmp/pythongrind.prof"
-        #prof = hotshot.Profile(filename, lineevents=1)
-        #prof.runcall(gui.main, config.data.args)
-        #prof.close()
+        # import hotshot
+        # filename = "/tmp/pythongrind.prof"
+        # prof = hotshot.Profile(filename, lineevents=1)
+        # prof.runcall(gui.main, config.data.args)
+        # prof.close()
         gui.main(config.data.args)
-    except Exception, e:
-        print config.data.version_string
-        print _("Got exception\n\n%s\n\n. Stopping services...") % str(e)
-        import traceback
-        s = StringIO.StringIO()
-        traceback.print_exc(file=s)
-        err = s.getvalue()
-        print err
-
-        import gtk
+    except Exception as e:
+        logging.warn("Got exception. Stopping services...", exc_info=True)
+
+        from gi.repository import Gtk
         if logfile is not None:
-            d = gtk.MessageDialog(None,
-                                gtk.DIALOG_MODAL,
-                                gtk.MESSAGE_ERROR,
-                                gtk.BUTTONS_OK,
-                                _("An error occurred."))
-            d.format_secondary_text(_("You can inform the Advene developers by sending the file\n %s\n to advene at liris.cnrs.fr, along with a description of how the bug occurred.") % logfile)
+            d = Gtk.MessageDialog(None,
+                                  Gtk.DialogFlags.MODAL,
+                                  Gtk.MessageType.ERROR,
+                                  Gtk.ButtonsType.OK,
+                                  _("An error occurred."))
+            d.format_secondary_text(_("You can inform the Advene developers by sending the file\n %s\n to support at advene.org, along with a description of how the bug occurred.") % logfile)
 
             def q(*p):
-                gtk.main_quit()
+                Gtk.main_quit()
                 return True
 
             d.connect('response', q)
             d.show()
-            gtk.main()
+            Gtk.main()
diff --git a/bin/advene-convert b/bin/advene-convert
index 6dabe02..b2e71ad 100755
--- a/bin/advene-convert
+++ b/bin/advene-convert
@@ -16,10 +16,11 @@
 # along with Foobar; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+import logging
+logger = logging.getLogger(__name__)
 
 import sys
 import os
-import StringIO
 
 # Magic stuff before the instanciation of Advene : we set the
 # sys.path and the various config.data.path
@@ -40,7 +41,7 @@ def fix_paths(path):
 if subdir == 'bin' and  os.path.exists(os.sep.join((maindir, "setup.py"))):
   # Chances are that we were in a development tree...
   libpath=os.sep.join((maindir, "lib"))
-  print "You seem to have a development tree at:\n%s." % libpath
+  logging.warn("You seem to have a development tree at:\n%s.", libpath)
   sys.path.insert (0, libpath)
 
   import advene.core.config as config
@@ -49,8 +50,7 @@ else:
   try:
     import advene.core.config as config
   except ImportError:
-    print """Cannot guess a valid directory.
-    Please check your installation or set the PYTHONPATH environment variable."""
+    logging.error("""Cannot guess a valid directory.\nPlease check your installation or set the PYTHONPATH environment variable.""")
     sys.exit(1)
 
 # Maybe we are running from a pyinstaller version
@@ -59,12 +59,10 @@ if not os.path.exists(config.data.path['resources']):
   if os.path.exists(os.path.join( maindir, 'share' )):
     # There is a 'share' directory at the same level as the executable
     # This can mean that we are in a pyinstaller version
-    print "Seemingly running from a pyinstaller version in\n%s" % maindir
+    logging.warn("Seemingly running from a pyinstaller version in\n%s", maindir)
     fix_paths(maindir)
 
 if config.data.os == 'win32':
-  import _winreg
-
   # Encoding stuff, to please py2exe
   if hasattr(sys, 'setdefaultencoding'):
     import locale
@@ -80,8 +78,9 @@ import advene.util.importer
 
 if __name__ == '__main__':
 
+    logging.basicConfig()
     if config.data.args != 2:
-        print "Should provide a file name and a package name"
+        logging.error("Should provide a file name and a package name")
         sys.exit(1)
 
     fname, pname = config.data.args
@@ -94,7 +93,7 @@ if __name__ == '__main__':
     # FIXME: i.process_options()
     # i.process_options(sys.argv[1:])
     # (for .sub conversion for instance, --fps, --offset)
-    print "Converting %s to %s using %s..." % (fname, pname, i.name)
+    logging.warn("Converting %s to %s using %s...", fname, pname, i.name)
     p=i.process_file(fname)
     p.save(pname)
     print "done."
diff --git a/bin/advene-webserver b/bin/advene-webserver
index c717e24..03f249c 100755
--- a/bin/advene-webserver
+++ b/bin/advene-webserver
@@ -17,9 +17,11 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
 
+import logging
+logger = logging.getLogger(__name__)
+
 import sys
 import os
-import StringIO
 
 # Magic stuff before the instanciation of Advene : we set the
 # sys.path and the various config.data.path
@@ -41,7 +43,7 @@ def fix_paths(path):
 if subdir == 'bin' and  os.path.exists(os.path.join(maindir, "setup.py")):
   # Chances are that we were in a development tree...
   libpath=os.path.join(maindir, "lib")
-  print "You seem to have a development tree at:\n%s." % libpath
+  logger.info("You seem to have a development tree at:\n%s." % libpath)
   sys.path.insert (0, libpath)
 
   import advene.core.config as config
@@ -50,8 +52,8 @@ else:
   try:
     import advene.core.config as config
   except ImportError:
-    print """Cannot guess a valid directory.
-    Please check your installation or set the PYTHONPATH environment variable."""
+    logger.error("""Cannot guess a valid directory.
+    Please check your installation or set the PYTHONPATH environment variable.""")
     sys.exit(1)
 
 # Maybe we are running from a pyinstaller version
@@ -60,25 +62,24 @@ if not os.path.exists(config.data.path['resources']):
   if os.path.exists(os.path.join( maindir, 'share' )):
     # There is a 'share' directory at the same level as the executable
     # This can mean that we are in a pyinstaller version
-    print "Seemingly running from a pyinstaller version in\n%s" % maindir
+    logger.info("Seemingly running from a pyinstaller version in\n%s" % maindir)
     fix_paths(maindir)
 
 if __name__ == '__main__':
     from advene.core.controller import AdveneController
     from advene.model.zippackage import ZipPackage
 
-
     controller=AdveneController()
     controller.init(config.data.args)
 
     if config.data.webserver['mode'] == 2:
-      print "Server ready to serve requests (threaded mode)."
+      logger.info("Server ready to serve requests (threaded mode).")
       controller.serverthread.join()
     elif config.data.webserver['mode'] == 1:
-      print "Server ready to serve requests (mainloop mode)."
+      logger.info( "Server ready to serve requests (mainloop mode).")
       controller.self_loop()
     else:
-      print "Web server deactived in configuration."
+      logger.info("Web server deactived in configuration.")
 
     # Cleanup the ZipPackage directories
     ZipPackage.cleanup()
diff --git a/debian/advene.desktop b/debian/advene.desktop
deleted file mode 100644
index 11a21ee..0000000
--- a/debian/advene.desktop
+++ /dev/null
@@ -1,12 +0,0 @@
-[Desktop Entry]
-Name=Advene Video annotation
-Comment=Annotate Digital Video, Exchange on the NEt
-Comment[fr]=Annotations de vidéo numérique échangées sur le NEt
-Exec=advene
-Terminal=false
-Type=Application
-Icon=/usr/share/advene/pixmaps/icon_advene32.png
-Categories=GTK;AudioVideo;Player;
-MimeType=application/ogg;application/x-ogg;application/sdp;application/smil;application/x-smil;application/streamingmedia;application/x-streamingmedia;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;audio/aac;audio/x-aac;audio/m4a;audio/x-m4a;audio/mp1;audio/x-mp1;audio/mp2;audio/x-mp2;audio/mp3;audio/x-mp3;audio/mpeg;audio/x-mpeg;audio/mpegurl;audio/x-mpegurl;audio/mpg;audio/x-mpg;audio/rn-mpeg;audio/scpls;audio/x-scpls;audio/vnd.rn-realaudio;audio/wav;audio/x-pn-windows-pcm;audio/x-realaudio;audio/x-pn-realaudio;audio/x-ms-wma;audio/x-pls;audio/x-wav;video/mpeg;video/ogg;video/x-mpeg;video/x-mpeg2;video/msvideo;video/x-msvideo;video/quicktime;video/vnd.rn-realvideo;video/x-ms-afs;video/x-ms-asf;video/x-ms-wmv;video/x-ms-wmx;video/x-ms-wvxvideo;video/x-avi;video/x-fli;video/x-theora;video/x-matroska;
-StartupNotify=true
-
diff --git a/debian/advene.links b/debian/advene.links
deleted file mode 100644
index 4eefea6..0000000
--- a/debian/advene.links
+++ /dev/null
@@ -1,2 +0,0 @@
-usr/share/javascript/jquery/jquery.js usr/share/advene/web/HTML5/jquery.js
-usr/share/javascript/jquery-ui/jquery-ui.js usr/share/advene/web/HTML5/jqueryui.js
diff --git a/debian/advene.manpages b/debian/advene.manpages
deleted file mode 100644
index 24299dd..0000000
--- a/debian/advene.manpages
+++ /dev/null
@@ -1 +0,0 @@
-doc/advene.1
diff --git a/debian/advene.menu b/debian/advene.menu
deleted file mode 100644
index 34e072b..0000000
--- a/debian/advene.menu
+++ /dev/null
@@ -1,10 +0,0 @@
-?package(advene):\
-	needs="X11"\
-	section="Applications/Video"\
-	title="Advene"\
-	longtitle="Advene - Video annotation"\
-	command="/usr/bin/advene" \
-	hints="Video" \
-	icon="/usr/share/advene/pixmaps/icon_advene32.xpm" \
-	icon32x32="/usr/share/advene/pixmaps/icon_advene32.xpm" \
-  	icon16x16="/usr/share/advene/pixmaps/icon_advene16.xpm"
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index 05aa5cf..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,26 +0,0 @@
-advene (1.1-2) unstable; urgency=medium
-
-  * add video/ogg as supported mime type for Ogg Theora; closes: #763174.
-
- -- Olivier Aubert <contact at olivieraubert.net>  Mon, 20 Oct 2014 17:00:30 +0200
-
-advene (1.1-1) unstable; urgency=medium
-
-  [ Olivier Aubert ]
-  * New upstream release; closes: #752215.
-  * Remove python-aeidon dependency; closes: #714201.
-  * Replace firefox | www-browser in Depends with a longer list of
-    alternative browsers; closes: #674177.
-
-  [ Alessio Treglia ]
-  * Add myself to the Uploaders field.
-  * Refresh debian/copyright.
-  * Bump Standards.
-
- -- Olivier Aubert <contact at olivieraubert.net>  Mon, 14 Jul 2014 01:27:35 +0200
-
-advene (1.0-1) unstable; urgency=low
-
-  * Initial release (Closes: #508451)
-
- -- Olivier Aubert <olivier.aubert at liris.cnrs.fr>  Tue, 20 Dec 2011 17:27:37 +0100
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index 7f8f011..0000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-7
diff --git a/debian/control b/debian/control
deleted file mode 100644
index 1688de5..0000000
--- a/debian/control
+++ /dev/null
@@ -1,66 +0,0 @@
-Source: advene
-Section: video
-Priority: optional
-Maintainer: Debian Multimedia Maintainers <pkg-multimedia-maintainers at lists.alioth.debian.org>
-Uploaders:
- Olivier Aubert <contact at olivieraubert.net>
-Build-Depends:
- cdbs (>= 0.4.49),
- debhelper (>= 8.0.0),
- python-all (>= 2.6.6)
-X-Python-Version: >= 2.6
-Standards-Version: 3.9.5
-Vcs-Git: git://anonscm.debian.org/pkg-multimedia/advene.git
-Vcs-Browser: http://git.debian.org/?p=pkg-multimedia/advene.git
-Homepage: http://www.advene.org/
-
-Package: advene
-Architecture: all
-Depends:
- gstreamer0.10-x,
- python-cairo,
- python-cherrypy3 (>=3.0.0),
- python-gobject,
- python-gst0.10,
- python-gtk2 (>=2.12),
- python-pygoocanvas,
- python-rsvg,
- python-simpletal (>=3.0),
- ${misc:Depends},
- ${python:Depends}
-Recommends:
- iceweasel | firefox | www-browser,
- libjs-jquery (>= 1.4.2),
- libjs-jquery-ui (>= 1.8),
- python-imaging,
- python-simplejson,
- python-vlc,
- python-webkit,
- shotdetect,
- vlc-plugin-svg
-Description: Annotate DVDs, Exchange on the Net
- The Advene (Annotate DVd, Exchange on the NEt) project is aimed
- towards communities exchanging discourses (analysis, studies) about
- audiovisual documents (e.g. movies) in DVD format. This requires that
- audiovisual content and hypertext facilities be integrated, thanks to
- annotations providing explicit structures on  audiovisual streams, upon
- which hypervideo documents can be engineered.
- .
- The cross-platform Advene application allows users to easily
- create comments and analyses of video documents, through the
- definition of time-aligned annotations and their mobilisation
- into automatically-generated or user-written comment views (HTML
- documents). Annotations can also be used to modify the rendition
- of the audiovisual document, thus providing virtual montage,
- captioning, navigation... capabilities. Users can exchange their
- comments/analyses in the form of Advene packages, independently from
- the video itself.
- .
- The Advene framework provides models and tools allowing to design and reuse
- annotations schemas; annotate video streams according to these schemas;
- generate and create Stream-Time Based (mainly video-centred) or User-Time
- Based (mainly text-centred) visualisations of the annotations. Schemas
- (annotation- and relation-types), annotations and relations, queries and
- views can be clustered and shared in units called packages. Hypervideo
- documents are generated when needed, both from packages (for annotation and
- view description) and DVDs (audiovisual streams).
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index 18d0860..0000000
--- a/debian/copyright
+++ /dev/null
@@ -1,565 +0,0 @@
-Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: Advene
-Upstream-Contact: Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-Source: http://www.advene.org/
-
-Files: *
-Copyright:
-  2003-2010 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-  2003-2010 Pierre-Antoine Champin <pierre-antoine.champin at liris.cnrs.fr>
-  2003-2010 Bertrand Richard <bertrand.richard at liris.cnrs.fr>
-  2009 Mathieu BEN <mben at irisa.fr>
-  2002 Per Kristian Gjermshus <pergj at ifi.uio.no>
-  2002 Tollef Fog Heen <tfheen at canonical.com>
-License: GPL-2+
-
-Files: debian/*
- mac/*
- scripts/*
- doc/*
- share/pixmaps/advene.icns
- share/pixmaps/advene.ico
- share/pixmaps/align.png
- share/pixmaps/align.svg
- share/pixmaps/begin-begin.png
- share/pixmaps/begin-begin.svg
- share/pixmaps/begin-end.png
- share/pixmaps/begin-end.svg
- share/pixmaps/create_at.png
- share/pixmaps/create_query.png
- share/pixmaps/create_rt.png
- share/pixmaps/create_schema.png
- share/pixmaps/create_view.png
- share/pixmaps/end-begin.png
- share/pixmaps/end-begin.svg
- share/pixmaps/end-end.png
- share/pixmaps/end-end.svg
- share/pixmaps/exchange.png
- share/pixmaps/filters_off.png
- share/pixmaps/filters_on.png
- share/pixmaps/icon_advene128.png
- share/pixmaps/icon_advene16.png
- share/pixmaps/icon_advene16.xpm
- share/pixmaps/icon_advene32.png
- share/pixmaps/icon_advene32.xpm
- share/pixmaps/icon_advene48.png
- share/pixmaps/icon_advene64.png
- share/pixmaps/locked.png
- share/pixmaps/logmessages.png
- share/pixmaps/logo_advene.png
- share/pixmaps/noplay.png
- share/pixmaps/notavailable.png
- share/pixmaps/notavailable.svg
- share/pixmaps/rotate.png
- share/pixmaps/set-to-now.png
- share/pixmaps/selection.png
- share/pixmaps/shape_arrow.png
- share/pixmaps/shape_ellipse.png
- share/pixmaps/shape_image.png
- share/pixmaps/shape_rectangle.png
- share/pixmaps/shape_text.png
- share/pixmaps/small_attach.png
- share/pixmaps/small_close.png
- share/pixmaps/small_detach.png
- share/pixmaps/small_ok.png
- share/pixmaps/snapshotter-idle.png
- share/pixmaps/snapshotter-running.png
- share/pixmaps/small_locked.png
-Copyright: 2003-2011 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-License: GPL-2
-
-Files: mac/pkg-dmg
-Copyright: Mark Mentovai <mark at moxienet.com>
-License: MPL1.1 or GPL-2 or LGPL-2.1
-
-Files: mac/Cillop/*
-Copyright: Emrah Hunal
-License: GPL-2
-
-Files: lib/advene/util/slicebuffer.py
- lib/advene/util/svgoverlay.py
-Copyright:
-  2009, Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-  2011, Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-License: LGPL-2.1
-
-Files: ./lib/advene/util/handyxml.py
-Copyright: 2004 Ned Batchelder
-License: Expat
-
-Files: ./lib/advene/util/odict.py
-Copyright: 2008 by Armin Ronacher and PEP 273 authors
-License: BSD-3-clause
-
-Files: share/haars/Mouth.xml
-Copyright:
-  2006, Modesto Castrillon-Santana (IUSIANI, University
- of Las Palmas de Gran Canaria, Spain)
-License: BSD-3-clause
-
-Files: share/haars/haarcascade_frontalface_default.xml
-Copyright: 2000, Intel Corporation
-License: BSD-3-clause
-
-Files: share/pixmaps/silk-sound.png
- share/pixmaps/silk-sound-mute.png
-Copyright: 2011 FamFamFam (Mark James)
-License: CC-BY-3.0
-
-Files: share/pixmaps/1leftarrow.png
- share/pixmaps/1rightarrow.png
- share/pixmaps/2leftarrow.png
- share/pixmaps/2rightarrow.png
- share/pixmaps/activebookmarks.png
- share/pixmaps/bookmarks.png
- share/pixmaps/browser.png
- share/pixmaps/clock.png
- share/pixmaps/comment.png
- share/pixmaps/create-relations.png
- share/pixmaps/create-relations.svg
- share/pixmaps/dvd.ico
- share/pixmaps/editaccumulator.png
- share/pixmaps/editionhistory.png
- share/pixmaps/eject.png
- share/pixmaps/explorer.png
- share/pixmaps/finder.png
- share/pixmaps/highlight.png
- share/pixmaps/montage.png
- share/pixmaps/moviefile.png
- share/pixmaps/play.png
- share/pixmaps/python.png
- share/pixmaps/schemaeditor.png
- share/pixmaps/svg_annotation.png
- share/pixmaps/table.png
- share/pixmaps/tagbag.png
- share/pixmaps/text_annotation.png
-Copyright: 2011 OpenClipart
-License: public-domain
- creative commons Public Domain Dedication
- .
- Copyright-Only Dedication (based on United States law) or Public Domain
- Certification
- .
- The person or persons who have associated work with this document (the
- "Dedicator" or "Certifier") hereby either (a) certifies that, to the best
- of his knowledge, the work of authorship identified is in the public
- domain of the country from which the work is published, or (b) hereby
- dedicates whatever copyright the dedicators holds in the work of authorship
- identified below (the "Work") to the public domain. A certifier, morever,
- dedicates any copyright interest he may have in the associated work, and
- for these purposes, is described as a "dedicator" below.
- .
- A certifier has taken reasonable steps to verify the copyright status of
- this work. Certifier recognizes that his good faith efforts may not shield
- him from liability if in fact the work certified is not in the public domain.
- .
- A dedicator makes this dedication for the benefit of the public at large and
- to the detriment of the Dedicator's heirs and successors. Dedicators intend
- this dedication to be an overt act of relinquishment in perpetuity of all
- present and future rights under copyright law, whether vested or contingent,
- in the Work. Dedicator understand that such relinquishment of all rights
- includes the relinquishment of all rights to enforce (by lawsuit or otherwise)
- those copyrights in the Work.
- .
- Dedicator recognizes that, once placed in the public domain, the Work may be
- freely reproduced, distributed, transmitted, used, modified, built upon, or
- otherwise exploited by anyone for any purpose, commercial or non-commercial,
- and in any way, including by methods that have not yet been invented or
- conceived.
-
-License: GPL-2+
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU General Public License for more details.
-Comment:
- On Debian systems the GNU General Public License (GPL) version 2 is
- located in '/usr/share/common-licenses/GPL-2'.
- .
- You should have received a copy of the GNU General Public License along
- with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-License: GPL-2
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, version 2 of the License.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
-Comment:
- On Debian systems the GNU General Public License (GPL) version 2 is
- located in '/usr/share/common-licenses/GPL-2'.
- .
- You should have received a copy of the GNU General Public License along
- with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-License: LGPL-2.1
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, version 2.1 of the License.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
-Comment:
- On Debian systems the GNU Lesser General Public License (LGPL) version 2.1 is
- located in '/usr/share/common-licenses/LGPL-2.1'.
- .
- You should have received a copy of the GNU General Public License along
- with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-License: MPL1.1
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "MPL"); you may not use this file except in
- compliance with the MPL.  You may obtain a copy of the MPL at
- http://www.mozilla.org/MPL/
- .
- Software distributed under the MPL is distributed on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the MPL
- for the specific language governing rights and limitations under the
- MPL.
-
-License: Expat
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
- .
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
- .
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-License: BSD-3-clause
- Copyright (C) 2000, Intel Corporation, all rights reserved.
- Third party copyrights are property of their respective owners.
- .
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
- .
-   * Redistribution's of source code must retain the above copyright notice,
-     this list of conditions and the following disclaimer.
- .
-   * Redistribution's in binary form must reproduce the above copyright notice,
-     this list of conditions and the following disclaimer in the documentation
-     and/or other materials provided with the distribution.
- .
-   * The name of Intel Corporation may not be used to endorse or promote products
-     derived from this software without specific prior written permission.
- .
- This software is provided by the copyright holders and contributors "as is" and
- any express or implied warranties, including, but not limited to, the implied
- warranties of merchantability and fitness for a particular purpose are disclaimed.
- In no event shall the Intel Corporation or contributors be liable for any direct,
- indirect, incidental, special, exemplary, or consequential damages
- (including, but not limited to, procurement of substitute goods or services;
- loss of use, data, or profits; or business interruption) however caused
- and on any theory of liability, whether in contract, strict liability,
- or tort (including negligence or otherwise) arising in any way out of
- the use of this software, even if advised of the possibility of such damage.
-
-License: CC-BY-3.0
- THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
-  COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
- COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
-  AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
- .
- BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
-  TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE
- MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
- CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
- CONDITIONS.
- .
- 1. Definitions
- .
- "Adaptation" means a work based upon the Work, or upon the Work and
- other pre-existing works, such as a translation, adaptation, derivative
- work, arrangement of music or other alterations of a literary or
- artistic work, or phonogram or performance and includes cinematographic
- adaptations or any other form in which the Work may be recast,
- transformed, or adapted including in any form recognizably derived from
- the original, except that a work that constitutes a Collection will not
- be considered an Adaptation for the purpose of this License. For the
- avoidance of doubt, where the Work is a musical work, performance or
- phonogram, the synchronization of the Work in timed-relation with a
- moving image ("synching") will be considered an Adaptation for the
- purpose of this License.
- "Collection" means a collection of literary or artistic works, such as
- encyclopedias and anthologies, or performances, phonograms or
- broadcasts, or other works or subject matter other than works listed in
- Section 1(f) below, which, by reason of the selection and arrangement of
-  their contents, constitute intellectual creations, in which the Work is
-  included in its entirety in unmodified form along with one or more
- other contributions, each constituting separate and independent works in
-  themselves, which together are assembled into a collective whole. A
- work that constitutes a Collection will not be considered an Adaptation
- (as defined above) for the purposes of this License.
- "Distribute" means to make available to the public the original and
- copies of the Work or Adaptation, as appropriate, through sale or other
- transfer of ownership.
- "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License.
- "Original Author" means, in the case of a literary or artistic work, the
-  individual, individuals, entity or entities who created the Work or if
- no individual or entity can be identified, the publisher; and in
- addition (i) in the case of a performance the actors, singers,
- musicians, dancers, and other persons who act, sing, deliver, declaim,
- play in, interpret or otherwise perform literary or artistic works or
- expressions of folklore; (ii) in the case of a phonogram the producer
- being the person or legal entity who first fixes the sounds of a
- performance or other sounds; and, (iii) in the case of broadcasts, the
- organization that transmits the broadcast.
- "Work" means the literary and/or artistic work offered under the terms
- of this License including without limitation any production in the
- literary, scientific and artistic domain, whatever may be the mode or
- form of its expression including digital form, such as a book, pamphlet
- and other writing; a lecture, address, sermon or other work of the same
- nature; a dramatic or dramatico-musical work; a choreographic work or
- entertainment in dumb show; a musical composition with or without words;
-  a cinematographic work to which are assimilated works expressed by a
- process analogous to cinematography; a work of drawing, painting,
- architecture, sculpture, engraving or lithography; a photographic work
- to which are assimilated works expressed by a process analogous to
- photography; a work of applied art; an illustration, map, plan, sketch
- or three-dimensional work relative to geography, topography,
- architecture or science; a performance; a broadcast; a phonogram; a
- compilation of data to the extent it is protected as a copyrightable
- work; or a work performed by a variety or circus performer to the extent
-  it is not otherwise considered a literary or artistic work.
- "You" means an individual or entity exercising rights under this License
-  who has not previously violated the terms of this License with respect
- to the Work, or who has received express permission from the Licensor to
-  exercise rights under this License despite a previous violation.
- "Publicly Perform" means to perform public recitations of the Work and
- to communicate to the public those public recitations, by any means or
- process, including by wire or wireless means or public digital
- performances; to make available to the public Works in such a way that
- members of the public may access these Works from a place and at a place
-  individually chosen by them; to perform the Work to the public by any
- means or process and the communication to the public of the performances
-  of the Work, including by public digital performance; to broadcast and
- rebroadcast the Work by any means including signs, sounds or images.
- "Reproduce" means to make copies of the Work by any means including
- without limitation by sound or visual recordings and the right of
- fixation and reproducing fixations of the Work, including storage of a
- protected performance or phonogram in digital form or other electronic
- medium.
- 2. Fair Dealing Rights. Nothing in this License is intended to reduce,
- limit, or restrict any uses free from copyright or rights arising from
- limitations or exceptions that are provided for in connection with the
- copyright protection under copyright law or other applicable laws.
- .
- 3. License Grant. Subject to the terms and conditions of this License,
- Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
- perpetual (for the duration of the applicable copyright) license to
- exercise the rights in the Work as stated below:
- .
- to Reproduce the Work, to incorporate the Work into one or more
- Collections, and to Reproduce the Work as incorporated in the
- Collections;
- to create and Reproduce Adaptations provided that any such Adaptation,
- including any translation in any medium, takes reasonable steps to
- clearly label, demarcate or otherwise identify that changes were made to
-  the original Work. For example, a translation could be marked "The
- original work was translated from English to Spanish," or a modification
-  could indicate "The original work has been modified.";
- to Distribute and Publicly Perform the Work including as incorporated in Collections; and,
- to Distribute and Publicly Perform Adaptations.
- For the avoidance of doubt:
- .
- Non-waivable Compulsory License Schemes. In those jurisdictions in which
-  the right to collect royalties through any statutory or compulsory
- licensing scheme cannot be waived, the Licensor reserves the exclusive
- right to collect such royalties for any exercise by You of the rights
- granted under this License;
- Waivable Compulsory License Schemes. In those jurisdictions in which the
-  right to collect royalties through any statutory or compulsory
- licensing scheme can be waived, the Licensor waives the exclusive right
- to collect such royalties for any exercise by You of the rights granted
- under this License; and,
- Voluntary License Schemes. The Licensor waives the right to collect
- royalties, whether individually or, in the event that the Licensor is a
- member of a collecting society that administers voluntary licensing
- schemes, via that society, from any exercise by You of the rights
- granted under this License.
- The above rights may be exercised in all media and formats whether now
- known or hereafter devised. The above rights include the right to make
- such modifications as are technically necessary to exercise the rights
- in other media and formats. Subject to Section 8(f), all rights not
- expressly granted by Licensor are hereby reserved.
- .
- 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
- .
- You may Distribute or Publicly Perform the Work only under the terms of
- this License. You must include a copy of, or the Uniform Resource
- Identifier (URI) for, this License with every copy of the Work You
- Distribute or Publicly Perform. You may not offer or impose any terms on
-  the Work that restrict the terms of this License or the ability of the
- recipient of the Work to exercise the rights granted to that recipient
- under the terms of the License. You may not sublicense the Work. You
- must keep intact all notices that refer to this License and to the
- disclaimer of warranties with every copy of the Work You Distribute or
- Publicly Perform. When You Distribute or Publicly Perform the Work, You
- may not impose any effective technological measures on the Work that
- restrict the ability of a recipient of the Work from You to exercise the
-  rights granted to that recipient under the terms of the License. This
- Section 4(a) applies to the Work as incorporated in a Collection, but
- this does not require the Collection apart from the Work itself to be
- made subject to the terms of this License. If You create a Collection,
- upon notice from any Licensor You must, to the extent practicable,
- remove from the Collection any credit as required by Section 4(b), as
- requested. If You create an Adaptation, upon notice from any Licensor
- You must, to the extent practicable, remove from the Adaptation any
- credit as required by Section 4(b), as requested.
- If You Distribute, or Publicly Perform the Work or any Adaptations or
- Collections, You must, unless a request has been made pursuant to
- Section 4(a), keep intact all copyright notices for the Work and
- provide, reasonable to the medium or means You are utilizing: (i) the
- name of the Original Author (or pseudonym, if applicable) if supplied,
- and/or if the Original Author and/or Licensor designate another party or
-  parties (e.g., a sponsor institute, publishing entity, journal) for
- attribution ("Attribution Parties") in Licensor's copyright notice,
- terms of service or by other reasonable means, the name of such party or
-  parties; (ii) the title of the Work if supplied; (iii) to the extent
- reasonably practicable, the URI, if any, that Licensor specifies to be
- associated with the Work, unless such URI does not refer to the
- copyright notice or licensing information for the Work; and (iv) ,
- consistent with Section 3(b), in the case of an Adaptation, a credit
- identifying the use of the Work in the Adaptation (e.g., "French
- translation of the Work by Original Author," or "Screenplay based on
- original Work by Original Author"). The credit required by this Section 4
-  (b) may be implemented in any reasonable manner; provided, however,
- that in the case of a Adaptation or Collection, at a minimum such credit
-  will appear, if a credit for all contributing authors of the Adaptation
-  or Collection appears, then as part of these credits and in a manner at
-  least as prominent as the credits for the other contributing authors.
- For the avoidance of doubt, You may only use the credit required by this
-  Section for the purpose of attribution in the manner set out above and,
-  by exercising Your rights under this License, You may not implicitly or
-  explicitly assert or imply any connection with, sponsorship or
- endorsement by the Original Author, Licensor and/or Attribution Parties,
-  as appropriate, of You or Your use of the Work, without the separate,
- express prior written permission of the Original Author, Licensor and/or
-  Attribution Parties.
- Except as otherwise agreed in writing by the Licensor or as may be
- otherwise permitted by applicable law, if You Reproduce, Distribute or
- Publicly Perform the Work either by itself or as part of any Adaptations
-  or Collections, You must not distort, mutilate, modify or take other
- derogatory action in relation to the Work which would be prejudicial to
- the Original Author's honor or reputation. Licensor agrees that in those
-  jurisdictions (e.g. Japan), in which any exercise of the right granted
- in Section 3(b) of this License (the right to make Adaptations) would be
-  deemed to be a distortion, mutilation, modification or other derogatory
-  action prejudicial to the Original Author's honor and reputation, the
- Licensor will waive or not assert, as appropriate, this Section, to the
- fullest extent permitted by the applicable national law, to enable You
- to reasonably exercise Your right under Section 3(b) of this License
- (right to make Adaptations) but not otherwise.
- 5. Representations, Warranties and Disclaimer
- .
- UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
- OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
- KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
- INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
- FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
- LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
-  WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
- EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
- .
- 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE
- LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR
- ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
- ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS
-  BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- .
- 7. Termination
- .
- This License and the rights granted hereunder will terminate
- automatically upon any breach by You of the terms of this License.
- Individuals or entities who have received Adaptations or Collections
- from You under this License, however, will not have their licenses
- terminated provided such individuals or entities remain in full
- compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
- survive any termination of this License.
- Subject to the above terms and conditions, the license granted here is
- perpetual (for the duration of the applicable copyright in the Work).
- Notwithstanding the above, Licensor reserves the right to release the
- Work under different license terms or to stop distributing the Work at
- any time; provided, however that any such election will not serve to
- withdraw this License (or any other license that has been, or is
- required to be, granted under the terms of this License), and this
- License will continue in full force and effect unless terminated as
- stated above.
- 8. Miscellaneous
- .
- Each time You Distribute or Publicly Perform the Work or a Collection,
- the Licensor offers to the recipient a license to the Work on the same
- terms and conditions as the license granted to You under this License.
- Each time You Distribute or Publicly Perform an Adaptation, Licensor
- offers to the recipient a license to the original Work on the same terms
-  and conditions as the license granted to You under this License.
- If any provision of this License is invalid or unenforceable under
- applicable law, it shall not affect the validity or enforceability of
- the remainder of the terms of this License, and without further action
- by the parties to this agreement, such provision shall be reformed to
- the minimum extent necessary to make such provision valid and
- enforceable.
- No term or provision of this License shall be deemed waived and no
- breach consented to unless such waiver or consent shall be in writing
- and signed by the party to be charged with such waiver or consent.
- This License constitutes the entire agreement between the parties with
- respect to the Work licensed here. There are no understandings,
- agreements or representations with respect to the Work not specified
- here. Licensor shall not be bound by any additional provisions that may
- appear in any communication from You. This License may not be modified
- without the mutual written agreement of the Licensor and You.
- The rights granted under, and the subject matter referenced, in this
- License were drafted utilizing the terminology of the Berne Convention
- for the Protection of Literary and Artistic Works (as amended on
- September 28, 1979), the Rome Convention of 1961, the WIPO Copyright
- Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and
- the Universal Copyright Convention (as revised on July 24, 1971). These
- rights and subject matter take effect in the relevant jurisdiction in
- which the License terms are sought to be enforced according to the
- corresponding provisions of the implementation of those treaty
- provisions in the applicable national law. If the standard suite of
- rights granted under applicable copyright law includes additional rights
-  not granted under this License, such additional rights are deemed to be
-  included in the License; this License is not intended to restrict the
- license of any rights under applicable law.
- Creative Commons Notice
- .
- Creative Commons is not a party to this License, and makes no warranty
- whatsoever in connection with the Work. Creative Commons will not be
- liable to You or any party on any legal theory for any damages
- whatsoever, including without limitation any general, special,
- incidental or consequential damages arising in connection to this
- license. Notwithstanding the foregoing two (2) sentences, if Creative
- Commons has expressly identified itself as the Licensor hereunder, it
- shall have all rights and obligations of Licensor.
- .
- Except for the limited purpose of indicating to the public that the Work
-  is licensed under the CCPL, Creative Commons does not authorize the use
-  by either party of the trademark "Creative Commons" or any related
- trademark or logo of Creative Commons without the prior written consent
- of Creative Commons. Any permitted use will be in compliance with
- Creative Commons' then-current trademark usage guidelines, as may be
- published on its website or otherwise made available upon request from
- time to time. For the avoidance of doubt, this trademark restriction
- does not form part of this License.
diff --git a/debian/copyright_hints b/debian/copyright_hints
deleted file mode 100644
index 2a7b8df..0000000
--- a/debian/copyright_hints
+++ /dev/null
@@ -1,712 +0,0 @@
-Format: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?rev=174
-Upstream-Name: FIXME
-Upstream-Contact: FIXME
-Source: FIXME
-Disclaimer: Autogenerated by CDBS
-
-Files: AUTHORS
- CHANGES.txt
- CREDITS.txt
- INSTALL.txt
- MANIFEST.in
- Makefile
- README.txt
- adveneAllInOne.iss
- bin/advene.bat
- debian/advene.desktop
- debian/advene.links
- debian/advene.manpages
- debian/advene.menu
- debian/compat
- debian/control
- debian/pycompat
- debian/pyversions
- debian/rules
- debian/source/format
- debian/source/local-options
- debian/watch
- doc/adhoc-views.txt
- doc/advene.1
- doc/developper.txt
- doc/fileformat.txt
- doc/mediacontrol.txt
- doc/mimetypes.txt
- doc/plugins.txt
- doc/references.txt
- doc/release.txt
- doc/win32.txt
- lib/advene/model/.cvsignore
- lib/advene/model/tal/.cvsignore
- lib/advene/model/util/.cvsignore
- lib/advene/model/util/defaultdict.py
- locale/de/LC_MESSAGES/advene.mo
- locale/eo/LC_MESSAGES/advene.mo
- locale/es/LC_MESSAGES/advene.mo
- locale/it/LC_MESSAGES/advene.mo
- mac/Advene.icns
- mac/Advene.wrapper
- mac/Cillop/gtk-2.0/arrow-down-ins.png
- mac/Cillop/gtk-2.0/arrow-down-pre.png
- mac/Cillop/gtk-2.0/arrow-down.png
- mac/Cillop/gtk-2.0/arrow-left-ins.png
- mac/Cillop/gtk-2.0/arrow-left-pre.png
- mac/Cillop/gtk-2.0/arrow-left.png
- mac/Cillop/gtk-2.0/arrow-pre.svg
- mac/Cillop/gtk-2.0/arrow-right-ins.png
- mac/Cillop/gtk-2.0/arrow-right-pre.png
- mac/Cillop/gtk-2.0/arrow-right.png
- mac/Cillop/gtk-2.0/arrow-rleft-ins.png
- mac/Cillop/gtk-2.0/arrow-up-ins.png
- mac/Cillop/gtk-2.0/arrow-up-pre.png
- mac/Cillop/gtk-2.0/arrow-up.png
- mac/Cillop/gtk-2.0/arrow.svg
- mac/Cillop/gtk-2.0/button-default.png
- mac/Cillop/gtk-2.0/button-default.svg
- mac/Cillop/gtk-2.0/button-insensitive.svg
- mac/Cillop/gtk-2.0/button-normal.svg
- mac/Cillop/gtk-2.0/button-prelight.svg
- mac/Cillop/gtk-2.0/button-pressed.svg
- mac/Cillop/gtk-2.0/comboarrow.png
- mac/Cillop/gtk-2.0/gtkrc
- mac/Cillop/gtk-2.0/lineh.png
- mac/Cillop/gtk-2.0/linev.png
- mac/Cillop/gtk-2.0/menubar.svg
- mac/Cillop/gtk-2.0/null.svg
- mac/Cillop/gtk-2.0/pbtroughh.svg
- mac/Cillop/gtk-2.0/pbtroughv.svg
- mac/Cillop/gtk-2.0/rangegrip-h.png
- mac/Cillop/gtk-2.0/rangegrip-h.svg
- mac/Cillop/gtk-2.0/rangegrip-v.png
- mac/Cillop/gtk-2.0/rangeslider-ins.svg
- mac/Cillop/gtk-2.0/rangeslider-pre.svg
- mac/Cillop/gtk-2.0/rangeslider-v-ins.svg
- mac/Cillop/gtk-2.0/rangeslider-v-pre.svg
- mac/Cillop/gtk-2.0/rangeslider-v.svg
- mac/Cillop/gtk-2.0/rangeslider.svg
- mac/Cillop/gtk-2.0/rangetrough-focus.png
- mac/Cillop/gtk-2.0/rangetrough-focus.svg
- mac/Cillop/gtk-2.0/slider-h-ins.svg
- mac/Cillop/gtk-2.0/slider-h-pre.svg
- mac/Cillop/gtk-2.0/slider-h.svg
- mac/Cillop/gtk-2.0/slider-v-ins.svg
- mac/Cillop/gtk-2.0/slider-v-pre.svg
- mac/Cillop/gtk-2.0/slider-v.svg
- mac/Cillop/gtk-2.0/trough2-h.svg
- mac/Cillop/gtk-2.0/trough2.svg
- mac/README
- mac/advene.dsstore
- mac/create_app_bundle
- mac/create_dmg
- mac/gst-plugins.txt
- mac/hack_update
- mac/patch-pango_utils.diff
- po/Makefile
- po/POTFILES
- post_install.bat
- pyinstaller/Makefile
- pyinstaller/README
- pyinstaller/advene-bin
- pyinstaller/advene-bin.spec
- pyinstaller/advene.pyspec
- scripts/fix_glade
- scripts/glade2py
- scripts/seq2package.py
- scripts/update_doc
- scripts/update_version
- scripts/version
- setup.cfg
- setup.py
- share/advene.rng
- share/default_rules.xml
- share/exporters.xml
- share/haars/frontalEyes35x16.xml
- share/mime.types
- share/pixmaps/1leftarrow.png
- share/pixmaps/1rightarrow.png
- share/pixmaps/2leftarrow.png
- share/pixmaps/2rightarrow.png
- share/pixmaps/activebookmarks.png
- share/pixmaps/advene.icns
- share/pixmaps/advene.ico
- share/pixmaps/align.png
- share/pixmaps/align.svg
- share/pixmaps/begin-begin.png
- share/pixmaps/begin-begin.svg
- share/pixmaps/begin-end.png
- share/pixmaps/begin-end.svg
- share/pixmaps/bookmarks.png
- share/pixmaps/browser.png
- share/pixmaps/clock.png
- share/pixmaps/comment.png
- share/pixmaps/create-relations.png
- share/pixmaps/create-relations.svg
- share/pixmaps/create_at.png
- share/pixmaps/create_query.png
- share/pixmaps/create_rt.png
- share/pixmaps/create_schema.png
- share/pixmaps/create_view.png
- share/pixmaps/dvd.ico
- share/pixmaps/editaccumulator.png
- share/pixmaps/editionhistory.png
- share/pixmaps/eject.png
- share/pixmaps/end-begin.png
- share/pixmaps/end-begin.svg
- share/pixmaps/end-end.png
- share/pixmaps/end-end.svg
- share/pixmaps/exchange.png
- share/pixmaps/explorer.png
- share/pixmaps/filters_off.png
- share/pixmaps/filters_on.png
- share/pixmaps/finder.png
- share/pixmaps/highlight.png
- share/pixmaps/icon_advene128.png
- share/pixmaps/icon_advene16.png
- share/pixmaps/icon_advene16.xpm
- share/pixmaps/icon_advene32.png
- share/pixmaps/icon_advene32.xpm
- share/pixmaps/icon_advene48.png
- share/pixmaps/icon_advene64.png
- share/pixmaps/locked.png
- share/pixmaps/logmessages.png
- share/pixmaps/logo_advene.png
- share/pixmaps/montage.png
- share/pixmaps/moviefile.png
- share/pixmaps/noplay.png
- share/pixmaps/notavailable.png
- share/pixmaps/notavailable.svg
- share/pixmaps/play.png
- share/pixmaps/python.png
- share/pixmaps/rotate.png
- share/pixmaps/schemaeditor.png
- share/pixmaps/selection.png
- share/pixmaps/set-to-now.png
- share/pixmaps/shape_arrow.png
- share/pixmaps/shape_ellipse.png
- share/pixmaps/shape_image.png
- share/pixmaps/shape_rectangle.png
- share/pixmaps/shape_text.png
- share/pixmaps/silk-sound-mute.png
- share/pixmaps/silk-sound.png
- share/pixmaps/small_attach.png
- share/pixmaps/small_close.png
- share/pixmaps/small_detach.png
- share/pixmaps/small_ok.png
- share/pixmaps/snapshotter-idle.png
- share/pixmaps/snapshotter-running.png
- share/pixmaps/svg_annotation.png
- share/pixmaps/table.png
- share/pixmaps/tagbag.png
- share/pixmaps/text_annotation.png
- share/pixmaps/timeline.png
- share/pixmaps/title_icon.png
- share/pixmaps/trace.png
- share/pixmaps/traces/allera.png
- share/pixmaps/traces/edition.png
- share/pixmaps/traces/error.png
- share/pixmaps/traces/finedition.png
- share/pixmaps/traces/lecture.png
- share/pixmaps/traces/moins.png
- share/pixmaps/traces/msg.png
- share/pixmaps/traces/msg_add.png
- share/pixmaps/traces/msg_del.png
- share/pixmaps/traces/pause.png
- share/pixmaps/traces/plus.png
- share/pixmaps/traces/stop.png
- share/pixmaps/traces/web.png
- share/pixmaps/traces_off.png
- share/pixmaps/traces_on.png
- share/pixmaps/tracetimeline.png
- share/pixmaps/transcribe.png
- share/pixmaps/transcription.png
- share/pixmaps/treeview.png
- share/pixmaps/unlocked.png
- share/pixmaps/url.png
- share/pixmaps/videoplayer.png
- share/pixmaps/web.png
- share/pixmaps/xml.png
- share/simple.glade
- share/template.azp
- share/web/HTML5/advene.js
- share/web/HTML5/advene_logo.png
- share/web/HTML5/advene_svg.js
- share/web/HTML5/anim.gif
- share/web/HTML5/bg.png
- share/web/HTML5/closefragment.png
- share/web/HTML5/loop.png
- share/web/HTML5/maximized.png
- share/web/HTML5/muted.png
- share/web/HTML5/noloop.png
- share/web/HTML5/pause.png
- share/web/HTML5/play.png
- share/web/HTML5/stop.png
- share/web/HTML5/style.css
- share/web/HTML5/theme/images/ui-anim_basic_16x16.gif
- share/web/HTML5/theme/images/ui-bg_diagonals-thick_18_b81900_40x40.png
- share/web/HTML5/theme/images/ui-bg_diagonals-thick_20_666666_40x40.png
- share/web/HTML5/theme/images/ui-bg_flat_10_000000_40x100.png
- share/web/HTML5/theme/images/ui-bg_glass_100_f6f6f6_1x400.png
- share/web/HTML5/theme/images/ui-bg_glass_100_fdf5ce_1x400.png
- share/web/HTML5/theme/images/ui-bg_glass_65_ffffff_1x400.png
- share/web/HTML5/theme/images/ui-bg_gloss-wave_35_f6a828_500x100.png
- share/web/HTML5/theme/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
- share/web/HTML5/theme/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
- share/web/HTML5/theme/images/ui-icons_222222_256x240.png
- share/web/HTML5/theme/images/ui-icons_228ef1_256x240.png
- share/web/HTML5/theme/images/ui-icons_ef8c08_256x240.png
- share/web/HTML5/theme/images/ui-icons_ffd27a_256x240.png
- share/web/HTML5/theme/images/ui-icons_ffffff_256x240.png
- share/web/HTML5/theme/images/ui_bg_diagonals_thick18.png
- share/web/HTML5/theme/images/ui_bg_diagonals_thick20.png
- share/web/HTML5/theme/images/ui_bg_flat10.png
- share/web/HTML5/theme/images/ui_bg_glass65.png
- share/web/HTML5/theme/images/ui_bg_glass65fd.png
- share/web/HTML5/theme/images/ui_bg_glass65ff.png
- share/web/HTML5/theme/images/ui_bg_gloss_wave.png
- share/web/HTML5/theme/images/ui_bg_highlight_soft100.png
- share/web/HTML5/theme/images/ui_bg_highlight_soft75.png
- share/web/HTML5/theme/images/ui_icons222.png
- share/web/HTML5/theme/images/ui_icons228.png
- share/web/HTML5/theme/images/ui_iconsef8.png
- share/web/HTML5/theme/images/ui_iconsffd.png
- share/web/HTML5/theme/images/ui_iconsfff.png
- share/web/HTML5/view_here.png
- share/web/HTML5/volume.png
- share/web/advene.css
- share/web/shortcuts.html
- share/web/user.html
-Copyright: *No copyright*
-License: UNKNOWN
- FIXME
-
-Files: lib/advene/__init__.py
- lib/advene/core/__init__.py
- lib/advene/core/config.py
- lib/advene/core/controller.py
- lib/advene/core/idgenerator.py
- lib/advene/core/imagecache.py
- lib/advene/core/mediacontrol.py
- lib/advene/core/version.py
- lib/advene/core/webcherry.py
- lib/advene/gui/__init__.py
- lib/advene/gui/edit/__init__.py
- lib/advene/gui/edit/create.py
- lib/advene/gui/edit/dvdselect.py
- lib/advene/gui/edit/elements.py
- lib/advene/gui/edit/frameselector.py
- lib/advene/gui/edit/htmleditor.py
- lib/advene/gui/edit/importer.py
- lib/advene/gui/edit/imports.py
- lib/advene/gui/edit/merge.py
- lib/advene/gui/edit/montage.py
- lib/advene/gui/edit/properties.py
- lib/advene/gui/edit/rules.py
- lib/advene/gui/edit/shapewidget.py
- lib/advene/gui/edit/tales.py
- lib/advene/gui/edit/timeadjustment.py
- lib/advene/gui/edit/transcribe.py
- lib/advene/gui/evaluator.py
- lib/advene/gui/plugins/__init__.py
- lib/advene/gui/plugins/actions.py
- lib/advene/gui/plugins/contenthandlers.py
- lib/advene/gui/plugins/eventaccumulator.py
- lib/advene/gui/plugins/htmlcontenhandler.py
- lib/advene/gui/plugins/logmessages.py
- lib/advene/gui/plugins/shotvalidation.py
- lib/advene/gui/plugins/tracepreview.py
- lib/advene/gui/plugins/tracetimeline.py
- lib/advene/gui/plugins/videoplayer.py
- lib/advene/gui/popup.py
- lib/advene/gui/util/__init__.py
- lib/advene/gui/util/completer.py
- lib/advene/gui/util/dialog.py
- lib/advene/gui/util/initialconfig.py
- lib/advene/gui/util/playpausebutton.py
- lib/advene/gui/views/__init__.py
- lib/advene/gui/views/accumulatorpopup.py
- lib/advene/gui/views/activebookmarks.py
- lib/advene/gui/views/annotationdisplay.py
- lib/advene/gui/views/bookmarks.py
- lib/advene/gui/views/browser.py
- lib/advene/gui/views/caption.py
- lib/advene/gui/views/editaccumulator.py
- lib/advene/gui/views/editionhistory.py
- lib/advene/gui/views/finder.py
- lib/advene/gui/views/html.py
- lib/advene/gui/views/interactivequery.py
- lib/advene/gui/views/logwindow.py
- lib/advene/gui/views/relation.py
- lib/advene/gui/views/relationdisplay.py
- lib/advene/gui/views/scroller.py
- lib/advene/gui/views/singletonpopup.py
- lib/advene/gui/views/table.py
- lib/advene/gui/views/tagbag.py
- lib/advene/gui/views/timeline.py
- lib/advene/gui/views/transcription.py
- lib/advene/gui/views/tree.py
- lib/advene/gui/views/viewbook.py
- lib/advene/gui/views/viewplugin.py
- lib/advene/gui/widget.py
- lib/advene/model/__init__.py
- lib/advene/model/_impl.py
- lib/advene/model/annotation.py
- lib/advene/model/bundle.py
- lib/advene/model/constants.py
- lib/advene/model/content.py
- lib/advene/model/context.py
- lib/advene/model/exception.py
- lib/advene/model/fragment.py
- lib/advene/model/modeled.py
- lib/advene/model/package.py
- lib/advene/model/query.py
- lib/advene/model/resources.py
- lib/advene/model/schema.py
- lib/advene/model/tal/__init__.py
- lib/advene/model/tal/context.py
- lib/advene/model/tal/global_methods.py
- lib/advene/model/test.py
- lib/advene/model/util/__init__.py
- lib/advene/model/util/auto_properties.py
- lib/advene/model/util/choice_tree.py
- lib/advene/model/util/dom.py
- lib/advene/model/util/locale_cmp.py
- lib/advene/model/util/mimetype.py
- lib/advene/model/util/uri.py
- lib/advene/model/view.py
- lib/advene/model/viewable.py
- lib/advene/model/zippackage.py
- lib/advene/player/__init__.py
- lib/advene/player/dummy.py
- lib/advene/player/gstreamer.py
- lib/advene/player/gstrecorder.py
- lib/advene/player/vlcctypes.py
- lib/advene/plugins/__init__.py
- lib/advene/plugins/aeidon.py
- lib/advene/plugins/aiff.py
- lib/advene/plugins/annotationgraph.py
- lib/advene/plugins/anvil.py
- lib/advene/plugins/brltty.py
- lib/advene/plugins/cinelab.py
- lib/advene/plugins/cutter.py
- lib/advene/plugins/dcp.py
- lib/advene/plugins/featuredetect.py
- lib/advene/plugins/goodshotdetector.py
- lib/advene/plugins/montagerenderer.py
- lib/advene/plugins/mpeg7.py
- lib/advene/plugins/shotdetect.py
- lib/advene/plugins/shotdetectapp.py
- lib/advene/plugins/soundenveloppe.py
- lib/advene/plugins/ted.py
- lib/advene/plugins/tracebuilder.py
- lib/advene/plugins/ttl.py
- lib/advene/plugins/tts.py
- lib/advene/plugins/undomanager.py
- lib/advene/rules/__init__.py
- lib/advene/rules/actions.py
- lib/advene/rules/ecaengine.py
- lib/advene/rules/elements.py
- lib/advene/rules/importer.py
- lib/advene/util/__init__.py
- lib/advene/util/audio.py
- lib/advene/util/ctypesrsvg.py
- lib/advene/util/expat.py
- lib/advene/util/handyxml.py
- lib/advene/util/helper.py
- lib/advene/util/importer.py
- lib/advene/util/merger.py
- lib/advene/util/snapshotter.py
- lib/advene/util/spawn.py
- lib/advene/util/website_export.py
-Copyright: 2008, Olivier Aubert <olivier.aubert at liris.cnrs.fr>
- 2009, Olivier Aubert <olivier.aubert at liris.cnrs.fr>
- 2010, Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-License: GPL-2+
- FIXME
-
-Files: bin/advene
- bin/advene-convert
- bin/advene-webserver
- lib/advene/gui/edit/schemaeditor.py
- scripts/package_sorter.py
-Copyright: *No copyright*
-License: GPL-2+
- FIXME
-
-Files: lib/advene/util/slicebuffer.py
- lib/advene/util/svgoverlay.py
-Copyright: 2009, Olivier Aubert <olivier.aubert at liris.cnrs.fr>
- 2011, Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-License: LGPL-3+
- FIXME
-
-Files: share/web/HTML5/jqueryui.js
- share/web/HTML5/theme/jqueryui.css
-Copyright: 2010, AUTHORS.txt (http://jqueryui.com/about)
-License: UNKNOWN
- FIXME
-
-Files: lib/advene/util/ElementPath.py
- lib/advene/util/ElementTree.py
-Copyright: 1999-2004, Fredrik Lundh
- 1999-2005, Fredrik Lundh
- 1999-2005, Fredrik Lundh.
- 2003-2004, Fredrik Lundh.
-License: UNKNOWN
- FIXME
-
-Files: COPYING
- advene_pad.xml
-Copyright: 1989, 1991 Free Software Foundation, Inc
- HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
- HOLDERS AND/OR OTHER PARTIES
- holder saying it may be distributed
- holder who places the Program under this License
- law:
- the software, and
-License: UNKNOWN
- FIXME
-
-Files: po/advene.pot
- po/es.po
-Copyright: YEAR THE PACKAGE'S HOLDER
-License: UNKNOWN
- FIXME
-
-Files: share/haars/Mouth.xml
-Copyright: 2006, Modesto Castrillon-Santana (IUSIANI, University of
- HOLDERS AND CONTRIBUTORS
-License: BSD (2 clause)
- FIXME
-
-Files: doc/copyright
-Copyright: 2003, Olivier Aubert, Pierre-Antoine Champin, Yannick Prie
-License: GPL
- FIXME
-
-Files: README.win32
-Copyright: *No copyright*
-License: GPL-2
- FIXME
-
-Files: mac/Cillop/LICENSE
-Copyright: 1989, 1991 Free Software Foundation, Inc
- <year> <name of author>
- HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
- HOLDERS AND/OR OTHER PARTIES
- disclaimer" for the program, if
- holder saying it may be distributed
- holder who places the Program under this License
- interest in the program
- law:
- the software, and
- year name of author
-License: GPL-2+
- FIXME
-
-Files: lib/advene/gui/main.py
-Copyright: 2002-2008, Olivier Aubert, Pierre-Antoine Champin")
- 2008, Olivier Aubert <olivier.aubert at liris.cnrs.fr>
- == 1 and (c.isalnum() or c.isspace()):
-License: GPL-2+
- FIXME
-
-Files: lib/advene/plugins/transcriber.py
-Copyright: 2009, Mathieu BEN <mben at irisa.fr>
-License: GPL-2+
- FIXME
-
-Files: mac/pangohack.c
-Copyright: 2002, Per Kristian Gjermshus <pergj at ifi.uio.no>
- Tollef Fog Heen <tfheen at canonical.com>
-License: GPL-2+
- FIXME
-
-Files: lib/advene/core/plugin.py
-Copyright: for c in p._classes
-License: GPL-2+
- FIXME
-
-Files: lib/advene/player/vlc.py
-Copyright: 2009, the VideoLAN team
-License: GPL-2+
- FIXME
-
-Files: mac/pkg-dmg
-Copyright: 2005
-License: MPL-1.1 GPL
- FIXME
-
-Files: po/fr.po
-Copyright: #%(first)d-#%(second)d dans #%(first)d"
- %(count)d segments jusqu'à %(time)s"
- %(uri)s : %(error)s"
- %(uri)s sous %(alias)s"
- %s de la liste des clients autorisÃs.</p>"
- %s plans"
- %s à la liste des clients autorisÃs.</p>"
- (_) est autorisÃ."
- (le changement requiert le "
- 2004, Olivier Aubert
- : %s et %s."
- None (il y a eu une exception)"
- ajoutà à la liste</strong></p>"
- après aucune interaction "
- arbitraire)"
- avec le recueil ?"
- d'extraction de vidÃo n'est pas disponible"
- dans "
- dans %s"
- dans les "
- de capture d'Ãcran n'est pas activÃe dans le "
- de caractères alphabÃtiques non-accentuÃs.\n"
- de l'algorithme devrait typiquement être entre 50 et\n"
- de prise de capture d'Ãcran"
- depuis "
- du fichier vidÃo"
- du lecteur"
- entre les annotations."
- est dÃsactivÃe."
- existante %s"
- existe.\n"
- extraite avec succès de l'URL donnÃe.\n"
- fichier vidÃo correspondant dans le chemin de recherche : %s"
- fin sans dÃbut"
- fixà à :\n"
- fixÃe à :\n"
- l'annotation #%(current)d en #%(current)d et #%(next)d"
- l'application "
- la borne de dÃbut pour la première annotation"
- la dernière action"
- le "
- le cut entre #%(first)d et %(second)d"
- mis à jour :\n"
- modifià mais pas sauvegardÃ.\n"
- modifiÃ. Souhaitez-vous fermer de toute façon et perdre les "
- modifiÃe(s).\n"
- modifiÃe(s)\n"
- n'est pas un DVD."
- n'est plus disponible. Pour obtenir le même "
- par %(userid)s sur %(serveraddress)s.</p>"
- par %(userid)s sur %(servername)s:%(serverport)d.</"
- par <a href=\"http://liris.cnrs."
- pour afficher les timecodes"
- pour communiquer avec le "
- pour crÃer le type Active-"
- pour l'interface (nÃcessite de redÃmarrer l'application)"
- pour les fichiers de donnÃes"
- pour spÃcifier la sensibilità de "
- pour stocker les fichiers de donnÃes (recueils Advene)"
- remplacà par %(replace)s dans %(count)d ÃlÃments(s)."
- remplacÃs.\n"
- sauvÃ"
- sauvÃe avec l'environnement"
- si vide."
- sous forme de ligne de temps"
- sÃlectionnÃ. On fait comme si l'utilisateur est passà "
- un identifiant de schÃma dÃjà existant. Ce dernier sera "
- un identifiant dÃjà existant qui ne dÃsigne pas un "
- un identifiant dÃjà existant. Annulation de l'opÃration."
- vers %(location)s</p>\n"
- vers\n"
- à %(pos)s "
- à l'affichage des sous-titres sous la vidÃo"
- à partir du titre, mais vous "
-License: UNKNOWN
- FIXME
-
-Files: mac/Cillop/gtk-2.0/bg.png
-Copyright: )Ræô¢ãÎf×±)„•ì½‰¨z0ü!¥°Gsl÷˜¨—ë&ŽgÂؤ-jmÞÓˆH¾kòµj2~ð/;T2_¨6&=¸ÍØá–y³Í±,Qyà®e™(v…ÈÕ4™4´
‹i}¶Ý(«Éæøu›e¸[Ûë$wÇ%y{z~Ô„‚’cëH“h&”'L_„í–ªºã˜a’½ÕÓ¯Ó†ìa˜Y@ή\€Å!3ú¦4°8Ú'7RNº¥jszÓéÖævŸ¸»PrYǧ5÷ÍÚ@4ÞÌ+eeD¶GoÄ;ᦝf‰k×g€õ:0»ïš|™šŒýÛßi(ñêßð%Æü‡N”u#ÒÍãÙBS«²0J½ÝN+sCCžôxQË&~ÍÆ‚XØv¤2²‚¨N=¢'¸ªV ™0ݧ÷ìl±[°+xa6™ØÐqOs™¼	nL:è&$îlΈNâ”*(+¼
- E*Âû"FYKíŽâÓ íBÀfg¢€dRÊîzhSÛñ-l»=6¸5\Á*›—›‰Ùïä¸؍íÀËñl‚PxôèËá®aÙl¨:ÿ°¢_[bè£K{í	ì°™
-License: UNKNOWN
- FIXME
-
-Files: examples/Nosferatu_demo_liris_0911.azp
-Copyright: /é
`ü±&ïÌß!¶"ÑÒ³	S™Ú†ùDK¶Ð3¡%ýfÛcÒ?¼½ãwÈŒŠOÔ.ÂâõÉ,6#2qÒh‡ëO¸vKÑÍ!Lù²½NYÌÕ²­˜¡xÒ -PÅI£{¥O-ø:=­A«p1}!9ÿµ?>¨ö1/u¦¥bm+Øê¡« €ÕbÅ@ë^Ù Ü„j“KÀÝÍe	pĄ̊fh‚…ÐDv­Û´Öê1«!#‹Còdßœû˜	•&1R€iâáÁñŠº´j•â¾Ì~žÃd“å´%®ž	¡Õm”9áê×±Î_Û3¸|ÿØòmz—³LO«æ˜39Ê\6ùÝüK¤³îb~¢4r`ÂwIè•ø¬¥v-ðiq[Õ„’8JPýña/xÐn5ö’&Sc¿ödÎh+Õè*’ª<bèKXˆ´åŠ¥+¬/§á²é¢µÕŠtçÞ	…û¹Ëï0|úÕáq¼¹y JPÄPAXÒP«çر3¸RÓ¯1Á9çTl·dIµ‘/uJsÿUòàî™uxR0Y4á´¤øIY£GÈâ§ÕÚ\¥­'(ßaíC9ýSä3QLKædoçŠä翯qÉH	76hÎœ}”¥RÐ*‡ÄJÈÍokÐEõ>gËûG!¨’á\Ü¿À+çûêiE2¸E–Æ³í´ ž#Šð(i¤ª´gUŸY
- =PªXu“uc>r±«›‹hÙÏ%ï<Ë[€={wXcõÏœGennHájQ‹}¢ö&ÍÍ*ÉRdÍd¦û•eS×fYåÇ®xñ®›/áe7±n!…ªD É³¡ç¶Ê¯㤣-”›d'I¬d•ü#·-¿TíÉÛ
- lÔx¢k–ë,0DŽ|L@Ë뇹ßTBš¾Þv’®×Êœîò’•³v€Ãº·Á¶˜ºk^.k^ìbÉüݽÏ_§3WåØÔN&0ý¼l£9/Šúófr¬/‰âô$(×3@<ƒs†}yMeNU Ÿ¡…Ü6’Pj‹æ£F{ó¦ŸÎIëcûx°œjRDZàAÆäfma	=v±¢´”Kb¥†è³×„à»?w*å[}¾Zqì_ôސŽŠObŠYàæ¥âÚ…¼ÕiËÚ–G+ˆ;§Œ	l6Û9×»T‹ÝqVq?>áå½ñ¿ 
N·ÆñZví@YÌNšÅÎ*¥3@ƒŒƒZá?„¨BÔ×\yp«," î•g	|Ê­ŸÖ:*ìià¬irn´ßSÔ0#§ž6¼iéP„ú¾‰ENÔ-ÊU¾Ù™4Ÿm½<‘CÉ\;昸|=} ø¥Œ?Èoü¥•;b’„‚D ÆË¿šª£è+Ѽi•…¤I‡œÒî.A,Kºe_€øƒr^¾ˆ‘wú¯ÖG«,ÙS†~gáIJ™÷ù¾wŸþ†UÀ¥¼rBÝ\zy÷žp92\(Í	Ãò+‡YŸ6g¼,L›zÿ¼e`=ßQSÉHH™ö/Œ‘üëÒ3ô3}òŽ’4|Úzñt,ïyfÿã)B!(g±Oáü~ì.ÃâÌæGòTøÐÅY®p­Sn-Dàê§2¯HŒ¿B?>QPŽz,!Ziýž`^G’ÿŒú¸Ç‘ñ|)?l×lv5~Åð”W…ã7ã1NCå Zž÷;ëâѦr-»b G}«Ýí'Ü Ë´fa¤¿‹}
-License: UNKNOWN
- FIXME
-
-Files: lib/advene/util/odict.py
-Copyright: 2008, Armin Ronacher and PEP 273 authors
-License: UNKNOWN
- FIXME
-
-Files: mac/background.tiff
-Copyright: 1998, Hewlett-Packard Company  desc       sRGB IEC61966-2.1           sRGB IEC61966-2.1                                                  XYZ       óQ    ÌXYZ                 XYZ       o¢  8õ  XYZ       b™  ·…  ÚXYZ       $   „  ¶Ïdesc       IEC http://www.iec.ch           IEC http://www.iec.ch                                              desc       .IEC 61966-2.1 Default RGB colour space - sRGB           .IEC 61966-2.1 Default RGB colour space - sRGB                      desc       ,Reference Viewing Condition in IEC61966-2.1           ,Reference Viewing Condition in IEC61966-2.1                          view     ¤þ _. Ï íÌ  \ž   XYZ      L	V P   Wçmeas                            sig     CRT curv           
-License: UNKNOWN
- FIXME
-
-Files: share/haars/haarcascade_frontalface_default.xml
-Copyright: 2000, Intel Corporation
- holders and contributors "as is" and
-License: UNKNOWN
- FIXME
-
-Files: share/web/HTML5/jquery.js
-Copyright: 2009, The Dojo Foundation
- 2010, John Resig
- 2010, The Dojo Foundation
-License: UNKNOWN
- FIXME
-
-Files: locale/fr/LC_MESSAGES/advene.mo
-Copyright: None (il y a eu une exception) Contrôle d'un affichage extÃrieur Importateur d'application externe Extraire un fragment vidÃo Extraction de %s Extraction de l'histogramme Extraction de l'enveloppe sonore Forme %s Reconnaissance de formes Le fichier %s n'est pas un recueil Advene compressÃ. Le fichier %s n'est pas un recueil Advene2 compressÃ. Fichier ajoutà Nom de fichier Rempli Filtre Finalisation Chercher Chercher dans le texte Trouver le mot Chercher d'abord le fichier vidÃo dans le même rÃpertoire que le recueil Description de la première option Première position Correction des rÃfÃrences Suivre le type de relation %s Suivre un lien Suivre la relation Taille de la police Taille de la police pour les reprÃsentations d'annotations Taille de la police pour le texte (0 pour la police standard) Pour tous les ÃlÃments de  Format utilisà pour afficher les timecodes Avancer (%.02f s) [Contrôle-droite
- dans %s Importer Importer les chapitres du _DVD Importer des donnÃes depuis une source externe Extraire automatiquement des donnÃes depuis la vidÃo Erreur dans le filtre d'import. Aucune mÃthode de conversion dÃfinie, faites un rapport de bug SVP. Erreur dans le filtre d'import. L'API asynchrone devrait être
-License: UNKNOWN
- FIXME
-
-Files: po/eo.po
-Copyright: 2005, Olivier Aubert
-License: UNKNOWN
- FIXME
-
-Files: po/de.po
-Copyright: 2007, Rosetta Contributors and Canonical Ltd 2007
-License: UNKNOWN
- FIXME
-
-Files: po/it.po
-Copyright: 2008, Rosetta Contributors and Canonical Ltd 2008
-License: UNKNOWN
- FIXME
-
-Files: examples/Nosferatu_unstable.azp
-Copyright: Uî¢V"ÕÏ¿¢›-¼8£±ýÓDý÷ô)ˆú¾6o«û¿Tè
- lÔx¢k–ë,0DŽ|L@Ë뇹ßTBš¾Þv’®×Êœîò’•³v€Ãº·Á¶˜ºk^.k^ìbÉüݽÏ_§3WåØÔN&0ý¼l£9/Šúófr¬/‰âô$(×3@<ƒs†}yMeNU Ÿ¡…Ü6’Pj‹æ£F{ó¦ŸÎIëcûx°œjRDZàAÆäfma	=v±¢´”Kb¥†è³×„à»?w*å[}¾Zqì_ôސŽŠObŠYàæ¥âÚ…¼ÕiËÚ–G+ˆ;§Œ	l6Û9×»T‹ÝqVq?>áå½ñ¿ 
N·ÆñZví@YÌNšÅÎ*¥3@ƒŒƒZá?„¨BÔ×\yp«," î•g	|Ê­ŸÖ:*ìià¬irn´ßSÔ0#§ž6¼iéP„ú¾‰ENÔ-ÊU¾Ù™4Ÿm½<‘CÉ\;昸|=} ø¥Œ?Èoü¥•;b’„‚D ÆË¿šª£è+Ѽi•…¤I‡œÒî.A,Kºe_€øƒr^¾ˆ‘wú¯ÖG«,ÙS†~gáIJ™÷ù¾wŸþ†UÀ¥¼rBÝ\zy÷žp92\(Í	Ãò+‡YŸ6g¼,L›zÿ¼e`=ßQSÉHH™ö/Œ‘üëÒ3ô3}òŽ’4|Úzñt,ïyfÿã)B!(g±Oáü~ì.ÃâÌæGòTøÐÅY®p­Sn-Dàê§2¯HŒ¿B?>QPŽz,!Ziýž`^G’ÿŒú¸Ç‘ñ|)?l×lv5~Åð”W…ã7ã1NCå Zž÷;ëâѦr-»b G}«Ýí'Ü Ë´fa¤¿‹}
- ‰¾uÓ?ïÁ(»÷vi%Õ,Mlý¥r‚#˜aK@|ÿ¡³åç|aj8!ÞÖ ÝY7YëÂRÄcLÛd·ꢏ‰º΁c§é<7Úa—ž:o^¹„<»Jé0+û•½º±¿èé®&ø143¾Æ 1›Üs>TXxR{²¾)/Ù ‡§¬ø®Ä7HòEšdsÖ ö¯2Ñz¸³«tQ³jÀ0ó²Hq"SU§·h¾À`ÌÈêŠÇáÿs,>Jê
-License: UNKNOWN
- FIXME
-
-Files: doc/TODO
-Copyright: advene.git | grep UNKN
- problems
-License: UNKNOWN
- FIXME
-
-Files: share/web/HTML5/view_player.png
-Copyright: dg¢¡.aÿ³
,ZÄ­I„7ÎÚÑaúÊeÌ”«W’0 !Q2y"CIP¡$"QÃ…’$Hmz#%2Œh¶ZLNV8xô8>¾—§žÞGez†(†R8F_Ö`$s1ïÞ˜¢nõõŠµmSƒÀŒ´{”±õ1)!ð}ªÕ9Çeb¼@>_ T.’J¥1“eyæA×Áª±‚±ýpdV¯¸sþGï ïÕ7Î/ëÓÚ&ø<3'¯»¯·ð¿^¦·Õj0;;ËÄäSSãLOÏÐl4X7û?1rÐYg^'aä[Ÿ5Æ6 ˱°Kj›¼em‰;¶6¡îÃlDí¹…g÷<ÁÜä!jã{¸`ã(çodx D.ãb;¶^*µJ€m(‰’1¦RH"„…Ô¹ÃÀ™™&Ç+UžÚ?Æ3‡§xúÀ$M/@IIÞ?L6õÃùƒ0Z@
- òjŒ‚:JY£$ÒÏqJrœ||œl<ŽŽcûãþ$ž£Â¦Q
-License: UNKNOWN
- FIXME
-
-Files: examples/Nosferatu_v11.azp
-Copyright: lÔx¢k–ë,0DŽ|L@Ë뇹ßTBš¾Þv’®×Êœîò’•³v€Ãº·Á¶˜ºk^.k^ìbÉüݽÏ_§3WåØÔN&0ý¼l£9/Šúófr¬/‰âô$(×3@<ƒs†}yMeNU Ÿ¡…Ü6’Pj‹æ£F{ó¦ŸÎIëcûx°œjRDZàAÆäfma	=v±¢´”Kb¥†è³×„à»?w*å[}¾Zqì_ôސŽŠObŠYàæ¥âÚ…¼ÕiËÚ–G+ˆ;§Œ	l6Û9×»T‹ÝqVq?>áå½ñ¿ 
N·ÆñZví@YÌNšÅÎ*¥3@ƒŒƒZá?„¨BÔ×\yp«," î•g	|Ê­ŸÖ:*ìià¬irn´ßSÔ0#§ž6¼iéP„ú¾‰ENÔ-ÊU¾Ù™4Ÿm½<‘CÉ\;昸|=} ø¥Œ?Èoü¥•;b’„‚D ÆË¿šª£è+Ѽi•…¤I‡œÒî.A,Kºe_€øƒr^¾ˆ‘wú¯ÖG«,ÙS†~gáIJ™÷ù¾wŸþ†UÀ¥¼rBÝ\zy÷žp92\(Í	Ãò+‡YŸ6g¼,L›zÿ¼e`=ßQSÉHH™ö/Œ‘üëÒ3ô3}òŽ’4|Úzñt,ïyfÿã)B!(g±Oáü~ì.ÃâÌæGòTøÐÅY®p­Sn-Dàê§2¯HŒ¿B?>QPŽz,!Ziýž`^G’ÿŒú¸Ç‘ñ|)?l×lv5~Åð”W…ã7ã1NCå Zž÷;ëâѦr-»b G}«Ýí'Ü Ë´fa¤¿‹}
- ‹´ÛzµÖýzš¯ªDÈHë±eÂ,š”È2Ç÷ëËŒ9­åûæ›õpYø†`ÝQ—¼i4àtg÷–Û”ÄÀ2Õ¶TÛ~“¥,~³ 5£3ÕÞ	a«°<£|€
i'øª³4^*OHߤÒì„Kµ­¶Ø®®[1½ë‚u®?õÆè XÈôn	éH
-License: UNKNOWN
- FIXME
-
-Files: share/pixmaps/i-dvd.png
-Copyright: mÛBJ
ðpÇ7¼
-License: UNKNOWN
- FIXME
-
-Files: share/pixmaps/dvd_small.png
-Copyright: Å£ÑhÌ4Í=•••²ªª(Š‚ªª¨ªŠ,ËضišØ¶M"‘HÝ–‚Ž<eN§“D"A{{;·nÝzoÆ=ÀÅâå_ ``dd$?##£lóæÍ‚Ëåú"%ËrÚ>ÿ¿ÔyWW/^‡B¡+À àä¤"Ú˘‰D"Ðßß¿ÈÙ¸q#>Ÿ§Ó¹¬£å˲L8¦½½óçÏG†††®Éù…ä6¥¶c¹"bšæl__ŸxxxÏç“ü~?™™™¸\.œNç²Î%I"‰Ð××G[[—/_žk~LF›*~–&ãr%Àzà·@½ÏçûÝ–-[r·mÛ&³víZ<Ï'z155Åàà Ïž=£³³3:00ГH$þ¼Oú’ûþx³4V py@)P#ËrEvvvþš5k¼~¿ßát:˲˜››³‚Á`,†æææúg@? '#É˜à³2íç RMI&OP |¬a±Pˆ°(0,ê|,é|6ùX¡>ü5 Ÿ7‘E““ý”–Ø€,Jî—êÿÓöÔÎåq$D   tEXtTitle -2èA   tEXtSoftware Test-RsvgyòxÜ   JtEXtsignature 2ef673a31a9c24df3c819d3bb5a97e62401a0fbdd3e03ba915e34a0b7c80bb9aVˆXÎ    IEND®B`‚
-License: UNKNOWN
- FIXME
-
-Files: share/pixmaps/dvd.png
-Copyright: úÏ…Û«?“&Ô2ššš8}ú´®Û|íµ×8zô¨÷ïâAnȪ”2!•ˆÓ!ÞDf7ÁZ`5Rl›@š6nÜHZZ
-License: UNKNOWN
- FIXME
-
diff --git a/debian/gbp.conf b/debian/gbp.conf
deleted file mode 100644
index cec628c..0000000
--- a/debian/gbp.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-[DEFAULT]
-pristine-tar = True
diff --git a/debian/pycompat b/debian/pycompat
deleted file mode 100644
index 0cfbf08..0000000
--- a/debian/pycompat
+++ /dev/null
@@ -1 +0,0 @@
-2
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index a9fb0b9..0000000
--- a/debian/rules
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/make -f
-
-DEB_PYTHON2_MODULE_PACKAGES = advene
-
-include /usr/share/cdbs/1/rules/utils.mk
-include /usr/share/cdbs/1/class/python-distutils.mk
-include /usr/share/cdbs/1/rules/debhelper.mk
-
-DEB_INSTALL_CHANGELOGS_ALL := CHANGES.txt
-DEB_INSTALL_DOCS_ALL := doc/*
-DEB_PYTHON_INSTALL_ARGS_ALL += --install-lib=/usr/share/advene
-
-pre-build::
-	cd po && $(MAKE) mo
-
-clean::
-	$(RM) -r locale
-
-install/advene::
-	cd debian/advene/usr && \
-		mv bin/advene share/advene/advene.real
-	cd debian/advene/usr/bin && ln -s ../share/advene/advene.real advene
diff --git a/debian/source/format b/debian/source/format
deleted file mode 100644
index 163aaf8..0000000
--- a/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (quilt)
diff --git a/debian/source/local-options b/debian/source/local-options
deleted file mode 100644
index 9cdfca9..0000000
--- a/debian/source/local-options
+++ /dev/null
@@ -1,2 +0,0 @@
-unapply-patches
-abort-on-upstream-changes
diff --git a/debian/watch b/debian/watch
deleted file mode 100644
index 038b7ff..0000000
--- a/debian/watch
+++ /dev/null
@@ -1,2 +0,0 @@
-version=3
-http://www.advene.org/download/src/advene-(.+).tgz
diff --git a/doc/TODO b/doc/TODO
index 406230d..3a054cc 100644
--- a/doc/TODO
+++ b/doc/TODO
@@ -1,17 +1,27 @@
-* Shapewidget: allow to resize background image (then adapt to the widget size)
+* Forced text/audio alignment: https://www.readbeyond.it/aeneas/ / https://github.com/readbeyond/aeneas
+
+* Notebook: tab names hidden if content too large vertically
+
+* finder: handle DND of annotation type annotation type and other types
+* finder: does not work correctly with empty packages (cf exporter)
+* Model: check dc: and xlink: prefixes in _impl.py code that uses uris for namespaces??
 
-* Table view: implement csv export
+* Gstreamer rendering: https://github.com/PhotoFilmStrip/PFS/blob/master/photofilmstrip/core/renderer/GStreamerRenderer.py
 
-* Implement an issue reporting/fixing tool (non-adjacents shots for instance, 0 or negative duration, etc)
+* Transcribe:
+- make delete-existing element a saveable option
+- insert timestamp on control+click (to preserve standard double click)
+
+* Shapewidget: allow to resize background image (then adapt to the widget size)
 
 * Port to gtk3.0/gstreamer1.0: https://wiki.ubuntu.com/Novacut/GStreamer1.0#Using_GStreamer_1.0_from_Python
+Stock items migration guide:
+https://docs.google.com/spreadsheets/d/1HavJQRPpMuq-N0GoN1wJR-9KEGXpKy3-NEPpZZkUGJY/pub?output=html
 
 * Allow to resize the SVG edit window
 
 * x-advene-values: normalize xx.xx notation (convert , to .)
 
-* Use simplejson instead of pickle for saving prefs
-
 * QRcode extractor
 
 * Have webcherry listen on both ipv4/ipv6
@@ -26,10 +36,6 @@
 
 * example SVG + lien -> json
 
-* Update default-fps value when data is available from player
-
-* feature extraction: check against filename encoding
-
 * pymecavideo: see opencv example
 
 * finder: in Static view/dynamic view columns, add a "+" item
@@ -40,48 +46,26 @@
 
 * gst spectrum videoanalyse
 
-* display clock cursor for lengthy actions (timeline update)
-
-* snapshotter: bug for NY_1.mov (look for "silver beach")
-
 * Implement a "security" option to disable/enable on demand python: expressions in TAL
 
-* Optional feature: automatically pause when  creating an annotation ?
+* Optional feature: automatically pause when creating an annotation ?
 
 * Undo: implement Redo
 
-* Undo: history stack display
-
-* Cut Adjustment: use image *before* the cut (like in FCP)
-
-* Annotation bound adjust: open as adhoc-view
-
 * Default caption dynamic view: make non-admin (remove _)
 
-* MacOSX: use Cmd modifier equiv. as control
-
-* Import youtube annotations ( was http://www.google.com/reviews/y/read2?video_id=YOUR_VIDEO_ID_HERE )
-
 * gstreamer pipeline (videomixer) to generate 1-pixel-column sum-up of video:
 gst-launch -e filesrc location=/data/video/Bataille.avi ! decodebin ! videoscale ! ffmpegcolorspace ! video/x-raw-rgb,width=320,pixel-aspect-ratio=\(fraction\)1/1 ! videocrop left=158 right=160 ! progressreport update-freq=1 ! pngenc snapshot=false ! multifilesink location=%05d.png
 montage -tile x1 -mode Concatenate 0*g final.png
 
 * montage: video export
 
-* transcribe: allow search/replace
-
-* quick edit: integrate EntryCompletion on attributes
-
-* add PyDiscoverer interface, to get movie details ASAP
-
 * trace replay mode of video navigation (replay video based on navigation events) -> trace player with controlled video player
 
 * Customizable shortcuts
 
 * Save current workspace: display option in Save dialog
 
-* Ldt ZIP importer
-
 * Screen overlay interface: define a grid with sensitive areas + event
    -> need to implement player.get_dimensions() method
 
@@ -91,43 +75,23 @@ montage -tile x1 -mode Concatenate 0*g final.png
 
 * table view: keyword occurrences + stats
 
-* gstrecorder: option to specify wether to record from webcam
-   (autovideosrc) or from screen (ximagesrc/dshowvideosrc...) or
-   audio-only
-
-* content.parsed: define/use a PATH syntax for accessing XML elements
-   (better than handyxml)
-
 * propose template when transmuting from any (esp.text/plain) to SVG
 
-* controller.update_status: accept annotation as parameter, to allow
-   more precise notification
-
 * gstreamer: multiple video syntax: path;path -> videobox
 
 * gui.edit.rules: SimpleQuery edition will fail since TALESEntry does
    not handle multiple sources
 
-* Fix autocompletion of attribute names for annotations (should
-   record key=value strings)
-
 * Shortcut for edit element validation
 
 * webcherry: use content negociation for invoking appropriate views
 
 * Utilisation npt:/
 
-* transcribe: use textbuffer.get_modified/set_modified
-
 * gui.main: simple click on Adhocview icon -> share code with viewbook
    (menu New/open existing).
 
-* EditElementPopup: if destination != popup, add scrolledwidget around
-   widget
-
-* timeline: fix continous scrolling. Set zoom 96%, 0h59 in Nosferatu
-
-* tabular adhoc view, with customizable columns and options to export as HTML
+* table adhoc view: customizable columns and options to export as HTML
 
 * HTMLeditor: implement basic css parsing (cf python-cssutils)
 
@@ -139,18 +103,10 @@ montage -tile x1 -mode Concatenate 0*g final.png
 * Import dialog: use a standard fileselector with a import-filter list
 
 * When DND rule in STBV editing, use the current edited rule and not
-   the saved one -> hard
-
-* Revamp player API (player.position, player.duration, ...)
-
-* Bug in Advene2 export -> resources
+  the saved one -> hard
 
 * Template: in _package_view, propose to Open adhoc views
 
-* Imagemap/SVG
-
-* improve search results navigation (cf PA post on May 2 2008)
-
 * Montage: double-click -> goto annotation
 
 * Auto-pause in montage view
@@ -164,22 +120,12 @@ montage -tile x1 -mode Concatenate 0*g final.png
  * create new type. On view rename -> set new type title
  * create/fusion/delete annotations when modifying timestamps
 
-* make all simple selections (annotation, timestamp, etc) able to get
-   multiline data to represent element list
-
-* Selection: extend-to-next ?
-
 * Global timeline with frame to represent "overview + detail" (p174)
 
 * Dynamic queries/filters (p.178)
 
 * Data brushing p.181 -> selection in a view, highlight in others
 
-* timeline: memorize zoom level and position when changing package
-   (needs a timeline.zoom_level[package_uri] structure)
-
-* allow to change mimetype when editing resource
-
 * shapewidget: complete support for <image> element. How to deal with
    images as resources ?
 
@@ -198,8 +144,6 @@ montage -tile x1 -mode Concatenate 0*g final.png
 
 * AdveneTypes a la XSD
 
-* gtk locale in win32
-
 * transcription: option to display timestamp marks and allow to modify
 
 * Montage: extend with 2nd video (cf bout-a-bout) ?
@@ -208,20 +152,10 @@ montage -tile x1 -mode Concatenate 0*g final.png
 
 * annotation highlight: other representation (red thick border ?)
 
-* editaccumulator: distinguish incomplete annotations (missing entidtime)
-
-* Convert event names from strings to objects (faster comparison?)
-
 * Allow to lock workspace modifications (to propose a read-only version)
 
-* interactive result: allow to DND the icon for new visualisations
-   (timeline...) [hard because of the transmission of the parameters
-   in DND and anyway buttons are now in a toolbar, which prevents DND]
-
 * slave view: record master view id in options when saving
 
-* highlight: blink (wait for gtk.Transition in 2.12?)
-
 * zippackage: implement a 'serialize'/'freeze' method, to save the data to the temp. directory (w/o overwriting the .azp package). This would allow regular backups of the data.
 
 * controller.get_url_for_alias: use correct baseurl from cherrypy request when possible
@@ -230,9 +164,9 @@ montage -tile x1 -mode Concatenate 0*g final.png
 
 ** Deactivate autoscroll when moving in the timeline
 
-** timeline: reimplement with a proper canvas (goocanvas?)
+** timeline: reimplement with a proper canvas
 
-** Make relation lines clickable (cf goocanvas)
+** Make relation lines clickable
 
 ** timeline: allow view-local tags/color to allow to define a specific color for various annotations for a given timeline (display a point of view, specific to the view)
 
@@ -262,8 +196,6 @@ position of current marks in the video (with small lines) [cf linkmap
 
 * Players
 
-** write a flashplayer plugin using ctypes + gnash/swfdec - or https://launchpad.net/pyswfdec/
-
 ** video plugin: ffmpeg
 
 ** MacOS X: write a qtplayer using the Carbon.Qt functionalities (cf
@@ -475,27 +407,6 @@ http://www.rexx.com/~dkuhlman/generateDS.html (XML-Schema) Or SOAPy
   - annotation alignment (=~ arrange/align in Impress)
   - ability to specify line order and which types to display
 
-* Make the annotation interface as On-Screen Display over the video window
-
-* Display the data in the form of a graph (annotation=Nodes, relations=Arcs or nodes)
-
-* Style setting:
-sendmail_styles="""
-style "green_button"
-{
-  fg[PRELIGHT] = { 1.0, 1.0, 1.0 }
-  bg[PRELIGHT] = { 0, 0.75, 0 }
-}
-widget "sendmail.*.Send*" style "green_button"
-
-style "blue_text"
-{
-  text[NORMAL] = { 0, 0, 0.75 }
-}
-widget "sendmail.*.mail" style "blue_text"
-"""
-gtk.rc_parse_string(sendmail_styles)
-
 ------------------------------------ Archive ------------------------------------------
 * Write the correct VLC/Python module -> DONE
 
@@ -2663,6 +2574,9 @@ http://www.onlamp.com/pub/a/onlamp/2005/04/28/kupu.html
 
 * shapewidget: allow to switch between begin/end images (or add a slider to select inside the annotation)
 
+* Make the annotation interface as On-Screen Display over the video window 
+
+
 # Local Variables:
 # auto-fill-inhibit-regexp: ".*"
 # End:
diff --git a/doc/advene.1 b/doc/advene.1
index fe2b4b0..558c871 100644
--- a/doc/advene.1
+++ b/doc/advene.1
@@ -33,7 +33,7 @@ the video itself.
 Use the \-\-help option to get a list of command line options.
 
 User documentation is available from the website
-http://www.advene.org/wiki/index.php/Main_Page
+http://www.advene.org/
 
 .SH ETYMOLOGY
 \fBadvene\fP is an ancient english word, meaning "to be added to
@@ -41,5 +41,5 @@ something or become a part of it, though not essential" (Webster
 1913). Good match for an annotation application.
 
 .SH AUTHOR
-This manual page was written by Olivier Aubert <olivier.aubert at liris.cnrs.fr>,
+This manual page was written by Olivier Aubert <contact at olivieraubert.net>,
 for the Debian project (but may be used by others).
diff --git a/doc/controller-API.txt b/doc/controller-API.txt
index 03fccd9..ae6dfcd 100644
--- a/doc/controller-API.txt
+++ b/doc/controller-API.txt
@@ -52,7 +52,6 @@ apply_export_filter
 
 * Player handling
 move_frame
-move_position
 position_update
 player_delayed_scrub
 restart_player
diff --git a/lib/advene/__init__.py b/lib/advene/__init__.py
index dc5e3f5..dc19bba 100644
--- a/lib/advene/__init__.py
+++ b/lib/advene/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/core/__init__.py b/lib/advene/core/__init__.py
index dc5e3f5..dc19bba 100644
--- a/lib/advene/core/__init__.py
+++ b/lib/advene/core/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/core/config.py b/lib/advene/core/config.py
index f15d0ab..e70b5cc 100644
--- a/lib/advene/core/config.py
+++ b/lib/advene/core/config.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -23,19 +23,26 @@ It provides data, an instance of Config class.
 It is meant to be used this way::
 
   import config
-  print "Userid: %s" % config.data.userid
+  default_userid = config.data.userid
 
 @var data: an instance of Config (Singleton)
 """
+import logging
+logger = logging.getLogger(__name__)
+
 # FIXME: cf http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/473846
 # for windows-specific paths
 import sys
 import os
-import cPickle
+import pickle
+import json
 from optparse import OptionParser
 import mimetypes
 import operator
+from pathlib import Path
+import subprocess
 import time
+import xml.dom
 
 APP='advene'
 
@@ -43,7 +50,7 @@ def init_gettext():
     import gettext
     gettext.bindtextdomain(APP, data.path['locale'])
     gettext.textdomain(APP)
-    gettext.install(APP, localedir=data.path['locale'], unicode=True)
+    gettext.install(APP, localedir=data.path['locale'])
 
 def find_in_path(name):
     """Return the fullpath of the filename name if found in $PATH
@@ -99,6 +106,10 @@ class Config(object):
 
         self.debug=False
 
+        # Set this to True (through the evaluator) to launch
+        # post-mortem pdb upon exception
+        self.livedebug = False
+
         self.startup_time=time.time()
 
         self.config_file=''
@@ -106,10 +117,10 @@ class Config(object):
 
         if os.sys.platform in ( 'win32', 'darwin' ):
             self.os=os.sys.platform
-        elif 'linux2' in os.sys.platform:
+        elif 'linux' in os.sys.platform:
             self.os='linux'
         else:
-            print "Warning: undefined platform: ", os.sys.platform
+            logger.warning("Warning: undefined platform: %s", os.sys.platform)
             self.os=os.sys.platform
 
         if self.os == 'win32':
@@ -292,21 +303,28 @@ class Config(object):
             # Engine
             'tts-engine': 'auto',
             'edition-history-size': 5,
-            # popup views may be forced into a specific viewbook,
-            # instead of default popup
-            'popup-destination': 'popup',
+            # popup views may be popup or opened into a specific viewbook,
+            'popup-destination': 'east',
             'embedded': True,
             'abbreviation-mode': True,
             'completion-mode': True,
+            # Complete with predefined terms only if they are defined
+            'completion-predefined-only': False,
             'text-abbreviations': '',
             # Automatically start the player when loading a media file
             # (either directly or through a package)
             'player-autostart': True,
             'prefer-wysiwyg': True,
             'player-shortcuts-in-edit-windows': True,
+            # See Gtk.accelerator_parse for possible values
+            'player-shortcuts-modifier':'<Control>',
             # Default FPS, used for smpte-style timestamp display
             'default-fps': 25,
             'apply-edited-elements-on-save': True,
+            'frameselector-width': 140,
+            'frameselector-count': 8,
+            # Cache settings for import filters
+            'filter-options': {}
             }
 
         # Player options
@@ -345,8 +363,14 @@ class Config(object):
             }
 
         # Global context options
-        self.namespace_prefix = {'advenetool': self.namespace,
-                                 'dc': 'http://purl.org/dc/elements/1.1/'}
+        self.namespace_prefix = { 'advene': "http://experience.univ-lyon1.fr/advene/ns",
+                                  'advenetool': self.namespace,
+                                  'dc': 'http://purl.org/dc/elements/1.1/',
+                                  'svg': 'http://www.w3.org/2000/svg',
+                                  'xlink': "http://www.w3.org/1999/xlink",
+                                  'xml': xml.dom.XML_NAMESPACE,
+                                  'xmlnsNS': xml.dom.XMLNS_NAMESPACE }
+        self.reverse_namespace_prefix = dict( (v, k) for (k, v) in self.namespace_prefix.items() )
 
         # Internal options. These should generally not be modified.
 
@@ -375,6 +399,7 @@ class Config(object):
         # Drag and drop parameters for URIed element and other elements
         self.target_type = {}
         self.drag_type = {}
+        self.target_entry = {}
         for name, typ, mime in (
             ('text-plain',           0, 'text/plain'),
             ('TEXT',                 1, 'TEXT'),
@@ -400,6 +425,7 @@ class Config(object):
             if mime is None:
                 mime = "application/x-advene-%s-uri" % name
             self.drag_type[name] = [ ( mime, 0, typ) ]
+            self.target_entry[name] = None
 
         self.video_extensions = (
             '.264',
@@ -430,34 +456,34 @@ class Config(object):
             )
 
         self.color_palette = (
-            u'string:#cccc99',
-            u'string:#AAAAEE',
-            u'string:#ccaaaa',
-            u'string:#ffcc52',
-            u'string:#AACCAA',
-            u'string:#deadbe',
-            u'string:#fedcba',
-            u'string:#abcdef',
-            u'string:#ff6666',
-            u'string:#66ff66',
-            u'string:#FFFF88',
-            u'string:#CDEB8B',
-            u'string:#C3D9FF',
-            u'string:#FF1A00',
-            u'string:#CC0000',
-            u'string:#FF7400',
-            u'string:#008C00',
-            u'string:#006E2E',
-            u'string:#4096EE',
-            u'string:#F0C5ED',
-            u'string:#B02B2C',
-            u'string:#D15600',
-            u'string:#C79810',
-            u'string:#73880A',
-            u'string:#6BBA70',
-            u'string:#3F4C6B',
-            u'string:#356AA0',
-            u'string:#D01F3C',
+            'string:#cccc99',
+            'string:#AAAAEE',
+            'string:#ccaaaa',
+            'string:#ffcc52',
+            'string:#AACCAA',
+            'string:#deadbe',
+            'string:#fedcba',
+            'string:#abcdef',
+            'string:#ff6666',
+            'string:#66ff66',
+            'string:#FFFF88',
+            'string:#CDEB8B',
+            'string:#C3D9FF',
+            'string:#FF1A00',
+            'string:#CC0000',
+            'string:#FF7400',
+            'string:#008C00',
+            'string:#006E2E',
+            'string:#4096EE',
+            'string:#F0C5ED',
+            'string:#B02B2C',
+            'string:#D15600',
+            'string:#C79810',
+            'string:#73880A',
+            'string:#6BBA70',
+            'string:#3F4C6B',
+            'string:#356AA0',
+            'string:#D01F3C',
             )
 
         # Content-handlers
@@ -478,7 +504,7 @@ class Config(object):
         """Check if the settings directory is present, and create it if necessary.
         """
         if not os.path.isdir(self.path['settings']):
-            os.mkdir(self.path['settings'])
+            os.makedirs(self.path['settings'])
             self.first_run=True
         else:
             self.first_run=False
@@ -490,6 +516,12 @@ class Config(object):
         parser=OptionParser(usage="""Advene - annotate digital videos, exchange on the Net.
     %prog [options] [file.azp|file.xml|alias=uri]""")
 
+        parser.add_option("-d", "--debug", dest="debug", action="store_true",
+                          help="Display debugging messages.")
+
+        parser.add_option("-i", "--info", dest="info", action="store_true",
+                          help="Display info messages.")
+
         parser.add_option("-v", "--version", dest="version", action="store_true",
                           help="Display version number and exit.")
 
@@ -533,8 +565,13 @@ class Config(object):
 
         (self.options, self.args) = parser.parse_args()
         if self.options.version:
-            print self.get_version_string()
+            logger.warn(self.get_version_string())
             sys.exit(0)
+        if self.options.info:
+            logging.getLogger().setLevel(logging.INFO)
+        if self.options.debug:
+            self.debug = True
+            logging.getLogger().setLevel(logging.DEBUG)
 
     def process_options(self):
         """Process command-line options.
@@ -587,9 +624,9 @@ class Config(object):
         self.player['dvd-device']='E:'
         advenehome=self.get_registry_value('software\\advene','path')
         if advenehome is None:
-            print "Cannot get the Advene location from registry"
+            logger.warning("Cannot get the Advene location from registry")
             return
-        print "Setting Advene paths from %s" % advenehome
+        logger.info("Setting Advene paths from %s", advenehome)
         self.path['advene'] = advenehome
         self.path['locale'] = os.path.sep.join( (advenehome, 'locale') )
         self.path['plugins'] = os.path.sep.join( (advenehome, 'vlcplugins') )
@@ -610,14 +647,14 @@ class Config(object):
         """
         if self.os != 'win32':
             return None
-        import _winreg
+        import winreg
         value = None
-        for hkey in _winreg.HKEY_LOCAL_MACHINE, _winreg.HKEY_CURRENT_USER:
+        for hkey in winreg.HKEY_LOCAL_MACHINE, winreg.HKEY_CURRENT_USER:
             try:
-                reg = _winreg.OpenKey(hkey, subkey)
-                value, type_id = _winreg.QueryValueEx(reg, name)
-                _winreg.CloseKey(reg)
-            except _winreg.error:
+                reg = winreg.OpenKey(hkey, subkey)
+                value, type_id = winreg.QueryValueEx(reg, name)
+                winreg.CloseKey(reg)
+            except winreg.error:
                 #value=None
                 pass
         return value
@@ -635,7 +672,7 @@ class Config(object):
         """
         # FIXME: check signature ?
         if name is None:
-            name=method.func_name
+            name=method.__name__
         self.global_methods[name]=method
         return True
 
@@ -645,6 +682,10 @@ class Config(object):
         self.players[player.player_id] = player
         return True
 
+    def get_target_types(self, *names):
+        return [ self.target_entry[n]
+                 for n in names ]
+
     def get_content_handler(self, mimetype):
         """Return a valid content handler for the given mimetype.
 
@@ -662,15 +703,15 @@ class Config(object):
         """Return the user's homedir.
         """
         h=None
-        if self.os == 'win32' and os.environ.has_key('USERPROFILE'):
+        if self.os == 'win32' and 'USERPROFILE' in os.environ:
             return os.environ['USERPROFILE']
         try:
             h=os.path.expanduser('~')
         except:
             # FIXME: find the appropriate exception to catch (on win32?)
-            if os.environ.has_key('HOME'):
+            if 'HOME' in os.environ:
                 h=os.environ['HOME']
-            elif os.environ.has_key('HOMEPATH'):
+            elif 'HOMEPATH' in os.environ:
                 # Fallback for Windows
                 h=os.path.join(os.environ['HOMEDRIVE'],
                                os.environ['HOMEPATH'])
@@ -689,7 +730,7 @@ class Config(object):
         elif self.os == 'darwin':
             dirname = os.path.join( 'Library', 'Preferences', 'Advene' )
         else:
-            dirname = '.advene'
+            dirname = '.config/advene'
 
         return os.path.join( self.get_homedir(), dirname )
 
@@ -697,7 +738,7 @@ class Config(object):
         """Update self.preferences from the preferences file.
         """
         prefs=self.read_preferences_file(d=self.preferences, name='advene')
-        if prefs and prefs.has_key('path'):
+        if prefs and 'path' in prefs:
             self.path.update(prefs['path'])
         self.read_preferences_file(d=self.player, name='player')
         return True
@@ -713,39 +754,49 @@ class Config(object):
         """Generic preferences reading.
         """
         if d is None:
-            d=self.preferences
-        preffile=self.advenefile(name+'.prefs', 'settings')
+            d = self.preferences
+        preffile = self.advenefile(name+'.json', 'settings')
         try:
-            f = open(preffile, "r")
+            f = open(preffile, "r", encoding='utf-8')
+            prefs = json.load(f)
         except IOError:
-            return None
-        try:
-            prefs=cPickle.load(f)
-        except (EOFError, cPickle.PickleError, cPickle.PicklingError):
-            return None
+            # No json file. Use old cPickle .prefs
+            preffile=self.advenefile(name+'.prefs', 'settings')
+            try:
+                f = open(preffile, "r", encoding='utf-8')
+            except IOError:
+                return None
+            try:
+                prefs=pickle.load(f)
+            except EOFError:
+                logger.error("Cannot load old prefs file", exc_info=True)
+                return None
         d.update(prefs)
         return prefs
 
     def save_preferences_file(self, d=None, name='advene'):
         """Generic preferences saving.
+
+        Save as json.
         """
         if d is None:
             d=self.preferences
-        preffile=self.advenefile(name+'.prefs', 'settings')
+        preffile=self.advenefile(name+'.json', 'settings')
         dp=os.path.dirname(preffile)
         if not os.path.isdir(dp):
             try:
-                os.mkdir(dp)
-            except OSError, e:
-                print "Error: ", str(e)
+                os.makedirs(dp)
+            except OSError as e:
+                logger.error("Error: %s", str(e))
                 return False
         try:
-            f = open(preffile, "w")
+            f = open(preffile, "w", encoding='utf-8')
         except IOError:
             return False
         try:
-            cPickle.dump(d, f)
-        except (EOFError, cPickle.PickleError, cPickle.PicklingError):
+            json.dump(d, f, indent=2)
+        except EOFError:
+            logger.error("Cannot save prefs file", exc_info=True)
             return False
         return True
 
@@ -755,21 +806,20 @@ class Config(object):
         conffile=self.advenefile('advene.ini', 'settings')
 
         try:
-            fd=open(conffile, "r")
+            fd=open(conffile, "r", encoding='utf-8')
         except IOError:
             self.config_file=''
             return False
 
-        print "Reading configuration from %s" % conffile
-        config=sys.modules['advene.core.config']
+        logger.info("Reading configuration from %s", conffile)
         for li in fd:
             if li.startswith ("#"):
                 continue
             obj = compile (li, conffile, 'single')
             try:
-                exec obj
-            except Exception, e:
-                print "Error in %s:\n%s" % (conffile, str(e))
+                exec(obj)
+            except Exception as e:
+                logger.error("Error in %s:\n%s", conffile, str(e))
         fd.close ()
 
         self.config_file=conffile
@@ -786,20 +836,9 @@ class Config(object):
 
         id_ = "Undefined id"
         for name in ('USER', 'USERNAME', 'LOGIN'):
-            if os.environ.has_key (name):
+            if name in os.environ:
                 id_ = os.environ[name]
                 break
-        # Convert to unicode
-        try:
-            # If there are any accented characters and the encoding is
-            # not UTF-8, this will fail
-            id_ = unicode(id_, 'utf-8')
-        except UnicodeDecodeError:
-            # Decoding to latin1 will always work (but may produce
-            # strange characters depending on the system charset).
-            # This looks however like the best fallback for the moment
-            # (even on win32)
-            id_ = unicode(id_, 'latin1')
         return id_
 
     def advenefile(self, filename, category='resources'):
@@ -820,14 +859,39 @@ class Config(object):
     def get_version_string(self):
         """Return the version string.
         """
-        try:
-            import advene.core.version as version
-            return "Advene v. %s release %s (svn %s)" % (version.version,
-                                                         version.date,
-                                                         version.svn)
-        except ImportError:
-            return "Advene v. ??? (cannot get version number)"
-
+        git_version = None
+        git_dir = Path(__file__).parents[3].joinpath('.git')
+        if git_dir.is_dir():
+            # We are in a git tree. Let's get the version information
+            # from there if we can call git
+            try:
+                git_version = subprocess.check_output(["git", "--git-dir=%s" % git_dir.as_posix(), "describe"]).strip().decode('utf-8')
+            except:
+                pass
+            if git_version is None:
+                # Cannot call git. Let's try the manual approach...
+                try:
+                    with open(git_dir.joinpath("HEAD").as_posix(), "r") as f:
+                        head = f.read().strip()
+                    if head.startswith('ref: '):
+                        # Using a ref.
+                        with open(git_dir.joinpath(head[5:]).as_posix(), "r") as f:
+                            git_version = f.read().strip()
+                    else:
+                        # Not using a ref. Assume it is a sha1
+                        git_version = head
+                except:
+                    pass
+        if git_version is not None:
+            v = "Advene development version %s" % git_version
+        else:
+            try:
+                import advene.core.version as version
+                v = "Advene v. %s release %s" % (version.version,
+                                                 version.date)
+            except ImportError:
+                v = "Advene v. ??? (cannot get version number)"
+        return v
     userid = property (fget=get_userid,
                        doc="Login name of the user")
 
@@ -837,7 +901,7 @@ class Config(object):
     def register_mimetype_file(self, fname):
         """Register a mimetype for a given extension.
         """
-        for ext, t in mimetypes.read_mime_types(fname).iteritems():
+        for ext, t in mimetypes.read_mime_types(fname).items():
             mimetypes.add_type(t, ext)
 
     def fix_paths(self, maindir):
@@ -846,7 +910,7 @@ class Config(object):
         # We override any modification that could have been made in
         # .advenerc. Rationale: if the .advenerc was really correct, it
         # would have set the correct paths in the first place.
-        print "Overriding 'resources', 'locale', 'advene' and 'web' config paths"
+        logger.info("Overriding 'resources', 'locale', 'advene' and 'web' config paths")
         self.path['resources']=os.path.sep.join((maindir, 'share'))
         self.path['locale']=os.path.sep.join( (maindir, 'locale') )
         self.path['web']=os.path.sep.join((maindir, 'share', 'web'))
diff --git a/lib/advene/core/controller.py b/lib/advene/core/controller.py
index de60e3a..24793a3 100755
--- a/lib/advene/core/controller.py
+++ b/lib/advene/core/controller.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -28,6 +28,10 @@ The X{AdveneEventHandler} is used by the application to handle events
 notifications and actions triggering.
 """
 
+import logging
+logger = logging.getLogger(__name__)
+
+import datetime
 import sys
 import time
 import os
@@ -35,15 +39,19 @@ import cgi
 import socket
 import re
 import webbrowser
-import urllib
-import StringIO
-import gobject
+import urllib.request, urllib.parse, urllib.error
+from urllib.parse import urljoin
+import io
+from gi.repository import GObject
 import shlex
 import itertools
 import operator
 
 import advene.core.config as config
 
+if config.data.debug:
+    from advene.util.debug import debug_log
+
 from gettext import gettext as _
 
 import advene.core.plugin
@@ -65,6 +73,7 @@ from advene.model.view import View
 from advene.model.query import Query
 from advene.model.util.defaultdict import DefaultDict
 from advene.model.tal.context import AdveneTalesException
+from advene.util.merger import Differ
 from advene.util.website_export import WebsiteExporter
 
 import advene.model.tal.context
@@ -80,7 +89,34 @@ if config.data.webserver['mode']:
     from advene.core.webcherry import AdveneWebServer
 
 import threading
-gobject.threads_init()
+GObject.threads_init()
+
+old_excepthook = sys.excepthook
+def _advene_excepthook(type, value, tracebk, thread=None):
+    """This function will replace sys.excepthook.
+    """
+    import traceback
+    tracebk = tracebk.tb_next
+    tb = "".join(traceback.format_exception(type, value, tracebk))
+    logger.error(tb)
+    if config.data.livedebug:
+        sys.last_type, sys.last_value, sys.last_traceback = type, value, tracebk
+        import pdb
+        pdb.pm()
+    # Use standard method also
+    old_excepthook(type, value, tracebk)
+sys.excepthook = _advene_excepthook
+
+class MessageHandler(logging.Handler):
+    def __init__(self, level=logging.NOTSET, controller=None):
+        super(MessageHandler, self).__init__(level)
+        self.controller = controller
+        formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
+        self.setFormatter(formatter)
+
+    def emit(self, record):
+        if self.controller.gui:
+            self.controller.gui.log_message(self.format(record))
 
 class GlobalPackage(object):
     """Wrapper to access all packages loaded data.
@@ -88,28 +124,33 @@ class GlobalPackage(object):
     def __init__(self, controller):
         self.controller = controller
 
+    @property
     def annotations(self):
-        for p in self.controller.packages.itervalues():
+        for p in self.controller.packages.values():
             for a in p.annotations:
                 yield a
 
+    @property
     def relations(self):
-        for p in self.controller.packages.itervalues():
+        for p in self.controller.packages.values():
             for r in p.relations:
                 yield r
 
+    @property
     def annotationTypes(self):
-        for p in self.controller.packages.itervalues():
+        for p in self.controller.packages.values():
             for at in p.annotationTypes:
                 yield at
 
+    @property
     def relationTypes(self):
-        for p in self.controller.packages.itervalues():
+        for p in self.controller.packages.values():
             for rt in p.relationTypes:
                 yield rt
 
+    @property
     def schemas(self):
-        for p in self.controller.packages.itervalues():
+        for p in self.controller.packages.values():
             for s in p.schemas:
                 yield s
 
@@ -180,6 +221,9 @@ class AdveneController(object):
         self.aliases = {}
         self.current_alias = None
 
+        # Imagecache indexed by media
+        self.imagecache = {}
+
         # Unknown arguments (neither a package nor a video file)
         self.unknown_args = []
 
@@ -222,7 +266,7 @@ class AdveneController(object):
         self.player.get_default_media = self.get_default_media
         self.player_restarted = 0
         self.slave_players = set()
-        # source-id (returned by gobject.timeout_add)
+        # source-id (returned by GObject.timeout_add)
         self.slave_player_timeout = None
 
         # Some player can define a cleanup() method
@@ -274,7 +318,7 @@ class AdveneController(object):
 
     def set_cached_duration(self, value):
         if self.package is not None:
-            self.package.cached_duration = long(value)
+            self.package.cached_duration = int(value)
 
     cached_duration = property(get_cached_duration,
                                set_cached_duration,
@@ -283,7 +327,7 @@ class AdveneController(object):
     def self_loop(self):
         """Autonomous gobject loop for GUI-less controller.
         """
-        self.mainloop = gobject.MainLoop()
+        self.mainloop = GObject.MainLoop()
 
         def update_wrapper():
             """Wrapper for the application update.
@@ -295,7 +339,7 @@ class AdveneController(object):
             self.update()
             return True
 
-        gobject.timeout_add (100, update_wrapper)
+        GObject.timeout_add (100, update_wrapper)
         self.notify ("ApplicationStart")
         self.mainloop.run ()
         self.notify ("ApplicationEnd")
@@ -303,7 +347,7 @@ class AdveneController(object):
     def load_plugins(self, directory, prefix="advene_plugins"):
         """Load the plugins from the given directory.
         """
-        #print "Loading plugins from ", directory
+        logger.debug("Loading plugins from %s", directory)
         l=advene.core.plugin.PluginCollection(directory, prefix)
         for p in l:
             try:
@@ -317,8 +361,8 @@ class AdveneController(object):
                     self.log("Could not register " + p.name)
                 else:
                     self.log("Registering " + p.name)
-            except AttributeError, e:
-                print "AttributeError in", p.name, ":", str(e)
+            except AttributeError:
+                logger.error("AttributeError in %s/%s", directory, p.name, exc_info=True)
                 pass
         return l
 
@@ -352,16 +396,10 @@ class AdveneController(object):
 
         # Now we can process the events
         for (method, args, kw) in ev:
-            #print "Process action: %s" % str(method)
             try:
                 method(*args, **kw)
-            except Exception, e:
-                import traceback
-                s=StringIO.StringIO()
-                traceback.print_exc (file = s)
-                self.queue_action(self.log, _("Exception (traceback in console):") + str(e))
-                print str(e)
-                print s.getvalue()
+            except Exception:
+                logger.error("Exception in process_queue", exc_info=True)
 
         return True
 
@@ -369,6 +407,8 @@ class AdveneController(object):
         """Register the GUI for the controller.
         """
         self.gui=gui
+        # Log messages to GUI
+        logging.getLogger().addHandler(MessageHandler(controller=self))
 
     def register_tracer(self, tracer):
         """Register a trace builder
@@ -452,7 +492,7 @@ class AdveneController(object):
                 return True
 
         if self.slave_player_timeout is None and config.data.preferences['slave-player-sync-delay'] != 0:
-            self.slave_player_timeout = gobject.timeout_add(config.data.preferences['slave-player-sync-delay'], synchronize_players)
+            self.slave_player_timeout = GObject.timeout_add(config.data.preferences['slave-player-sync-delay'], synchronize_players)
 
     def unregister_slave_player(self, p):
         """Unregister a slave video player.
@@ -529,13 +569,13 @@ class AdveneController(object):
                        for an in self.future_begins
                        if an[0].type == t ]
                 if l and l[0][1] > a.fragment.end:
-                    self.queue_action(self.update_status, 'set', l[0][1])
+                    self.queue_action(self.update_status, 'seek', l[0][1])
                 else:
                     # No next annotation. Return to the start
                     if self.restricted_annotations:
                         l=self.restricted_annotations
                     else:
-                        l=[ a.fragment.begin for a in at.annotations ]
+                        l=[ an.fragment.begin for an in at.annotations ]
                         l.sort()
                     self.queue_action(self.update_status, "set", position=l[0])
             return True
@@ -545,7 +585,7 @@ class AdveneController(object):
             self.restricted_rule=self.event_handler.internal_rule(event="AnnotationEnd",
                                                                   method=restricted_play)
             p=self.player
-            if p.status == p.PauseStatus or p.status == p.PlayingStatus:
+            if p.is_playing():
                 if [ a for a in self.active_annotations if a.type == at ]:
                     # We are in an annotation of the right type. Do
                     # not move the player, just play from here.
@@ -565,7 +605,8 @@ class AdveneController(object):
         """Return a list of TitledElements
         """
         return [ helper.TitledElement(expression, label)
-                 for (label, expression) in [ (_("All annotations"), "all_annotations") ] + [
+                 for (label, expression) in [ (_("Annotations in current package"), "all_annotations"),
+                                              (_("Annotations in all packages"), "global_annotations") ] + [
                 (_("Annotations of type %s") % self.get_title(at),
                  'here/annotationTypes/%s/annotations' % at.id) for at in self.package.annotationTypes ] + [ (_("Views"), 'here/views'), (_("Tags"), 'tags'), (_("Ids"), 'ids') ]
                  ]
@@ -604,12 +645,12 @@ class AdveneController(object):
         # Replace standard \n/\t escape, because \ are parsed by shlex
         searched=searched.replace('\\n', '%n').replace('\\t', '%t')
         try:
-            words=[ unicode(w, 'utf8').replace('%n', "\n").replace('%t', "\t") for w in shlex.split(searched.encode('utf8')) ]
+            words=[ w.replace('%n', "\n").replace('%t', "\t") for w in shlex.split(searched) ]
         except ValueError:
             # Unbalanced quote. Just do a split along whitespace, the
             # user may be looking for a string with a quote and not
             # know it should be escaped.
-            words=[ unicode(w, 'utf8').replace('%n', "\n").replace('%t', "\t") for w in searched.encode('utf8').split() ]
+            words=[ w.replace('%n', "\n").replace('%t', "\t") for w in searched.split() ]
 
         mandatory=[ w[1:] for w in words if w.startswith('+') ]
         exceptions=[ w[1:] for w in words if w.startswith('-') ]
@@ -626,7 +667,6 @@ class AdveneController(object):
                     data_func=lambda e: [ normalize_case(t) for t in e.tags ]
             elif source == 'ids':
                 # Special search.
-                res=[]
                 for i in searched.split():
                     e=p.get_element_by_id(i)
                     if e is not None:
@@ -635,20 +675,24 @@ class AdveneController(object):
             else:
                 if source == 'all_annotations':
                     source = 'here/annotations'
-                c=self.build_context()
-                sourcedata=c.evaluateValue(source)
+                    sourcedata = p.annotations
+                elif source == 'global_annotations':
+                    sourcedata = self.global_package.annotations
+                else:
+                    c=self.build_context()
+                    sourcedata=c.evaluateValue(source)
 
             for w in mandatory:
                 w=normalize_case(w)
-                sourcedata=[ e for e in sourcedata if w in data_func(e) ]
+                sourcedata=[ el for el in sourcedata if w in data_func(el) ]
             for w in exceptions:
                 w=normalize_case(w)
-                sourcedata=[ e for e in sourcedata if w not in data_func(e) ]
+                sourcedata=[ el for el in sourcedata if w not in data_func(el) ]
             if not normal:
                 # No "normal" search terms. Return the result.
                 result.extend(sourcedata)
             else:
-                normal=[ normalize_case(w) for w in normal ]
+                normal=[ normalize_case(el) for el in normal ]
                 for e in sourcedata:
                     data=data_func(e)
                     for w in normal:
@@ -711,25 +755,37 @@ class AdveneController(object):
 
     def build_context(self, here=None, alias=None, baseurl=None):
         """Build a context object with additional information.
+
+        The information is cached if no additional parameter (alias,
+        baseurl) is specified.
         """
-        if baseurl is None:
-            baseurl=self.get_default_url(root=True, alias=alias)
         if here is None:
             here=self.package
+        if alias is None and baseurl is None:
+            try:
+                c = here._cached_context
+                c.restore()
+                return c
+            except AttributeError:
+                pass
+        if baseurl is None:
+            baseurl=self.get_default_url(root=True, alias=alias)
         c=advene.model.tal.context.AdveneContext(here,
                                                  options={
-                u'package_url': baseurl,
-                u'snapshot': self.package.imagecache,
-                u'namespace_prefix': config.data.namespace_prefix,
-                u'config': config.data.web,
-                u'aliases': self.aliases,
-                u'controller': self,
+                'package_url': baseurl,
+                'snapshot': self.package.imagecache,
+                'namespace_prefix': config.data.namespace_prefix,
+                'config': config.data.web,
+                'aliases': self.aliases,
+                'controller': self,
                 })
-        c.addGlobal(u'package', self.package)
-        c.addGlobal(u'packages', self.packages)
-        c.addGlobal(u'player', self.player)
-        for name, method in config.data.global_methods.iteritems():
+        c.addGlobal('package', self.package)
+        c.addGlobal('packages', self.packages)
+        c.addGlobal('player', self.player)
+        for name, method in config.data.global_methods.items():
             c.addMethod(name, method)
+        # Preserve a copy of globals/locals for later restoring
+        c.checkpoint()
         return c
 
     def busy_port_info(self):
@@ -762,21 +818,20 @@ class AdveneController(object):
         try:
             self.player_plugins=self.load_plugins(os.path.join(os.path.dirname(advene.__file__), 'player'),
                                                   prefix="advene_player_plugins")
-        except OSError, e:
-            print "Error while loading player plugins", str(e).encode('utf-8')
-            pass
+        except OSError:
+            logger.error("Error while loading player plugins", exc_info=True)
 
         try:
             self.app_plugins=self.load_plugins(os.path.join(os.path.dirname(advene.__file__), 'plugins'),
                                                prefix="advene_app_plugins")
         except OSError:
-            pass
+            logger.error("Error while loading app plugins", exc_info=True)
 
         try:
             self.user_plugins=self.load_plugins(config.data.advenefile('plugins', 'settings'),
                                                 prefix="advene_user_plugins")
         except OSError:
-            pass
+            logger.error("Error while loading user plugins", exc_info=True)
 
         # Read the default rules
         self.event_handler.read_ruleset_from_file(config.data.advenefile('default_rules.xml'),
@@ -795,10 +850,10 @@ class AdveneController(object):
                 try:
                     self.load_package (uri=uri, alias=alias)
                     self.log(_("Loaded %(uri)s as %(alias)s") % {'uri': uri, 'alias': alias})
-                except Exception, e:
+                except Exception as e:
                     self.log(_("Cannot load package from file %(uri)s: %(error)s") % {
                             'uri': uri,
-                            'error': unicode(e)})
+                            'error': str(e)})
             else:
                 name, ext = os.path.splitext(uri)
                 if ext.lower() in ('.xml', '.azp', '.apl'):
@@ -807,10 +862,10 @@ class AdveneController(object):
                         self.load_package (uri=uri, alias=alias)
                         self.log(_("Loaded %(uri)s as %(alias)s") % {
                                 'uri': uri, 'alias':  alias})
-                    except Exception, e:
+                    except Exception as e:
                         self.log(_("Cannot load package from file %(uri)s: %(error)s") % {
                                 'uri': uri,
-                                'error': unicode(e)})
+                                'error': str(e)})
                 elif ('dvd' in name
                       or ext.lower() in config.data.video_extensions):
                     # Try to load the file as a video file
@@ -852,13 +907,13 @@ class AdveneController(object):
         return True
 
     def create_annotation(self, position, type, duration=None, content=None):
-        position=long(position)
+        position=int(position)
         if position > self.cached_duration:
             return None
         id_=self.package._idgenerator.get_id(Annotation)
 
         if duration is None:
-            duration = self.cached_duration / 20
+            duration = int(self.cached_duration / 20)
         if position + duration > self.cached_duration:
             duration = self.cached_duration - position
 
@@ -879,7 +934,7 @@ class AdveneController(object):
                         # Add other keys
                         data.update(dict( (f, "") for f in sorted(el.type._fieldnames) ))
                         # Serialize
-                        content = "\n".join( "%s=%s" % (k, v) for (k, v) in data.iteritems() )
+                        content = "\n".join( "%s=%s" % (k, v) for (k, v) in data.items() )
                     except ValueError:
                         # Badly formatted data
                         content = "\n".join( "%s=" % f for f in sorted(el.type._fieldnames) ) + "\ncontent=%s" % content.replace("\n", " ")
@@ -905,15 +960,6 @@ class AdveneController(object):
         self.notify('AnnotationCreate', annotation=el)
         return el
 
-    def create_position (self, value=0, key=None, origin=None):
-        """Create a new player-specific position.
-        """
-        if key is None:
-            key=self.player.MediaTime
-        if origin is None:
-            origin=self.player.AbsolutePosition
-        return self.player.create_position(value=value, key=key, origin=origin)
-
     def notify (self, event_name, *param, **kw):
         """Notify the occurence of an event.
 
@@ -923,14 +969,11 @@ class AdveneController(object):
         will be triggered through queue_action in the application
         mainloop (main thread).
         """
-        if False:
-            print "Notify %s (%s): %s" % (
+        if config.data.debug:
+            debug_log("Notify %s (%s): %s" % (
                 event_name,
                 helper.format_time_reference(self.player.current_position_value),
-                str(kw))
-            import traceback
-            traceback.print_stack()
-            print "-" * 80
+                str(kw)))
 
         # Set the package._modified state
         # This does not really belong here, but it is the more convenient and
@@ -966,49 +1009,11 @@ class AdveneController(object):
         """
         try:
             v=self.player.sound_get_volume()
-        except Exception, e:
-            self.log(_("Cannot get audio volume: %s") % unicode(e))
+        except Exception as e:
+            self.log(_("Cannot get audio volume: %s") % str(e))
             v=0
         return v
 
-    def snapshot_taken(self, snap):
-        if snap is not None and snap.height != 0:
-            self.package.imagecache[snap.date] = helper.snapshot2png(snap)
-            self.notify('SnapshotUpdate', position=snap.date)
-
-    def update_snapshot (self, position=None):
-        """Event handler used to take a snapshot for the given position.
-
-        @return: a boolean (~desactivation)
-        """
-        if (config.data.player['snapshot']
-            and not self.package.imagecache.is_initialized (position)):
-
-            # Check if the player has async_snapshot capability.
-            async=getattr(self.player, 'async_snapshot', None)
-            if async is not None:
-                if position is None:
-                    position = self.player.current_position_value
-                if self.player.snapshot_notify is None:
-                    self.player.snapshot_notify=self.snapshot_taken
-                async(position or 0)
-                return True
-
-            # FIXME: only 0-relative position for the moment
-            # print "Update snapshot for %d" % position
-            try:
-                i = self.player.snapshot (self.player.relative_position)
-            except self.player.InternalException, e:
-                print "Exception in snapshot: %s" % e
-                return True
-            if i is not None and i.height != 0:
-                self.package.imagecache[i.date] = helper.snapshot2png (i)
-                self.notify('SnapshotUpdate', position=i.date)
-        else:
-            # FIXME: do something useful (warning) ?
-            pass
-        return True
-
     def open_url(self, url):
         """Open an URL in the most appropriate browser.
 
@@ -1021,45 +1026,7 @@ class AdveneController(object):
             return True
         if self.gui and self.gui.open_url_embedded(url):
             return True
-        if config.data.os == 'win32' or config.data.os == 'darwin':
-            # webbrowser is not broken on win32 or Mac OS X
-            webbrowser.get().open(url)
-            return True
-        # webbrowser is broken on UNIX/Linux : if the browser
-        # does not exist, it does not always launch it in the
-        # background, so it can freeze the GUI.
-        web_browser = os.getenv("BROWSER", None)
-        if web_browser == None:
-            # Try to guess if we are running a Gnome/KDE desktop
-            if os.environ.has_key('KDE_FULL_SESSION'):
-                web_browser = 'kfmclient exec'
-            elif os.environ.has_key('GNOME_DESKTOP_SESSION_ID'):
-                web_browser = 'gnome-open'
-            else:
-                term_command = os.getenv("TERMCMD", "xterm")
-                browser_list = ('xdg-open', "firefox", "firebird", "epiphany", "galeon", "mozilla", "opera", "konqueror", "netscape", "dillo", ("links", "%s -e links" % term_command), ("w3m", "%s -e w3m" % term_command), ("lynx", "%s -e lynx" % term_command), "amaya", "gnome-open")
-                breaked = 0
-                for browser in browser_list:
-                    if type(browser) == str:
-                        browser_file = browser_cmd = browser
-                    elif type(browser) == tuple and len(browser) == 2:
-                        browser_file = browser[0]
-                        browser_cmd = browser[1]
-                    else:
-                        continue
-
-                    for directory in os.getenv("PATH", "").split(os.path.pathsep):
-                        if os.path.isdir(directory):
-                            browser_path = os.path.join(directory, browser_file)
-                            if os.path.isfile(browser_path) and os.access(browser_path, os.X_OK):
-                                web_browser = browser_cmd
-                                breaked = 1
-                                break
-                    if breaked:
-                        break
-        if web_browser != None:
-            os.system("%s \"%s\" &" % (web_browser, url))
-
+        webbrowser.open(url)
         return True
 
     def get_url_for_alias (self, alias):
@@ -1068,7 +1035,7 @@ class AdveneController(object):
         # FIXME: it should be more integrated with the webserver, in
         # order to use the same BaseURL as the calling context.
         if self.server:
-            return urllib.basejoin(self.server.urlbase, "/packages/" + alias)
+            return urljoin(self.server.urlbase, "/packages/" + alias)
         else:
             return "/packages/" + alias
 
@@ -1094,10 +1061,10 @@ class AdveneController(object):
         if not url:
             return None
         if root:
-            return unicode(url)
+            return str(url)
         defaultview=self.package.getMetaData(config.data.namespace, 'default_utbv')
         if defaultview:
-            url=u"%s/view/%s" % (url, defaultview)
+            url="%s/view/%s" % (url, defaultview)
         return url
 
     def get_urlbase(self):
@@ -1113,11 +1080,13 @@ class AdveneController(object):
         """
         def trim_size(s):
             if max_size is not None and len(s) > max_size:
-                return s[:max_size]+'\u2026'
+                return s[:max_size]+helper.chars.ellipsis
             else:
                 return s
 
         def cleanup(s):
+            if not isinstance(s, str):
+                s = str(s)
             i=s.find('\n')
             if i > 0:
                 return trim_size(s[:i])
@@ -1126,7 +1095,7 @@ class AdveneController(object):
 
         if element is None:
             return _("None")
-        if isinstance(element, unicode) or isinstance(element, str):
+        if isinstance(element, str):
             return trim_size(element)
         if isinstance(element, Annotation) or isinstance(element, Relation):
             if representation is not None and representation != "":
@@ -1159,25 +1128,117 @@ class AdveneController(object):
                     r=element.id
                 return cleanup(r)
         if isinstance(element, RelationType):
-            if config.data.os == 'win32':
-                arrow=u'->'
-            else:
-                arrow=u'\u2192'
-            return arrow + unicode(cleanup(element.title))
+            arrow = helper.chars.arrow_to
+            return arrow + str(cleanup(element.title))
         if hasattr(element, 'title') and element.title:
-            return unicode(cleanup(element.title))
+            return cleanup(element.title)
         if hasattr(element, 'id') and element.id:
-            return unicode(element.id)
-        return cleanup(unicode(element))
+            return str(element.id)
+        return cleanup(str(element))
+
+    def snapshot_taken(self, snap):
+        """Callback for async-snapshot.
+
+        Keep this method as an instance method so that it is not garbage collected.
+        """
+        if snap is not None and snap.height != 0:
+            ic = self.imagecache[snap.media]
+            t = ic.round_timestamp(snap.date)
+            ic[t] = helper.snapshot2png(snap)
+            self.notify('SnapshotUpdate', position=t, media=snap.media)
+
+    def update_snapshot (self, position=None, media=None, force=False):
+        """Event handler used to take a snapshot for the given position.
+
+        @return: a boolean (~desactivation)
+       """
+        if position is None:
+            position = self.player.current_position_value
+
+        if not config.data.player['snapshot'] or position < 0:
+            return True
+
+        if media is None:
+            media == self.package.getMedia()
+
+        # Refresh not forced, check before that it is needed.
+        if not force and not self.get_snapshot(position=position, media=media, auto_update=False).is_default:
+            return True
+
+        # Check if the player has async_snapshot capability.
+        if 'async-snapshot' in self.player.player_capabilities:
+            logger.debug("Calling async_snapshot %d", position)
+            self.player.async_snapshot(position, self.snapshot_taken)
+            return True
+        elif 'snapshot' in self.player.player_capabilities:
+            # only 0-relative position for the moment
+            try:
+                i = self.player.snapshot(position)
+            except:
+                logger.exception("Exception in snapshot", exc_info=True)
+                return True
+            if i is not None and i.height != 0:
+                self.imagecache[i.media][i.date] = helper.snapshot2png(i)
+                self.notify('SnapshotUpdate', position=self.imagecache.round_timestamp(i.date), media=i.media)
+        else:
+            logger.debug("Player does not support snapshotting.")
+        return True
+
+    def round_timestamp(self, t, media=None):
+        """Round the given timestamp to the appropriate time wrt. framerate.
+        """
+        if media is None:
+            ic = self.package.imagecache
+        else:
+            ic = self.imagecache[media]
+        return ic.round_timestamp(t)
+
+    def frame2time(self, n, media=None):
+        """Convert a frame number to a time in ms.
+
+        based on the current video framerate.
+        """
+        if media is None:
+            ic = self.package.imagecache
+        else:
+            ic = self.imagecache[media]
+        return int(n * 1000 * ic.video_info['framerate'])
+
+    def get_snapshot(self, position=None, annotation=None, media=None, precision=None, auto_update=True):
+        """Return the snapshot for a given position or annotation.
+
+        If position is specified without a media, then the default
+        (current) media will be used.
+        """
+        # Determine appropriate imagecache:
+        # In any case, fallback on current imagecache if nothing is specified
+        if media:
+            # Media explicitly defined by the user
+            imagecache = self.imagecache.get(media, self.package.imagecache)
+        elif annotation is not None:
+            # Media implicitly defined by the annotation
+            media = annotation.ownerPackage.getMedia()
+            imagecache = annotation.ownerPackage.imagecache
+        else:
+            media = self.package.getMedia()
+            imagecache = self.package.imagecache
+
+        # Use annotation begin only if position was not explictly defined
+        if position is None and annotation is not None:
+            position = annotation.fragment.begin
+
+        snapshot = imagecache.get(position, precision=precision)
+        if auto_update and position >= 0 and snapshot.is_default and media == self.get_default_media():
+            self.update_snapshot(position, media=media, force=True)
+        return snapshot
 
     def get_default_media (self, package=None):
         """Return the current media for the given package.
         """
         if package is None:
-            package=self.package
+            package = self.package
 
-        mediafile = package.getMetaData (config.data.namespace,
-                                         "mediafile")
+        mediafile = package.media
         if mediafile is None or mediafile == "":
             return ""
         m=self.dvd_regexp.match(mediafile)
@@ -1190,34 +1251,35 @@ class AdveneController(object):
         else:
             mediafile=self.locate_mediafile(mediafile)
 
+        package.setMedia(mediafile)
         return mediafile
 
     def locate_mediafile(self, mediafile):
         """Locate the given media file.
         """
-        if not os.path.exists(mediafile.encode(sys.getfilesystemencoding(), 'ignore')):
+        if not os.path.exists(mediafile):
             # It is a file. It should exist. Else check for a similar
             # one in moviepath
             # UNIX/Windows interoperability: convert pathnames
             n=mediafile.replace('\\', os.sep).replace('/', os.sep)
 
-            name=unicode(os.path.basename(n))
+            name=os.path.basename(n)
             for d in config.data.path['moviepath'].split(os.pathsep):
                 if d == '_':
-                  # Get package dirname
+                    # Get package dirname
                     d=self.package.uri
                     # And convert it to a pathname (for Windows)
                     if d.startswith('file:'):
                         d=d.replace('file://', '')
-                    d=urllib.url2pathname(d)
-                    d=unicode(os.path.dirname(d), sys.getfilesystemencoding())
+                    d=urllib.request.url2pathname(d)
+                    d=os.path.dirname(d)
                 if '~' in d:
                     # Expand userdir
-                    d=unicode(os.path.expanduser(d), sys.getfilesystemencoding())
+                    d=str(os.path.expanduser(d), sys.getfilesystemencoding())
 
                 n=os.path.join(d, name)
                 # FIXME: if d is a URL, use appropriate method (urllib.??)
-                if os.path.exists(n.encode(sys.getfilesystemencoding(), 'ignore')):
+                if os.path.exists(n):
                     mediafile=n
                     self.log(_("Found matching video file in moviepath: %s") % n)
                     break
@@ -1239,21 +1301,6 @@ class AdveneController(object):
             tags.update(e.tags)
         return tags
 
-    def set_media(self, uri=None):
-        """Set the current media in the video player.
-        """
-        p=self.player
-        if isinstance(uri, unicode):
-            uri=uri.encode('utf8')
-        if p.status == p.PlayingStatus or p.status == p.PauseStatus:
-            p.stop(0)
-        p.playlist_clear()
-        if uri is not None:
-            p.playlist_add_item (uri)
-        # Reset cached_duration so that it will be updated on play
-        self.pending_duration_update = True
-        self.notify("MediaChange", uri=uri)
-
     def update_package_title(self):
         """Generate a default package title if none was set.
         """
@@ -1262,33 +1309,57 @@ class AdveneController(object):
                  or self.package.title == "Template package"
                  or self.package.title.startswith(_("Analysis of ")))
             and self.get_default_media()):
-            self.package.title = _("Analysis of ") + unicode(os.path.basename(self.get_default_media()))
+            self.package.title = _("Analysis of ") + str(os.path.basename(self.get_default_media()))
             self.notify("PackageEditEnd", package=self.package)
             return True
         else:
             return False
 
+    def set_media(self, uri=None):
+        """Set the current media in the video player.
+        """
+        p = self.player
+        if p.is_playing():
+            p.stop()
+        video_info = p.set_uri(uri)
+        # Reset cached_duration so that it will be updated on play
+        self.pending_duration_update = True
+        self.notify("MediaChange", uri=uri)
+        return video_info
+
     def set_default_media (self, uri, package=None):
         """Set the default media for the package.
         """
         if package is None:
-            package=self.package
-        m=self.dvd_regexp.match(uri)
+            package = self.package
+        m = self.dvd_regexp.match(uri)
         if m:
-            title,chapter=m.group(1,2)
+            title,chapter = m.group(1,2)
             uri="dvd@%s:%s" % (title, chapter)
-        uri=unicode(uri).encode('utf8')
-        package.setMetaData (config.data.namespace, "mediafile", uri)
+        package.setMedia(uri)
         if m:
-            uri=self.player.dvd_uri(title, chapter)
-        self.set_media(uri)
+            uri = self.player.dvd_uri(title, chapter)
+        video_info = self.set_media(uri)
+        try:
+            framerate = video_info.get('framerate_denom', 0) / video_info.get('framerate_num', 1)
+        except ZeroDivisionError:
+            framerate = 0
+        if framerate == 0:
+            framerate = 1 / config.data.prefix['default-fps']
+            logger.warn("Cannot determine video FPS. Using default value %.02f", framerate)
         # Reset the imagecache
-        self.package.imagecache=ImageCache()
-        if uri is not None and uri != "":
-            id_ = helper.mediafile2id (uri)
-            self.package.imagecache.load (id_)
-            # Update package title and description if necessary
-            self.update_package_title()
+        if uri not in self.imagecache:
+            self.imagecache[uri] = ImageCache(uri, framerate=framerate)
+            id_ = helper.mediafile2id(uri)
+            self.imagecache[uri].load(id_)
+        package.imagecache = self.imagecache[uri]
+
+        # Store video info in the ImageCache
+        video_info['framerate'] = framerate
+        package.imagecache.video_info = video_info
+
+        # Update package title and description if necessary
+        self.update_package_title()
 
     def delete_element (self, el, immediate_notify=False, batch=None, undone=False):
         """Delete an element from its package.
@@ -1394,7 +1465,7 @@ class AdveneController(object):
                 d=dict([ (r.findall(l) or [ ('_error', l) ])[0] for l in annotation.content.data.split('\n') ])
                 name="Unknown"
                 for n in ('name', 'title', 'content'):
-                    if d.has_key(n):
+                    if n in d:
                         name=d[n]
                         break
                 d['name']=name.replace('\n', '\\n')
@@ -1405,7 +1476,7 @@ class AdveneController(object):
             d.setdefault('width', 10)
             d.setdefault('height', 10)
             d.setdefault('shape', 'rect')
-            an.content.data="\n".join( [ "%s=%s" % (k, v) for k, v in d.iteritems() ] )
+            an.content.data="\n".join( [ "%s=%s" % (k, v) for k, v in d.items() ] )
         elif an.type.mimetype == 'application/x-advene-structured':
             if annotation.type.mimetype == 'text/plain':
                 an.content.data = "title=" + annotation.content.data.replace('\n', '\\n')
@@ -1508,22 +1579,66 @@ class AdveneController(object):
             # Compare fields and merge identical fields
             sdata=s.content.parsed()
             ddata=d.content.parsed()
-            for k, v in sdata.iteritems():
+            for k, v in sdata.items():
                 if k in ddata:
                     # Merge fields
                     ddata[k] = "|".join( (sdata[k], ddata[k]) )
                 else:
                     ddata[k] = sdata[k]
             # Re-encode ddata
-            d.content.data="\n".join( [ "%s=%s" % (k, unicode(v).replace('\n', '%0A')) for (k, v) in ddata.iteritems() if k != '_all' ] )
+            d.content.data="\n".join( [ "%s=%s" % (k, str(v).replace('\n', '%0A')) for (k, v) in ddata.items() if k != '_all' ] )
         elif mtd == 'application/x-advene-structured':
-            d.content.data=d.content.data + '\nmerged_content="' + urllib.quote(s.content.data)+'"'
+            d.content.data=d.content.data + '\nmerged_content="' + urllib.parse.quote(s.content.data)+'"'
         self.notify("AnnotationMerge", annotation=d,comment="Merge annotations", batch=batch_id)
         self.delete_element(s, batch=batch_id)
         self.notify("AnnotationEditEnd", annotation=d, comment="Merge annotations", batch=batch_id)
         self.notify('EditSessionEnd', element=d)
         return d
 
+    def split_package_by_type(self, atype, callback=None):
+        """Generate packages corresponding to annotations in the given annotation type.
+
+        @param atype: the annotation type used for splitting
+        @type atype: AnnotationType
+        @param callback: a callback method for progress report
+        @param callback: a function which will take as parameters (name, filename, annotation_count, index)
+        """
+        baseuri, extension = os.path.splitext(urllib.parse.unquote(self.package.uri))
+        for index, segment in enumerate(sorted(atype.annotations)):
+            # Create a new package
+            p = Package(uri="new_pkg", source=None)
+            p._idgenerator = advene.core.idgenerator.Generator(p)
+            differ = Differ(self.package, p, self)
+            # Copy its structure
+            for name, s, d, action in differ.diff_structure():
+                try:
+                    action(s, d)
+                except:
+                    logger.error("Error when splitting package (%s)", name, exc_info=True)
+            # Copy relevant annotations (contained in segment)
+            count = 0
+            for a in self.package.annotations:
+                if segment.fragment.begin < a.fragment.end and segment.fragment.end > a.fragment.begin:
+                    differ.copy_annotation(a)
+                    count += 1
+            # Copy package metadata
+            differ.update_meta(self.package, p, 'advenetool', 'duration')
+            differ.update_meta(self.package, p, 'advenetool', 'mediafile')
+            differ.update_meta(self.package, p, 'advenetool', 'tag_colors')
+            differ.update_meta(self.package, p, 'dc', 'title')
+            differ.update_meta(self.package, p, 'dc', 'creator')
+            differ.update_meta(self.package, p, 'dc', 'description')
+            p.date = self.get_timestamp()
+
+            title = self.get_title(segment)
+            fname = "%s-split-%03d-%s%s" % (baseuri, index + 1, helper.title2id(title), extension)
+            p.save(fname)
+            if callback:
+                if not callback(title, fname, count, index + 1):
+                    # Action was cancelled
+                    return
+            logger.info("Saving %s with %d annotations.", fname, count)
+
     def select_player(self, p):
         """Activate the given player.
         """
@@ -1534,33 +1649,50 @@ class AdveneController(object):
             # The old player was a recorder. Chances are that we
             # recorded something. In this case, set the default_media
             # to the recorded file path.
-            l=self.player.playlist_get_list()
-            if l and not self.get_default_media():
-                self.set_default_media(l[0])
+            uri = self.player.get_uri()
+            if uri and not self.get_default_media():
+                self.set_default_media(uri)
 
         # Start the new one
         self.player=p()
-        if not 'record' in p.player_capabilities:
+        if 'record' not in p.player_capabilities:
             # Store the selected player if it is not a recorder.
             config.data.player['plugin']=p.player_id
         self.notify('PlayerChange', player=p)
         mediafile = self.get_default_media()
-        if mediafile != "":
-            self.set_media(mediafile)
+        self.set_media(mediafile)
 
     def restart_player (self):
         """Restart the media player."""
         self.player.restart_player ()
         mediafile = self.get_default_media()
-        if mediafile != "":
-            self.set_media(mediafile)
+        self.set_media(mediafile)
         self.notify('PlayerChange', player=self.player)
 
     def get_timestamp(self):
         """Return a formatted timestamp for the current date.
         """
-        return time.strftime("%Y-%m-%d")
+        return datetime.datetime.now().replace(microsecond=0).isoformat()
 
+    def get_tag_color_for_element(self, element):
+        """Given an element, return a color based on tags set.
+        """
+        try:
+            tags = element.tags
+        except AttributeError:
+            return None
+        try:
+            d = element.rootPackage._tag_colors
+        except AttributeError:
+            return None
+        for t in tags:
+            try:
+                return d[t]
+            except KeyError:
+                pass
+        return None
+
+    STATIC_STRING_RE = re.compile('string:[^$]*')
     def get_element_color(self, element, metadata='color'):
         """Return the color for the given element.
 
@@ -1576,18 +1708,45 @@ class AdveneController(object):
         'color' metadata of the container (annotation-type for
         annotations, schema for types).
         """
+
+        def shortcut_evaluateValue(element, expr):
+            """Optimized version of evaluateValue
+
+            Common expressions (static strings, here/tag_color
+            expression) are evaluated without using the AdveneContext.
+            """
+            val = None
+
+            if not expr:
+                return None
+
+            if self.STATIC_STRING_RE.match(expr):
+                # Static value.
+                return expr[7:]
+
+            if expr == u'here/tag_color':
+                return self.get_tag_color_for_element(element)
+
+            if val is None:
+                # Previous shortcuts did not work. Go the slow way
+                # through a AdveneContext evaluation
+                logger.debug("unoptimized evaluation - %s", expr)
+                c = self.build_context(here=element)
+                try:
+                    val = c.evaluateValue(expr)
+                except Exception:
+                    logger.debug("Exception in color evaluation for %s", exc_info=True)
+                    val = None
+            return val
+
         # First try the 'color' metadata from the element itself.
-        color=None
+        color = None
         try:
-            col=element.getMetaData(config.data.namespace, metadata)
+            expr = element.getMetaData(config.data.namespace, metadata)
         except AttributeError:
             return None
-        if col:
-            c=self.build_context(here=element)
-            try:
-                color=c.evaluateValue(col)
-            except Exception:
-                color=None
+        if expr:
+            color = shortcut_evaluateValue(element, expr)
 
         if not color:
             # Not found in element. Try item_color from the container.
@@ -1598,16 +1757,12 @@ class AdveneController(object):
             else:
                 container=None
             if container:
-                col=container.getMetaData(config.data.namespace, 'item_color')
-                if col:
-                    c=self.build_context(here=element)
-                    try:
-                        color=c.evaluateValue(col)
-                    except Exception:
-                        color=None
+                expr = container.getMetaData(config.data.namespace, 'item_color')
+                if expr:
+                    color = shortcut_evaluateValue(element, expr)
                 if not color:
                     # Really not found. So use the container color.
-                    color=self.get_element_color(container)
+                    color = self.get_element_color(container)
         return color
 
     def load_package (self, uri=None, alias=None, activate=True):
@@ -1626,10 +1781,10 @@ class AdveneController(object):
             try:
                 self.package = Package (uri="new_pkg",
                                         source=config.data.advenefile(config.data.templatefilename))
-            except Exception, e:
+            except Exception as e:
                 self.log(_("Cannot find the template package %(filename)s: %(error)s")
                          % {'filename': config.data.advenefile(config.data.templatefilename),
-                            'error': unicode(e)})
+                            'error': str(e)})
                 alias='new_pkg'
                 self.package = Package (alias, source=None)
             self.package.author = config.data.userid
@@ -1648,7 +1803,7 @@ class AdveneController(object):
                 if node.tag == tag('package'):
                     u=node.attrib['uri']
                     a=node.attrib['alias']
-                    d=node.attrib.has_key('default')
+                    d='default' in node.attrib
                     self.load_package(u, a, activate=False)
                     if d:
                         default_alias=a
@@ -1659,19 +1814,24 @@ class AdveneController(object):
                 self.activate_package(default_alias)
             return
         else:
-            t=time.time()
-            p = Package(uri=uri)
-            dur=time.time()-t
+            t = time.time()
+            try:
+                p = Package (uri=uri)
+            except Exception:
+                logger.error("Cannot load package %s", uri, exc_info=True)
+                return
+            dur = time.time() - t
             self.log("Loaded package in %f seconds" % dur)
             # Check if the imported package was found. Else it will
             # fail when accessing elements...
+            imp = []
             for i in p.imports:
                 try:
-                    imp=i.package
-                except Exception, e:
+                    imp.append(i.package)
+                except Exception as e:
                     raise Exception(_("Cannot read the imported package %(uri)s: %(error)s") % {
                             'uri': i.uri,
-                            'error': unicode(e)})
+                            'error': str(e)})
             self.package=p
 
         if alias is None:
@@ -1685,7 +1845,8 @@ class AdveneController(object):
         # letting the user specify a valid alias.
         alias = re.sub('[^a-zA-Z0-9_]', '_', alias)
 
-        self.package.imagecache=ImageCache()
+        # This will initialize the package imagecache
+        self.set_default_media(self.package.getMedia(), self.package)
         self.package._idgenerator = advene.core.idgenerator.Generator(self.package)
         self.package._modified = False
 
@@ -1717,7 +1878,7 @@ class AdveneController(object):
         duration = self.package.getMetaData (config.data.namespace, "duration")
         if duration is not None:
             try:
-                v=long(float(duration))
+                v=int(float(duration))
                 self.pending_duration_update = False
             except ValueError:
                 v=0
@@ -1731,13 +1892,13 @@ class AdveneController(object):
         # stricter wrt. namespaces. Fix common problems.
         for q in self.package.queries:
             if 'http://liris.cnrs.fr/advene/ruleset' in q.content.data:
-                print "Fixing query", q.id
+                logger.debug("Fixing query %s", q.id)
                 q.content.data = q.content.data.replace('http://liris.cnrs.fr/advene/ruleset',
                                                         config.data.namespace)
         for v in self.package.views:
             if (v.content.mimetype == 'application/x-advene-ruleset'
                 and '<ruleset>' in v.content.data):
-                print "Fixing view ", v.id
+                logger.debug("Fixing view %s", v.id)
                 v.content.data = v.content.data.replace('<ruleset>',
                                                         '<ruleset xmlns="http://experience.univ-lyon1.fr/advene/ns/advenetool">')
 
@@ -1768,7 +1929,7 @@ class AdveneController(object):
         """
         # If we load a new file and only the template package was present,
         # then remove the template package
-        if len(self.packages) <= 2 and 'new_pkg' in self.packages.keys():
+        if len(self.packages) <= 2 and 'new_pkg' in self.packages:
             self.unregister_package('new_pkg')
         self.packages[alias] = package
         self.aliases[package] = alias
@@ -1807,18 +1968,14 @@ class AdveneController(object):
 
         # Reset the cached duration
         duration = self.package.getMetaData (config.data.namespace, "duration")
-        self.cached_duration = long(float(duration or 0))
+        self.cached_duration = int(float(duration or 0))
         if not self.cached_duration:
             self.pending_duration_update = True
 
         mediafile = self.get_default_media()
-        if mediafile is not None and mediafile != "":
-            if self.player.is_active():
-                if mediafile not in self.player.playlist_get_list ():
-                    # Update the player playlist
-                    self.set_media(mediafile)
-        else:
-            self.set_media(None)
+        if mediafile != self.player.get_uri():
+            # Update the player info
+            self.set_media(mediafile)
 
         # Activate the default STBV
         default_stbv = self.package.getMetaData (config.data.namespace, "default_stbv")
@@ -1849,7 +2006,7 @@ class AdveneController(object):
             return ET.QName(config.data.namespace, i)
 
         root=ET.Element(tag('package-list'))
-        for a, p in self.packages.iteritems():
+        for a, p in self.packages.items():
             if a == 'advene' or a == 'new_pkg':
                 # Do not write the default or template package
                 continue
@@ -1857,9 +2014,9 @@ class AdveneController(object):
             if a == self.current_alias:
                 n.attrib['default']=''
 
-        f=open(name, 'w')
+        f=open(name, 'w', encoding='utf-8')
         helper.indent(root)
-        ET.ElementTree(root).write(f, encoding='utf-8')
+        ET.ElementTree(root).write(f, encoding='unicode')
         f.close()
         return True
 
@@ -1875,28 +2032,28 @@ class AdveneController(object):
             p=self.packages[alias]
 
         if name is None:
-            name=p.uri
+            name=urllib.parse.unquote(p.uri)
         old_uri = p.uri
 
         # Handle tag_colors
         # Parse tag_colors attribute.
         self.package.setMetaData (config.data.namespace,
                                   "tag_colors",
-                                  urllib.urlencode(self.package._tag_colors))
+                                  urllib.parse.urlencode(self.package._tag_colors))
 
         # Check if we know the stream duration. If so, save it as
         # package metadata
         d=self.cached_duration
         if d > 0:
             p.setMetaData (config.data.namespace,
-                           "duration", unicode(d))
+                           "duration", str(d))
 
         if p == self.package:
             # Set if necessary the mediafile metadata
             if self.get_default_media() == "":
-                pl = self.player.playlist_get_list()
-                if pl and pl[0]:
-                    self.set_default_media(pl[0])
+                uri = self.player.get_uri()
+                if uri:
+                    self.set_default_media(uri)
 
         p.save(name=name)
         p._modified = False
@@ -1939,15 +2096,14 @@ class AdveneController(object):
             # Load the imagecache
             id_ = helper.mediafile2id (mediafile)
             p.imagecache.load (id_)
-            # Populate the missing keys
+            # Populate imagecache for defined annotations
             for a in p.annotations:
-                p.imagecache.init_value (a.fragment.begin)
-                p.imagecache.init_value (a.fragment.end)
+                self.get_snapshot(annotation=a)
 
         # Handle 'auto-import' meta-attribute
         master_uri=p.getMetaData(config.data.namespace, 'auto-import')
         if master_uri:
-            i=[ p for p in p.imports if p.getUri(absolute=False) == master_uri ]
+            i=[ pk for pk in p.imports if pk.getUri(absolute=False) == master_uri ]
             if not i:
                 self.log(_("Cannot handle master attribute, the package %s is not imported.") % master_uri)
             else:
@@ -1963,7 +2119,7 @@ class AdveneController(object):
             uris=[ e.uri for e in getattr(p, source) ]
             for e in getattr(i, source):
                 if not e.uri in uris:
-                    print "Missing %s: importing it" % str(e)
+                    logger.info("Missing %s: importing it" % str(e))
                     helper.import_element(p, e, self, notify=False)
         return True
 
@@ -2066,10 +2222,10 @@ class AdveneController(object):
         @param msg: the message
         @type msg: string
         """
-        if self.gui:
+        try:
             self.gui.log(msg, level)
-        else:
-            print unicode(msg).encode('utf-8')
+        except AttributeError:
+            print(str(msg))
 
     def message_log (self, context, parameters):
         """Event Handler for the message action.
@@ -2081,7 +2237,7 @@ class AdveneController(object):
         @param parameters: the parameters (should have a 'message' one)
         @type parameters: dict
         """
-        if parameters.has_key('message'):
+        if 'message' in parameters:
             message=context.evaluateValue(parameters['message'])
         else:
             message="No message..."
@@ -2097,10 +2253,10 @@ class AdveneController(object):
                 end=self.event_handler.dump()
                 import difflib
                 diff=difflib.Differ()
-                print "-----------"
+                logger.debug("-----------")
                 for l in diff.compare(start, end):
-                    print l
-                print "-----------"
+                    logger.debug(l)
+                logger.debug("-----------")
             self.event_handler.reset_queue()
             self.event_handler.clear_state()
             self.event_handler.update_rulesets()
@@ -2120,15 +2276,11 @@ class AdveneController(object):
             for tr in self.tracers:
                 tr.equeue.put(tr.exit_code)
                 tr.join()
-            # Terminate the VLC server
+            # Terminate the video player
             try:
-                #print "Exiting vlc player"
                 self.player.exit()
-            except Exception, e:
-                import traceback
-                s=StringIO.StringIO()
-                traceback.print_exc (file = s)
-                self.log(_("Got exception %s when stopping player.") % str(e), s.getvalue())
+            except:
+                logger.error(_("Got exception when stopping player."), exc_info=True)
             self.cleanup_done = True
         return True
 
@@ -2140,26 +2292,9 @@ class AdveneController(object):
         p=self.player
         if p.status == p.PlayingStatus:
             self.update_status('pause')
-        self.move_position (int(1000 * number_of_frames / config.data.preferences['default-fps']), notify=False)
+        self.update_status("seek_relative", self.frame2time(number_of_frames), notify=False)
         return True
 
-    def move_position (self, value, relative=True, notify=True):
-        """Helper method : fast forward or rewind by value milliseconds.
-
-        @param value: the offset in milliseconds
-        @type value: int
-        """
-        if relative:
-            self.update_status ("set", self.create_position (value=value,
-                                                             key=self.player.MediaTime,
-                                                             origin=self.player.RelativePosition),
-                                notify=notify)
-        else:
-            self.update_status ("set", self.create_position (value=value,
-                                                             key=self.player.MediaTime,
-                                                             origin=self.player.AbsolutePosition),
-                                notify=notify)
-
     def update_status (self, status=None, position=None, notify=True):
         """Update the player status.
 
@@ -2174,8 +2309,8 @@ class AdveneController(object):
         if isinstance(position, Annotation):
             position = position.fragment.begin
         position_before=self.player.current_position_value
-        #print "update status:", status, position
-        if (status == 'set' or status == 'start' or status == 'stop'):
+        logger.debug("update status: %s %s", status, position)
+        if (status == 'seek' or status == 'start' or status == 'stop'):
             if position != position_before:
                 self.reset_annotation_lists()
             if notify:
@@ -2188,30 +2323,16 @@ class AdveneController(object):
             # to be taken *before* moving
             self.update_snapshot(position_before)
         try:
-            # if hasattr(position, 'value'):
-            #     print "update_status %s %i" % (status, position.value)
-            # else:
-            #     print "update_status %s %s" % (status, position)
-            if self.player.playlist_get_list() or 'record' in self.player.player_capabilities:
-                self.player.update_status (status, position)
+            if self.player.get_uri() or 'record' in self.player.player_capabilities:
+                self.player.update_status(status, position)
                 for p in self.slave_players:
                     p.update_status(status, position)
                 # Update the destination screenshot
-                if hasattr(position, 'value'):
-                    # It is a player.Position. Do a simple conversion
-                    # (which will fail in many cases)
-                    if position.origin == self.player.RelativePosition:
-                        position = self.player.current_position_value + position.value
-                    elif position.origin == self.player.ModuloPosition:
-                        position = (self.player.current_position_value + position.value) % self.player.stream_duration
-                    else:
-                        position=position.value
                 self.update_snapshot(position)
-        except Exception, e:
+        except Exception:
             # FIXME: we should catch more specific exceptions and
             # devise a better feedback than a simple print
-            import traceback
-            self.log(_("Raised exception in update_status: %s") % traceback.format_exc())
+            logger.error(_("Video player problem"), exc_info=True)
         en=self.status2eventname.get(status, None)
         if en and notify:
             self.notify (en,
@@ -2233,9 +2354,9 @@ class AdveneController(object):
         """
         try:
             self.player.position_update ()
-        except self.player.InternalException, e:
-            # The server is down. Restart it.
-            print "Restarting player...", str(e)
+        except:
+            # The player is down. Restart it.
+            logger.info("Restarting player...", exc_info=True)
             self.player_restarted += 1
             if self.player_restarted > 5:
                 raise Exception (_("Unable to start the player."))
@@ -2248,7 +2369,7 @@ class AdveneController(object):
         """
         p=self.player
         if p.status == p.PauseStatus and 'frame-by-frame' in p.player_capabilities:
-            self.update_status("set", pos, notify=True)
+            self.update_status("seek", pos, notify=True)
         return False
 
     def player_delayed_scrub(self, pos):
@@ -2268,7 +2389,7 @@ class AdveneController(object):
         if p.status == p.PauseStatus and 'frame-by-frame' in p.player_capabilities:
             if self.scrub_lastvalue is None:
                 # Not in a scrubbing state.
-                gobject.timeout_add(250, do_scrub)
+                GObject.timeout_add(250, do_scrub)
             self.scrub_lastvalue = pos
 
         return True
@@ -2305,18 +2426,20 @@ class AdveneController(object):
         active = []
 
         for a in self.package.annotations:
-            if a.fragment.begin >= position:
-                future_begins.append( (a, a.fragment.begin, a.fragment.end) )
-                future_ends.append( (a, a.fragment.begin, a.fragment.end) )
-            elif a.fragment.end >= position:
-                future_ends.append( (a, a.fragment.begin, a.fragment.end) )
+            begin = a.fragment.begin
+            end = a.fragment.end
+            if begin >= position:
+                future_begins.append( (a, begin, end) )
+                future_ends.append( (a, begin, end) )
+            elif end >= position:
+                future_ends.append( (a, begin, end) )
                 active.append(a)
         future_begins.sort(key=operator.itemgetter(1))
         future_ends.sort(key=operator.itemgetter(2))
 
-        #print "Position: %s" % helper.format_time(position)
-        #print "Begins: %s\nEnds: %s" % ([ a[0].id for a in future_begins[:4] ],
-        #                                [ a[0].id for a in future_ends[:4] ])
+        #logger.debug("Position: %s" % helper.format_time(position))
+        #logger.debug("Begins: %s\nEnds: %s" % ([ a[0].id for a in future_begins[:4] ],
+        #                                [ a[0].id for a in future_ends[:4] ]))
         return future_begins, future_ends, active
 
     def reset_annotation_lists (self):
@@ -2375,16 +2498,15 @@ class AdveneController(object):
 
         if self.future_begins is None or self.future_ends is None:
             self.future_begins, self.future_ends, self.active_annotations = self.generate_sorted_lists(pos)
-            #print "New lists", [a.id for a in self.active_annotations], [t[0].id for t in self.future_begins ]
+            #logger.debug("New lists %s %s", [a.id for a in self.active_annotations], [t[0].id for t in self.future_begins ])
 
-        if self.future_begins and (p.status == p.PlayingStatus or p.status == p.PauseStatus):
+        if self.future_begins and p.is_playing():
             a, b, e = self.future_begins[0]
-            #print "Future begin", a.id, b, pos
+            #logger.debug("Future begin %s %d %d", a.id, b, pos)
             while b <= pos:
                 # Ignore if we were after the annotation end
                 self.future_begins.pop(0)
                 if e > pos:
-                    #print "AnnotationBegin", a.id, e, pos
                     self.notify ("AnnotationBegin",
                                  annotation=a,
                                  immediate=True)
@@ -2394,10 +2516,9 @@ class AdveneController(object):
                 else:
                     break
 
-        if self.future_ends and (p.status == p.PlayingStatus or p.status == p.PauseStatus):
+        if self.future_ends and p.is_playing():
             a, b, e = self.future_ends[0]
             while e <= pos:
-                #print "Comparing %d < %d for %s" % (e, pos, a.content.data)
                 try:
                     self.active_annotations.remove(a)
                 except ValueError:
@@ -2416,11 +2537,11 @@ class AdveneController(object):
             # length movie.  The "+ 2000" is here to make sure that we
             # do not spend our time updating, since it could be a live
             # stream played/recorded.
-            self.cached_duration=long(p.stream_duration)
+            self.cached_duration=int(p.stream_duration)
             self.notify('DurationUpdate', duration=self.cached_duration)
         # Update the cached duration if necessary
         elif self.pending_duration_update and p.stream_duration > 0:
-            self.cached_duration=long(p.stream_duration)
+            self.cached_duration=int(p.stream_duration)
             self.notify('DurationUpdate', duration=self.cached_duration)
             self.pending_duration_update = False
 
@@ -2495,7 +2616,7 @@ class AdveneController(object):
         ctx=self.build_context(here=element)
         try:
             stream=open(filename, 'wb')
-        except Exception, e:
+        except Exception as e:
             self.log(_("Cannot export to %(filename)s: %(e)s") % locals())
             return True
 
@@ -2505,22 +2626,22 @@ class AdveneController(object):
             compiler.parseTemplate (filter.content.stream, 'utf-8')
             if filter.content.mimetype == 'text/plain':
                 # Convert HTML entities to their values
-                output = StringIO.StringIO()
+                output = io.BytesIO()
             else:
                 output = stream
             try:
                 compiler.getTemplate ().expand (context=ctx, outputFile=output, outputEncoding='utf-8')
-            except simpleTALES.ContextContentException, e:
-                self.log(_("Error when exporting: %s") % unicode(e))
+            except simpleTALES.ContextContentException:
+                logger.error(_("Error when exporting text template"), exc_info=True)
             if filter.content.mimetype == 'text/plain':
-                stream.write(output.getvalue().replace('<', '<').replace('>', '>').replace('&', '&'))
+                stream.write(output.getvalue().replace(b'<', b'<').replace(b'>', b'>').replace(b'&', b'&'))
         else:
             compiler = simpleTAL.XMLTemplateCompiler ()
             compiler.parseTemplate (filter.content.stream)
             try:
                 compiler.getTemplate ().expand (context=ctx, outputFile=stream, outputEncoding='utf-8', suppressXMLDeclaration=True)
-            except simpleTALES.ContextContentException, e:
-                self.log(_("Error when exporting: %s") % unicode(e))
+            except simpleTALES.ContextContentException:
+                logger.error(_("Error when exporting XML template"), exc_info=True)
         stream.close()
         self.log(_("Data exported to %s") % filename)
         return True
@@ -2534,11 +2655,7 @@ class AdveneController(object):
 if __name__ == '__main__':
     cont = AdveneController()
     try:
-        cont.main ()
-    except Exception, e:
-        print "Got exception %s. Stopping services..." % str(e)
-        import code
-        e, v, tb = sys.exc_info()
-        code.traceback.print_exception (e, v, tb)
-        cont.on_exit ()
-        print "*** Exception ***"
+        cont.self_loop()
+    except Exception:
+        logger.error("Got exception %s. Stopping services...", exc_info=True)
+        cont.on_exit()
diff --git a/lib/advene/core/idgenerator.py b/lib/advene/core/idgenerator.py
index 958a776..a960976 100644
--- a/lib/advene/core/idgenerator.py
+++ b/lib/advene/core/idgenerator.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -49,7 +49,7 @@ class Generator:
     def __init__(self, package=None):
         self.last_used={}
         self.existing=[]
-        for k in self.prefix.keys():
+        for k in self.prefix:
             self.last_used[k]=0
         if package is not None:
             self.init(package)
@@ -74,7 +74,7 @@ class Generator:
 
     def init(self, package):
         """Initialize the indexes for the given package."""
-        prefixes=self.prefix.values()
+        prefixes=list(self.prefix.values())
         re_id = re.compile("^(" + "|".join(prefixes) + ")([0-9]+)")
         last_id={}
         for k in prefixes:
@@ -89,7 +89,7 @@ class Generator:
                 self.existing.append(i)
                 m=re_id.match(i)
                 if m:
-                    n=long(m.group(2))
+                    n=int(m.group(2))
                     k=m.group(1)
                     if last_id[k] < n:
                         last_id[k] = n
diff --git a/lib/advene/core/imagecache.py b/lib/advene/core/imagecache.py
index 5b40287..145f7fb 100644
--- a/lib/advene/core/imagecache.py
+++ b/lib/advene/core/imagecache.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,10 +19,14 @@
 """
 Imagecache module for advene
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import advene.core.config as config
 import operator
 
+from collections import defaultdict
+import math
 import os
 import re
 
@@ -30,45 +34,54 @@ class CachedString:
     """String cached in a file.
     """
     def __init__(self, filename):
-        self._filename=filename
-        self.contenttype='text/plain'
-        ts=re.findall('(\d+).png$', filename)
+        self._filename = filename
+        self.contenttype = 'text/plain'
+        self.is_default = False
+        ts = re.findall('(\d+).png$', filename)
         if ts:
-            self.timestamp=long(ts[0])
+            self.timestamp = int(ts[0])
         else:
-            self.timestamp=-1
+            self.timestamp = -1
 
-    def __str__(self):
+    def size(self):
+        return os.path.getsize(self._filename)
+
+    def __bytes__(self):
         try:
-            f=open(self._filename, 'rb')
-            data=f.read()
-            f.close()
-            return data
+            with open(self._filename, 'rb') as f:
+                return f.read()
         except (IOError, OSError):
-            return ''
+            return b''
 
     def __repr__(self):
         return "Cached content from " + self._filename
 
-class TypedString(str):
+class TypedString(bytes):
     """String with a mimetype and a timestamp attribute.
     """
-    def __new__(cls, value=""):
-        s=str.__new__(cls, value)
-        s.contenttype='text/plain'
-        s.timestamp=-1
+    def __new__(cls, value=b""):
+        s = bytes.__new__(cls, value)
+        s.contenttype = 'text/plain'
+        s.timestamp = -1
+        s.is_default = False
         return s
 
-class ImageCache(dict):
+    def size(self):
+        return len(self)
+
+    def __bytes__(self):
+        return self
+
+class ImageCache(object):
     """ImageCache class.
 
     It interacts with the player to return annotation snapshots. It approximates
-    key values to a given precision (20 by default).
+    key values to a given precision (20ms by default).
 
     @ivar not_yet_available_image: the image returned for not-yet-captured images
     @type not_yet_available_image: PNG data
-    @ivar epsilon: the precision for key values
-    @type epsilon: integer
+    @ivar precision: the precision for key values
+    @type precision: integer
     @ivar _modified: the modified status of the cache
     @type _modified: boolean
     @ivar name: id of the ImageCache (used when saving)
@@ -78,57 +91,87 @@ class ImageCache(dict):
     """
     # The content of the not_yet_available_file file. We could use
     # CachedString but as it is frequently used, let us keep it in memory.
-    f=open(config.data.advenefile( ( 'pixmaps', 'notavailable.png' ) ), 'rb')
-    not_yet_available_image = TypedString(f.read(10000))
-    f.close()
-    not_yet_available_image.contenttype='image/png'
-    not_yet_available_image.timestamp=-1
+    with open(config.data.advenefile( ( 'pixmaps', 'notavailable.png' ) ), 'rb') as f:
+        not_yet_available_image = TypedString(f.read(10000))
+    not_yet_available_image.contenttype = 'image/png'
+    not_yet_available_image.timestamp = -1
+    not_yet_available_image.is_default = True
 
-    def __init__ (self, name=None, epsilon=35):
+    def __init__ (self, uri=None, name=None, precision=20, framerate=None):
         """Initialize the Imagecache
 
+        @param uri: URI of the media file
+        @type uri: string
         @param name: id of a previously saved ImageCache.
         @type name: string
-        @param epsilon: value of the precision
-        @type epsilon: integer
+        @param precision: value of the precision
+        @type precision: integer
         """
         # It is a dictionary whose keys are the positions
-        # (in ms) and values the snapshot in PNG format.
+        # (in ms) and values the snapshot in PNG format. We store only
         # value = self.not_yet_available_image if the image has
         # not yet been updated.
-        dict.__init__ (self)
+        self.uri = uri
+
+        self._dict = defaultdict(lambda: self.not_yet_available_image)
 
         self._modified=False
 
         self.name=None
+
+        if framerate is None:
+            framerate = 1 / config.data.prefix['default-fps']
+            logger.warn("No framerate given. Using default value %.02f", framerate)
+        self.framerate = framerate
+
         # If autosync, then data will automatically be stored on disk
         # (provided that self.name is properly initialized)
         self.autosync=False
 
-        self.epsilon = epsilon
+        self.precision = precision
         if name is not None:
             self.load (name)
 
-    def init_value (self, key):
-        """Initialize a key if needed.
+    def round_timestamp(self, t_in_ms):
+        """Round the given timestamp to the appropriate value based on framerate.
 
-        @param key: the tested key
-        @type key: long
+        We assume a constant frame rate encoding. So
+        math.ceil(t/1000/framerate) returns the frame number (starting
+        at 1). We multiply it by framerate again to get the time of
+        the end of the frame. We substract .1 framerate to ask the
+        player to get just before the end of the frame.
+
+        Since we deal with ms, return an integer.
         """
-        if key is None:
-            return
-        if not dict.has_key (self, key):
-            dict.__setitem__(self, key, self.not_yet_available_image)
+        return int(self.framerate * (1000 * math.ceil(t_in_ms / 1000 / self.framerate) - 0.5))
 
-    def has_key (self, key):
+    def approximate (self, key, precision=None):
+        """Return an approximate key value for key.
+
+        If there is an existing key no further than precision, then return it.
+        Else, initialize data for key and return key.
+        """
         if key is None:
-            return True
-        try:
-            self.approximate(key)
-            return True
-        except ValueError:
-            return False
-        return False
+            return None
+        key = self.round_timestamp(key)
+        if key in self._dict or precision == 0:
+            return key
+
+        if precision is None:
+            precision = self.precision
+        best = min( ((pos, abs(pos - key))
+                     for pos in self._dict.keys()
+                     if abs(pos - key) <= precision),
+                    key=operator.itemgetter(1),
+                    default=(key, 0) )
+        #logger.debug("approximate %d (%d) -> %d", key, precision or 0, best[0])
+        return best[0]
+
+    def clear(self):
+        self._dict.clear()
+
+    def __contains__(self, key):
+        return self.round_timestamp(key) in self._dict
 
     def __getitem__ (self, key):
         """Return a snapshot for the image corresponding to the position pos.
@@ -140,13 +183,21 @@ class ImageCache(dict):
         @return: an image
         @rtype: PNG data
         """
-        if key is None:
+        if key is None or key < 0:
             return self.not_yet_available_image
-        key = self.approximate(key)
-        return dict.__getitem__(self, key)
+        return self._dict.get(self.round_timestamp(key), self.not_yet_available_image)
 
-    def get(self, key, epsilon=None):
-        """Return a snapshot for the image corresponding to the position pos.
+    def __delitem__(self, key):
+        self._dict.__delitem__(key)
+
+    def __iter__(self):
+        return self._dict.__iter__()
+
+    def __len__(self):
+        return self._dict.__len__()
+
+    def get(self, key, precision=None):
+        """Return a snapshot for the image corresponding to the position pos with a given precision.
 
         The snapshot can be ImageCache.not_yet_available_image.
 
@@ -155,10 +206,13 @@ class ImageCache(dict):
         @return: an image
         @rtype: PNG data
         """
-        if key is None:
+        if key is None or key < 0:
             return self.not_yet_available_image
-        key = self.approximate(key, epsilon)
-        return dict.__getitem__(self, key)
+        if precision:
+            key = self.approximate(key, precision)
+        else:
+            key = self.round_timestamp(key)
+        return self._dict.get(key, self.not_yet_available_image)
 
     def __setitem__ (self, key, value):
         """Set the snapshot for the image corresponding to the position key.
@@ -170,58 +224,28 @@ class ImageCache(dict):
         """
         if key is None:
             return value
+        key = self.round_timestamp(key)
         if value != self.not_yet_available_image:
-            self._modified=True
             if self.autosync and self.name is not None:
-                d=os.path.join(config.data.path['imagecache'], self.name)
+                d = os.path.join(config.data.path['imagecache'], self.name)
                 if not os.path.isdir(d):
                     os.mkdir (d)
-                filename=os.path.join(d, "%010d.png" % key)
-                f = open(filename, 'wb')
-                f.write (value)
-                f.close ()
-                value=CachedString(filename)
-                value.contenttype='image/png'
-            elif isinstance(value, basestring):
-                value=TypedString(value)
-                value.timestamp=key
-                value.contenttype='image/png'
-            return dict.__setitem__(self, key, value)
+                filename = os.path.join(d, "%010d.png" % key)
+                with open(filename, 'wb') as f:
+                    f.write (value)
+                value = CachedString(filename)
+                value.contenttype = 'image/png'
+            elif isinstance(value, (str, bytes)):
+                self._modified = True
+                value = TypedString(value)
+                value.timestamp = key
+                value.contenttype = 'image/png'
+            self._dict[key] = value
+            return value
         else:
             return self.not_yet_available_image
 
-    def approximate (self, key, epsilon=None):
-        """Return an approximate key value for key.
-
-        If there is an existing key no further than self.epsilon, then return it.
-        Else, initialize data for key and return key.
-        """
-        if key is None:
-            return None
-        key=long(key)
-        if dict.has_key(self, key) and dict.__getitem__(self, key) != self.not_yet_available_image:
-            return key
-
-        if epsilon is None:
-            epsilon=self.epsilon
-        valids = [ (pos, abs(pos-key))
-                   for pos in self.keys()
-                   if abs(pos - key) <= epsilon
-                   and dict.__getitem__(self, pos) != self.not_yet_available_image ]
-        valids.sort(key=operator.itemgetter(1))
-
-        if valids:
-            key = valids[0][0]
-#            print "Approximate key: %d (%d)" % valids[0]
-#            if len(valids) > 1:
-#                print "Imagecache: more than 1 valid snapshot for %d: %s" % (key,
-#                                                                              valids)
-        else:
-            self.init_value (key)
-
-        return key
-
-    def invalidate(self, key, epsilon=None):
+    def invalidate(self, key, precision=None):
         """Invalidate the given key.
 
         This method is used when the player has some trouble getting
@@ -229,44 +253,16 @@ class ImageCache(dict):
         """
         if key is None:
             return
-        if epsilon is None:
-            epsilon=self.epsilon
-        key = self.approximate(key, epsilon)
-        if dict.__getitem__(self, key) != self.not_yet_available_image:
-            dict.__setitem__(self, key, self.not_yet_available_image)
+        key = self.round_timestamp(key)
+        del self._dict[key]
         return key
 
-    def missing_snapshots (self):
-        """Return a list of positions of missing snapshots.
-
-        @return: a list of keys
-        """
-        return [ pos
-                 for pos in self.keys()
-                 if dict.__getitem__(self, pos) == self.not_yet_available_image ]
-
     def valid_snapshots (self):
         """Return the list of positions of valid snapshots.
 
         @return: a list of keys
         """
-        return [ pos
-                 for pos in self.keys()
-                 if dict.__getitem__(self, pos) != self.not_yet_available_image ]
-
-    def is_initialized (self, key, epsilon=None):
-        """Return True if the given key is initialized.
-
-        @return: True if the given key is initialized.
-        @rtype: boolean
-        """
-        if key is None:
-            return False
-        key = self.approximate(key, epsilon)
-        if dict.__getitem__(self, key) == self.not_yet_available_image:
-            return False
-        else:
-            return True
+        return list(self._dict.keys())
 
     def save (self, name):
         """Save the content of the cache under a specified name (id).
@@ -296,8 +292,7 @@ class ImageCache(dict):
             else:
                 os.mkdir (d)
 
-        for k in self.iterkeys():
-            i=dict.__getitem__(self, k)
+        for k, i in self._dict.items():
             if i == self.not_yet_available_image:
                 continue
             if isinstance(i, CachedString):
@@ -331,28 +326,55 @@ class ImageCache(dict):
                         n=n.lstrip('0')
                         if n == '':
                             n=0
-                        i=long(n)
+                        i=int(n)
                     except ValueError:
-                        print "Invalid filename in imagecache: " + name
+                        logger.error("Invalid filename in imagecache: %s", name)
                         continue
                     s=CachedString(os.path.join (d, name))
                     s.contenttype='image/png'
-                    dict.__setitem__(self, i, s)
+                    self._dict[i] = s
         self._modified=False
 
+    def stats(self):
+        memory_size = 0
+        memory_count = 0
+        disk_size = 0
+        disk_count = 0
+        for s in self._dict.values():
+            if isinstance(s, TypedString):
+                memory_count += 1
+                memory_size += s.size()
+            elif isinstance(s, CachedString):
+                disk_count += 1
+                disk_size += s.size()
+
+        stats = {
+            'count': len(self._dict),
+            'memory_count': memory_count,
+            'memory_size': memory_size,
+            'memory_size_mb': memory_size / 1024 / 1024,
+            'disk_count': disk_count,
+            'disk_size': disk_size,
+            'disk_size_mb': disk_size / 1024 / 1024,
+        }
+        return stats
+
+    def stats_repr(self):
+        return "%(count)d values. Memory: %(memory_count)d (%(memory_size_mb).02f MB) - Disk: %(disk_count)d (%(disk_size_mb).02f MB)" % self.stats()
+
     def reset(self):
         """Reset imagecache.
         """
-        for pos in self.keys():
-            dict.__setitem__(self, pos, self.not_yet_available_image)
+        for pos in self._dict:
+            self._dict[pos] = self.not_yet_available_image
 
-    def ids (self):
+    def ids(self):
         """Return the list of currents ids.
         """
-        return [ str(k) for k in self.keys () ]
+        return [ str(k) for k in self._dict ]
 
-    def __str__ (self):
-        return "ImageCache object (%d images)" % len(self)
+    def __str__(self):
+        return "ImageCache object (%d images)" % len(self._dict)
 
-    def __repr__ (self):
-        return "ImageCache object (%d images)" % len(self)
+    def __repr__(self):
+        return "ImageCache object (%d images)" % len(self._dict)
diff --git a/lib/advene/core/mediacontrol.py b/lib/advene/core/mediacontrol.py
index f54596d..79e760c 100644
--- a/lib/advene/core/mediacontrol.py
+++ b/lib/advene/core/mediacontrol.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,11 +18,10 @@
 #
 """Player factory.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import advene.core.config as config
-import os
-
-from gettext import gettext as _
 
 class PlayerFactory:
     def __init__(self):
@@ -33,7 +32,7 @@ class PlayerFactory:
         """
         if p is None:
             p=config.data.player['plugin']
-        print "mediacontrol: using %s" % p
+        logger.warn("mediacontrol: using %s", p)
         # vlcnative is deprecated and has been removed.
         if p == 'vlcnative':
             p = 'vlcctypes'
@@ -52,18 +51,18 @@ class PlayerFactory:
             elif p == 'quicktime':
                 import advene.player.quicktime as playermodule
             else:
-                print "Fallback to dummy module"
+                logger.warn("Fallback to dummy module")
                 import advene.player.dummy as playermodule
-        except ImportError, e:
+        except ImportError as e:
             if p != 'gstreamer':
-                print "Cannot import %(player)s mediaplayer: %(error)s.\nTrying gstreamer player." % {
+                logger.warn("Cannot import %(player)s mediaplayer: %(error)s.\nTrying gstreamer player." % {
                     'player': p,
-                    'error': str(e) }
+                    'error': str(e) })
                 return self.get_player('gstreamer')
             else:
-                print "Cannot import %(player)s mediaplayer: %(error)s.\nUsing dummy player." % {
+                logger.warn("Cannot import %(player)s mediaplayer: %(error)s.\nUsing dummy player." % {
                     'player': p,
-                    'error': str(e) }
+                    'error': str(e) })
                 import advene.player.dummy as playermodule
 
         return playermodule.Player()
diff --git a/lib/advene/core/plugin.py b/lib/advene/core/plugin.py
index 324e174..140884c 100755
--- a/lib/advene/core/plugin.py
+++ b/lib/advene/core/plugin.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,8 +19,18 @@
 """Plugin loader.
 
 """
+import logging
+logger = logging.getLogger(__name__)
+
+try:
+    # Python >= 3.5
+    from importlib.util import spec_from_file_location, module_from_spec
+    import_method='new'
+except ImportError:
+    # Python 3.3/3.4
+    from importlib.machinery import SourceFileLoader
+    import_method='old'
 
-import imp
 import os
 import inspect
 import zipfile
@@ -60,9 +70,8 @@ class PluginCollection(list):
                 except (PluginException, OSError):
                     # Silently ignore non-plugin files
                     pass
-                except (ImportError, SyntaxError, AttributeError), e:
-                    print "!!!! Cannot load %s plugin" % fname
-                    print unicode(e)
+                except (ImportError, SyntaxError, AttributeError):
+                    logger.error("!!!! Cannot load %s plugin", fname, exc_info=True)
 
     def standard_plugins(self, d):
         for name in os.listdir(d):
@@ -114,14 +123,17 @@ class Plugin(object):
             self._plugin=zi.load_module(fname.replace('/', os.sep))
         else:
             name, ext = os.path.splitext(fname)
-            if ext == '.py':
-                f=open(fullname, 'r')
-                self._plugin = imp.load_source('_'.join( (prefix, name) ), fullname, f )
-                f.close()
-            elif ext == '.pyc':
-                f=open(fullname, 'r')
-                self._plugin = imp.load_compiled('_'.join( (prefix, name) ), fullname, f )
-                f.close()
+            if not ext == '.py' or ext == '.pyc':
+                logger.error("%s is not a python file", fullname)
+                raise PluginException("%s is not a plugin" % fullname)
+
+            module_name = '_'.join((prefix, name))
+            if import_method == 'new':
+                self._spec = spec_from_file_location(module_name, fullname)
+                self._plugin = module_from_spec(self._spec)
+                self._spec.loader.exec_module(self._plugin)
+            else:
+                self._plugin = SourceFileLoader(module_name, fullname).load_module()
 
         # Is this really a plugin ?
         if not hasattr(self._plugin, 'name') or not hasattr(self._plugin, 'register'):
@@ -146,7 +158,7 @@ class Plugin(object):
         return "Plugin %s" % name
 
 if __name__ == '__main__':
+    logging.basicConfig(level=logging.DEBUG)
     l = PluginCollection('plugins')
     for p in l:
-        print p, ":", ",".join([ str(c) for c in p._classes ])
-
+        logger.warn("%s : %s", p, ",".join([ str(c) for c in p._classes ]))
diff --git a/lib/advene/core/version.py b/lib/advene/core/version.py
index e5273e0..5cacffb 100644
--- a/lib/advene/core/version.py
+++ b/lib/advene/core/version.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,7 +19,6 @@
 """Versioning information.
 """
 
-version='1.1'
-date='20140709'
-svn=''
-major,minor=[ long(s) for s in version.split('.') ]
+version='3.4'
+date='20171012'
+major,minor=[ int(s) for s in version.split('.') ]
diff --git a/lib/advene/core/webcherry.py b/lib/advene/core/webcherry.py
index 8cad4b7..894fdbd 100644
--- a/lib/advene/core/webcherry.py
+++ b/lib/advene/core/webcherry.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -31,6 +31,8 @@ URL syntax
   (typically the C{advene} GUI).  In all cases, Webserver depends on
   AdveneController.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import advene.core.config as config
 import advene.core.version
@@ -38,7 +40,7 @@ import advene.core.version
 import sys
 import os
 import re
-import urllib
+import urllib.request, urllib.parse, urllib.error
 import cgi
 import socket
 import imghdr
@@ -74,9 +76,9 @@ class Common:
         """
         err = sys.exc_info()
         if DEBUG:
-            print "Error handling"
-            import traceback, StringIO
-            bodyFile = StringIO.StringIO()
+            logger.error("Error handling", exc_info=True)
+            import traceback, io
+            bodyFile = io.StringIO()
             traceback.print_exc(file = bodyFile)
             cherrypy.response.status=500
             cherrypy.response.headers['Content-type']='text/html'
@@ -96,8 +98,8 @@ class Common:
         @return: a HTML string
         @rtype: string
         """
-        s = urllib.splittag(
-            urllib.splitquery(cherrypy.request.path_info)[0]
+        s = urllib.parse.splittag(
+            urllib.parse.splitquery(cherrypy.request.path_info)[0]
             )[0]
         path = s.split('/')[1:]
         return """<a href="/">/</a>""" + "/".join(
@@ -157,7 +159,7 @@ class Common:
             self.no_cache ()
 
         res=[]
-        if mode == "navigation":
+        if mode == "navigation" and mimetype.startswith('text/'):
             res.append("""<html><head><title>%s</title><link rel="stylesheet" type="text/css" href="/data/advene.css" />""" % title)
             if head_section is not None:
                 res.append(head_section)
@@ -175,10 +177,10 @@ class Common:
             """) % { 'locationbar': self.location_bar (),
                      'path': cherrypy.request.path_info } )
 
-        if duplicate_title and mode == 'navigation':
-            res.append("<h1>%s</h1>\n" % title)
+            if duplicate_title:
+                res.append("<h1>%s</h1>\n" % title)
 
-        return "".join(res)
+        return res or b''
 
     def send_no_content(self):
         """Sends a No Content (204) response.
@@ -243,7 +245,7 @@ class Common:
         @return: the content-type if o is an image, else None
         @rtype: string
         """
-        res=imghdr.what (None, str(o))
+        res=imghdr.what (None, bytes(o))
         if res is not None:
             return "image/%s" % res
         else:
@@ -260,7 +262,6 @@ class Common:
         if self.controller.player == None:
             res.append(_("""<h1>No available mediaplayer</h1>"""))
         else:
-            l = self.controller.player.playlist_get_list ()
             self.controller.update_status ()
             res.append(_("""
             <h1>Current STBV: %(currentstbv)s</h1>
@@ -268,30 +269,27 @@ class Common:
             <h1>Player status</h1>
             <table border="1">
             <tr>
+            <td>Current media</td><td>%(uri)s</td>
             <td>Current position</td><td>%(position)s</td>
             <td>Duration</td><td>%(duration)s</td>
             <td>Player status</td><td>%(status)s</td>
             </tr>
             </table>
             """) % {
-                    'currentstbv': str(self.controller.current_stbv),
-                    'position': helper.format_time(self.controller.player.current_position_value),
-                    'duration': helper.format_time(self.controller.player.stream_duration),
-                    'status': repr(self.controller.player.status)
-                    })
-
-            if len(l) == 0:
-                res.append (_("""<h1>No playlist</h1>"""))
-            else:
-                res.append (_("""<h1>Current playlist</h1>
-                <ul>%s</ul>""") % ("\n<li>".join ([ str(i) for i in l ])))
-                res.append (_("""
-                <form action="/media/play" method="GET">
-                Starting pos: <input type="text" name="position" value="0">
-                <input type="submit" value="Play">
-                </form>
-                <a href="/media/stop">Stop</a> | <a href="/media/pause">Pause</a><br>
-                """))
+                'uri': self.controller.player.get_uri() or _("No media file"),
+                'currentstbv': str(self.controller.current_stbv),
+                'position': helper.format_time(self.controller.player.current_position_value),
+                'duration': helper.format_time(self.controller.player.stream_duration),
+                'status': repr(self.controller.player.status)
+            })
+
+            res.append (_("""
+            <form action="/media/play" method="GET">
+            Starting pos: <input type="text" name="position" value="0">
+            <input type="submit" value="Play">
+            </form>
+            <a href="/media/stop">Stop</a> | <a href="/media/pause">Pause</a><br>
+            """))
             res.append (_("""<hr />
             <form action="/media/load" method="GET">
             Add a new file (<em>dvd</em> to play a DVD):
@@ -389,14 +387,14 @@ class Media(Common):
     def load(self, **params):
         """Load a media file.
         """
-        if params.has_key ('filename'):
+        if 'filename' in params:
             name = params['filename']
             res=[]
             if name == 'dvd':
                 name=self.controller.player.dvd_uri(1, 1)
             self.controller.queue_action(self.controller.set_media, name)
             res.append(_("File added"))
-            res.append(_("""<p><strong>%s has been added to the playlist</strong></p>""") % name)
+            res.append(_("""<p><strong>%s has been loaded.</strong></p>""") % name)
             res.append(self.display_media_status ())
         return "".join(res)
     load.exposed=True
@@ -409,22 +407,22 @@ class Media(Common):
         if not args:
             res.append(self.start_html (_("Access to packages snapshots"), duplicate_title=True, mode='navigation'))
             res.append ("<ul>")
-            for alias in self.controller.packages.keys ():
+            for alias in self.controller.packages:
                 res.append ("""<li><a href="/media/snapshot/%s">%s</a></li>""" % (alias, alias))
             res.append("</ul>")
             return "".join(res)
         alias = args[0]
         try:
-            i = self.controller.packages[alias].imagecache
+            p = self.controller.packages[alias]
         except KeyError:
             return self.send_error(400, _("Unknown package alias"))
 
         try:
-            position=long(args[1])
+            position=int(args[1])
         except IndexError:
             # No position was given. Display all available snapshots
             res.append(self.start_html (_("Available snapshots for %s") % alias, duplicate_title=True, mode='navigation'))
-            if (params.has_key('mode') and params['mode'] == 'inline'):
+            if params.get('mode', None) == 'inline':
                 template="""<li><a href="/media/snapshot/%(alias)s/%(position)d"><img src="/media/snapshot/%(alias)s/%(position)d" /></a></li>"""
                 res.append ("""<p><a href="/media/snapshot/%s">Display with no inline images</a></p>""" % alias)
             else:
@@ -432,10 +430,10 @@ class Media(Common):
                 res.append (_("""<p><a href="/media/snapshot/%s?mode=inline">Display with inline images</a></p>""") % alias)
             res.append ("<ul>")
 
-            k = i.keys ()
+            k = list(p.imagecache.keys())
             k.sort ()
             for position in k:
-                if i.is_initialized (position):
+                if position in p.imagecache:
                     m = _("Done")
                 else:
                     m = _("Pending")
@@ -445,13 +443,9 @@ class Media(Common):
             res.append ("</ul>")
             return "".join(res)
 
-        if not i.is_initialized (position):
-            self.no_cache ()
-            if 'async-snapshot' in self.controller.player.player_capabilities:
-                self.controller.queue_action(self.controller.update_snapshot, position)
-        snapshot=i[position]
+        snapshot = self.controller.get_snapshot(position, media=p.media)
         cherrypy.response.headers['Content-type']=snapshot.contenttype
-        res.append (str(snapshot))
+        res.append (bytes(snapshot))
         return res
     snapshot.exposed=True
 
@@ -471,7 +465,7 @@ class Media(Common):
         if not args:
             res.append(self.start_html (_("Access to packages snapshots"), duplicate_title=True, mode='navigation'))
             res.append ("<ul>")
-            for alias in self.controller.packages.keys ():
+            for alias in self.controller.packages:
                 res.append ("""<li><a href="/media/snapshot/%s">%s</a></li>""" % (alias, alias))
             res.append("</ul>")
             return "".join(res)
@@ -498,7 +492,7 @@ class Media(Common):
             path.extend(args[2:])
             path='/'.join(path)
             ctx=self.controller.build_context(here=a)
-            svg_data=unicode( ctx.evaluateValue(path) )
+            svg_data=ctx.evaluateValue(path)
         elif 'svg' in a.content.mimetype:
             # Overlay svg
             svg_data=a.content.data
@@ -511,7 +505,7 @@ class Media(Common):
         else:
             img=snapshot
         cherrypy.response.headers['Content-type']='image/png'
-        res.append (str(img))
+        res.append (img)
         return res
     overlay.exposed=True
 
@@ -524,12 +518,12 @@ class Media(Common):
         - position: the position in ms
         """
         c=self.controller
-        if params.has_key('stbv'):
+        if 'stbv' in params:
             self.activate_stbvid(params['stbv'])
-        if params.has_key ('filename'):
+        if 'filename' in params:
             c.queue_action(c.set_media, params['filename'])
 
-        if not c.player.playlist_get_list():
+        if not c.player.get_uri():
             return self.send_no_content()
 
         if begin is None:
@@ -537,10 +531,7 @@ class Media(Common):
                 begin=params['position']
             except KeyError:
                 begin=0
-        pos=c.create_position (value=long(begin),
-                               key=c.player.MediaTime,
-                               origin=c.player.AbsolutePosition)
-        c.queue_action( c.update_status, "start", pos )
+        c.queue_action(c.update_status, "start", int(begin))
         return self.send_no_content()
     play.exposed=True
 
@@ -550,7 +541,7 @@ class Media(Common):
         Optional parameters:
         - stbv: the id of the dynamic view that should be activated
         """
-        if params.has_key('stbv'):
+        if 'stbv' in params:
             self.activate_stbvid(params['stbv'])
         self.controller.queue_action(self.controller.update_status, 'pause')
         return self.send_no_content()
@@ -562,7 +553,7 @@ class Media(Common):
         Optional parameters:
         - stbv: the id of the dynamic view that should be activated
         """
-        if params.has_key('stbv'):
+        if 'stbv' in params:
             self.activate_stbvid(params['stbv'])
         self.controller.queue_action(self.controller.update_status, 'stop')
         return self.send_no_content()
@@ -574,7 +565,7 @@ class Media(Common):
         Optional parameters:
         - stbv: the id of the dynamic view that should be activated
         """
-        if params.has_key('stbv'):
+        if 'stbv' in params:
             self.activate_stbvid(params['stbv'])
         self.controller.queue_action(self.controller.update_status, 'resume')
         return self.send_no_content()
@@ -584,17 +575,13 @@ class Media(Common):
         """Return the currently playing movie file.
         """
         cherrypy.response.headers['Content-type']='text/plain'
-        l=self.controller.player.playlist_get_list()
-        if l:
-            return l[0]
-        else:
-            return 'N/C'
+        return self.controller.player.get_uri() or 'N/C'
     current.exposed=True
 
     def stbv(self, *args, **query):
         """Activate the given stbv.
         """
-        if not args and not query.has_key('id'):
+        if not args and 'id' not in query:
             cherrypy.response.headers['Content-Type']='text/plain'
             return self.controller.current_stbv.id or 'None'
         else:
@@ -606,9 +593,9 @@ class Media(Common):
                 stbvid=None
             try:
                 self.activate_stbvid(stbvid)
-            except Exception, e:
+            except Exception as e:
                 return self.send_error(400, _("Cannot activate stbvid %(stbvid)s: %(error)s") % { 'stbvid': stbvid,
-                                                                                           'error': unicode(e) })
+                                                                                           'error': str(e) })
             return self.send_redirect("/application/")
 
     stbv.exposed=True
@@ -676,7 +663,7 @@ class Application(Common):
         else:
             res.append(_("""<p>Opened adhoc views: %s</p>""") % ", ".join([ v.view_name for v in c.gui.adhoc_views]))
             res.append(_("""<p>Available adhoc views:</p><ul>"""))
-            l=c.gui.registered_adhoc_views.keys()
+            l=list(c.gui.registered_adhoc_views)
             l.sort()
             for name in l:
                 view=c.gui.registered_adhoc_views[name]
@@ -724,9 +711,9 @@ class Application(Common):
             try:
                 self.activate_stbvid(stbvid)
                 return self.send_redirect("/application/")
-            except Exception, e:
+            except Exception as e:
                 self.send_error(400, _("Cannot activate stbvid %(stbvid)s: %(error)s") % { 'stbvid': stbvid,
-                                                                                           'error': unicode(e) })
+                                                                                           'error': str(e) })
     stbv.exposed=True
 
     def adhoc(self, view=None, arg=None, **query):
@@ -808,9 +795,9 @@ class Application(Common):
         elif cherrypy.request.method == 'PUT':
             data=cherrypy.request.rfile.read()
             # Convert the type.
-            if isinstance(v, int) or isinstance(v, long):
+            if isinstance(v, int):
                 try:
-                    data=long(data)
+                    data=int(data)
                 except ValueError:
                     return self.send_error(500, _("Invalid value"))
             config.data.web[name]=data
@@ -969,7 +956,7 @@ class Admin(Common):
         </form>
         </body></html>
         """) % { 'packagelist': " | ".join( ['<a href="/packages/%s">%s</a>' % (alias, alias)
-                                             for alias in self.controller.packages.keys() ] ),
+                                             for alias in self.controller.packages] ),
                  'displaymode': mode_sw })
         return "".join(res)
     index.exposed=True
@@ -986,7 +973,7 @@ class Admin(Common):
         l=[ os.path.join(config.data.path['data'], n)
             for n in os.listdir(config.data.path['data'])
             if n.lower().endswith('.xml') or n.lower().endswith('.azp') ]
-        l.sort(lambda a, b: cmp(a.lower(), b.lower()))
+        l.sort(key=lambda a: a.lower())
         for uri in l:
             name, ext = os.path.splitext(uri)
             alias = re.sub('[^a-zA-Z0-9_]', '_', os.path.basename(name))
@@ -1020,7 +1007,7 @@ class Admin(Common):
                 self.start_html (_("Package %s loaded") % alias, duplicate_title=True, mode='navigation'),
                 _("""<p>Go to the <a href="/packages/%(alias)s">%(alias)s</a> package, or to the <a href="/packages">package list</a>.""") % { 'alias': alias }
                 ))
-        except Exception, e:
+        except Exception as e:
             return self.send_error(501, _("""<p>Cannot load package %(alias)s : %(error)s</p>""" % {
                         'alias': alias,
                         'error': str(e) }))
@@ -1035,7 +1022,7 @@ class Admin(Common):
                 self.start_html (_("Package %s deleted") % alias, duplicate_title=True, mode='navigation'),
                 _("""<p>Go to the <a href="/packages">package list</a>.""")
                 ))
-        except Exception, e:
+        except Exception as e:
             return self.send_error(501, _("""<p>Cannot delete package %(alias)s : %(error)s</p>""" % {
                         'alias': alias,
                         'error': str(e) }
@@ -1056,7 +1043,7 @@ class Admin(Common):
                 self.start_html (_("Package %s saved") % alias, duplicate_title=True, mode='navigation'),
                 _("""<p>Go to the <a href="/packages/%(alias)s">%(alias)s</a> package, or to the <a href="/packages">package list</a>.""") % { 'alias': alias }
                 ))
-        except Exception, e:
+        except Exception as e:
             return self.send_error(501, _("""<p>Cannot save package %(alias)s : %(error)s</p>""" % {
                         'alias': alias,
                         'error': str(e) }
@@ -1076,7 +1063,7 @@ class Admin(Common):
         res=[ self.start_html (_('Available TALES methods'), duplicate_title=True, mode='navigation') ]
         res.append('<ul>')
         c=self.controller.build_context(here=None)
-        k=c.methods.keys()
+        k=list(c.methods)
         k.sort()
         for name in k:
             descr=c.methods[name].__doc__
@@ -1126,7 +1113,7 @@ class Packages(Common):
         <th>Annotations</th>
         </tr>
         """))
-        for alias in self.controller.packages.keys():
+        for alias in self.controller.packages:
             p = self.controller.packages[alias]
             res.append (_("""<tr>
             <td><a href="/packages/%(alias)s">%(alias)s</a></td>
@@ -1196,14 +1183,14 @@ class Packages(Common):
         context.setLocal('request', query)
         # FIXME: the following line is a hack for having qname-keys work
         #        It is a hack because obviously, p is not a "view"
-        context.setLocal (u'view', p)
+        context.setLocal ('view', p)
 
         try:
             objet = context.evaluateValue (expr)
-        except AdveneException, e:
-            self.start_html (_("Error"), duplicate_title=True, mode='navigation')
-            res.append (_("""The TALES expression %s is not valid.""") % tales)
-            res.append (unicode(e.args[0]).encode('utf-8'))
+        except AdveneException as e:
+            self.start_html(_("Error"), duplicate_title=True, mode='navigation')
+            res.append(_("""The TALES expression %s is not valid.""") % tales)
+            res.append(str(e.args[0]))
             return
 
         displaymode = self.controller.server.displaymode
@@ -1212,18 +1199,19 @@ class Packages(Common):
         # with a content-type method : if it is HTML, we return it normally ;
         # if it is some other thing, we return it with the correct content-type
         # header).
-        if query.has_key('mode'):
+        if 'mode' in query:
             displaymode = query['mode']
             del (query['mode'])
-        if isinstance(objet, str) and self.image_type (objet) is not None:
+        if isinstance(objet, bytes) and self.image_type (objet) is not None:
             displaymode = 'image'
 
+        logger.debug("DPE: display mode %s", displaymode)
         if displaymode == 'image':
             # Return an image, so build the correct headers
             try:
                 mimetype=expr.contenttype
             except AttributeError:
-                mimetype=self.image_type(str(objet))
+                mimetype=self.image_type(objet)
             if 'imagecache' in expr and 'async-snapshot' in self.controller.player.player_capabilities:
                 # Probably an image from the imagecache. Check if it
                 # is initialized, else ask if possible for update.
@@ -1232,26 +1220,26 @@ class Packages(Common):
                     # Non-initialized snapshot. Ask for update.
                     ts=re.findall('imagecache/(\d+)', expr)
                     if ts:
-                        self.controller.queue_action(self.controller.update_snapshot, long(ts[0]))
+                        self.controller.queue_action(self.controller.update_snapshot, int(ts[0]))
             cherrypy.response.status=200
             cherrypy.response.headers['Content-type']=mimetype
             self.no_cache ()
 
-            res.append (str(objet))
-            return "".join(res)
+            res.append(objet)
+            return res
         elif displaymode == 'content':
             if hasattr(objet, 'mimetype'):
                 cherrypy.response.status=200
                 cherrypy.response.headers['Content-type']=objet.mimetype
                 self.no_cache ()
                 res.append (objet.data)
-                return "".join(res)
+                return res
             elif hasattr(objet, 'contenttype'):
                 cherrypy.response.status=200
                 cherrypy.response.headers['Content-type']=objet.contenttype
                 self.no_cache ()
-                res.append (objet)
-                return "".join(res)
+                res.append(objet)
+                return res
             else:
                 return self.send_error (404, _("Content mode not available on non-content data"))
 
@@ -1260,22 +1248,22 @@ class Packages(Common):
         if displaymode != "raw":
             displaymode = "navigation"
 
+        logger.debug("DPE display content %s", displaymode)
         # Display content
         if hasattr (objet, 'view') and callable (objet.view):
 
+            logger.debug("DPE callable view")
             context = self.controller.build_context(here=objet, alias=alias)
             context.pushLocals()
             context.setLocal('request', query)
             # FIXME: should be default view
-            context.setLocal(u'view', objet)
+            context.setLocal('view', objet)
             try:
-                v=objet.view (context=context)
-                res.append( self.start_html(mimetype=v.contenttype) )
-                if v.contenttype.startswith('text'):
-                    res.append (unicode(v).encode('utf-8'))
-                else:
-                    res.append(v)
-            except simpletal.simpleTAL.TemplateParseException, e:
+                v=objet.view(context=context)
+                #import pdb;pdb.set_trace()
+                res.append(self.start_html(mimetype=v.contenttype, mode=displaymode))
+                res.append(v)
+            except simpletal.simpleTAL.TemplateParseException as e:
                 res.append( self.start_html(_("Error")) )
                 res.append(_("<h1>Error</h1>"))
                 res.append(_("""<p>There was an error in the template code.</p>
@@ -1283,21 +1271,21 @@ class Packages(Common):
                 <p>Error message: <em>%(message)s</em></p>""") % {
                         'tagname': cgi.escape(e.location),
                         'message': e.errorDescription} )
-                return "".join(res)
-            except simpleTALES.ContextContentException, e:
+                return res
+            except simpleTALES.ContextContentException as e:
                 res.append( self.start_html(_("Error")) )
                 res.append(_("<h1>Error</h1>"))
                 res.append(_("""<p>An invalid character is in the Context:</p>
                 <p>Error message: <em>%(error)s</em></p><pre>%(message)s</pre>""")
                                  % {'error': e.errorDescription,
-                                    'message': unicode(e.args[0]).encode('utf-8')})
-                return "".join(res)
-            except AdveneException, e:
+                                    'message': str(e.args[0]).encode('utf-8')})
+                return res
+            except AdveneException as e:
                 res.append( self.start_html(_("Error")) )
                 res.append(_("<h1>Error</h1>"))
                 res.append(_("""<p>There was an error in the TALES expression.</p>
-                <pre>%s</pre>""") % cgi.escape(unicode(e.args[0]).encode('utf-8')))
-                return "".join(res)
+                <pre>%s</pre>""") % cgi.escape(str(e.args[0]).encode('utf-8')))
+                return res
         else:
             mimetype=None
             try:
@@ -1308,16 +1296,17 @@ class Packages(Common):
                 except AttributeError:
                     pass
             try:
-                res.append( self.start_html(mimetype=mimetype) )
-                if mimetype and mimetype.startswith('text'):
-                    res.append (unicode(objet).encode('utf-8'))
+                logger.debug("DPE object display %s", type(objet))
+                res.append( self.start_html(mimetype=mimetype, mode=displaymode) )
+                if isinstance(objet, str):
+                    res.append(objet.encode('utf-8'))
                 else:
-                    res.append(str(objet))
-            except AdveneException, e:
+                    res.append(objet)
+            except AdveneException as e:
                 res.append(_("<h1>Error</h1>"))
                 res.append(_("""<p>There was an error.</p>
-                <pre>%s</pre>""") % cgi.escape(unicode(e.args[0]).encode('utf-8')))
-            except simpletal.simpleTAL.TemplateParseException, e:
+                <pre>%s</pre>""") % cgi.escape(str(e.args[0]).encode('utf-8')))
+            except simpletal.simpleTAL.TemplateParseException as e:
                 res.append(_("<h1>Error</h1>"))
                 res.append(_("""<p>There was an error in the template code.</p>
                 <p>Tag name: <strong>%(tagname)s</strong></p>
@@ -1381,7 +1370,7 @@ class Packages(Common):
                     'expression': tales ,
                     'uri': p.uri,
                     'value': cgi.escape(str(type(objet)))})
-        return "".join(res)
+        return res
 
     def default(self, *args, **query):
         """Access a specific package.
@@ -1415,7 +1404,7 @@ class Packages(Common):
                                     % pkgid)
 
         # Handle form parameters (from the navigation interface)
-        if query.has_key('view'):
+        if 'view' in query:
             if query['view'] != '':
                 # The 'view' parameter is in fact the new path
                 # that we should redirect to
@@ -1425,7 +1414,7 @@ class Packages(Common):
                 # the view field will exist but be empty, so delete it
                 del(query['view'])
 
-        if query.has_key('path'):
+        if 'path' in query:
             # Append the given path to the current URL
             p="/".join( (cherrypy.url(), query['path']) )
             if query['path'].find ('..') != -1:
@@ -1435,8 +1424,8 @@ class Packages(Common):
                 location = p
             else:
                 location = "%s?%s" % (p,
-                                      "&".join (["%s=%s" % (k,urllib.quote(query[k]))
-                                                 for k in query.keys()]))
+                                      "&".join (["%s=%s" % (k,urllib.parse.quote(query[k]))
+                                                 for k in list(query)]))
             return self.send_redirect (location)
 
         tales = "/".join (args[1:])
@@ -1448,9 +1437,10 @@ class Packages(Common):
         elif cherrypy.request.method != 'GET':
             return self.send_error(400, 'Unknown method: %s' % cherrypy.request.method)
 
+        logger.debug("Evaluating %s", tales)
         try:
             return self.display_package_element (p , tales, query)
-        except simpletal.simpleTAL.TemplateParseException, e:
+        except simpletal.simpleTAL.TemplateParseException as e:
             res=[ self.start_html(_("Error")) ]
             res.append(_("<h1>Error</h1>"))
             res.append(_("""<p>There was an error in the template code.</p>
@@ -1458,11 +1448,11 @@ class Packages(Common):
             <p>Error message: <em>%(message)s</em></p>""") % {
                         'tagname': cgi.escape(e.location),
                         'message': e.errorDescription })
-        except AdveneException, e:
+        except AdveneException as e:
             res=[ self.start_html(_("Error")) ]
             res.append(_("<h1>Error</h1>"))
             res.append(_("""<p>There was an error in the expression.</p>
-            <pre>%s</pre>""") % cgi.escape(unicode(e.args[0]).encode('utf-8')))
+            <pre>%s</pre>""") % cgi.escape(str(e.args[0]).encode('utf-8')))
         except:
             # FIXME: should use standard Cherrypy error handling.
             t, v, tr = sys.exc_info()
@@ -1475,11 +1465,11 @@ class Packages(Common):
             %(traceback)s</pre>""") % {
                     'expr': tales,
                     'package': pkgid,
-                    'type': unicode(tales),
-                    'value': unicode(v),
+                    'type': str(tales),
+                    'value': str(v),
                     'traceback': "\n".join(code.traceback.format_tb (tr)) })
 
-        return "".join(res)
+        return res
     default.exposed=True
 
     def handle_put_request(self, *args, **query):
@@ -1603,13 +1593,13 @@ class Packages(Common):
 
         try:
             objet = context.evaluateValue (expr)
-        except Exception, e:
-            return self.send_error(501, _("<h1>Error</h1>") + unicode(e.args[0]).encode('utf-8'))
+        except Exception as e:
+            return self.send_error(501, _("<h1>Error</h1>") + str(e.args[0]).encode('utf-8'))
         try:
             objet.__setattr__(attribute, data)
             cherrypy.response.status=200
             return _("Value successfuly updated")
-        except Exception, e:
+        except Exception as e:
             return self.send_error(501, _("Unable to update the attribute %(attribute)s for element %(element)s: %(error)s." ) % { 'attribute': attribute, 'element': objet, 'error': e })
 
     def handle_post_request(self, *args, **query):
@@ -1773,8 +1763,8 @@ class Packages(Common):
         if query['action'] == 'update':
             try:
                 objet = context.evaluateValue (expr)
-            except Exception, e:
-                return self.send_error(501, _("<h1>Error</h1>") + unicode(e.args[0]).encode('utf-8'))
+            except Exception as e:
+                return self.send_error(501, _("<h1>Error</h1>") + str(e.args[0]).encode('utf-8'))
             if hasattr(objet, attribute):
                 objet.__setattr__(attribute, data)
                 if 'redirect' in query and query['redirect']:
@@ -1884,11 +1874,11 @@ class Packages(Common):
                 try:
                     v = objet.createView(**kw)
                     objet.views.append(v)
-                except Exception, e:
+                except Exception as e:
                     return self.send_error(500,
                                            _("<p>Error while creating view %(id)s</p><pre>%(error)s</pre>") % {
                             'id': kw['ident'],
-                            'error': unicode(e).encode('utf-8') })
+                            'error': str(e).encode('utf-8') })
 
                 if 'redirect' in query and query['redirect']:
                     return self.send_redirect(query['redirect'])
@@ -1908,7 +1898,7 @@ class Packages(Common):
                 # member2 = second member (annotation id)
                 # data = content data (optional)
                 for k in ('relationtype', 'member1', 'member2'):
-                    if not query.has_key(k):
+                    if k not in query:
                         return self.send_error(500, _("Missing %s parameter") % k)
                 rt = context.evaluateValue("here/relationTypes/%s" % query['relationtype'])
                 if rt is None:
@@ -1935,8 +1925,8 @@ class Packages(Common):
                     relation.content.data=data
                     objet.relations.append(relation)
                     self.controller.notify("RelationCreate", relation=relation)
-                except Exception, e:
-                    query['error']=unicode(e).encode('utf-8')
+                except Exception as e:
+                    query['error']=str(e).encode('utf-8')
                     return self.send_error(500, _("<p>Error while creating relation between %(member1)s and %(member2)s :</p><pre>%(error)s</pre>") % query)
                 if 'redirect' in query and query['redirect']:
                     return self.send_redirect(query['redirect'])
@@ -1957,15 +1947,15 @@ class Packages(Common):
                 except KeyError:
                     id_ = objet._idgenerator.get_id(Annotation)
                 try:
-                    begin=long(query['begin'])
-                    end=long(query['end'])
+                    begin=int(query['begin'])
+                    end=int(query['end'])
                     fragment=MillisecondFragment(begin=begin, end=end)
                     a=objet.createAnnotation(ident=id_, type=at, fragment=fragment)
                     objet._idgenerator.add(id_)
                     a.content.data = data
                     objet.annotations.append(a)
                     self.controller.notify("AnnotationCreate", annotation=a)
-                except Exception, e:
+                except Exception as e:
                     t, v, tr = sys.exc_info()
                     import code
                     return self.send_error(500, _("""<p>Error while creating annotation of type %(type)s :<pre>
@@ -1973,8 +1963,8 @@ class Packages(Common):
                     %(value)s
                     %(traceback)s</pre>""") % {
                             'type': query['annotationtype'],
-                            'errortype': unicode(t),
-                            'value': unicode(v),
+                            'errortype': str(t),
+                            'value': str(v),
                             'traceback': "\n".join(code.traceback.format_tb (tr))
                             })
 
@@ -1985,7 +1975,7 @@ class Packages(Common):
                 return self.send_error(500, _("Error: Cannot create an object of type %s.") % (query['type']))
 
         else:
-            return self.send_error(500, _("Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</code></p>") % { 'action': query['action'], 'object': cgi.escape(unicode(objet)) })
+            return self.send_error(500, _("Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</code></p>") % { 'action': query['action'], 'object': cgi.escape(str(objet)) })
 
 class Action(Common):
     """Handles the X{/action}  requests.
@@ -2000,8 +1990,8 @@ class Action(Common):
         catalog=self.controller.event_handler.catalog
         res=[ self.start_html(_("Available actions"), duplicate_title=True, mode='navigation') ]
         res.append("<ul>")
-        d=dict(catalog.get_described_actions(expert=True).iteritems())
-        k=d.keys()
+        d=dict(iter(catalog.get_described_actions(expert=True).items()))
+        k=list(d.keys())
         k.sort()
         for name in k:
             a=catalog.get_action(name)
@@ -2080,7 +2070,7 @@ class Root(Common):
         """Display the server root document.
         """
         res=[ self.start_html (_("Advene webserver"), duplicate_title=True, mode='navigation') ]
-        res.append(_("""<p>Welcome on the <a href="http://liris.cnrs.fr/advene/">Advene</a> webserver run by %(userid)s on %(serveraddress)s.</p>""") %
+        res.append(_("""<p>Welcome on the <a href="http://advene.org/">Advene</a> webserver run by %(userid)s on %(serveraddress)s.</p>""") %
                          {
                 'userid': config.data.userid,
                 'serveraddress': cherrypy.request.base,
@@ -2104,7 +2094,7 @@ class Root(Common):
                 mes=_("""the <a href="/packages">loaded packages' data</a>""")
             res.append(_(""" <p>You can either access %s or the <a href="/admin">server administration page</a>.<p>""") % mes)
 
-        res.append(_("""<hr><p align="right"><em>Document generated by <a href="http://liris.cnrs.fr/advene/">Advene</a> v. %s.</em></p>""") % (advene.core.version.version))
+        res.append(_("""<hr><p align="right"><em>Document generated by <a href="http://advene.org/">Advene</a> v. %s.</em></p>""") % (advene.core.version.version))
         return "".join(res)
     index.exposed=True
 
@@ -2153,7 +2143,7 @@ class AdveneWebServer:
                 'log.error_file': config.data.advenefile('webserver-error.log', 'settings'),
                 'server.reverse_dns': False,
                 'server.thread_pool': 10,
-                'engine.autoreload_on': False,
+                'engine.autoreload.on': False,
                 #'server.environment': "development",
                 'server.environment': "production",
                 },
@@ -2168,9 +2158,12 @@ class AdveneWebServer:
         # Not used for the moment.
         self.authorized_hosts = {'127.0.0.1': 'localhost'}
 
-        self.urlbase = u"http://localhost:%d/" % port
+        self.urlbase = "http://localhost:%d/" % port
 
         app_config={
+            '/': {
+                 'tools.encode.on': True
+            },
             '/favicon.ico': {
                 'tools.staticfile.on': True,
                 'tools.staticfile.filename': config.data.advenefile( ( 'pixmaps', 'advene.ico' ) ),
@@ -2185,8 +2178,8 @@ class AdveneWebServer:
         try:
             # engine.start *must* be started from the main thread.
             cherrypy.engine.start()
-        except Exception, e:
-            self.controller.log(_("Cannot start HTTP server: %s") % unicode(e))
+        except Exception as e:
+            self.controller.log(_("Cannot start HTTP server: %s") % str(e))
 
     def start(self):
         """Start the webserver.
@@ -2194,8 +2187,8 @@ class AdveneWebServer:
         def protected_start():
             try:
                 cherrypy.engine.start()
-            except Exception, e:
-                self.controller.log(_("Cannot start HTTP server: %s") % unicode(e))
+            except Exception as e:
+                self.controller.log(_("Cannot start HTTP server: %s") % str(e))
         self.controller.queue_action(protected_start)
         return True
 
diff --git a/lib/advene/gui/__init__.py b/lib/advene/gui/__init__.py
index dc5e3f5..dc19bba 100644
--- a/lib/advene/gui/__init__.py
+++ b/lib/advene/gui/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/gui/edit/__init__.py b/lib/advene/gui/edit/__init__.py
index dc5e3f5..dc19bba 100644
--- a/lib/advene/gui/edit/__init__.py
+++ b/lib/advene/gui/edit/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/gui/edit/atelier.jpg.txt b/lib/advene/gui/edit/atelier.jpg.txt
new file mode 100644
index 0000000..e69de29
diff --git a/lib/advene/gui/edit/create.py b/lib/advene/gui/edit/create.py
index 6afdf8b..055d811 100755
--- a/lib/advene/gui/edit/create.py
+++ b/lib/advene/gui/edit/create.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,6 +18,8 @@
 #
 """Dialogs for the creation of new elements.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import advene.core.config as config
 
@@ -26,7 +28,7 @@ from gettext import gettext as _
 import sys
 import re
 
-import gtk
+from gi.repository import Gtk
 
 from advene.model.package import Package
 from advene.model.fragment import MillisecondFragment
@@ -74,9 +76,9 @@ class CreateElementPopup(object):
     def build_widget(self, modal=False):
         i=self.generate_id()
         if modal:
-            flags=gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_MODAL
+            flags=Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.MODAL
         else:
-            flags=gtk.DIALOG_DESTROY_WITH_PARENT
+            flags=Gtk.DialogFlags.DESTROY_WITH_PARENT
 
         d=dialog.title_id_dialog(title=_("%s creation")  % element_label[self.type_],
                                           text=_("To create a new element of type %s,\nyou must give the following information.") % element_label[self.type_],
@@ -88,9 +90,9 @@ class CreateElementPopup(object):
         # Choose a type if possible
         if self.type_ in (Annotation, Relation, AnnotationType, RelationType,
                           View, Query, Resources, ResourceData):
-            hbox = gtk.HBox()
-            l = gtk.Label(_("Type"))
-            hbox.pack_start(l)
+            hbox = Gtk.HBox()
+            l = Gtk.Label(label=_("Type"))
+            hbox.pack_start(l, True, True, 0)
 
             if self.type_ == Annotation:
                 if isinstance(self.parent, AnnotationType):
@@ -121,7 +123,7 @@ class CreateElementPopup(object):
             elif self.type_ == ResourceData:
                 type_list = [ ViewType("file", _("Resource File")) ]
             else:
-                print "Error in advene.gui.edit.create.build_widget: invalid type %s" % self.type_
+                logger.error("Error in advene.gui.edit.create.build_widget: invalid type %s", self.type_)
                 return None
 
             if not type_list:
@@ -142,7 +144,7 @@ class CreateElementPopup(object):
             d.type_combo = dialog.list_selector_widget(
                 members=[ (t, self.controller.get_title(t)) for t in type_list  ],
                 preselect=preselect)
-            hbox.pack_start(d.type_combo)
+            hbox.pack_start(d.type_combo, True, True, 0)
 
             d.vbox.add(hbox)
 
@@ -164,8 +166,8 @@ class CreateElementPopup(object):
 
         @return: the created element, None if an error occurred
         """
-        id_ = unicode(self.dialog.id_entry.get_text())
-        title_ = unicode(self.dialog.title_entry.get_text())
+        id_ = self.dialog.id_entry.get_text()
+        title_ = self.dialog.title_entry.get_text()
         # Check validity of id.
         if not self.is_valid_id(id_):
             dialog.message_dialog(
@@ -268,7 +270,7 @@ class CreateElementPopup(object):
             self.controller.notify('SchemaCreate', schema=el)
         elif self.type_ == AnnotationType:
             if not isinstance(self.parent, Schema):
-                print "Error: bad invocation of CreateElementPopup"
+                logger.error("Error: bad invocation of CreateElementPopup for AnnotationType")
                 el=None
             else:
                 el=self.parent.createAnnotationType(
@@ -277,13 +279,13 @@ class CreateElementPopup(object):
                 el.date=self.get_date()
                 el.title=title_
                 el.mimetype=t.id
-                el.setMetaData(config.data.namespace, 'color', self.parent.rootPackage._color_palette.next())
+                el.setMetaData(config.data.namespace, 'color', next(self.parent.rootPackage._color_palette))
                 el.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
             self.parent.annotationTypes.append(el)
             self.controller.notify('AnnotationTypeCreate', annotationtype=el)
         elif self.type_ == RelationType:
             if not isinstance(self.parent, Schema):
-                print "Error: bad invocation of CreateElementPopup"
+                logger.error("Error: bad invocation of CreateElementPopup for RelationType")
                 el=None
             else:
                 el=self.parent.createRelationType(
@@ -292,10 +294,10 @@ class CreateElementPopup(object):
                 el.date=self.get_date()
                 el.title=title_
                 el.mimetype=t.id
-                el.setMetaData(config.data.namespace, 'color', self.parent.rootPackage._color_palette.next())
+                el.setMetaData(config.data.namespace, 'color', next(self.parent.rootPackage._color_palette))
                 el.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
                 # Create a generic binary relationType
-                el.hackedMemberTypes=(u'', u'')
+                el.hackedMemberTypes=('', '')
             self.parent.relationTypes.append(el)
             self.controller.notify('RelationTypeCreate', relationtype=el)
         elif self.type_ == Resources:
@@ -314,7 +316,7 @@ class CreateElementPopup(object):
 
         else:
             el=None
-            print "Not implemented yet."
+            logger.error("Not implemented yet.")
         return el
 
     def popup(self, modal=False):
@@ -326,7 +328,7 @@ class CreateElementPopup(object):
             dialog.center_on_mouse(d)
             res=d.run()
             retval=None
-            if res == gtk.RESPONSE_OK:
+            if res == Gtk.ResponseType.OK:
                 retval=self.do_create_element()
 
                 if retval is not None:
@@ -341,17 +343,18 @@ class CreateElementPopup(object):
         return retval
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
     if len(sys.argv) < 2:
-        print "Should provide a package name"
+        logger.error("Should provide a package name")
         sys.exit(1)
 
     package = Package (uri=sys.argv[1])
 
-    window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+    window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
 
     window.set_border_width(10)
     window.set_title (package.title)
-    vbox = gtk.VBox()
+    vbox = Gtk.VBox()
     window.add (vbox)
 
     def create_element_cb(button, t):
@@ -359,33 +362,33 @@ if __name__ == "__main__":
         cr.popup()
         return True
 
-    for (t, l) in element_label.iteritems():
-        b = gtk.Button(l)
+    for (t, l) in element_label.items():
+        b = Gtk.Button(l)
         b.connect('clicked', create_element_cb, t)
         b.show()
-        vbox.pack_start(b)
+        vbox.pack_start(b, True, True, 0)
 
-    hbox = gtk.HButtonBox()
-    vbox.pack_start (hbox, expand=False)
+    hbox = Gtk.HButtonBox()
+    vbox.pack_start(hbox, False, False, 0)
 
     def validate_cb (win, package):
         filename="/tmp/package.xml"
         package.save (name=filename)
-        print "Package saved as %s" % filename
-        gtk.main_quit ()
+        logger.info("Package saved as %s", filename)
+        Gtk.main_quit ()
 
-    b = gtk.Button (stock=gtk.STOCK_SAVE)
+    b = Gtk.Button (stock=Gtk.STOCK_SAVE)
     b.connect('clicked', validate_cb, package)
     hbox.add (b)
 
-    b = gtk.Button (stock=gtk.STOCK_QUIT)
+    b = Gtk.Button (stock=Gtk.STOCK_QUIT)
     b.connect('clicked', lambda w: window.destroy ())
     hbox.add (b)
 
     vbox.set_homogeneous (False)
 
-    window.connect('destroy', lambda e: gtk.main_quit())
+    window.connect('destroy', lambda e: Gtk.main_quit())
 
     window.show_all()
-    gtk.main ()
+    Gtk.main ()
 
diff --git a/lib/advene/gui/edit/dvdselect.py b/lib/advene/gui/edit/dvdselect.py
index 0e39139..5b91107 100755
--- a/lib/advene/gui/edit/dvdselect.py
+++ b/lib/advene/gui/edit/dvdselect.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,7 +19,8 @@
 """Widget used to select the DVD chapter in Advene.
 """
 
-import gtk
+from gi.repository import Gdk
+from gi.repository import Gtk
 import re
 
 from gettext import gettext as _
@@ -44,8 +45,8 @@ class DVDSelect:
         m = re.match("dvd\w*:.+@(\d+)[,:](\d+)", current)
         if m is not None:
             (title, chapter) = m.groups()
-            self.titlewidget.set_value(long(title))
-            self.chapterwidget.set_value(long(chapter))
+            self.titlewidget.set_value(int(title))
+            self.chapterwidget.set_value(int(chapter))
         return True
 
     def get_chapter(self):
@@ -61,58 +62,33 @@ class DVDSelect:
         #return "dvdsimple:///dev/dvd@%d:%d" % (self.get_title(),
         #                                       self.get_chapter())
 
-    def preview(self, button=None):
-        if not hasattr(self, 'oldplaylist'):
-            self.oldplaylist=self.controller.player.playlist_get_list()
-            self.controller.player.playlist_clear()
-            mediafile=self.get_url()
-            if isinstance(mediafile, unicode):
-                mediafile=mediafile.encode('utf8')
-            self.controller.player.playlist_add_item(mediafile)
-            self.controller.player.update_status("start")
-            button.set_label(_("Stop"))
-        else:
-            self.controller.player.update_status("stop")
-            self.controller.player.playlist_clear()
-            for i in self.oldplaylist:
-                if isinstance(i, unicode):
-                    i=i.encode('utf8')
-                self.controller.player.playlist_add_item(i)
-            del self.oldplaylist
-            button.set_label(_("Preview"))
-        return True
-
     def get_widget(self):
         return self.widget
 
     def make_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        label=gtk.Label(_("Select the correct\ntitle and chapter\nof the DVD"))
+        label=Gtk.Label(label=_("Select the correct\ntitle and chapter\nof the DVD"))
         vbox.add(label)
 
-        hbox=gtk.HBox()
-        hbox.add(gtk.Label(_("Title")))
-        sp=gtk.SpinButton()
+        hbox=Gtk.HBox()
+        hbox.add(Gtk.Label(label=_("Title")))
+        sp=Gtk.SpinButton()
         sp.set_range(1, 15)
         sp.set_increments(1, 1)
-        hbox.pack_start(sp, expand=False)
+        hbox.pack_start(sp, False, True, 0)
         self.titlewidget=sp
         vbox.add(hbox)
 
-        hbox=gtk.HBox()
-        hbox.add(gtk.Label(_("Chapter")))
-        sp=gtk.SpinButton()
+        hbox=Gtk.HBox()
+        hbox.add(Gtk.Label(label=_("Chapter")))
+        sp=Gtk.SpinButton()
         sp.set_range(1, 30)
         sp.set_increments(1, 1)
-        hbox.pack_start(sp, expand=False)
+        hbox.pack_start(sp, False, True, 0)
         self.chapterwidget=sp
         vbox.add(hbox)
 
-        b=gtk.Button(_("Preview"))
-        b.connect('clicked', self.preview)
-        vbox.add(b)
-
         vbox.show_all()
         return vbox
 
@@ -127,19 +103,19 @@ if __name__ == "__main__":
             self.player.check_player()
 
     def key_pressed_cb (win, event):
-        if event.state & gtk.gdk.CONTROL_MASK:
+        if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             # The Control-key is held. Special actions :
-            if event.keyval == gtk.keysyms.q:
-                gtk.main_quit ()
+            if event.keyval == Gdk.KEY_q:
+                Gtk.main_quit ()
                 return True
         return False
 
-    window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+    window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
     window.connect('key-press-event', key_pressed_cb)
-    window.connect('destroy', lambda e: gtk.main_quit())
+    window.connect('destroy', lambda e: Gtk.main_quit())
 
     c = DummyController()
     sel=DVDSelect(controller=c)
     window.add(sel.get_widget())
     window.show_all()
-    gtk.main()
+    Gtk.main()
diff --git a/lib/advene/gui/edit/elements.py b/lib/advene/gui/edit/elements.py
index feef5f1..ee2023e 100644
--- a/lib/advene/gui/edit/elements.py
+++ b/lib/advene/gui/edit/elements.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -27,17 +27,23 @@ View, Package).
 import advene.core.config as config
 from gettext import gettext as _
 
-import gtk
-import gobject
-import pango
-import re
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import Gtk
+from gi.repository import GObject
+from gi.repository import Pango
+
+import operator
 import os
+import re
 import struct
 
 try:
-    import gtksourceview2
+    import gi
+    gi.require_version('GtkSource', '3.0')
+    from gi.repository import GtkSource
 except ImportError:
-    gtksourceview2=None
+    GtkSource = None
 
 from advene.model.package import Package
 from advene.model.annotation import Annotation, Relation
@@ -79,7 +85,7 @@ class EditPopupClass (type):
         if hasattr (cls, 'can_edit'):
             _edit_popup_list.append(cls)
 
-class EditElementPopup (AdhocView):
+class EditElementPopup (AdhocView, metaclass=EditPopupClass):
     """Abstract class for editing Advene elements.
 
     To create a specialized edit window, define the make_widget
@@ -90,7 +96,6 @@ class EditElementPopup (AdhocView):
     On validation, the registered forms are asked to update the values
     of their respective elements.
     """
-    __metaclass__ = EditPopupClass
 
     view_name = _("Edit Window")
     view_id = 'editwindow'
@@ -106,7 +111,7 @@ class EditElementPopup (AdhocView):
         else:
             t=el.__class__.__name__
         self.view_id="-".join( (EditElementPopup.view_id, t) )
-        self.vbox = gtk.VBox ()
+        self.vbox = Gtk.VBox ()
         self.vbox.connect('key-press-event', self.key_pressed_cb)
         self.editable=editable
         # List of defined forms in the window
@@ -124,25 +129,25 @@ class EditElementPopup (AdhocView):
         """Compatibility property to integrate in the AdhocView framework.
         """
         if self._widget is None:
-            vbox=gtk.VBox()
+            vbox=Gtk.VBox()
 
-            tb=gtk.Toolbar()
-            tb.set_style(gtk.TOOLBAR_ICONS)
+            tb=Gtk.Toolbar()
+            tb.set_style(Gtk.ToolbarStyle.ICONS)
 
-            b=gtk.ToolButton(gtk.STOCK_OK)
+            b=Gtk.ToolButton(Gtk.STOCK_OK)
             b.connect('clicked', self.validate_cb)
             b.set_tooltip_text(_("Apply changes and close the edit window"))
             tb.insert(b, -1)
 
-            b=gtk.ToolButton (gtk.STOCK_APPLY)
+            b=Gtk.ToolButton (Gtk.STOCK_APPLY)
             b.connect('clicked', self.apply_cb)
             b.set_tooltip_text(_("Apply changes"))
             tb.insert(b, -1)
 
             self.extend_toolbar(tb)
 
-            vbox.pack_start(tb, expand=False)
-            vbox.pack_start(self.make_widget(editable=self.editable))
+            vbox.pack_start(tb, False, True, 0)
+            vbox.pack_start(self.make_widget(editable=self.editable), True, True, 0)
 
             def destroy_cb(*p):
                 if self.controller and self.controller.gui:
@@ -160,7 +165,7 @@ class EditElementPopup (AdhocView):
                 vbox.disconnect(self.sig)
                 del self.sig
                 return False
-            self.sig = vbox.connect('expose-event', initial_focus)
+            self.sig = vbox.connect('draw', initial_focus)
 
             self._widget=vbox
 
@@ -169,8 +174,8 @@ class EditElementPopup (AdhocView):
     def reparent_done(self):
         if self._widget.get_toplevel() != self.controller.gui.gui.win:
             # In a popup window. Define appropriate shortcuts.
-            #self.key_cb[gtk.keysyms.Return] = self.validate_cb
-            self.key_cb[gtk.keysyms.Escape] = self.close_cb
+            #self.key_cb[Gdk.KEY_Return] = self.validate_cb
+            self.key_cb[Gdk.KEY_Escape] = self.close_cb
             self._widget.get_toplevel().connect('key-press-event', self.key_pressed_cb)
         return True
 
@@ -270,7 +275,7 @@ class EditElementPopup (AdhocView):
     def close_cb (self, button=None, data=None):
         """Method called when closing a form."""
         if self.get_modified():
-            if not dialog.message_dialog(_("Content has been modified. Close anyway and lose data?"), icon=gtk.MESSAGE_QUESTION,
+            if not dialog.message_dialog(_("Content has been modified. Close anyway and lose data?"), icon=Gtk.MessageType.QUESTION,
                                          modal=True):
                 return False
         self.controller.notify("EditSessionEnd", element=self.element, comment="Window closed")
@@ -298,13 +303,13 @@ class EditElementPopup (AdhocView):
         return t
 
     def framed (self, widget, label=""):
-        fr = gtk.Frame ()
+        fr = Gtk.Frame ()
         fr.set_label (label)
         fr.add (widget)
         return fr
 
     def expandable (self, widget, label="", expanded=False):
-        fr = gtk.Expander ()
+        fr = Gtk.Expander ()
         fr.set_label (label)
         fr.add(widget)
         fr.set_expanded(expanded)
@@ -319,8 +324,8 @@ class EditElementPopup (AdhocView):
             w.set_urgency_hint(True)
             return self.element
         self.callback=callback
-        self.key_cb[gtk.keysyms.Return] = self.validate_cb
-        self.key_cb[gtk.keysyms.Escape] = self.close_cb
+        self.key_cb[Gdk.KEY_Return] = self.validate_cb
+        self.key_cb[Gdk.KEY_Escape] = self.close_cb
 
         if hasattr(self.element, 'isImported') and self.element.isImported():
             self.editable=False
@@ -333,11 +338,11 @@ class EditElementPopup (AdhocView):
             title=_("View %s (read-only)") % self.get_title()
 
         if modal:
-            d = gtk.Dialog(title=title,
-                           parent=None,
-                           flags=gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_MODAL,
-                           buttons=( gtk.STOCK_OK, gtk.RESPONSE_OK,
-                                     gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL ))
+            d = Gtk.Dialog(title=title,
+                           parent=self.controller.gui.gui.win,
+                           flags=Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.MODAL,
+                           buttons=( Gtk.STOCK_OK, Gtk.ResponseType.OK,
+                                     Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL ))
 
             d.vbox.add(self.widget)
             d.vbox.show_all()
@@ -349,9 +354,9 @@ class EditElementPopup (AdhocView):
                 dialog.center_on_mouse(d)
                 res=d.run()
                 retval=False
-                if res == gtk.RESPONSE_OK:
+                if res == Gtk.ResponseType.OK:
                     retval=self.apply_cb()
-                elif res == gtk.RESPONSE_CANCEL:
+                elif res == Gtk.ResponseType.CANCEL:
                     retval=True
 
                 if retval:
@@ -371,8 +376,8 @@ class EditElementPopup (AdhocView):
     def compact(self, callback=None):
         """Display the compact edit window.
         """
-        self.key_cb[gtk.keysyms.Return] = self.validate_cb
-        self.key_cb[gtk.keysyms.Escape] = self.close_cb
+        self.key_cb[Gdk.KEY_Return] = self.validate_cb
+        self.key_cb[Gdk.KEY_Escape] = self.close_cb
 
         self.callback=callback
         if hasattr(self.element, 'isImported') and self.element.isImported():
@@ -380,13 +385,13 @@ class EditElementPopup (AdhocView):
         elif hasattr(self.element, 'schema') and self.element.schema.isImported():
             self.editable=False
 
-        tb=gtk.Toolbar()
+        tb=Gtk.Toolbar()
         self.extend_toolbar(tb)
         if tb.get_children():
             # There are some items. Display them
-            tb.props.icon_size=gtk.ICON_SIZE_SMALL_TOOLBAR
-            tb.set_style(gtk.TOOLBAR_ICONS)
-            self.vbox.pack_start(tb, expand=False)
+            tb.props.icon_size=Gtk.IconSize.SMALL_TOOLBAR
+            tb.set_style(Gtk.ToolbarStyle.ICONS)
+            self.vbox.pack_start(tb, False, True, 0)
         else:
             tb.destroy()
         w=self.make_widget (editable=self.editable, compact=True)
@@ -431,12 +436,13 @@ class EditAnnotationPopup (EditElementPopup):
         return True
 
     def goto(self, button=None, direction=1):
-        # FIXME: cmp usually returns -1, 0, 1 but its definition only
-        # states that the value is positive or negative. Thus this may
-        # not work in all cases.
+        if direction > 0:
+            compare = operator.gt
+        else:
+            compare = operator.lt
         l=[a
            for a in self.element.type.annotations
-           if cmp(a.fragment.begin, self.element.fragment.begin) == direction ]
+           if compare(a.fragment.begin, self.element.fragment.begin) ]
         l.sort(key=lambda a: a.fragment.begin, reverse=(direction == -1))
         if l:
             a=l[0]
@@ -447,13 +453,13 @@ class EditAnnotationPopup (EditElementPopup):
 
     def extend_toolbar(self, tb):
         if tb.get_children():
-            tb.insert(gtk.SeparatorToolItem(), -1)
+            tb.insert(Gtk.SeparatorToolItem(), -1)
 
-        b=get_pixmap_toolbutton(gtk.STOCK_GO_BACK, self.goto, -1)
+        b=get_pixmap_toolbutton(Gtk.STOCK_GO_BACK, self.goto, -1)
         b.set_tooltip_text(_("Apply changes and edit previous annotation of same type"))
         tb.insert(b, -1)
 
-        b=get_pixmap_toolbutton(gtk.STOCK_GO_FORWARD, self.goto, +1)
+        b=get_pixmap_toolbutton(Gtk.STOCK_GO_FORWARD, self.goto, +1)
         b.set_tooltip_text(_("Apply changes and edit next annotation of same type"))
         tb.insert(b, -1)
 
@@ -476,13 +482,13 @@ class EditAnnotationPopup (EditElementPopup):
         return True
 
     def make_widget (self, editable=True, compact=False):
-        vbox = gtk.VBox ()
+        vbox = Gtk.VBox ()
 
-        nb=gtk.Notebook()
-        vbox.pack_start(nb, expand=False)
+        nb=Gtk.Notebook()
+        vbox.pack_start(nb, False, True, 0)
 
         def small_label(t):
-            l=gtk.Label()
+            l=Gtk.Label()
             l.set_markup('<span size="x-small">%s</span>' % t)
             return l
 
@@ -525,7 +531,7 @@ class EditAnnotationPopup (EditElementPopup):
         f.set_editable(editable)
         t = f.get_view(compact=compact)
         self.register_form(f)
-        vbox.pack_start(t, expand=True)
+        vbox.pack_start(t, True, True, 0)
 
 
         def select_default(widget):
@@ -545,7 +551,7 @@ class EditRelationPopup (EditElementPopup):
         return True
 
     def make_widget (self, editable=True, compact=False):
-        vbox = gtk.VBox ()
+        vbox = Gtk.VBox ()
 
         f = self.make_registered_form (element=self.element,
                                        fields=('id', 'uri', 'type',
@@ -560,31 +566,31 @@ class EditRelationPopup (EditElementPopup):
                                                'date':   _('Date')}
                                        )
         ex=self.expandable(f.get_view(), _("Metadata"), expanded=False)
-        vbox.pack_start(ex, expand=False)
+        vbox.pack_start(ex, False, True, 0)
 
         def button_press_handler(widget, event, annotation):
-            if event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS:
+            if event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
                 menu=advene.gui.popup.Menu(annotation, controller=self.controller)
                 menu.popup()
                 return True
-            if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+            if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
                 self.controller.gui.edit_element(annotation)
                 return True
             return False
 
         # FIXME: make it possible to edit the members list (drag and drop ?)
-        hb = gtk.HBox()
+        hb = Gtk.HBox()
         for a in self.element.members:
             b = AnnotationRepresentation(a, controller=self.controller)
             b.set_alignment(0, 0)
-            hb.pack_start(b, expand=False)
+            hb.pack_start(b, False, True, 0)
         hb.show_all()
-        vbox.pack_start(self.framed(hb, _("Members")), expand=False)
+        vbox.pack_start(self.framed(hb, _("Members")), False, False, 0)
 
         # Tags
         f = EditTagForm(element=self.element, controller=self.controller, editable=editable)
         self.register_form(f)
-        vbox.pack_start (f.get_view(), expand=False)
+        vbox.pack_start (f.get_view(), False, False, 0)
 
         # Relation content
         f = EditContentForm(self.element.content, controller=self.controller,
@@ -597,7 +603,7 @@ class EditRelationPopup (EditElementPopup):
             exp=True
         else:
             exp=False
-        vbox.pack_start(self.expandable(t, _("Content"), expanded=exp), expand=True)
+        vbox.pack_start(self.expandable(t, _("Content"), expanded=exp), True, True, 0)
 
         return vbox
 
@@ -616,16 +622,16 @@ class EditViewPopup (EditElementPopup):
             b = get_pixmap_toolbutton( 'web.png', self.apply_and_open)
             b.set_tooltip_text(_("Apply changes and visualise in web browser"))
             tb.insert(b, -1)
-            self.key_cb[gtk.keysyms.F5] = self.apply_and_open
+            self.key_cb[Gdk.KEY_F5] = self.apply_and_open
         elif t == 'dynamic':
-            b = get_pixmap_toolbutton( gtk.STOCK_MEDIA_PLAY, self.apply_and_activate)
+            b = get_pixmap_toolbutton( Gtk.STOCK_MEDIA_PLAY, self.apply_and_activate)
             b.set_tooltip_text(_("Apply changes and activate the view"))
             tb.insert(b, -1)
-            self.key_cb[gtk.keysyms.F5] = self.apply_and_activate
+            self.key_cb[Gdk.KEY_F5] = self.apply_and_activate
         return True
 
     def make_widget (self, editable=True, compact=False):
-        vbox = gtk.VBox ()
+        vbox = Gtk.VBox ()
 
         f = EditAttributeForm(title=_("Title (name)"),
                               element=self.element, name='title',
@@ -633,7 +639,7 @@ class EditViewPopup (EditElementPopup):
                               editable=editable,
                               tooltip=_("Name of the view"))
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = self.make_registered_form (element=self.element,
                                        fields=('id', 'uri',
@@ -647,7 +653,7 @@ class EditViewPopup (EditElementPopup):
                                                'date':   _('Date')}
                                        )
         vbox.pack_start (self.expandable(f.get_view (), _("Metadata"),
-                                         expanded=False), expand=False)
+                                         expanded=False), False, False, 0)
 
         if config.data.preferences['expert-mode']:
             # matchFilter
@@ -659,13 +665,13 @@ class EditViewPopup (EditElementPopup):
                                                    'type':  _('Type')}
                                            )
             vbox.pack_start (self.expandable(f.get_view (), _("Match Filter"), expanded=False),
-                             expand=False)
+                             False, False, 0)
 
         # Tags (not tags in view)
         #f = EditTagForm(element=self.element, controller=self.controller, editable=editable)
         #self.register_form(f)
         #ex=self.expandable(f.get_view(), _("Tags"), expanded=not compact)
-        #vbox.pack_start (ex, expand=False)
+        #vbox.pack_start (ex, False, False, 0)
 
         # View content
 
@@ -674,7 +680,7 @@ class EditViewPopup (EditElementPopup):
         f.set_editable (editable)
         t = f.get_view ()
         self.register_form (f)
-        vbox.pack_start (self.framed(t, _("Content")), expand=True)
+        vbox.pack_start (self.framed(t, _("Content")), True, True, 0)
 
         return vbox
 
@@ -695,8 +701,8 @@ class EditQueryPopup (EditElementPopup):
                                                 query=self.element,
                                                 result=res,
                                                 destination='east')
-        except Exception, e:
-            self.controller.log(_('Exception in query: %s') % unicode(e))
+        except Exception as e:
+            self.controller.log(_('Exception in query: %s') % str(e))
         return True
 
     def extend_toolbar(self, tb):
@@ -706,7 +712,7 @@ class EditQueryPopup (EditElementPopup):
         return True
 
     def make_widget (self, editable=True, compact=False):
-        vbox = gtk.VBox ()
+        vbox = Gtk.VBox ()
 
         f = EditAttributeForm(title=_("Title (name)"),
                               element=self.element, name='title',
@@ -714,7 +720,7 @@ class EditQueryPopup (EditElementPopup):
                               editable=editable,
                               tooltip=_("Name of the query"))
         self.register_form(f)
-        vbox.pack_start(f.get_view (), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = self.make_registered_form (element=self.element,
                                        fields=('id', 'uri',
@@ -727,14 +733,14 @@ class EditQueryPopup (EditElementPopup):
                                                'date':   _('Date')}
                                        )
         vbox.pack_start (self.expandable(f.get_view (),  _("Metadata"), expanded=False),
-                         expand=False)
+                         False, False, 0)
 
         f = EditContentForm (self.element.content, controller=self.controller,
                              mimetypeeditable=editable, parent=self.element)
         f.set_editable (editable)
         t = f.get_view ()
         self.register_form (f)
-        vbox.pack_start (self.framed(t, _("Content")), expand=True)
+        vbox.pack_start (self.framed(t, _("Content")), True, True, 0)
 
         return vbox
 
@@ -746,12 +752,12 @@ class EditPackagePopup (EditElementPopup):
     def notify(self, element):
         # Side effect of the notify method: we use it to update the
         # appropriate attributes of the package.
-        self.controller.set_default_media(element.getMetaData (config.data.namespace, "mediafile"),
+        self.controller.set_default_media(element.media,
                                           package=element)
         d=element.getMetaData (config.data.namespace, "duration")
         if d:
             try:
-                d=long(d)
+                d=int(d)
             except ValueError:
                 d=0
             element.cached_duration = d
@@ -761,9 +767,9 @@ class EditPackagePopup (EditElementPopup):
         return True
 
     def make_widget (self, editable=False, compact=False):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        sg=gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
+        sg=Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL)
 
         f = EditAttributeForm(title=_("Title (name)"),
                               element=self.element, name='title',
@@ -772,7 +778,7 @@ class EditPackagePopup (EditElementPopup):
                               tooltip=_("Name of the package"),
                               sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = self.make_registered_form (element=self.element,
                                        fields=('uri',
@@ -785,7 +791,7 @@ class EditPackagePopup (EditElementPopup):
                                        )
 
         vbox.pack_start (self.expandable(f.get_view (),  _("Metadata"), expanded=False),
-                         expand=False)
+                         False, False, 0)
 
         f = EditMetaForm(title=_("Description"),
                          element=self.element, name='description',
@@ -794,7 +800,7 @@ class EditPackagePopup (EditElementPopup):
                          tooltip=_("Textual description of the package"),
                          sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = EditMetaForm(title=_("Default dynamic view"),
                          element=self.element, name='default_stbv',
@@ -803,7 +809,7 @@ class EditPackagePopup (EditElementPopup):
                          tooltip=_("Dynamic view to activate on package load"),
                          sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = EditMetaForm(title=_("Default static view"),
                          element=self.element, name='default_utbv',
@@ -812,7 +818,7 @@ class EditPackagePopup (EditElementPopup):
                          tooltip=_("Static view to open on package load"),
                          sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = EditMetaForm(title=_("Default adhoc view"),
                          element=self.element, name='default_adhoc',
@@ -821,7 +827,7 @@ class EditPackagePopup (EditElementPopup):
                          tooltip=_("Adhoc view to open on package load"),
                          sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = EditMetaForm(title=_("Cached duration"),
                          element=self.element, name='duration',
@@ -830,7 +836,7 @@ class EditPackagePopup (EditElementPopup):
                          tooltip=_("Cached duration in ms"),
                          sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = EditMetaForm(title=_("Mediafile"),
                          element=self.element, name='mediafile',
@@ -839,7 +845,7 @@ class EditPackagePopup (EditElementPopup):
                          tooltip=_("Location of associated media file"),
                          sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         return vbox
 
@@ -853,9 +859,9 @@ class EditSchemaPopup (EditElementPopup):
         return True
 
     def make_widget (self, editable=True, compact=False):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        sg=gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
+        sg=Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL)
         f = EditAttributeForm(title=_("Title (name)"),
                               element=self.element, name='title',
                               controller=self.controller,
@@ -863,7 +869,7 @@ class EditSchemaPopup (EditElementPopup):
                               tooltip=_("Name of the schema"),
                               sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = self.make_registered_form (element=self.element,
                                        fields=('id', 'uri',
@@ -876,7 +882,7 @@ class EditSchemaPopup (EditElementPopup):
                                                'date':   _('Date')}
                                        )
         vbox.pack_start (self.expandable(f.get_view (),  _("Metadata"), expanded=False),
-                         expand=False)
+                         False, False, 0)
 
         f = EditMetaForm(title=_("Description"),
                          element=self.element, name='description',
@@ -886,7 +892,7 @@ class EditSchemaPopup (EditElementPopup):
                          focus=True,
                          sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = EditMetaForm(title=_("Color"),
                          element=self.element, name='color',
@@ -896,7 +902,7 @@ class EditSchemaPopup (EditElementPopup):
                          type='color',
                          sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         if config.data.preferences['expert-mode']:
             f = EditMetaForm(title=_("Item color"),
@@ -907,7 +913,7 @@ class EditSchemaPopup (EditElementPopup):
                              type='color',
                              sizegroup=sg)
             self.register_form(f)
-            vbox.pack_start(f.get_view(), expand=False)
+            vbox.pack_start(f.get_view(), False, False, 0)
 
         return vbox
 
@@ -921,9 +927,9 @@ class EditAnnotationTypePopup (EditElementPopup):
         return True
 
     def make_widget (self, editable=False, compact=False):
-        vbox = gtk.VBox()
+        vbox = Gtk.VBox()
 
-        sg=gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
+        sg=Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL)
 
         f = EditAttributeForm(title=_("Title (name)"),
                               element=self.element, name='title',
@@ -932,7 +938,7 @@ class EditAnnotationTypePopup (EditElementPopup):
                               tooltip=_("Name of the type"),
                               sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = self.make_registered_form (element=self.element,
                                        fields=('id', 'uri',
@@ -945,7 +951,7 @@ class EditAnnotationTypePopup (EditElementPopup):
                                                'date':   _('Date'),
                                                }
                                        )
-        vbox.pack_start(self.expandable(f.get_view(),  _("Metadata"), expanded=False), expand=False)
+        vbox.pack_start(self.expandable(f.get_view(),  _("Metadata"), expanded=False), False, False, 0)
 
         f = EditAttributeForm(title=_("MIME Type"),
                               element=self.element, name='mimetype',
@@ -955,7 +961,7 @@ class EditAnnotationTypePopup (EditElementPopup):
                               type='mimetype',
                               sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = EditMetaForm(title=_("Description"),
                          element=self.element, name='description',
@@ -966,7 +972,7 @@ class EditAnnotationTypePopup (EditElementPopup):
                          sizegroup=sg)
 
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = EditMetaForm(title=_("Color"),
                          element=self.element, name='color',
@@ -976,9 +982,9 @@ class EditAnnotationTypePopup (EditElementPopup):
                          type='color',
                          sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
-        abox=gtk.VBox()
+        abox=Gtk.VBox()
         f = EditMetaForm(title=_("Representation"),
                          element=self.element, name='representation',
                          controller=self.controller,
@@ -988,7 +994,7 @@ class EditAnnotationTypePopup (EditElementPopup):
                                     for name in getattr(self.element, '_fieldnames', []) ],
                          sizegroup=sg)
         self.register_form(f)
-        abox.pack_start(f.get_view(), expand=False)
+        abox.pack_start(f.get_view(), False, False, 0)
 
         f = EditMetaForm(title=_("Item color"),
                          element=self.element, name='item_color',
@@ -998,7 +1004,7 @@ class EditAnnotationTypePopup (EditElementPopup):
                          type='color',
                          sizegroup=sg)
         self.register_form(f)
-        abox.pack_start(f.get_view(), expand=False)
+        abox.pack_start(f.get_view(), False, False, 0)
 
         f = EditMetaForm(title=_("Completions"),
                          element=self.element, name='completions',
@@ -1007,10 +1013,10 @@ class EditAnnotationTypePopup (EditElementPopup):
                          tooltip=_("Space-separated list of words used for content completion"),
                          sizegroup=sg)
         self.register_form(f)
-        abox.pack_start(f.get_view(), expand=False)
+        abox.pack_start(f.get_view(), False, False, 0)
 
 
-        vbox.pack_start(self.expandable(abox, label=_("Advanced"), expanded=False), expand=False)
+        vbox.pack_start(self.expandable(abox, label=_("Advanced"), expanded=False), False, False, 0)
 
         return vbox
 
@@ -1024,9 +1030,9 @@ class EditRelationTypePopup (EditElementPopup):
         return True
 
     def make_widget (self, editable=False, compact=False):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        sg=gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
+        sg=Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL)
         f = EditAttributeForm(title=_("Title (name)"),
                               element=self.element, name='title',
                               controller=self.controller,
@@ -1034,7 +1040,7 @@ class EditRelationTypePopup (EditElementPopup):
                               tooltip=_("Name of the type"),
                               sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = EditAttributeForm(title=_("MIME Type"),
                               element=self.element, name='mimetype',
@@ -1044,7 +1050,7 @@ class EditRelationTypePopup (EditElementPopup):
                               type='mimetype',
                               sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = self.make_registered_form (element=self.element,
                                        fields=('id', 'uri',
@@ -1069,7 +1075,7 @@ class EditRelationTypePopup (EditElementPopup):
             controller=self.controller,
             editable=editable)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = EditMetaForm(title=_("Description"),
                          element=self.element, name='description',
@@ -1080,7 +1086,7 @@ class EditRelationTypePopup (EditElementPopup):
                          sizegroup=sg)
 
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         f = EditMetaForm(title=_("Color"),
                          element=self.element, name='color',
@@ -1090,7 +1096,7 @@ class EditRelationTypePopup (EditElementPopup):
                          type='color',
                          sizegroup=sg)
         self.register_form(f)
-        vbox.pack_start(f.get_view(), expand=False)
+        vbox.pack_start(f.get_view(), False, False, 0)
 
         return vbox
 
@@ -1104,7 +1110,7 @@ class EditResourcePopup (EditElementPopup):
         return True
 
     def make_widget (self, editable=True, compact=False):
-        vbox = gtk.VBox ()
+        vbox = Gtk.VBox ()
 
         # Resource data
         f = self.make_registered_form (element=self.element,
@@ -1118,14 +1124,14 @@ class EditResourcePopup (EditElementPopup):
                                                'author': _('Author'),
                                                'date':   _('Date')}
                                        )
-        vbox.pack_start (f.get_view (), expand=False)
+        vbox.pack_start (f.get_view (), False, False, 0)
 
         f = EditContentForm(self.element, controller=self.controller,
                             mimetypeeditable=False, parent=self.element)
         f.set_editable(editable)
         t = f.get_view()
         self.register_form(f)
-        vbox.pack_start(self.framed(t, _("Content")), expand=True)
+        vbox.pack_start(self.framed(t, _("Content")), True, True, 0)
 
         return vbox
 
@@ -1201,7 +1207,7 @@ class EditForm(object):
                 #    i=str(element)
                 #print "Messed up value for %s" % element.id
                 value=""
-            element.setMetaData(namespace, data, unicode(value))
+            element.setMetaData(namespace, data, str(value))
             return True
         return set_method
 
@@ -1242,7 +1248,7 @@ class EditContentForm(EditForm):
         # self.contentform will be an appropriate EditForm
         # (EditTextForm,EditRuleSetForm,...)
         self.contentform = None
-        # self.mimetype is a gtk.Entry
+        # self.mimetype is a Gtk.Entry
         self.mimetype = None
 
         # Allow the edition of mimetype for contents
@@ -1298,15 +1304,15 @@ class EditContentForm(EditForm):
 
     def get_view (self, compact=False):
         """Generate a view widget for editing content."""
-        vbox = gtk.VBox()
+        vbox = Gtk.VBox()
 
         if self.element.mimetype == 'application/x-advene-ruleset':
             compact=True
 
         if not compact and config.data.preferences['expert-mode']:
-            hbox = gtk.HBox()
-            l=gtk.Label(_("MIME Type"))
-            hbox.pack_start(l, expand=False)
+            hbox = Gtk.HBox()
+            l=Gtk.Label(label=_("MIME Type"))
+            hbox.pack_start(l, False, True, 0)
 
             mt=self.element.mimetype
             # Is the current value in the predefined list?
@@ -1329,16 +1335,16 @@ class EditContentForm(EditForm):
                                                       preselect=mt,
                                                       entry=self.mimetypeeditable)
 
-            hbox.pack_start(self.mimetype)
+            hbox.pack_start(self.mimetype, True, True, 0)
 
-            vbox.pack_start(hbox, expand=False)
+            vbox.pack_start(hbox, False, True, 0)
         else:
             self.mimetype=None
 
         handler = config.data.get_content_handler(self.element.mimetype)
         if handler is None:
             self.contentform=None
-            vbox.add(gtk.Label(_("Error: cannot find a content handler for %s")
+            vbox.add(Gtk.Label(label=_("Error: cannot find a content handler for %s")
                                % self.element.mimetype))
         else:
             self.contentform=handler(self.element,
@@ -1396,7 +1402,7 @@ class TextContentHandler (ContentHandler):
             return False
         buf = self.view.get_buffer()
         start_iter, end_iter = buf.get_bounds ()
-        text = unicode(buf.get_text (start_iter, end_iter))
+        text = buf.get_text(start_iter, end_iter, False)
         self.element.data = text
         self.set_modified(False)
         return True
@@ -1407,17 +1413,17 @@ class TextContentHandler (ContentHandler):
         # insertion is common in text editing.
         #if self.controller.gui and self.controller.gui.process_player_shortcuts(win, event):
         #    return True
-        if event.state & gtk.gdk.CONTROL_MASK:
-            if event.keyval == gtk.keysyms.s:
+        if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
+            if event.keyval == Gdk.KEY_s:
                 self.content_save()
                 return True
-            elif event.keyval == gtk.keysyms.o:
+            elif event.keyval == Gdk.KEY_o:
                 self.content_open()
                 return True
-            elif event.keyval == gtk.keysyms.r:
+            elif event.keyval == Gdk.KEY_r:
                 self.content_reload()
                 return True
-            elif event.keyval == gtk.keysyms.i:
+            elif event.keyval == Gdk.KEY_i:
                 self.browser_open()
                 return True
         return False
@@ -1428,7 +1434,7 @@ class TextContentHandler (ContentHandler):
                 if e.startswith('string:'):
                     e=e.replace('string:', '')
                 b=self.view.get_buffer()
-                b.insert_at_cursor(unicode(e))
+                b.insert_at_cursor(str(e))
             return True
         browser = Browser(element=self.element,
                           controller=self.controller,
@@ -1451,23 +1457,15 @@ class TextContentHandler (ContentHandler):
             fname=dialog.get_filename(default_file=self.fname)
         if fname is not None:
             try:
-                f=open(fname, 'r')
-            except IOError, e:
+                with open(fname, 'r', encoding='utf-8') as f:
+                    lines="".join(f.readlines())
+                    self.content_set(data)
+                    self.fname=fname
+            except IOError as e:
                 dialog.message_dialog(
-                    _("Cannot read the data:\n%s") % unicode(e),
-                    icon=gtk.MESSAGE_ERROR)
+                    _("Cannot read the data:\n%s") % str(e),
+                    icon=Gtk.MessageType.ERROR)
                 return True
-            lines="".join(f.readlines())
-            f.close()
-            try:
-                data=unicode(lines, 'utf8')
-            except UnicodeDecodeError:
-                # Fallback on latin1, which is very common, but may
-                # sometimes fail
-                data=unicode(lines, 'latin1')
-
-            self.content_set(data.encode('utf-8'))
-            self.fname=fname
         return True
 
     def content_save(self, b=None, fname=None):
@@ -1479,45 +1477,44 @@ class TextContentHandler (ContentHandler):
                 except AttributeError:
                     pass
             fname=dialog.get_filename(title=_("Save content to..."),
-                                               action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                               button=gtk.STOCK_SAVE,
+                                               action=Gtk.FileChooserAction.SAVE,
+                                               button=Gtk.STOCK_SAVE,
                                                default_file=default)
         if fname is not None:
             if os.path.exists(fname):
                 os.rename(fname, fname + '~')
             try:
-                f=open(fname, 'w')
-            except IOError, e:
+                b=self.view.get_buffer()
+                with open(fname, 'w', encoding='utf-8') as f:
+                    f.write(b.get_text(*b.get_bounds() + ( False, )))
+                self.fname=fname
+            except IOError as e:
                 dialog.message_dialog(
-                    _("Cannot save the data:\n%s") % unicode(e),
-                    icon=gtk.MESSAGE_ERROR)
+                    _("Cannot save the data:\n%s") % str(e),
+                    icon=Gtk.MessageType.ERROR)
                 return True
-            b=self.view.get_buffer()
-            f.write(unicode(b.get_text(*b.get_bounds())))
-            f.close()
-            self.fname=fname
         return True
 
     def get_view (self, compact=False):
         """Generate a view widget for editing text attribute."""
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
         if not compact:
-            tb = self.toolbar = gtk.Toolbar()
+            tb = self.toolbar = Gtk.Toolbar()
             vbox.toolbar=tb
-            tb.set_style(gtk.TOOLBAR_ICONS)
+            tb.set_style(Gtk.ToolbarStyle.ICONS)
 
-            b=gtk.ToolButton(gtk.STOCK_OPEN)
+            b=Gtk.ToolButton(Gtk.STOCK_OPEN)
             b.set_tooltip_text(_("Open a file (C-o)"))
             b.connect('clicked', self.content_open)
             tb.insert(b, -1)
 
-            b=gtk.ToolButton(gtk.STOCK_SAVE)
+            b=Gtk.ToolButton(Gtk.STOCK_SAVE)
             b.set_tooltip_text(_("Save to a file (C-s)"))
             b.connect('clicked', self.content_save)
             tb.insert(b, -1)
 
-            b=gtk.ToolButton(gtk.STOCK_REFRESH)
+            b=Gtk.ToolButton(Gtk.STOCK_REFRESH)
             b.set_tooltip_text(_("Reload the file (C-r)"))
             b.connect('clicked', self.content_reload)
             tb.insert(b, -1)
@@ -1527,28 +1524,28 @@ class TextContentHandler (ContentHandler):
                 b.set_tooltip_text(_("Insert a value from the browser (C-i)"))
                 tb.insert(b, -1)
 
-            vbox.pack_start(tb, expand=False)
+            vbox.pack_start(tb, False, True, 0)
 
-        if gtksourceview2 is not None:
-            textview=gtksourceview2.View(gtksourceview2.Buffer())
+        if GtkSource is not None:
+            textview=GtkSource.View.new_with_buffer(GtkSource.Buffer())
             b=textview.get_buffer()
-            m=gtksourceview2.language_manager_get_default()
+            m=GtkSource.LanguageManager.get_default()
             if m:
                 b.set_language(m.guess_language(content_type=self.element.mimetype))
                 b.set_highlight_syntax(True)
             textview.set_editable (self.editable)
-            textview.set_wrap_mode (gtk.WRAP_CHAR)
+            textview.set_wrap_mode (Gtk.WrapMode.CHAR)
             textview.set_auto_indent(True)
             b.begin_not_undoable_action()
-            b.set_text (self.element.data)
+            b.set_text(self.element.data)
             b.end_not_undoable_action()
             textview.connect('key-press-event', self.key_pressed_cb)
 
             if not compact:
-                b_undo = gtk.ToolButton(gtk.STOCK_UNDO)
+                b_undo = Gtk.ToolButton(Gtk.STOCK_UNDO)
                 tb.insert(b_undo, -1)
 
-                b_redo = gtk.ToolButton(gtk.STOCK_REDO)
+                b_redo = Gtk.ToolButton(Gtk.STOCK_REDO)
                 tb.insert(b_redo, -1)
 
                 def undo_cb(buf):
@@ -1575,9 +1572,9 @@ class TextContentHandler (ContentHandler):
                 b_redo.connect('clicked', redo)
                 undo_cb(textview.get_buffer())
         else:
-            textview = gtk.TextView ()
+            textview = Gtk.TextView ()
             textview.set_editable (self.editable)
-            textview.set_wrap_mode (gtk.WRAP_CHAR)
+            textview.set_wrap_mode (Gtk.WrapMode.CHAR)
             textview.get_buffer().set_text(self.element.data)
             textview.connect('key-press-event', self.key_pressed_cb)
         self.view = textview
@@ -1586,7 +1583,7 @@ class TextContentHandler (ContentHandler):
         col=self.controller.get_element_color(self.parent)
         if col is not None:
             color=name2color(col)
-            self.view.modify_base(gtk.STATE_NORMAL, color)
+            self.view.modify_base(Gtk.StateType.NORMAL, color)
 
         # Hook the completer component
         if hasattr(self.parent.rootPackage, '_indexer'):
@@ -1595,8 +1592,8 @@ class TextContentHandler (ContentHandler):
                                 element=self.parent,
                                 indexer=self.parent.rootPackage._indexer)
 
-        scroll_win = gtk.ScrolledWindow ()
-        scroll_win.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        scroll_win = Gtk.ScrolledWindow ()
+        scroll_win.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         scroll_win.add(textview)
 
         vbox.add(scroll_win)
@@ -1633,19 +1630,19 @@ class GenericContentHandler (ContentHandler):
     def update_preview(self):
         self.preview.foreach(self.preview.remove)
         if self.element.mimetype.startswith('image/'):
-            i=gtk.Image()
+            i=Gtk.Image()
             if self.fname is None:
                 # Load the element content
-                loader = gtk.gdk.PixbufLoader()
+                loader = GdkPixbuf.PixbufLoader()
                 try:
-                    loader.write (self.data, len (self.data))
+                    loader.write (self.data)
                     loader.close ()
                     pixbuf = loader.get_pixbuf ()
-                except gobject.GError:
+                except GObject.GError:
                     # The PNG data was invalid.
-                    pixbuf=gtk.gdk.pixbuf_new_from_file(config.data.advenefile( ( 'pixmaps', 'notavailable.png' ) ))
+                    pixbuf=GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile( ( 'pixmaps', 'notavailable.png' ) ))
             else:
-                pixbuf=gtk.gdk.pixbuf_new_from_file(self.fname)
+                pixbuf=GdkPixbuf.Pixbuf.new_from_file(self.fname)
             i.set_from_pixbuf(pixbuf)
             self.preview.add(i)
             i.show()
@@ -1659,14 +1656,14 @@ class GenericContentHandler (ContentHandler):
         return True
 
     def key_pressed_cb (self, win, event):
-        if event.state & gtk.gdk.CONTROL_MASK:
-            if event.keyval == gtk.keysyms.s:
+        if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
+            if event.keyval == Gdk.KEY_s:
                 self.content_save()
                 return True
-            elif event.keyval == gtk.keysyms.o:
+            elif event.keyval == Gdk.KEY_o:
                 self.content_open()
                 return True
-            elif event.keyval == gtk.keysyms.r:
+            elif event.keyval == Gdk.KEY_r:
                 self.content_reload()
                 return True
         return False
@@ -1677,10 +1674,10 @@ class GenericContentHandler (ContentHandler):
         if fname is not None:
             try:
                 f=open(fname, 'rb')
-            except IOError, e:
+            except IOError as e:
                 dialog.message_dialog(
-                    _("Cannot read the data:\n%s") % unicode(e),
-                    icon=gtk.MESSAGE_ERROR)
+                    _("Cannot read the data:\n%s") % str(e),
+                    icon=Gtk.MessageType.ERROR)
                 return True
             self.set_filename(fname)
 
@@ -1705,8 +1702,8 @@ class GenericContentHandler (ContentHandler):
                 except AttributeError:
                     pass
             fname=dialog.get_filename(title=_("Save content to..."),
-                                               action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                               button=gtk.STOCK_SAVE,
+                                               action=Gtk.FileChooserAction.SAVE,
+                                               button=Gtk.STOCK_SAVE,
                                                default_file=default)
         if fname is not None:
             if os.path.exists(fname):
@@ -1715,46 +1712,46 @@ class GenericContentHandler (ContentHandler):
                 f=open(fname, 'wb')
                 f.write(self.data)
                 f.close()
-            except IOError, e:
+            except IOError as e:
                 dialog.message_dialog(
-                    _("Cannot save the data:\n%s") % unicode(e),
-                    icon=gtk.MESSAGE_ERROR)
+                    _("Cannot save the data:\n%s") % str(e),
+                    icon=Gtk.MessageType.ERROR)
                 return True
             self.set_filename(fname)
         return True
 
     def get_view (self, compact=False):
         """Generate a view widget for editing any content (by saving/loading to/from a file)."""
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        tb=gtk.Toolbar()
-        tb.set_style(gtk.TOOLBAR_ICONS)
+        tb=Gtk.Toolbar()
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
 
-        b=gtk.ToolButton(gtk.STOCK_OPEN)
+        b=Gtk.ToolButton(Gtk.STOCK_OPEN)
         b.set_tooltip_text(_("Open a file (C-o)"))
         b.connect('clicked', self.content_open)
         tb.insert(b, -1)
 
-        b=gtk.ToolButton(gtk.STOCK_SAVE)
+        b=Gtk.ToolButton(Gtk.STOCK_SAVE)
         b.set_tooltip_text(_('Save to a file (C-s)'))
         b.connect('clicked', self.content_save)
         tb.insert(b, -1)
 
-        b=gtk.ToolButton(gtk.STOCK_REFRESH)
+        b=Gtk.ToolButton(Gtk.STOCK_REFRESH)
         b.set_tooltip_text(_('Reload the file (C-r)'))
         b.connect('clicked', self.content_reload)
         tb.insert(b, -1)
 
         tb.show_all()
-        vbox.pack_start(tb, expand=False)
+        vbox.pack_start(tb, False, True, 0)
 
-        self.filename_entry = gtk.Entry()
+        self.filename_entry = Gtk.Entry()
         self.filename_entry.set_editable (self.editable)
         vbox.connect('key-press-event', self.key_pressed_cb)
 
-        vbox.pack_start(self.filename_entry, expand=False)
-        self.preview=gtk.VBox()
-        vbox.pack_start(self.preview, expand=True)
+        vbox.pack_start(self.filename_entry, False, True, 0)
+        self.preview=Gtk.VBox()
+        vbox.pack_start(self.preview, True, True, 0)
         self.update_preview()
         return vbox
 config.data.register_content_handler(GenericContentHandler)
@@ -1771,7 +1768,7 @@ class EditFragmentForm(EditForm):
     def check_validity(self):
         if self.begin.value >= self.end.value:
             dialog.message_dialog(_("Begin time is greater than end time"),
-                                           icon=gtk.MESSAGE_ERROR)
+                                           icon=Gtk.MessageType.ERROR)
             return False
         else:
             return True
@@ -1792,26 +1789,26 @@ class EditFragmentForm(EditForm):
         return True
 
     def get_view(self, compact=False):
-        hbox=gtk.HBox()
+        hbox=Gtk.HBox()
 
         self.begin=TimeAdjustment(value=self.element.begin,
                                   controller=self.controller,
                                   editable=self.editable,
                                   compact=compact,
                                   callback=self.begin_callback)
-        f=gtk.Frame()
+        f=Gtk.Frame()
         f.set_label(_("Begin"))
         f.add(self.begin.get_widget())
-        hbox.pack_start(f, expand=False)
+        hbox.pack_start(f, False, True, 0)
 
         self.end=TimeAdjustment(value=self.element.end,
                                 controller=self.controller,
                                 editable=self.editable,
                                 compact=compact)
-        f=gtk.Frame()
+        f=Gtk.Frame()
         f.set_label(_("End"))
         f.add(self.end.get_widget())
-        hbox.pack_start(f, expand=False)
+        hbox.pack_start(f, False, True, 0)
 
         return hbox
 
@@ -1841,10 +1838,10 @@ class EditGenericForm(EditForm):
             return False
 
     def get_view(self, compact=False):
-        hbox = gtk.HBox()
+        hbox = Gtk.HBox()
 
-        l=gtk.Label(self.title)
-        hbox.pack_start(l, expand=False)
+        l=Gtk.Label(label=self.title)
+        hbox.pack_start(l, False, True, 0)
         if self.sizegroup is not None:
             self.sizegroup.add_widget(l)
 
@@ -1875,14 +1872,14 @@ class EditGenericForm(EditForm):
                                                    preselect=v,
                                                    entry=self.editable)
         else:
-            self.entry=gtk.Entry()
+            self.entry=Gtk.Entry()
             self.entry.set_text(v)
             self.entry.set_editable(self.editable)
 
         if self.tooltip:
             self.entry.set_tooltip_text(self.tooltip)
 
-        hbox.pack_start(self.entry)
+        hbox.pack_start(self.entry, True, True, 0)
 
         if self.type == 'color':
             if not config.data.preferences['expert-mode'] and (not v or v.startswith('string:')):
@@ -1890,14 +1887,14 @@ class EditGenericForm(EditForm):
                 # current color is statically defined or empty
                 self.entry.hide()
                 self.entry.set_no_show_all(True)
-            b=gtk.ColorButton()
+            b=Gtk.ColorButton()
             b.set_use_alpha(False)
 
             if v:
                 c=self.controller.build_context()
                 try:
                     color=c.evaluateValue(v)
-                    gtk_color=gtk.gdk.color_parse(color)
+                    gtk_color=Gdk.color_parse(color)
                     b.set_color(gtk_color)
                 except:
                     pass
@@ -1908,23 +1905,24 @@ class EditGenericForm(EditForm):
                 return True
 
             b.connect('color-set', handle_color)
-            hbox.pack_start(b, expand=False)
+            hbox.pack_start(b, False, True, 0)
 
             def drag_received(widget, context, x, y, selection, targetType, time):
                 """Handle the drop of a color.
                 """
                 if targetType == config.data.target_type['color']:
                     # The structure consists in 4 unsigned shorts: r, g, b, opacity
-                    (r, g, b, opacity)=struct.unpack('HHHH', selection.data)
+                    (r, g, b, opacity)=struct.unpack('HHHH', selection.get_data())
                     self.entry.set_text("string:#%04x%04x%04x" % (r, g, b))
                 return False
 
             # Allow the entry to get drops of type application/x-color
             self.entry.connect('drag-data-received', drag_received)
-            self.entry.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                  gtk.DEST_DEFAULT_HIGHLIGHT |
-                                  gtk.DEST_DEFAULT_ALL,
-                                  config.data.drag_type['color'], gtk.gdk.ACTION_COPY)
+            self.entry.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                     Gtk.DestDefaults.HIGHLIGHT |
+                                     Gtk.DestDefaults.ALL,
+                                     config.data.get_target_types('color'),
+                                     Gdk.DragAction.COPY)
 
 
         hbox.show_all()
@@ -1945,7 +1943,7 @@ class EditGenericForm(EditForm):
         if hasattr(self.entry, 'get_current_element'):
             v=self.entry.get_current_element()
         else:
-            v=unicode(self.entry.get_text())
+            v=self.entry.get_text()
         self.setter(v)
         return True
 
@@ -2026,7 +2024,7 @@ class EditAttributesForm (EditForm):
         else:
             # No specific type was given. Guess it...
             e=getattr(self.element, at)
-            if isinstance (e, int) or isinstance (e, long):
+            if isinstance (e, int):
                 typ='int'
         return typ
 
@@ -2039,14 +2037,14 @@ class EditAttributesForm (EditForm):
         typ = self.attribute_type (at)
         if typ == 'int':
             try:
-                val = long(v)
+                val = int(v)
             except ValueError:
-                raise ValueError (_('Expecting an integer.'))
+                raise ValueError (_('Expecting an integer.')) from None
         elif typ == 'advene':
             # We should not have writable Advene elements in attributes anyway
             pass
         elif isinstance(v, str):
-            val = unicode(v)
+            val = str(v)
         else:
             val=v
         return val
@@ -2060,22 +2058,22 @@ class EditAttributesForm (EditForm):
         if typ == 'advene':
             return self.controller.get_title(v)
         elif v is not None:
-            return unicode(v)
+            return str(v)
         else:
             return None
 
-    def cell_edited(self, cell, path_string, text, (model, column)):
+    def cell_edited(self, cell, path_string, text, model, column):
         it = model.get_iter_from_string(path_string)
         if not it:
             return
         at = model.get_value (it, self.COLUMN_NAME)
         try:
             val = self.repr_to_value (at, text)
-        except ValueError, e:
+        except ValueError as e:
             dialog.message_dialog(
                 _("The %(attribute)s attribute could not be updated:\n\n%(error)s\n\nResetting to the original value.")
-                % {'attribute': at, 'error': unicode(e)},
-                icon=gtk.MESSAGE_WARNING)
+                % {'attribute': at, 'error': str(e)},
+                icon=Gtk.MessageType.WARNING)
             # Invalid value -> we take the original value
             val = getattr(self.element, at)
 
@@ -2087,13 +2085,12 @@ class EditAttributesForm (EditForm):
         it = model.get_iter_first ()
         while it is not None:
             at = model.get_value (it, EditAttributesForm.COLUMN_NAME)
-            #print "Updating value of %s.%s" % (str(self.element), at)
             if at in self.editable:
                 text = model.get_value (it, EditAttributesForm.COLUMN_VALUE)
                 v = None
                 try:
                     v = self.repr_to_value (at, text)
-                except ValueError, e:
+                except ValueError as e:
                     v = None
                     invalid.append((at, e))
             it = model.iter_next(it)
@@ -2101,8 +2098,8 @@ class EditAttributesForm (EditForm):
         if invalid:
             dialog.message_dialog(
                 _("The following attributes cannot be updated:\n\n%s")
-                % "\n".join ([ "%s: %s" % (at, str(e)) for (at, e) in invalid ]),
-                icon=gtk.MESSAGE_ERROR)
+                % "\n".join ([ "%s: %s" % (attr, str(err)) for (attr, err) in invalid ]),
+                icon=Gtk.MessageType.ERROR)
             return False
         else:
             return True
@@ -2120,29 +2117,27 @@ class EditAttributesForm (EditForm):
         it = model.get_iter_first ()
         while it is not None:
             at = model.get_value (it, EditAttributesForm.COLUMN_NAME)
-            #print "Updating value of %s.%s" % (str(self.element), at)
             if at in self.editable:
                 text = model.get_value (it, EditAttributesForm.COLUMN_VALUE)
                 v = None
                 try:
                     v = self.repr_to_value (at, text)
-                except ValueError, e:
+                except ValueError as e:
                     v = None
                     invalid.append((at, e))
 
                 if v is not None:
                     try:
-                        #print "el.%s = %s (%s)" % (at, str(v), repr(type(v)))
                         setattr (self.element, at, v)
-                    except ValueError, e:
+                    except ValueError as e:
                         invalid.append((at, e))
             it = model.iter_next(it)
         # Display list of invalid attributes
         if invalid:
             dialog.message_dialog(
                 _("The following attributes could not be updated:\n\n%s")
-                % "\n".join ([ "%s: %s" % (at, str(e)) for (at, e) in invalid ]),
-                icon=gtk.MESSAGE_ERROR)
+                % "\n".join ([ "%s: %s" % (attr, str(err)) for (attr, err) in invalid ]),
+                icon=Gtk.MessageType.ERROR)
         return True
 
     def get_view (self, compact=False):
@@ -2150,32 +2145,32 @@ class EditAttributesForm (EditForm):
 
         Return the view widget.
         """
-        model = gtk.ListStore (gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_BOOLEAN, gobject.TYPE_INT)
+        model = Gtk.ListStore (GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_BOOLEAN, GObject.TYPE_INT)
 
         el = self.element
 
-        treeview = gtk.TreeView(model)
+        treeview = Gtk.TreeView(model)
 
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(_('Attribute'), renderer,
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn(_('Attribute'), renderer,
                                     text=self.COLUMN_LABEL,
                                     weight=self.COLUMN_WEIGHT)
 
         treeview.append_column(column)
 
-        renderer = gtk.CellRendererText()
-        renderer.connect('edited', self.cell_edited, (model, 1))
-        column = gtk.TreeViewColumn(_('Value'), renderer,
+        renderer = Gtk.CellRendererText()
+        renderer.connect('edited', self.cell_edited, model, 1)
+        column = Gtk.TreeViewColumn(_('Value'), renderer,
                                     text=self.COLUMN_VALUE,
                                     editable=self.COLUMN_EDITABLE,
                                     weight=self.COLUMN_WEIGHT)
-        column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+        column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
         column.set_resizable(True)
         column.set_clickable(False)
         treeview.append_column(column)
 
-        weight = {False: pango.WEIGHT_BOLD,
-                  True:  pango.WEIGHT_NORMAL}
+        weight = {False: Pango.Weight.BOLD,
+                  True:  Pango.Weight.NORMAL}
 
         for at in self.attributes:
             editable = at in self.editable
@@ -2225,7 +2220,7 @@ class EditElementListForm(EditForm):
         y = int(event.y)
 
         if button == 3:
-            if event.window is widget.get_bin_window():
+            if event.get_window() is widget.get_bin_window():
                 model = widget.get_model()
                 t = widget.get_path_at_pos(x, y)
                 if t is not None:
@@ -2246,9 +2241,9 @@ class EditElementListForm(EditForm):
         return r
 
     def create_store(self):
-        store=gtk.ListStore(
-            gobject.TYPE_PYOBJECT,
-            gobject.TYPE_STRING
+        store=Gtk.ListStore(
+            GObject.TYPE_PYOBJECT,
+            GObject.TYPE_STRING
             )
         for el in getattr(self.model, self.field):
             store.append( [ el,
@@ -2272,27 +2267,27 @@ class EditElementListForm(EditForm):
         return True
 
     def get_view(self, compact=False):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
         self.store=self.create_store()
 
-        treeview=gtk.TreeView(model=self.store)
+        treeview=Gtk.TreeView(model=self.store)
         treeview.set_reorderable(True)
         treeview.connect('button-press-event', self.tree_view_button_cb)
         self.treeview=treeview
 
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(self.title, renderer,
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn(self.title, renderer,
                                     text=self.COLUMN_LABEL)
         treeview.append_column(column)
 
         vbox.add(treeview)
 
-        hbox=gtk.HButtonBox()
-        b=gtk.Button(stock=gtk.STOCK_ADD)
+        hbox=Gtk.HButtonBox()
+        b=Gtk.Button(stock=Gtk.STOCK_ADD)
         b.connect('clicked', self.insert_new, treeview)
         hbox.add(b)
 
-        b=gtk.Button(stock=gtk.STOCK_REMOVE)
+        b=Gtk.Button(stock=Gtk.STOCK_REMOVE)
         b.connect('clicked', self.delete_current, treeview)
         hbox.add(b)
 
@@ -2328,7 +2323,7 @@ class EditTagForm(EditForm):
                   if not re.match('^[\w\d_]+$', t) ]
         if invalid:
             dialog.message_dialog(_("Some tags contain invalid characters: %s") % ", ".join(invalid),
-                                           icon=gtk.MESSAGE_ERROR)
+                                           icon=Gtk.MessageType.ERROR)
             return False
         else:
             return True
@@ -2349,8 +2344,8 @@ class EditTagForm(EditForm):
         return True
 
     def get_view(self, compact=False):
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Tags:") + " "), expand=False)
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Tags:") + " "), False, False, 0)
         self.view=TagBag(controller=self.controller, tags=self.element.tags, vertical=False)
         self.view.register_callback(controller=self.controller)
         self.view.widget.connect('destroy', lambda w: self.view.unregister_callback(self.controller))
@@ -2371,15 +2366,15 @@ class EditRelationsForm(EditForm):
         invalid=[]
         if invalid:
             dialog.message_dialog(_("Some tags contain invalid characters: %s") % ", ".join(invalid),
-                                           icon=gtk.MESSAGE_ERROR)
+                                           icon=Gtk.MessageType.ERROR)
             return False
         else:
             return True
 
     def refresh(self):
         self.view.foreach(self.view.remove)
-        col1=gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
-        col2=gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
+        col1=Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL)
+        col2=Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL)
         for i, r in enumerate(self.element.relations):
             # Determine the direction
             if r.members[0] == self.element:
@@ -2388,19 +2383,19 @@ class EditRelationsForm(EditForm):
             else:
                 direction="from"
                 other=r.members[0]
-            hb=gtk.HBox()
+            hb=Gtk.HBox()
 
             b=RelationRepresentation(r, controller=self.controller, direction=direction)
             b.set_alignment(0, 0)
             col1.add_widget(b)
-            hb.pack_start(b, expand=False)
+            hb.pack_start(b, False, True, 0)
 
             a=AnnotationRepresentation(other, controller=self.controller)
             a.set_alignment(0, 0)
             col2.add_widget(a)
-            hb.pack_start(a, expand=False)
+            hb.pack_start(a, False, True, 0)
 
-            self.view.pack_start(hb, expand=False)
+            self.view.pack_start(hb, False, True, 0)
         self.view.show_all()
         return
 
@@ -2413,6 +2408,6 @@ class EditRelationsForm(EditForm):
         return True
 
     def get_view(self, compact=False):
-        self.view=gtk.VBox()
+        self.view=Gtk.VBox()
         self.refresh()
         return self.view
diff --git a/lib/advene/gui/edit/frameselector.py b/lib/advene/gui/edit/frameselector.py
index 720ce27..5084036 100644
--- a/lib/advene/gui/edit/frameselector.py
+++ b/lib/advene/gui/edit/frameselector.py
@@ -1,6 +1,6 @@
 
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,11 +20,14 @@
 
 It depends on a Controller instance to be able to interact with the video player.
 """
+import logging
+logger = logging.getLogger(__name__)
 
-import gtk
+from gi.repository import Gdk
+from gi.repository import Gtk
 import advene.core.config as config
-from advene.gui.widget import TimestampRepresentation, GenericColorButtonWidget
-from advene.gui.util import dialog, get_color_style
+from advene.gui.widget import TimestampRepresentation
+from advene.gui.util import dialog
 from gettext import gettext as _
 
 class FrameSelector(object):
@@ -46,17 +49,15 @@ class FrameSelector(object):
         self.border_mode = border_mode
 
         # Number of displayed timestamps
-        self.count = 8
-        self.frame_length = 1000 / config.data.preferences['default-fps']
-
-        self.black_color = gtk.gdk.color_parse('black')
-        self.red_color = gtk.gdk.color_parse('#ff6666')
-        self.mouseover_color = gtk.gdk.color_parse('#ff0000')
+        self.count = config.data.preferences['frameselector-count']
+        self.frame_length = self.controller.frame2time(1)
+        self.frame_width = config.data.preferences['frameselector-width']
 
         # List of TimestampRepresentation widgets.
         # It is initialized in build_widget()
         self.frames = []
         self.widget = self.build_widget()
+        self.refresh_snapshots()
 
     def set_timestamp(self, timestamp):
         """Set the reference timestamp.
@@ -64,6 +65,7 @@ class FrameSelector(object):
         It is the timestamp displayed in the label, and corresponds
         most of the time to the original timestamp (before adjustment).
         """
+        timestamp = self.controller.round_timestamp(timestamp)
         self.timestamp = timestamp
         self.selected_value = timestamp
         self.update_timestamp(timestamp)
@@ -79,11 +81,11 @@ class FrameSelector(object):
         @param focus_index: the index of the child widget which should get the focus
         @type focus_index: int
         """
-        t = timestamp - self.count / 2 * self.frame_length
+        t = timestamp - int(self.count / 2) * self.frame_length
         if t < 0:
             # Display from 0. But we have to take this into account
             # when handling focus_index
-            index_offset = t / self.frame_length
+            index_offset = int(t / self.frame_length)
             t = 0
         else:
             index_offset = 0
@@ -91,32 +93,31 @@ class FrameSelector(object):
         matching_index = -1
         for (i, f) in enumerate(self.frames):
             f.value = t
-            f.left_border.set_color(self.black_color)
-            f.right_border.set_color(self.black_color)
+            f.remove_class('frameselector_selected')
 
             if t < self.timestamp:
-                f.bgcolor = '#666666'
+                f.remove_class('frameselector_after')
+                f.add_class('frameselector_before')
             else:
                 if matching_index < 0:
                     matching_index = i
 
                 if t == self.timestamp and self.border_mode == 'right':
-                    f.bgcolor = '#666666'
+                    f.remove_class('frameselector_after')
+                    f.add_class('frameselector_before')
                 else:
-                    f.bgcolor = 'black'
+                    f.remove_class('frameselector_before')
+                    f.add_class('frameselector_after')
 
             t += self.frame_length
 
         if matching_index >= 0:
             f = self.frames[matching_index]
-            if self.border_mode == 'left' or self.border_mode ==  'both':
-                f.left_border.set_color(self.red_color)
-            if self.border_mode == 'right' or self.border_mode ==  'both':
-                f.right_border.set_color(self.red_color)
+            f.add_class('frameselector_selected')
 
         # Handle focus
         if focus_index is None:
-            focus_index = self.count / 2
+            focus_index = int(self.count / 2)
 
         self.frames[focus_index + index_offset].grab_focus()
         return True
@@ -130,22 +131,22 @@ class FrameSelector(object):
         else:
             ref=self.frames[offset]
             start = ref.value
-        self.update_timestamp(start + self.count / 2 * self.frame_length, focus_index)
+        self.update_timestamp(start + int(self.count / 2) * self.frame_length, focus_index)
         return True
 
     def refresh_snapshots(self):
         """Update non-initialized snapshots.
         """
-        ic=self.controller.package.imagecache
-        for c in self.frames:
-            if not ic.is_initialized(c.value):
-                self.controller.update_snapshot(c.value)
+        for f in self.frames:
+            if not f.valid_screenshot:
+                self.controller.update_snapshot(f.value, force=True)
         return True
 
     def handle_scroll_event(self, widget, event):
-        if event.direction == gtk.gdk.SCROLL_UP or event.direction == gtk.gdk.SCROLL_LEFT:
+        logger.warn("scroll %d", event.direction)
+        if event.direction == Gdk.ScrollDirection.UP or event.direction == Gdk.ScrollDirection.LEFT:
             offset=-1
-        elif event.direction == gtk.gdk.SCROLL_DOWN or event.direction == gtk.gdk.SCROLL_RIGHT:
+        elif event.direction == Gdk.ScrollDirection.DOWN or event.direction == Gdk.ScrollDirection.RIGHT:
             offset=+1
         self.update_offset(offset)
         return True
@@ -153,17 +154,21 @@ class FrameSelector(object):
     def focus_index(self):
         """Return the index of the TimestampRepresentation which has the focus.
         """
-        return self.frames.index(self.frames[0].get_parent().get_focus_child())
+        child = self.frames[0].get_parent().get_focus_child()
+        if child is not None:
+            return self.frames.index(child)
+        else:
+            return 0
 
     def handle_key_press(self, widget, event):
-        if event.keyval == gtk.keysyms.Left:
+        if event.keyval == Gdk.KEY_Left:
             i = self.focus_index()
             if i == 0:
                 self.update_offset(-1, focus_index = 0)
             else:
                 self.frames[i - 1].grab_focus()
             return True
-        elif event.keyval == gtk.keysyms.Right:
+        elif event.keyval == Gdk.KEY_Right:
             i = self.focus_index()
             if i == len(self.frames) -1:
                 self.update_offset(+1, focus_index = -1)
@@ -173,35 +178,37 @@ class FrameSelector(object):
         return False
 
     def get_value(self, title=None):
+        """Popup a FrameSelector dialog to select a precise frame.
+        """
         if title is None:
             title = _("Select the appropriate snapshot")
-        d = gtk.Dialog(title=title,
-                       parent=None,
-                       flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                                 gtk.STOCK_OK, gtk.RESPONSE_OK,
+        d = Gtk.Dialog(title=title,
+                       parent=self.controller.gui.gui.win,
+                       flags=Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+                                 Gtk.STOCK_OK, Gtk.ResponseType.OK,
                                  ))
 
         def callback(v):
-            d.response(gtk.RESPONSE_OK)
+            d.response(Gtk.ResponseType.OK)
             return True
         self.callback = callback
 
         d.vbox.add(self.widget)
 
-        buttons = gtk.HBox()
-        b=gtk.Button(_("Refresh snapshots"))
+        buttons = Gtk.HBox()
+        b=Gtk.Button(_("Refresh snapshots"))
         b.set_tooltip_text(_("Refresh missing snapshots"))
         b.connect("clicked", lambda b: self.refresh_snapshots())
-        buttons.pack_start(b, expand=False)
-        d.vbox.pack_start(buttons, expand=False)
+        buttons.pack_start(b, False, True, 0)
+        d.vbox.pack_start(buttons, False, True, 0)
 
         d.show_all()
         dialog.center_on_mouse(d)
 
         res = d.run()
         timestamp = self.timestamp
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             timestamp = self.selected_value
         d.destroy()
         return timestamp
@@ -218,77 +225,56 @@ class FrameSelector(object):
         return True
 
     def build_widget(self):
-        vb=gtk.VBox()
+        vb=Gtk.VBox()
 
-        l = gtk.Label(self.label)
-        vb.pack_start(l, expand=False)
+        l = Gtk.Label(label=self.label)
+        vb.pack_start(l, False, True, 0)
 
-        hb=gtk.HBox()
+        hb=Gtk.HBox()
 
-        eb = gtk.EventBox()
-        ar = gtk.Arrow(gtk.ARROW_LEFT, gtk.SHADOW_IN)
+        eb = Gtk.EventBox()
+        ar = Gtk.Arrow(Gtk.ArrowType.LEFT, Gtk.ShadowType.IN)
         ar.set_tooltip_text(_("Click to see more frames or scroll with the mouse wheel"))
         eb.connect('button-press-event', lambda b,e: self.update_offset(-1))
         eb.add(ar)
-        hb.pack_start(eb, expand=False)
+        hb.pack_start(eb, False, True, 0)
 
         r = None
-        for i in xrange(self.count):
-
-            border = GenericColorButtonWidget('border')
-            border.default_size=(3, 110)
-            border.local_color=self.black_color
-
-            if r is not None:
-                # Previous TimestampRepresentation -> right border
-                r.right_border = border
-
-            r = TimestampRepresentation(0, self.controller, width=100, visible_label=True,
-                                        epsilon=(1000 / config.data.preferences['default-fps'] - 10))
+        for i in range(self.count):
+
+            r = TimestampRepresentation(0, None,
+                                        self.controller,
+                                        width=self.frame_width,
+                                        visible_label=True,
+                                        precision=0)
+            r.add_class("frameselector_frame")
+            r.add_class("frameselector_frame_%s" % self.border_mode)
             self.frames.append(r)
             r.connect("clicked", self.select_time)
-            r.left_border = border
 
             def enter_bookmark(widget, event):
-                if self.border_mode == 'left':
-                    b=widget.left_border
-                elif self.border_mode == 'right':
-                    b=widget.right_border
-                b.old_color = b.local_color
-                b.set_color(self.mouseover_color)
+                widget.add_class('frameselector_selected')
                 return False
             def leave_bookmark(widget, event):
-                if self.border_mode == 'left':
-                    b=widget.left_border
-                elif self.border_mode == 'right':
-                    b=widget.right_border
-                b.set_color(b.old_color)
+                widget.remove_class('frameselector_selected')
                 return False
-            if self.border_mode in ('left', 'right'):
-                r.connect('enter-notify-event', enter_bookmark)
-                r.connect('leave-notify-event', leave_bookmark)
-
-            hb.pack_start(border, expand=False)
-            hb.pack_start(r, expand=False)
-
-        # Last right border
-        border = GenericColorButtonWidget('border')
-        border.default_size=(3, 110)
-        border.local_color=self.black_color
-        r.right_border = border
-        hb.pack_start(border, expand=False)
-
-        eb = gtk.EventBox()
-        ar = gtk.Arrow(gtk.ARROW_RIGHT, gtk.SHADOW_IN)
+            r.connect('enter-notify-event', enter_bookmark)
+            r.connect('leave-notify-event', leave_bookmark)
+
+            hb.pack_start(r, False, True, 0)
+
+        eb = Gtk.EventBox()
+        ar = Gtk.Arrow(Gtk.ArrowType.RIGHT, Gtk.ShadowType.IN)
         ar.set_tooltip_text(_("Click to see more frames or scroll with the mouse wheel"))
         eb.connect('button-press-event', lambda b,e: self.update_offset(+1))
         eb.add(ar)
-        hb.pack_start(eb, expand=False)
+        hb.pack_start(eb, False, True, 0)
 
-        hb.set_style(get_color_style(hb, 'black', 'black'))
-        hb.connect('scroll-event', self.handle_scroll_event)
-        hb.connect('key-press-event', self.handle_key_press)
         vb.add(hb)
 
+        vb.set_events(Gdk.EventMask.SCROLL_MASK | Gdk.EventMask.KEY_PRESS_MASK)
+        vb.connect('scroll-event', self.handle_scroll_event)
+        vb.connect('key-press-event', self.handle_key_press)
+
         self.update_timestamp(self.timestamp)
         return vb
diff --git a/lib/advene/gui/edit/htmleditor.py b/lib/advene/gui/edit/htmleditor.py
index 0854a32..434e5ad 100755
--- a/lib/advene/gui/edit/htmleditor.py
+++ b/lib/advene/gui/edit/htmleditor.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,6 +19,8 @@
 #
 """Basic pseudo-WYSIWYG HTML editor, with simple ZPT editing facilities.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 # Derived from facilhtml code (GPLv2 - http://code.google.com/p/facilhtml/)
 
@@ -27,26 +29,25 @@
 # - Insert bullets in list items
 # - Handle list item insertion
 
-import gobject
-import pygtk
-pygtk.require('2.0')
-import gtk
-import pango
+from gi.repository import GObject
+from gi.repository import Gtk
+from gi.repository import GdkPixbuf
+from gi.repository import Pango
 import sys
-import urllib2
+import urllib.request, urllib.error, urllib.parse
 import socket
-import StringIO
+import io
 import re
-from HTMLParser import HTMLParser
+from html.parser import HTMLParser
 try:
-    import gtksourceview2
+    from gi.repository import GtkSource
 except ImportError:
-    gtksourceview2=None
+    GtkSource=None
 
-if gtksourceview2 is None:
-    textview_class=gtk.TextView
+if GtkSource is None:
+    textview_class=Gtk.TextView
 else:
-    textview_class=gtksourceview2.View
+    textview_class=GtkSource.View
 
 broken_xpm="""20 22 5 1
   c black
@@ -98,11 +99,11 @@ class HTMLEditor(textview_class, HTMLParser):
     # FIXME: we should parse at least a subset of CSS to get some things right
     __formats = {
          'h1': { 'font': "sans bold 16",
-                 #'justification': gtk.JUSTIFY_CENTER,
+                 #'justification': Gtk.Justification.CENTER,
                  'pixels-above-lines': 8,
                  'pixels-below-lines': 4 },
          'h2': { 'font': "sans bold 12",
-                 #'justification': gtk.JUSTIFY_CENTER,
+                 #'justification': Gtk.Justification.CENTER,
                  'pixels-above-lines': 6,
                  'pixels-below-lines': 3 },
          'h3': { 'font': "sans bold italic 10",
@@ -126,7 +127,7 @@ class HTMLEditor(textview_class, HTMLParser):
          'strong': { 'font': "sans bold italic 10" },
          'code': { 'font': "monospace 10" },
          'a': { 'font': "sans 10",
-                'underline': pango.UNDERLINE_SINGLE,
+                'underline': Pango.Underline.SINGLE,
                 'foreground': 'blue' },
          'head': { 'invisible': True },
          'table': {},
@@ -148,12 +149,12 @@ class HTMLEditor(textview_class, HTMLParser):
          __tags as a list of tags in the text and present their
          positions so we can allocate the formatting.
         """
-        gtk.TextView.__init__(self, *cnf, **kw)
+        GObject.GObject.__init__(self, *cnf, **kw)
         HTMLParser.__init__(self)
-        if gtksourceview2 is not None:
-            self.set_buffer(gtksourceview2.Buffer())
+        if GtkSource is not None:
+            self.set_buffer(GtkSource.Buffer())
         self.set_editable(True)
-        self.set_wrap_mode(gtk.WRAP_WORD)
+        self.set_wrap_mode(Gtk.WrapMode.WORD)
 
         # Callers can override this with a custom method to load URLs.
         # The method takes a URL as parameter, and returns the
@@ -178,11 +179,10 @@ class HTMLEditor(textview_class, HTMLParser):
             self.__tb.create_tag(tag, **self.__formats[tag])
         def debug_mark(buf, m):
             if hasattr(m, '_tag'):
-                print "Deleted ", m._tag
+                logger.debug("Deleted %s", m._tag)
             elif hasattr(m, '_endtag'):
-                print "Deleted /", m._endtag
+                logger.debug("Deleted /%s", m._endtag)
             else:
-                #print "Deleted ", m
                 pass
 
             return True
@@ -192,7 +192,7 @@ class HTMLEditor(textview_class, HTMLParser):
             while True:
                 # Remove marks
                 for m in it.get_marks():
-                    if hasattr(m, '_tag'):
+                    if hasattr(m, '_tag') and hasattr(m, '_endmark'):
                         try:
                             b.remove_tag_by_name(m._tag,
                                                  b.get_iter_at_mark(m),
@@ -203,9 +203,9 @@ class HTMLEditor(textview_class, HTMLParser):
                                 # instance, br tag have startmark ==
                                 # endmark)
                                 b.delete_mark(m._endmark)
-                        except AttributeError, e:
-                            print "Exception for %s" % m._tag, unicode(e).encode('utf-8')
-                    elif  hasattr(m, '_endtag'):
+                        except AttributeError:
+                            logger.error("Exception for %s" % m._tag, exc_info=True)
+                    elif  hasattr(m, '_endtag') and hasattr(m, 'startmark'):
                         b.remove_tag_by_name(m._endtag,
                                              b.get_iter_at_mark(m._startmark),
                                              b.get_iter_at_mark(m))
@@ -219,7 +219,7 @@ class HTMLEditor(textview_class, HTMLParser):
     def can_undo(self):
         try:
             return hasattr(self.get_buffer(), 'can_undo')
-        except AttributeError, e:
+        except AttributeError:
             return False
 
     def undo(self, *p):
@@ -263,23 +263,23 @@ class HTMLEditor(textview_class, HTMLParser):
         PyGTK.
         """
         self.html_reset()
-        if not isinstance(txt, unicode):
+        if not isinstance(txt, str):
             # <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
             l=re.findall('http-equiv.+content-type.+charset=([\w\d-]+)', txt)
             if l:
                 charset=l[0]
-                print "Detected %s charset"
+                logger.warn("Detected %s charset")
             else:
                 charset='utf-8'
             try:
-                txt=unicode(txt, charset)
+                txt=str(txt, charset)
             except UnicodeDecodeError:
                 # Fallback to latin1.
-                txt=unicode(txt, 'latin1')
-        self.feed(txt.encode('utf-8'))
-        for k, v in self.__tags.iteritems():
+                txt=str(txt, 'latin1')
+        self.feed(txt)
+        for k, v in self.__tags.items():
             if v:
-                print "Unbalanced tag at end ", k
+                logger.error("Unbalanced tag at end %s", k)
 
     def _get_iter_for_creating_mark(self):
         """Return an appropriate iter for creating a mark.
@@ -291,12 +291,12 @@ class HTMLEditor(textview_class, HTMLParser):
             # position. So if we add a new mark here, we cannot
             # guarantee their order.
             # Insert an invisible char to alleviate this problem.
-            self.__tb.insert_at_cursor(u'\u2063')
+            self.__tb.insert_at_cursor('\u2063')
             cursor = self.__tb.get_iter_at_mark(self.__tb.get_insert())
             # Safety test. Normally useles...
             m=[ m for m in cursor.get_marks() if hasattr(m, '_tag') or hasattr(m, '_endtag') ]
             if m:
-                print "Strange, there should be not tag mark here."
+                logger.error("Strange, there should be not tag mark here.")
         return cursor
 
     def insert_widget(self, widget, cursor=None):
@@ -345,14 +345,14 @@ class HTMLEditor(textview_class, HTMLParser):
             try:
                 data=self.custom_url_loader(url)
                 msg=''
-            except Exception, ex:
+            except Exception as ex:
                 data=None
                 msg=ex
             if data is not None:
                 return data, msg
             elif isinstance(msg, Exception):
                 # There was an error.
-                return data, unicode(msg)
+                return data, str(msg)
             # Useless else: use default code.
             # else:
             #    pass
@@ -363,11 +363,11 @@ class HTMLEditor(textview_class, HTMLParser):
         if not url.startswith('http:') and not url.startswith('file:'):
             url='file:'+url
         try:
-            f = urllib2.urlopen(url)
+            f = urllib.request.urlopen(url)
             data = f.read()
             f.close()
             msg=''
-        except Exception, ex:
+        except Exception as ex:
             data=None
             msg=str(ex)
         socket.setdefaulttimeout(dto)
@@ -380,7 +380,7 @@ class HTMLEditor(textview_class, HTMLParser):
         if src:
             data, msg=self.url_load(src)
             if data is None:
-                print "Error loading %s: %s" % (src, msg)
+                logger.error("Error loading %s: %s", src, msg)
                 alt=dattr.get('alt', 'Broken image')
             else:
                 alt=dattr.get('alt', '')
@@ -394,7 +394,7 @@ class HTMLEditor(textview_class, HTMLParser):
             # Caveat: GdkPixbuf is known not to be safe to load images
             # from network... this program is now potentially hackable
             # ;)
-            loader = gtk.gdk.PixbufLoader()
+            loader = GdkPixbuf.PixbufLoader()
 
             def set_size(pixbuf, width, height):
                 if attrwidth and attrheight:
@@ -402,7 +402,7 @@ class HTMLEditor(textview_class, HTMLParser):
                     width, height = attrwidth, attrheight
                 elif attrwidth:
                     # Only width is specified.
-                    height = int(attrwidth) * height / width
+                    height = int(int(attrwidth) * height / width)
                     width = int(attrwidth)
                 elif attrheight:
                     width = int(attrheight) * width / height
@@ -414,13 +414,13 @@ class HTMLEditor(textview_class, HTMLParser):
                 loader.write(data)
                 loader.close()
                 pixbuf = loader.get_pixbuf()
-            except gobject.GError:
+            except GObject.GError:
                 pixbuf=None
         else:
             pixbuf=None
 
         if pixbuf is None:
-            pixbuf=gtk.gdk.pixbuf_new_from_xpm_data(broken_xpm)
+            pixbuf=GdkPixbuf.Pixbuf.new_from_xpm_data(broken_xpm)
         pixbuf._tag=tag
         pixbuf._attr=attr
         self.insert_pixbuf(pixbuf)
@@ -446,9 +446,9 @@ class HTMLEditor(textview_class, HTMLParser):
             for p in self._class_parsers:
                 widget, self.enclosed_processor = p(tag, dattr)
                 if widget is not None:
-                    if isinstance(widget, gtk.gdk.Pixbuf):
+                    if isinstance(widget, GdkPixbuf.Pixbuf):
                         self.insert_pixbuf(widget)
-                    elif isinstance(widget, gtk.Widget):
+                    elif isinstance(widget, Gtk.Widget):
                         self.insert_widget(widget)
                     else:
                         self.log("Unknown element type")
@@ -539,11 +539,11 @@ class HTMLEditor(textview_class, HTMLParser):
             start_mark._endmark=mark
             return
         except IndexError:
-            print "Unbalanced tag", tag
+            logger.error("Unbalanced tag %s", tag)
             mark._startmark=mark
             mark._endmark=mark
         except KeyError:
-            print "Unhandled tag", tag
+            logger.error("Unhandled tag %s", tag)
             mark._startmark=mark
             mark._endmark=mark
 
@@ -722,7 +722,7 @@ class HTMLEditor(textview_class, HTMLParser):
                     try:
                         context.remove(m._startmark)
                     except ValueError:
-                        print "Cannot remove start mark for ", m._endtag
+                        logger.error("Cannot remove start mark for %s", m._endtag)
                 elif hasattr(m, '_tag') and not m._tag in self.__standalone:
                     context.append(m)
             if i.equal(cursor):
@@ -736,7 +736,7 @@ class HTMLEditor(textview_class, HTMLParser):
     def get_html(self):
         """Return the buffer contents as html.
         """
-        s=StringIO.StringIO()
+        s=io.StringIO()
         self.dump_html(s)
         res=s.getvalue()
         s.close()
@@ -829,10 +829,10 @@ class HTMLEditor(textview_class, HTMLParser):
             endmark._startmark=mark
             mark._endmark=endmark
 
-class ContextDisplay(gtk.TreeView):
+class ContextDisplay(Gtk.TreeView):
     def __init__(self):
         super(ContextDisplay, self).__init__()
-        self.set_model(gtk.TreeStore(object, str, str))
+        self.set_model(Gtk.TreeStore(object, str, str))
 
         def edited_cell(renderer, path, newtext, col):
             model=self.get_model()
@@ -856,18 +856,18 @@ class ContextDisplay(gtk.TreeView):
                     it=model.iter_next(it)
                 mark._attr=l
 
-            print "Edited", mark._tag, mark._attr
+            logger.debug("Edited %s %s", mark._tag, mark._attr)
             return False
 
-        cell=gtk.CellRendererText()
+        cell=Gtk.CellRendererText()
         cell.set_property('editable', True)
         cell.connect('edited', edited_cell, 1)
-        self.append_column(gtk.TreeViewColumn("Name", cell, text=1))
+        self.append_column(Gtk.TreeViewColumn("Name", cell, text=1))
 
-        cell=gtk.CellRendererText()
+        cell=Gtk.CellRendererText()
         cell.set_property('editable', True)
         cell.connect('edited', edited_cell, 2)
-        self.append_column(gtk.TreeViewColumn("Value", cell, text=2))
+        self.append_column(Gtk.TreeViewColumn("Value", cell, text=2))
 
     def set_context(self, context):
         model=self.get_model()
@@ -885,9 +885,9 @@ if __name__ == "__main__":
 
     t = HTMLEditor()
     if source is not None:
-        t.set_text(open(source).read())
+        t.set_text(open(source, encoding='utf-8').read())
     t.show()
-    sb = gtk.ScrolledWindow()
+    sb = Gtk.ScrolledWindow()
     sb.add(t)
     sb.show()
 
@@ -907,8 +907,8 @@ if __name__ == "__main__":
     t.get_buffer().connect('mark-set', cursor_moved)
     context_data.show()
 
-    p=gtk.HPaned()
-    sw=gtk.ScrolledWindow()
+    p=Gtk.HPaned()
+    sw=Gtk.ScrolledWindow()
     sw.add(context_data)
     p.add1(sw)
     p.add2(sb)
@@ -917,37 +917,37 @@ if __name__ == "__main__":
     ev.widget.add(p)
 
     for (icon, action) in (
-        (gtk.STOCK_CONVERT, lambda i: t.dump_html()),
-        (gtk.STOCK_REFRESH, lambda i: t.refresh()),
-        (gtk.STOCK_BOLD, lambda i: t.apply_html_tag('b')),
-        (gtk.STOCK_ITALIC, lambda i: t.apply_html_tag('i')),
+        (Gtk.STOCK_CONVERT, lambda i: t.dump_html()),
+        (Gtk.STOCK_REFRESH, lambda i: t.refresh()),
+        (Gtk.STOCK_BOLD, lambda i: t.apply_html_tag('b')),
+        (Gtk.STOCK_ITALIC, lambda i: t.apply_html_tag('i')),
         ):
-        b=gtk.ToolButton(icon)
+        b=Gtk.ToolButton(icon)
         b.connect('clicked', action)
         ev.toolbar.insert(b, -1)
         b.show()
 
-    if gtksourceview2 is not None:
-        b=gtk.ToolButton(gtk.STOCK_UNDO)
+    if GtkSource is not None:
+        b=Gtk.ToolButton(Gtk.STOCK_UNDO)
         b.connect('clicked', lambda i: t.undo())
         ev.toolbar.insert(b, -1)
         b.show()
 
     actions={
-        gtk.keysyms.b: lambda: t.apply_html_tag('b'),
-        gtk.keysyms.i: lambda: t.apply_html_tag('i'),
-        gtk.keysyms.z: lambda: t.dump_html(),
+        Gdk.KEY_b: lambda: t.apply_html_tag('b'),
+        Gdk.KEY_i: lambda: t.apply_html_tag('i'),
+        Gdk.KEY_z: lambda: t.dump_html(),
         }
 
     w=ev.popup(embedded=False)
 
     def key_press(win, event):
         # Control-shortcuts
-        if event.state & gtk.gdk.CONTROL_MASK and event.keyval in actions:
+        if event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.keyval in actions:
             actions[event.keyval]()
             return True
         return False
     w.connect('key-press-event', key_press)
 
     t.grab_focus()
-    gtk.main()
+    Gtk.main()
diff --git a/lib/advene/gui/edit/importer.py b/lib/advene/gui/edit/importer.py
index c3ca9bf..eb67efd 100644
--- a/lib/advene/gui/edit/importer.py
+++ b/lib/advene/gui/edit/importer.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,12 +16,16 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-"""GUI to import external file formats.
+"""GUI to apply importers to files or internal data
 """
+import logging
+logger = logging.getLogger(__name__)
+
 import os
-import thread
-import gobject
-import gtk
+import _thread
+from gi.repository import GObject
+from gi.repository import Gdk
+from gi.repository import Gtk
 
 from gettext import gettext as _
 
@@ -36,17 +40,17 @@ from advene.gui.views import AdhocView
 
 dummy_advene_importer = object()
 
-name="FileImporter view plugin"
+name="AnnotationImporter view plugin"
 
 def register(controller):
-    controller.register_viewclass(FileImporter)
+    controller.register_viewclass(AnnotationImporter)
 
-class FileImporter(AdhocView):
+class AnnotationImporter(AdhocView):
     view_name = _("Importer")
     view_id = 'importerview'
 
-    def __init__(self, controller=None, filename=None, message=None, display_unlikely=True, parameters=None):
-        super(FileImporter, self).__init__(controller=controller)
+    def __init__(self, controller=None, filename=None, message=None, display_unlikely=True, parameters=None, importerclass=None, source_type=None):
+        super(AnnotationImporter, self).__init__(controller=controller)
         self.controller=controller
         self.parameters=parameters
         self.message = message
@@ -64,10 +68,11 @@ class FileImporter(AdhocView):
         # thread. Store its id, so that we detect if calls
         # (esp. progress_callback) are made from another thread and
         # act accordingly.
-        self.main_thread_id = thread.get_ident()
+        self.main_thread_id = _thread.get_ident()
         self.importer = None
+        if importerclass is not None:
+            self.importer = importerclass(controller=self.controller, callback=self.progress_callback, source_type=source_type)
         self.filename = filename
-
         self.widget=self.build_widget()
 
         if filename:
@@ -78,20 +83,22 @@ class FileImporter(AdhocView):
         if filename is not None:
             n = filename
         else:
-            n=unicode(self.filename or self.fb.get_filename() or self.fb.get_uri())
+            n=self.filename or self.fb.get_filename() or self.fb.get_uri()
+        if not n:
+            return
         if n.startswith('file://'):
             n = n.replace('file://', '')
         if not self.fb.get_filename():
             # It was not a filename, hence the Button did not get
             # updated. Update it explicitly.
             b = self.fb.get_children()[0]
-            if isinstance(b, gtk.Button):
-                # Normally, the gtk.Button contains a gtk.HBox, which
-                # contains some widgets among which a gtk.Label
-                l = [ c 
-                      for w in b.get_children() 
-                      for c in w.get_children() 
-                      if isinstance(c, gtk.Label) ]
+            if isinstance(b, Gtk.Button):
+                # Normally, the Gtk.Button contains a Gtk.HBox, which
+                # contains some widgets among which a Gtk.Label
+                l = [ c
+                      for w in b.get_children()
+                      for c in w.get_children()
+                      if isinstance(c, Gtk.Label) ]
                 if l:
                     # Found the label
                     l[0].set_text(n)
@@ -127,14 +134,15 @@ class FileImporter(AdhocView):
         return True
 
     def processing_ended(self, msg=None):
-        if thread.get_ident() != self.main_thread_id:
+        if _thread.get_ident() != self.main_thread_id:
             self.do_gui_operation(self.processing_ended, msg=msg)
             return True
         self.progress_callback(1.0)
         self.controller.notify("PackageActivate", package=self.controller.package)
         self.close()
         if msg is None:
-            msg = _('Completed conversion: %(statistics)s') % {
+            msg = _('Completed conversion: %(message)s\n%(statistics)s') % {
+                'message': self.importer.output_message,
                 'statistics': self.importer.statistics_formatted() }
         dialog.message_dialog(msg, modal=False)
         self.log(msg)
@@ -147,50 +155,60 @@ class FileImporter(AdhocView):
             b.set_sensitive(False)
             return True
 
-        b.set_label(stop_label)
-        self.importers.set_sensitive(False)
-        self.fb.set_sensitive(False)
-        ic = self.importers.get_current_element()
-        fname = unicode(self.filename or self.fb.get_filename() or self.fb.get_uri())
-
-        if fname.startswith('file://'):
-            fname = fname.replace('file://', '')
-        if ic == dummy_advene_importer:
-            # Invoke the package merge functionality.
-            try:
-                source=Package(uri=fname)
-            except Exception, e:
-                self.log("Cannot load %s file: %s" % (fname, unicode(e)))
+        if self.importer is None:
+            ic = self.importers.get_current_element()
+            fname = self.filename or self.fb.get_filename() or self.fb.get_uri()
+
+            if fname.startswith('file://'):
+                fname = fname.replace('file://', '')
+            if ic == dummy_advene_importer:
+                # Invoke the package merge functionality.
+                try:
+                    source=Package(uri=fname)
+                except Exception as e:
+                    self.log("Cannot load %s file: %s" % (fname, str(e)))
+                    return True
+                m=Merger(self.controller, sourcepackage=source, destpackage=self.controller.package)
+                m.popup()
+                self.close()
                 return True
-            m=Merger(self.controller, sourcepackage=source, destpackage=self.controller.package)
-            m.popup()
-            self.close()
-            return True
 
-        if ic is None:
-            return True
-        i = ic(controller=self.controller, callback=self.progress_callback)
-        self.importer = i
+            if ic is None:
+                return True
+            i = ic(controller=self.controller, callback=self.progress_callback)
+            self.importer = i
+        else:
+            i = self.importer
+            fname = self.filename
         i.set_options(self.optionform.options)
+        i.get_preferences().update(dict(self.optionform.options))
         i.package=self.controller.package
 
+        reqs = i.check_requirements()
+        if reqs:
+            # Not all requirements are met. Display some information.
+            dialog.message_dialog(_("The filter is not ready.\n%s") % "\n".join(reqs), modal=True)
+            return True
+
+        # Update Start button to Stop and disable GUI elements
+        b.set_label(stop_label)
+        self.importers.set_sensitive(False)
+        self.fb.set_sensitive(False)
+
         if hasattr(i, 'async_process_file'):
             # Asynchronous version.
             try:
                 i.async_process_file(fname, self.processing_ended)
-            except Exception, e:
-                dialog.message_dialog(unicode(e.args), modal=False)
+            except Exception as e:
+                dialog.message_dialog(str(e.args), modal=False)
                 self.close()
         else:
             # Standard, synchronous version
             try:
                 i.process_file(fname)
-            except Exception, e:
-                dialog.message_dialog(unicode(e.args), modal=False)
-                import sys
-                import code
-                e, v, tb = sys.exc_info()
-                code.traceback.print_exception (e, v, tb)
+            except Exception as e:
+                dialog.message_dialog(str(e.args), modal=False)
+                logger.exception("Error in processing import data")
             finally:
                 self.processing_ended()
         return True
@@ -201,16 +219,16 @@ class FileImporter(AdhocView):
         Ensure that we execute all Gtk operations in the mainloop.
         """
         def idle_func():
-            gtk.gdk.threads_enter()
+            Gdk.threads_enter()
             try:
                 func(*args, **kw)
             finally:
-                gtk.gdk.threads_leave()
+                Gdk.threads_leave()
             return False
-        gobject.idle_add(idle_func)
+        GObject.idle_add(idle_func)
 
     def progress_callback(self, value=None, label=None):
-        if thread.get_ident() != self.main_thread_id:
+        if _thread.get_ident() != self.main_thread_id:
             self.do_gui_operation(self.progress_callback, value=value, label=label)
             return self.should_continue
 
@@ -220,79 +238,96 @@ class FileImporter(AdhocView):
             self.progressbar.set_fraction(value)
         if label is not None:
             self.progressbar.set_text(label)
-        # We could do a "while gtk.events_pending()" but we want to
+        # We could do a "while Gtk.events_pending()" but we want to
         # avoid process lock because of too many pending events
         # processing.
-        for i in xrange(8):
-            if gtk.events_pending():
-                gtk.main_iteration()
+        for i in range(8):
+            if Gtk.events_pending():
+                Gtk.main_iteration()
             else:
                 break
         return self.should_continue
 
-    def update_options(self, combo):
-        # Instanciate a dummy importer, to get its options.
-        ic = combo.get_current_element()
+    def update_options(self, combo, forced=None):
+        if forced:
+            ic = forced.__class__
+        else:
+            # Instanciate a dummy importer, to get its options.
+            ic = combo.get_current_element()
         self.options_frame.foreach(self.options_frame.remove)
         if ic is not None and ic != dummy_advene_importer:
-            i = ic(controller=self.controller)
+            if forced:
+                i = forced
+            else:
+                i = ic(controller=self.controller)
+            # Restore cached options if any
+            i.set_options(i.get_preferences())
             self.optionform = OptionParserGUI(i.optionparser, i)
             self.options_frame.add(self.optionform)
         return True
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
         def updated_filename(entry):
             self.update_importers()
             return True
 
-        line=gtk.HBox()
-        vbox.pack_start(line, expand=False)
+        line=Gtk.HBox()
+        vbox.pack_start(line, False, True, 0)
 
-        self.fb = gtk.FileChooserButton(_("Choose the file to import"))
+        self.fb = Gtk.FileChooserButton(_("Choose the file to import"))
         self.fb.set_local_only(False)
-        self.fb.set_action(gtk.FILE_CHOOSER_ACTION_OPEN)
+        self.fb.set_action(Gtk.FileChooserAction.OPEN)
         self.fb.set_current_folder(config.data.path['data'])
         self.fb.connect('file-set', updated_filename)
 
-        line.pack_start(self.fb)
+        line.pack_start(self.fb, True, True, 0)
+        # We pass a message, assume that the source is already specified and hide FileChooser
         if self.message is not None:
-            line.pack_start(gtk.Label(self.message))
+            line.pack_start(Gtk.Label(self.message), True, True, 0)
             self.fb.set_no_show_all(True)
             self.fb.hide()
 
-        self.progressbar=gtk.ProgressBar()
-        vbox.pack_start(self.progressbar, expand=False)
+        self.progressbar=Gtk.ProgressBar()
+        vbox.pack_start(self.progressbar, False, True, 0)
 
         # Importer choice list
-        line=gtk.HBox()
-        vbox.pack_start(line, expand=False)
+        line=Gtk.HBox()
+        vbox.pack_start(line, False, True, 0)
 
-        line.pack_start(gtk.Label(_("Filter")), expand=False)
+        line.pack_start(Gtk.Label(_("Filter") + " "), False, False, 0)
         self.importers = dialog.list_selector_widget([], None, callback=self.update_options)
-        line.pack_start(self.importers, expand=False)
-
-        exp = gtk.Expander(_("Options"))
-        exp.set_expanded(True)
-        self.options_frame = gtk.VBox()
-        sw = gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        line.pack_start(self.importers, False, True, 0)
+        # An importer was specified. Do no display the importer list
+        if self.importer is not None:
+            self.importers.set_no_show_all(True)
+            self.importers.hide()
+            line.pack_start(Gtk.Label(self.importer.name), False, True, 0)
+
+        exp = Gtk.Frame.new(_("Options"))
+        self.options_frame = Gtk.VBox()
+        sw = Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         sw.add_with_viewport(self.options_frame)
         exp.add(sw)
-        vbox.pack_start(exp, expand=True)
+        vbox.pack_start(exp, True, True, 0)
 
-        bb=gtk.HButtonBox()
+        bb=Gtk.HButtonBox()
 
-        b=gtk.Button(_("Start"))
+        b=Gtk.Button(_("Start"))
         b.connect('clicked', self.convert_file)
-        b.set_sensitive(False)
-        bb.pack_start(b, expand=False)
+        bb.pack_start(b, False, True, 0)
         self.convert_button=b
 
-        vbox.pack_start(bb, expand=False)
+        vbox.pack_start(bb, False, True, 0)
 
-        self.update_importers()
+        if self.importer is None:
+            self.convert_button.set_sensitive(False)
+            self.update_importers()
+        else:
+            self.update_options(self.importers, forced=self.importer)
+            self.convert_button.set_sensitive(True)
 
         vbox.show_all()
 
diff --git a/lib/advene/gui/edit/imports.py b/lib/advene/gui/edit/imports.py
index 92a20e0..fee147f 100644
--- a/lib/advene/gui/edit/imports.py
+++ b/lib/advene/gui/edit/imports.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,10 +18,13 @@
 #
 """GUI to import package elements.
 """
+import logging
+logger = logging.getLogger(__name__)
+
 import sys
 
-import gtk
-import gobject
+from gi.repository import Gtk
+from gi.repository import GObject
 
 from gettext import gettext as _
 
@@ -74,7 +77,7 @@ class TreeViewImporter:
         y = int(event.y)
 
         if button == 3:
-            if event.window is widget.get_bin_window():
+            if event.get_window() is widget.get_bin_window():
                 model = widget.get_model()
                 t = widget.get_path_at_pos(x, y)
                 if t is not None:
@@ -95,7 +98,7 @@ class TreeViewImporter:
                 pop = advene.gui.edit.elements.get_edit_popup (node,
                                                                controller=self.controller,
                                                                editable=False)
-            except TypeError, e:
+            except TypeError:
                 pass
             else:
                 pop.edit ()
@@ -109,7 +112,7 @@ class TreeViewImporter:
             at=self.types_mapping[el.viewableClass]
             source=getattr(self.controller.package, at)
         except AttributeError:
-            print "Exception on %s" % str(el)
+            logger.error("Exception on %s", el.id, exc_info=True)
             return False
         l=[ e.uri for e in source if e.isImported() ]
         return (el.uri in l)
@@ -223,12 +226,12 @@ class TreeViewImporter:
     def build_liststore(self):
         # Store reference to the element, string representation (title and id)
         # and boolean indicating wether it is imported or not
-        store=gtk.TreeStore(
-            gobject.TYPE_PYOBJECT,
-            gobject.TYPE_STRING,
-            gobject.TYPE_STRING,
-            gobject.TYPE_BOOLEAN,
-            gobject.TYPE_STRING,
+        store=Gtk.TreeStore(
+            GObject.TYPE_PYOBJECT,
+            GObject.TYPE_STRING,
+            GObject.TYPE_STRING,
+            GObject.TYPE_BOOLEAN,
+            GObject.TYPE_STRING,
             )
 
         for i in self.controller.package.imports:
@@ -243,7 +246,7 @@ class TreeViewImporter:
         if model[path][column]:
             # If True, it means that it was previously False and that
             # we want to import the element
-            print "Importing %s" % model[path][self.COLUMN_LABEL]
+            logger.info("Importing %s", model[path][self.COLUMN_LABEL])
             # Depends on the type
             if hasattr(element, 'viewableClass'):
                 if element.viewableClass == 'list':
@@ -266,7 +269,7 @@ class TreeViewImporter:
                 elif element.viewableClass in ('annotation-type',
                                                'relation-type'):
                     # We should import the parent schema
-                    print "Annotation types and relation types are not directly importable.\nImport their schema instead."
+                    logger.warn("Annotation types and relation types are not directly importable.\nImport their schema instead.")
                 else:
                     helper.import_element(self.controller.package,
                                           element,
@@ -276,7 +279,7 @@ class TreeViewImporter:
                 # FIXME: does not seem to work yet
                 if self.is_imported(element):
                     # It was previously imported. Unimport it
-                    print "Removing %s" % model[path][self.COLUMN_LABEL]
+                    logger.warn("Removing %s", model[path][self.COLUMN_LABEL])
                     helper.unimport_element(self.controller.package,
                                             element,
                                             self.controller)
@@ -297,44 +300,44 @@ class TreeViewImporter:
                 elif element.viewableClass in ('annotation-type',
                                                'relation-type'):
                     # We should import the parent schema
-                    print "Annotation types and relation types are not directly importable.\nImport their schema instead."
+                    logger.warn("Annotation types and relation types are not directly importable.\nImport their schema instead.")
                 else:
                     # Package
-                    print "FIXME"
+                    logger.warn("Whole package import not implement yet - FIXME")
         return False
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
         # FIXME: implement package removal from the list
         self.store=self.build_liststore()
 
-        treeview=gtk.TreeView(model=self.store)
+        treeview=Gtk.TreeView(model=self.store)
         treeview.connect('button-press-event', self.tree_view_button_cb)
         treeview.connect('row-activated', self.row_activated_cb)
 
-        renderer = gtk.CellRendererToggle()
+        renderer = Gtk.CellRendererToggle()
         renderer.set_property('activatable', True)
         renderer.connect('toggled', self.toggled_cb, self.store, self.COLUMN_IMPORTED)
 
-        column = gtk.TreeViewColumn(_('Imported?'), renderer,
+        column = Gtk.TreeViewColumn(_('Imported?'), renderer,
                                     active=self.COLUMN_IMPORTED)
         treeview.append_column(column)
 
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(_('Id'), renderer,
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn(_('Id'), renderer,
                                     text=self.COLUMN_ID)
         column.set_resizable(True)
         treeview.append_column(column)
 
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(_('Title'), renderer,
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn(_('Title'), renderer,
                                     text=self.COLUMN_LABEL)
         column.set_resizable(True)
         treeview.append_column(column)
 
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(_('URI'), renderer,
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn(_('URI'), renderer,
                                     text=self.COLUMN_URI)
         column.set_resizable(True)
         treeview.append_column(column)
@@ -357,8 +360,8 @@ class Importer:
         else:
             d=None
         filename, alias=dialog.get_filename(title=_("Choose the package to import, and its alias"),
-                                                     action=gtk.FILE_CHOOSER_ACTION_OPEN,
-                                                     button=gtk.STOCK_OPEN,
+                                                     action=Gtk.FileChooserAction.OPEN,
+                                                     button=Gtk.STOCK_OPEN,
                                                      default_dir=d,
                                                      alias=True,
                                                      filter='advene')
@@ -377,34 +380,33 @@ class Importer:
         return True
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        vbox.pack_start(gtk.Label("Elements imported into %s" % self.controller.package.title),
-                        expand=False)
+        vbox.pack_start(Gtk.Label("Elements imported into %s" % self.controller.package.title), False, False, 0)
 
-        scroll_win = gtk.ScrolledWindow ()
-        scroll_win.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        scroll_win = Gtk.ScrolledWindow ()
+        scroll_win.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         vbox.add(scroll_win)
 
         self.ti=TreeViewImporter(controller=self.controller)
         scroll_win.add_with_viewport(self.ti.widget)
 
-        hb=gtk.HButtonBox()
+        hb=Gtk.HButtonBox()
 
-        b=gtk.Button(stock=gtk.STOCK_ADD)
+        b=Gtk.Button(stock=Gtk.STOCK_ADD)
         b.connect('clicked', self.add_package)
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
-        vbox.pack_start(hb, expand=False)
+        vbox.pack_start(hb, False, True, 0)
 
         hb.show_all()
 
         return vbox
 
     def popup(self):
-        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+        window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
         window.set_title (_("Package %s") % (self.controller.package.title or _("No title")))
-        vbox = gtk.VBox()
+        vbox = Gtk.VBox()
         window.add (vbox)
 
         vbox.add (self.widget)
@@ -414,15 +416,15 @@ class Importer:
 
         if self.controller.gui:
             self.controller.gui.init_window_size(window, 'importeditor')
-            window.set_icon_list(*self.controller.gui.get_icon_list())
+            window.set_icon_list(self.controller.gui.get_icon_list())
 
-        self.buttonbox = gtk.HButtonBox()
+        self.buttonbox = Gtk.HButtonBox()
 
-        b = gtk.Button(stock=gtk.STOCK_CLOSE)
+        b = Gtk.Button(stock=Gtk.STOCK_CLOSE)
         b.connect('clicked', lambda w: window.destroy ())
         self.buttonbox.add (b)
 
-        vbox.pack_start(self.buttonbox, expand=False)
+        vbox.pack_start(self.buttonbox, False, True, 0)
 
         window.show_all()
 
@@ -430,8 +432,9 @@ class Importer:
 
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
     if len(sys.argv) < 2:
-        print "Should provide a package name"
+        logger.error("Should provide a package name")
         sys.exit(1)
 
     class DummyController:
@@ -447,7 +450,7 @@ if __name__ == "__main__":
     i=Importer(controller=controller)
     window=i.popup()
 
-    window.connect('destroy', lambda e: gtk.main_quit())
+    window.connect('destroy', lambda e: Gtk.main_quit())
 
-    gtk.main ()
+    Gtk.main ()
 
diff --git a/lib/advene/gui/edit/merge.py b/lib/advene/gui/edit/merge.py
index 0fc776f..7515f05 100644
--- a/lib/advene/gui/edit/merge.py
+++ b/lib/advene/gui/edit/merge.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,10 +18,10 @@
 #
 """GUI to merge packages.
 """
-import gtk
-import gobject
+from gi.repository import Gtk
+from gi.repository import GObject
 import difflib
-import pango
+from gi.repository import Pango
 
 from gettext import gettext as _
 
@@ -61,11 +61,11 @@ class TreeViewMerger:
     def build_liststore(self):
         # Store reference to the element, string representation (title and id)
         # and boolean indicating wether it is imported or not
-        store=gtk.ListStore(
-            gobject.TYPE_PYOBJECT,
-            gobject.TYPE_STRING,
-            gobject.TYPE_STRING,
-            gobject.TYPE_BOOLEAN,
+        store=Gtk.ListStore(
+            GObject.TYPE_PYOBJECT,
+            GObject.TYPE_STRING,
+            GObject.TYPE_STRING,
+            GObject.TYPE_BOOLEAN,
             )
 
         for l in self.differ.diff():
@@ -76,7 +76,7 @@ class TreeViewMerger:
                                labels.setdefault(name, name),
                                "%s %s (%s)" % (helper.get_type(s),
                                                self.controller.get_title(s),
-                                               getattr(s, 'id', unicode(s))),
+                                               getattr(s, 'id', str(s))),
                                True ])
         return store
 
@@ -86,17 +86,17 @@ class TreeViewMerger:
 
             diff=difflib.Differ()
 
-            w=gtk.Window()
+            w=Gtk.Window()
             w.set_title(_("Difference between original and merged elements"))
 
-            v=gtk.VBox()
+            v=Gtk.VBox()
 
-            sw = gtk.ScrolledWindow()
-            sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+            sw = Gtk.ScrolledWindow()
+            sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
             v.add(sw)
 
-            tv=gtk.TextView()
-            f=pango.FontDescription("courier 12")
+            tv=Gtk.TextView()
+            f=Pango.FontDescription("courier 12")
             tv.modify_font(f)
 
             b=tv.get_buffer()
@@ -115,12 +115,12 @@ class TreeViewMerger:
                     b.insert_at_cursor(l)
             sw.add(tv)
 
-            hb=gtk.HButtonBox()
-            b=gtk.Button(stock=gtk.STOCK_CLOSE)
+            hb=Gtk.HButtonBox()
+            b=Gtk.Button(stock=Gtk.STOCK_CLOSE)
             b.connect('clicked', lambda b: w.destroy())
             hb.add(b)
 
-            v.pack_start(hb, expand=False)
+            v.pack_start(hb, False, True, 0)
             w.add(v)
 
             w.show_all()
@@ -128,23 +128,23 @@ class TreeViewMerger:
             return True
 
         def build_popup_menu(l):
-            menu=gtk.Menu()
+            menu=Gtk.Menu()
 
             name, s, d, action = l
 
             if name != 'new':
-                i=gtk.MenuItem(_("Current element"))
+                i=Gtk.MenuItem(_("Current element"))
                 m = advene.gui.popup.Menu(d, controller=self.controller, readonly=False)
                 i.set_submenu(m.menu)
                 menu.append(i)
 
-            i=gtk.MenuItem(_("Updated element"))
+            i=Gtk.MenuItem(_("Updated element"))
             m = advene.gui.popup.Menu(s, controller=self.controller, readonly=True)
             i.set_submenu(m.menu)
             menu.append(i)
 
             if name == 'update_content':
-                i=gtk.MenuItem(_("Show diff"))
+                i=Gtk.MenuItem(_("Show diff"))
                 i.connect('activate', show_diff, l)
                 menu.append(i)
 
@@ -158,7 +158,7 @@ class TreeViewMerger:
             y = int(event.y)
 
             if button == 3:
-                if event.window is widget.get_bin_window():
+                if event.get_window() is widget.get_bin_window():
                     model = widget.get_model()
                     t = widget.get_path_at_pos(x, y)
                     if t is not None:
@@ -167,17 +167,17 @@ class TreeViewMerger:
                         node = model.get_value(it, self.COLUMN_ELEMENT)
                         widget.get_selection().select_path (path)
                         menu=build_popup_menu(node)
-                        menu.popup(None, None, None, 0, gtk.get_current_event_time())
+                        menu.popup_at_pointer(None)
                         retval = True
             return retval
 
 
-        treeview=gtk.TreeView(model=self.store)
+        treeview=Gtk.TreeView(model=self.store)
         treeview.connect('button-press-event', tree_view_button_cb)
 
-        renderer = gtk.CellRendererToggle()
+        renderer = Gtk.CellRendererToggle()
         renderer.set_property('activatable', True)
-        column = gtk.TreeViewColumn(_('Merge?'), renderer,
+        column = Gtk.TreeViewColumn(_('Merge?'), renderer,
                                     active=self.COLUMN_APPLY)
 
         def toggled_cb(renderer, path, model, column):
@@ -187,14 +187,14 @@ class TreeViewMerger:
 
         treeview.append_column(column)
 
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(_('Action'), renderer,
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn(_('Action'), renderer,
                                     text=self.COLUMN_ACTION)
         column.set_resizable(True)
         treeview.append_column(column)
 
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(_('Element'), renderer,
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn(_('Element'), renderer,
                                     text=self.COLUMN_ELEMENT_NAME)
         column.set_resizable(True)
         treeview.append_column(column)
@@ -210,14 +210,14 @@ class Merger:
         self.widget=self.build_widget()
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        vbox.pack_start(gtk.Label("Merge elements from %s into %s" % (self.sourcepackage.uri,
-                                                                     self.destpackage.uri)),
-                                  expand=False)
+        vbox.pack_start(Gtk.Label(_("Merge elements from %(source)s into %(dest)s") % {'source': self.sourcepackage.uri,
+                                                                                       'dest': self.destpackage.uri}),
+                                  False, False, 0)
 
-        scroll_win = gtk.ScrolledWindow ()
-        scroll_win.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        scroll_win = Gtk.ScrolledWindow ()
+        scroll_win.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         vbox.add(scroll_win)
 
         self.mergerview=TreeViewMerger(controller=self.controller, differ=self.differ)
@@ -226,21 +226,20 @@ class Merger:
         return vbox
 
     def popup(self):
-        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+        window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
         window.set_title (_("Package %s") % (self.destpackage.title or _("No title")))
 
-        vbox = gtk.VBox()
+        vbox = Gtk.VBox()
         window.add (vbox)
 
         vbox.add (self.widget)
         if self.controller.gui:
             self.controller.gui.init_window_size(window, 'merge')
-            window.set_icon_list(*self.controller.gui.get_icon_list())
+            window.set_icon_list(self.controller.gui.get_icon_list())
 
-        self.buttonbox = gtk.HButtonBox()
+        self.buttonbox = Gtk.HButtonBox()
 
         def validate(b):
-            print "Validate"
             m=self.mergerview.store
             for l in m:
                 if l[self.mergerview.COLUMN_APPLY]:
@@ -264,24 +263,24 @@ class Merger:
             return True
 
 
-        b = gtk.Button(_("All"))
+        b = Gtk.Button(_("All"))
         b.connect('clicked', select_all)
         self.buttonbox.add (b)
 
 
-        b = gtk.Button(_('None'))
+        b = Gtk.Button(_('None'))
         b.connect('clicked', unselect_all)
         self.buttonbox.add (b)
 
-        b = gtk.Button(stock=gtk.STOCK_OK)
+        b = Gtk.Button(stock=Gtk.STOCK_OK)
         b.connect('clicked', validate)
         self.buttonbox.add (b)
 
-        b = gtk.Button(stock=gtk.STOCK_CANCEL)
+        b = Gtk.Button(stock=Gtk.STOCK_CANCEL)
         b.connect('clicked', lambda b: window.destroy())
         self.buttonbox.add (b)
 
-        vbox.pack_start(self.buttonbox, expand=False)
+        vbox.pack_start(self.buttonbox, False, True, 0)
 
         window.show_all()
 
diff --git a/lib/advene/gui/edit/montage.py b/lib/advene/gui/edit/montage.py
index 5fdaf5c..f546133 100644
--- a/lib/advene/gui/edit/montage.py
+++ b/lib/advene/gui/edit/montage.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -23,6 +23,9 @@ FIXME: loop option
 FIXME: replace button dropzone by EventBox 1pixel wide, with visual feedback
 """
 
+import logging
+logger = logging.getLogger(__name__)
+
 # Advene part
 import advene.core.config as config
 import advene.util.helper as helper
@@ -35,7 +38,8 @@ import advene.gui.popup
 
 from gettext import gettext as _
 
-import gtk
+from gi.repository import Gdk
+from gi.repository import Gtk
 import re
 
 name="Montage view plugin"
@@ -66,13 +70,14 @@ class Montage(AdhocView):
 
         # How many units (ms) does a pixel represent ?
         # How many units does a pixel represent ?
-        # self.scale.value = unit by pixel
+        # self.scale.get_value() = unit by pixel
         # Unit = ms
-        self.scale = gtk.Adjustment (value=(self.controller.package.cached_duration or 60*60*1000) / gtk.gdk.get_default_root_window().get_size()[0],
-                                     lower=5,
-                                     upper=36000,
-                                     step_incr=5,
-                                     page_incr=1000)
+        self.scale = Gtk.Adjustment.new(int((self.controller.package.cached_duration or 60*60*1000) / Gdk.get_default_root_window().get_width()),
+                                        5,
+                                        36000,
+                                        5,
+                                        1000,
+                                        100)
         self.scale.connect('value-changed', scale_event)
 
         opt, arg = self.load_parameters(parameters)
@@ -116,13 +121,13 @@ class Montage(AdhocView):
 
     def set_master_view(self, master):
         def master_value_changed(sc):
-            self.scale.value=sc.value
+            self.scale.set_value(sc.get_value())
             return False
         def master_changed(sc):
-            self.scale.set_all(self.scale.value,
-                               sc.lower, sc.upper,
-                               sc.step_increment, sc.page_increment,
-                               sc.page_size)
+            self.scale.set_all(self.scale.get_value(),
+                               sc.get_lower(), sc.get_upper(),
+                               sc.get_step_increment(), sc.get_page_increment(),
+                               sc.get_page_size())
             return False
 
         self.safe_connect(master.scale, 'value-changed', master_value_changed)
@@ -153,7 +158,7 @@ class Montage(AdhocView):
             if targetType == config.data.target_type['uri-list']:
                 uri="advene:/adhoc/%d/%d" % (hash(self),
                                                   hash(widget))
-                selection.set(selection.target, 8, uri.encode('utf8'))
+                selection.set(selection.get_target(), 8, uri.encode('utf8'))
                 return True
             return False
 
@@ -165,7 +170,7 @@ class Montage(AdhocView):
         def button_press(widget, event):
             """Handle button presses on annotation widgets.
             """
-            if event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS:
+            if event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
                 # Display the popup menu when clicking on annotation.
                 menu=advene.gui.popup.Menu(widget.annotation, controller=self.controller)
                 menu.add_menuitem(menu.menu, _("Remove from montage"), remove_cb, widget)
@@ -187,10 +192,10 @@ class Montage(AdhocView):
         return True
 
     def unit2pixel(self, u):
-        return long(u / self.scale.value)
+        return int(u / self.scale.get_value())
 
     def pixel2unit(self, p):
-        return long(p * self.scale.value)
+        return int(p * self.scale.get_value())
 
     def refresh(self, *p):
         self.mainbox.foreach(self.mainbox.remove)
@@ -263,35 +268,36 @@ class Montage(AdhocView):
         """
         def drag_received(widget, context, x, y, selection, targetType, time):
             if targetType == config.data.target_type['annotation']:
-                sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+                sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
                 for ann in sources:
                     self.insert(ann, i)
                     # If the origin is from the same montage, then
                     # consider it is a move and remove the origin
                     # annotation
-                    w=context.get_source_widget()
+                    w=Gtk.drag_get_source_widget(context)
                     if w in self.contents:
                         self.contents.remove(w)
                 self.refresh()
                 return True
             else:
-                print "Unknown target type for drag: %d" % targetType
+                logger.warn("Unknown target type for drag: %d" % targetType)
             return False
 
-        b = gtk.Button()
+        b = Gtk.Button()
         b.set_size_request(4, self.button_height)
         b.index=i
-        b.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                        gtk.DEST_DEFAULT_HIGHLIGHT |
-                        gtk.DEST_DEFAULT_ALL,
-                        config.data.drag_type['annotation'], gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK)
+        b.drag_dest_set(Gtk.DestDefaults.MOTION |
+                        Gtk.DestDefaults.HIGHLIGHT |
+                        Gtk.DestDefaults.ALL,
+                        config.data.get_target_types('annotation'),
+                        Gdk.DragAction.COPY | Gdk.DragAction.LINK)
         b.connect('drag-data-received', drag_received)
 
-        self.mainbox.pack_start(b, expand=False, fill=False)
+        self.mainbox.pack_start(b, False, False, 0)
         return b
 
     def append_repr(self, w):
-        self.mainbox.pack_start(w, expand=False, fill=False)
+        self.mainbox.pack_start(w, False, False, 0)
         w.update_widget()
         return w
 
@@ -313,14 +319,12 @@ class Montage(AdhocView):
             """Go to the beginning of the annotation, and program the next jump.
             """
             try:
-                w=annotation_queue.next()
+                w=next(annotation_queue)
                 if self.current_widget is not None:
                     self.current_widget.fraction_marker=None
                 self.current_widget=w
                 a=w.annotation
-                #print "Playing ", a.id
             except StopIteration:
-                #print "StopIteration"
                 self.controller.update_status('pause')
                 for w in self.contents:
                     self.set_widget_active(w, False)
@@ -331,7 +335,7 @@ class Montage(AdhocView):
             # Go to the annotation
             # Change position only if we are not already at the right place
             if abs(position - a.fragment.begin) > 100:
-                self.controller.queue_action(self.controller.update_status, 'set', a.fragment.begin, notify=False)
+                self.controller.queue_action(self.controller.update_status, 'seek', a.fragment.begin, notify=False)
             self.controller.queue_action(self.set_widget_active, w, True)
             self.controller.position_update()
             # And program its end.
@@ -351,29 +355,34 @@ class Montage(AdhocView):
         return True
 
     def build_widget(self):
-        self.zoom_adjustment=gtk.Adjustment(value=1.0, lower=0.01, upper=2.0)
+        self.zoom_adjustment=Gtk.Adjustment.new(value=1.0,
+                                                lower=0.01,
+                                                upper=2.0,
+                                                step_increment=.01,
+                                                page_increment=.1,
+                                                page_size=.1)
 
         def zoom_adj_change(adj):
             # Update the value of self.scale accordingly
             # Get the window size
-            if not self.mainbox.window:
+            if not self.mainbox.get_window():
                 # The widget is not yet realized
                 return True
-            display_size=self.mainbox.parent.window.get_size()[0]
+            display_size=self.mainbox.get_parent().get_window().get_width()
             # Dropzones are approximately 10 pixels wide, and should
             # be taken into account, but it enforces handling the corner cases
-            self.scale.value = 1.0 * self.duration / (display_size / adj.value )
+            self.scale.set_value(1.0 * self.duration / (display_size / adj.get_value() ))
 
             # Update the zoom combobox value
-            self.zoom_combobox.child.set_text('%d%%' % long(100 * adj.value))
+            self.zoom_combobox.get_child().set_text('%d%%' % int(100 * adj.get_value()))
             return True
 
         def remove_drag_received(widget, context, x, y, selection, targetType, time):
             if targetType == config.data.target_type['uri-list']:
                 m=re.match('advene:/adhoc/%d/(.+)' % hash(self),
-                           selection.data)
+                           selection.get_data().decode('utf-8'))
                 if m:
-                    h=long(m.group(1))
+                    h=int(m.group(1))
                     l=[ w for w in self.contents if hash(w) == h ]
                     if l:
                         # Found the element. Remove it.
@@ -381,86 +390,87 @@ class Montage(AdhocView):
                         self.refresh()
                 return True
             else:
-                print "Unknown target type for drop: %d" % targetType
+                logger.warn("Unknown target type for drop: %d" % targetType)
             return False
 
         self.zoom_adjustment.connect('value-changed', zoom_adj_change)
 
-        v=gtk.VBox()
+        v=Gtk.VBox()
 
         # Toolbar
-        tb=gtk.Toolbar()
-        tb.set_style(gtk.TOOLBAR_ICONS)
+        tb=Gtk.Toolbar()
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
 
-        b=get_small_stock_button(gtk.STOCK_DELETE)
+        b=get_small_stock_button(Gtk.STOCK_DELETE)
         b.set_tooltip_text(_("Drop an annotation here to remove it from the list"))
-        b.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                        gtk.DEST_DEFAULT_HIGHLIGHT |
-                        gtk.DEST_DEFAULT_ALL,
-                        config.data.drag_type['uri-list'], gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK)
+        b.drag_dest_set(Gtk.DestDefaults.MOTION |
+                        Gtk.DestDefaults.HIGHLIGHT |
+                        Gtk.DestDefaults.ALL,
+                        config.data.get_target_types('uri-list'),
+                        Gdk.DragAction.COPY | Gdk.DragAction.LINK)
         b.connect('drag-data-received', remove_drag_received)
-        ti=gtk.ToolItem()
+        ti=Gtk.ToolItem()
         ti.add(b)
         tb.insert(ti, -1)
 
-        b=gtk.ToolButton(gtk.STOCK_MEDIA_PLAY)
+        b=Gtk.ToolButton(Gtk.STOCK_MEDIA_PLAY)
         b.set_tooltip_text(_("Play the montage"))
         b.connect('clicked', self.play)
         tb.insert(b, -1)
 
-        b = gtk.ToolButton(gtk.STOCK_SAVE)
+        b = Gtk.ToolButton(Gtk.STOCK_SAVE)
         b.set_tooltip_text(_("Save the view in the package"))
         b.connect('clicked', self.save_view)
         tb.insert(b, -1)
 
         def zoom_entry(entry):
-            f=unicode(entry.get_text())
+            f=entry.get_text()
 
             i=re.findall(r'\d+', f)
             if i:
                 f=int(i[0])/100.0
             else:
                 return True
-            self.zoom_adjustment.value=f
+            self.zoom_adjustment.set_value(f)
             return True
 
         def zoom_change(combo):
             v=combo.get_current_element()
             if isinstance(v, float):
-                self.zoom_adjustment.value=v
+                self.zoom_adjustment.set_value(v)
             return True
 
         def zoom(i, factor):
-            self.zoom_adjustment.value=self.zoom_adjustment.value * factor
+            self.zoom_adjustment.set_value(self.zoom_adjustment.get_value() * factor)
             return True
 
-        b=gtk.ToolButton(gtk.STOCK_ZOOM_OUT)
+        b=Gtk.ToolButton(Gtk.STOCK_ZOOM_OUT)
         b.connect('clicked', zoom, 1.3)
         b.set_tooltip_text(_("Zoom out"))
         tb.insert(b, -1)
 
-        b=gtk.ToolButton(gtk.STOCK_ZOOM_IN)
+        b=Gtk.ToolButton(Gtk.STOCK_ZOOM_IN)
         b.connect('clicked', zoom, .7)
         b.set_tooltip_text(_("Zoom in"))
         tb.insert(b, -1)
 
         self.zoom_combobox=dialog.list_selector_widget(members=[
-                ( f, "%d%%" % long(100*f) )
+                ( f, "%d%%" % int(100*f) )
                 for f in [
                     (1.0 / pow(1.5, n)) for n in range(0, 10)
                     ]
                 ],
                                                        entry=True,
                                                        callback=zoom_change)
-        self.zoom_combobox.child.connect('activate', zoom_entry)
-        self.zoom_combobox.child.set_width_chars(4)
+        self.zoom_combobox.get_child().connect('activate', zoom_entry)
+        self.zoom_combobox.get_child().set_width_chars(4)
 
-        ti=gtk.ToolItem()
+        ti=Gtk.ToolItem()
         ti.add(self.zoom_combobox)
         ti.set_tooltip_text(_("Set zoom level"))
         tb.insert(ti, -1)
 
-        b=gtk.ToolButton(gtk.STOCK_ZOOM_100)
+        b=Gtk.ToolButton(Gtk.STOCK_ZOOM_100)
         b.connect('clicked', lambda i: self.zoom_adjustment.set_value(1.0))
         b.set_tooltip_text(_("Set 100% zoom"))
         tb.insert(b, -1)
@@ -478,22 +488,22 @@ class Montage(AdhocView):
             for a in set( [ w.annotation for w in self.contents ] ):
                 self.controller.notify(event, annotation=a)
             return True
-        i=gtk.Image()
+        i=Gtk.Image()
         i.set_from_file(config.data.advenefile( ( 'pixmaps', 'highlight.png') ))
-        b=gtk.ToggleToolButton()
+        b=Gtk.ToggleToolButton()
         b.set_tooltip_text(_("Highlight annotations"))
         b.set_icon_widget(i)
         b.highlight=True
         b.connect('clicked', toggle_highlight)
         tb.insert(b, -1)
 
-        v.pack_start(tb, expand=False)
+        v.pack_start(tb, False, True, 0)
 
-        self.mainbox=gtk.HBox()
+        self.mainbox=Gtk.HBox()
 
         def mainbox_drag_received(widget, context, x, y, selection, targetType, time):
             if targetType == config.data.target_type['annotation']:
-                sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+                sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
                 for ann in sources:
                     if ann is None:
                         self.log("Problem when getting annotation from DND")
@@ -502,50 +512,49 @@ class Montage(AdhocView):
                     # If the origin is from the same montage, then
                     # consider it is a move and remove the origin
                     # annotation
-                    w=context.get_source_widget()
+                    w=Gtk.drag_get_source_widget(context)
                     if w in self.contents:
                         self.contents.remove(w)
                 self.refresh()
                 return True
             elif targetType == config.data.target_type['annotation-type']:
-                at=self.controller.package.annotationTypes.get(unicode(selection.data, 'utf8'))
+                at=self.controller.package.annotationTypes.get(str(selection.get_data(), 'utf8'))
                 for a in at.annotations:
                     self.insert(a)
                 self.refresh()
                 return True
             else:
-                print "Unknown target type for drag: %d" % targetType
+                logger.warn("Unknown target type for drag: %d" % targetType)
             return False
-        v.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                   gtk.DEST_DEFAULT_HIGHLIGHT |
-                                   gtk.DEST_DEFAULT_ALL,
-                                   config.data.drag_type['annotation']
-                                   + config.data.drag_type['annotation-type'],
-                                   gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_MOVE)
+        v.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                   Gtk.DestDefaults.HIGHLIGHT |
+                                   Gtk.DestDefaults.ALL,
+                                   config.data.get_target_types('annotation', 'annotation-type'),
+                                   Gdk.DragAction.COPY | Gdk.DragAction.LINK | Gdk.DragAction.MOVE)
         v.connect('drag-data-received', mainbox_drag_received)
 
-        sw=gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_NEVER)
+        sw=Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER)
         sw.add_with_viewport(self.mainbox)
         self.scrollwindow=sw
 
-        v.pack_start(sw, expand=False)
+        v.pack_start(sw, False, True, 0)
 
         a=AnnotationDisplay(controller=self.controller)
-        f=gtk.Frame(_("Inspector"))
+        f=Gtk.Frame.new(_("Inspector"))
         f.add(a.widget)
         v.add(f)
         self.controller.gui.register_view (a)
         a.set_master_view(self)
         a.widget.show_all()
 
-        v.pack_start(gtk.VBox(), expand=True)
+        v.pack_start(Gtk.VBox(), True, True, 0)
 
-        hb=gtk.HBox()
-        l=gtk.Label(_("Total duration:"))
-        hb.pack_start(l, expand=False)
-        self.duration_label=gtk.Label('??')
-        hb.pack_start(self.duration_label, expand=False)
-        v.pack_start(hb, expand=False)
+        hb=Gtk.HBox()
+        l=Gtk.Label(label=_("Total duration:"))
+        hb.pack_start(l, False, True, 0)
+        self.duration_label=Gtk.Label(label='??')
+        hb.pack_start(self.duration_label, False, True, 0)
+        v.pack_start(hb, False, True, 0)
 
         return v
diff --git a/lib/advene/gui/edit/properties.py b/lib/advene/gui/edit/properties.py
index a25663e..8e9b355 100644
--- a/lib/advene/gui/edit/properties.py
+++ b/lib/advene/gui/edit/properties.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -21,18 +21,153 @@
 Code adapted from gDesklets.
 """
 
-import gtk
+import logging
+logger = logging.getLogger(__name__)
+
+from gi.repository import GObject
+from gi.repository import Gdk
+from gi.repository import Gtk
+
 import os
 import sys
+import time
 
 from gettext import gettext as _
 
+class Popup(Gtk.Window):
+    """Popup widget (for KeyGrabber)
+
+    Code taken from GPLv2 UbuntuTweak which got it from GPLv2 ccsm.
+    """
+    def __init__(self, parent, text=None, child=None,
+                 decorated=True, mouse=False, modal=True):
+        GObject.GObject.__init__(self, type=Gtk.WindowType.TOPLEVEL)
+        self.set_type_hint(Gdk.WindowTypeHint.UTILITY)
+        self.set_position(mouse and Gtk.WindowPosition.MOUSE or
+                          Gtk.WindowPosition.CENTER_ALWAYS)
+
+        if parent:
+            self.set_transient_for(parent.get_toplevel())
+
+        self.set_modal(modal)
+        self.set_decorated(decorated)
+        self.set_title("")
+
+        if text:
+            label = Gtk.Label(label=text)
+            align = Gtk.Alignment()
+            align.set_padding(20, 20, 20, 20)
+            align.add(label)
+            self.add(align)
+        elif child:
+            self.add(child)
+
+        while Gtk.events_pending():
+            Gtk.main_iteration()
+
+    def destroy(self):
+        Gtk.Window.destroy(self)
+        while Gtk.events_pending():
+            Gtk.main_iteration()
+
+class KeyGrabber(Gtk.Button):
+    """KeyGrabber widget.
+
+    Code taken from GPLv2 UbuntuTweak which got it from GPLv2 ccsm.
+    """
+    __gsignals__ = {
+        "changed": (GObject.SignalFlags.RUN_FIRST, None,
+                    (GObject.TYPE_INT, GObject.TYPE_INT)),
+        "current-changed": (GObject.SignalFlags.RUN_FIRST, None,
+                            (GObject.TYPE_INT, Gdk.ModifierType))
+    }
+
+    key = 0
+    mods = 0
+    handler = None
+    popup = None
+
+    label = None
+
+    def __init__ (self, parent=None, key=0, mods=0, label=None):
+        '''Prepare widget'''
+        GObject.GObject.__init__(self)
+
+        self.main_window = parent
+        self.key = key
+        self.mods = mods
+
+        self.label = label
+
+        self.connect("clicked", self.begin_key_grab)
+        self.set_label()
+
+    def begin_key_grab(self, widget):
+        self.add_events(Gdk.EventMask.KEY_PRESS_MASK)
+        if self.main_window is None:
+            self.main_window = self.get_toplevel()
+        self.popup = Popup(self.main_window,
+                           _("Please press the new key combination"))
+        self.popup.show_all()
+
+        self.handler = self.popup.connect("key-press-event",
+                                          self.on_key_press_event)
+
+        while Gdk.keyboard_grab(self.main_window.get_window(),
+                                True,
+                                Gtk.get_current_event_time()) != Gdk.GrabStatus.SUCCESS:
+            time.sleep (0.1)
+
+    def end_key_grab(self):
+        Gdk.keyboard_ungrab(Gtk.get_current_event_time())
+        self.popup.disconnect(self.handler)
+        self.popup.destroy()
+
+    def on_key_press_event(self, widget, event):
+        mods = event.get_state()
+
+        if event.keyval in (Gdk.KEY_Escape, Gdk.KEY_Return) and not mods:
+            if event.keyval == Gdk.KEY_Escape:
+                self.emit("changed", self.key, self.mods)
+            self.end_key_grab()
+            self.set_label()
+            return
+
+        key = Gdk.keyval_to_lower(event.keyval)
+        if (key == Gdk.KEY_ISO_Left_Tab):
+            key = Gdk.KEY_Tab
+
+        if Gtk.accelerator_valid(key, mods) or (key == Gdk.KEY_Tab and mods):
+            self.set_label(key, mods)
+            self.end_key_grab()
+            self.key = key
+            self.mods = mods
+            self.emit("changed", self.key, self.mods)
+            return
+
+        self.set_label(key, mods)
+
+    def set_label(self, key=None, mods=None):
+        if self.label:
+            if key != None and mods != None:
+                self.emit("current-changed", key, mods)
+            Gtk.Button.set_label(self, self.label)
+            return
+        if key == None and mods == None:
+            key = self.key
+            mods = self.mods
+        label = Gtk.accelerator_name(key, mods)
+        if not len(label):
+            label = _("Disabled")
+        Gtk.Button.set_label(self, label)
+
+
 class EditNotebook(object):
     def __init__(self, set_config, get_config):
         self.__name = _("Properties")
         self._set_config = set_config
         self._get_config = get_config
-        self.book = gtk.Notebook()
+        self.book = Gtk.Notebook()
         self.current_widget = None
 
     def __getattribute__ (self, name):
@@ -55,26 +190,26 @@ class EditNotebook(object):
     def add_title(self, title):
         self.current_widget = EditWidget(self._set_config, self._get_config)
         self.current_widget.set_name(title)
-        self.book.append_page(self.current_widget, gtk.Label(title))
+        self.book.append_page(self.current_widget, Gtk.Label(label=title))
         return
 
     def popup(self):
-        d = gtk.Dialog(title=self.get_name(),
+        d = Gtk.Dialog(title=self.get_name(),
                        parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_OK, gtk.RESPONSE_OK,
-                                 gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL ))
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_OK, Gtk.ResponseType.OK,
+                                 Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL ))
         d.vbox.add(self.book)
         self.book.show_all()
         res=d.run()
         d.destroy()
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             return True
         else:
             return False
 
 
-class EditWidget(gtk.VBox):
+class EditWidget(Gtk.VBox):
     """Configuration edit widget.
 
     Adapted from (GPL) gdesklets code.
@@ -84,7 +219,8 @@ class EditWidget(gtk.VBox):
     CHANGE_SPIN = 2
     CHANGE_CHECKBOX = 3
     CHANGE_TEXT = 4
-    CHANGE_FLOAT_SPIN = 2
+    CHANGE_FLOAT_SPIN = 5
+    CHANGE_ACCELERATOR = 6
 
     def __init__(self, set_config, get_config):
 
@@ -99,11 +235,11 @@ class EditWidget(gtk.VBox):
         self.__lines = 0
 
 
-        gtk.VBox.__init__(self)
+        GObject.GObject.__init__(self)
         self.set_border_width(12)
         self.show()
 
-        self.__table = gtk.Table(1, 2)
+        self.__table = Gtk.Table(1, 2)
         self.__table.show()
         self.add(self.__table)
 
@@ -120,13 +256,13 @@ class EditWidget(gtk.VBox):
 
         if (w2):
             self.__table.attach(w1, 0, 1, self.__lines - 1, self.__lines,
-                                gtk.FILL, 0, x, y)
+                                Gtk.AttachOptions.FILL, 0, x, y)
             self.__table.attach(w2, 1, 2, self.__lines - 1, self.__lines,
-                                gtk.EXPAND | gtk.FILL, 0, 0, y)
+                                Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, 0, 0, y)
 
         else:
             self.__table.attach(w1, 0, 2, self.__lines - 1, self.__lines,
-                                gtk.EXPAND | gtk.FILL, 0, x, y)
+                                Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, 0, x, y)
 
 
 
@@ -140,7 +276,7 @@ class EditWidget(gtk.VBox):
         value = None
 
         if (mode == self.CHANGE_ENTRY):
-            value = unicode(src.get_text())
+            value = src.get_text()
 
         elif (mode == self.CHANGE_OPTION):
             value = src.get_model()[src.get_active()][1]
@@ -155,10 +291,13 @@ class EditWidget(gtk.VBox):
             value = src.get_value()
 
         elif (mode == self.CHANGE_TEXT):
-            value = unicode(src.get_text(*src.get_bounds()))
+            value = src.get_text(*src.get_bounds() + ( False, ))
+
+        elif (mode == self.CHANGE_ACCELERATOR):
+            value = Gtk.accelerator_name(src.key, src.mods)
 
         else:
-            print "Unknown type", str(mode)
+            logger.info("Unknown type %s", str(mode))
 
         if value is not None:
             self.__set_config(property, value)
@@ -172,11 +311,11 @@ class EditWidget(gtk.VBox):
 
     def add_label(self, label):
 
-        lbl = gtk.Label("")
+        lbl = Gtk.Label(label="")
         lbl.set_markup(label)
         lbl.set_line_wrap(True)
         lbl.show()
-        align = gtk.Alignment()
+        align = Gtk.Alignment()
         align.show()
         align.add(lbl)
 
@@ -188,7 +327,7 @@ class EditWidget(gtk.VBox):
 
     def add_checkbox(self, label, property, help):
 
-        check = gtk.CheckButton(label)
+        check = Gtk.CheckButton(label)
         check.show()
 
         check.set_tooltip_text(help)
@@ -203,15 +342,15 @@ class EditWidget(gtk.VBox):
 
     def add_entry(self, label, property, help, passwd = 0, entries=None):
 
-        lbl = gtk.Label(label)
+        lbl = Gtk.Label(label=label)
         lbl.show()
-        align = gtk.Alignment()
+        align = Gtk.Alignment()
         align.show()
         align.add(lbl)
 
         if entries:
-            combo = gtk.combo_box_entry_new_text()
-            entry = combo.child
+            combo = Gtk.ComboBoxText.new_with_entry()
+            entry = combo.get_child()
             combo.show()
             for e in entries:
                 combo.append_text(e)
@@ -219,14 +358,14 @@ class EditWidget(gtk.VBox):
             self.__add_line(1, align, combo)
         else:
             combo = None
-            entry = gtk.Entry()
+            entry = Gtk.Entry()
             entry.show()
             entry.set_tooltip_text(help)
             self.__add_line(1, align, entry)
 
         if (passwd):
             entry.set_visibility(False)
-            entry.set_invisible_char(unichr(0x2022))
+            entry.set_invisible_char('\u0222')
 
         value = self.__get_config(property)
         entry.set_text(value)
@@ -239,20 +378,20 @@ class EditWidget(gtk.VBox):
         The callback function has the following signature:
         callback(button, entry)
         """
-        lbl = gtk.Label(label)
+        lbl = Gtk.Label(label=label)
         lbl.show()
-        entry = gtk.Entry()
+        entry = Gtk.Entry()
         entry.show()
-        align = gtk.Alignment()
+        align = Gtk.Alignment()
         align.show()
         align.add(lbl)
 
-        hbox = gtk.HBox()
+        hbox = Gtk.HBox()
         hbox.show()
         hbox.add(entry)
-        b = gtk.Button(button_label)
+        b = Gtk.Button(button_label)
         b.connect('clicked', callback, entry)
-        hbox.pack_start(b, expand=False)
+        hbox.pack_start(b, False, True, 0)
 
         entry.set_tooltip_text(help)
         self.__add_line(1, align, hbox)
@@ -265,14 +404,14 @@ class EditWidget(gtk.VBox):
 
     def add_text(self, label, property, help):
 
-        lbl = gtk.Label(label)
+        lbl = Gtk.Label(label=label)
         lbl.show()
-        sw = gtk.ScrolledWindow()
-        entry = gtk.TextView()
+        sw = Gtk.ScrolledWindow()
+        entry = Gtk.TextView()
         sw.add(entry)
         entry.show()
         sw.show()
-        align = gtk.Alignment()
+        align = Gtk.Alignment()
         align.show()
         align.add(lbl)
 
@@ -287,15 +426,15 @@ class EditWidget(gtk.VBox):
 
     def add_spin(self, label, property, help, low, up):
 
-        lbl = gtk.Label(label)
+        lbl = Gtk.Label(label=label)
         lbl.show()
 
-        align = gtk.Alignment()
+        align = Gtk.Alignment()
         align.show()
         align.add(lbl)
 
-        adjustment = gtk.Adjustment(0, low, up, 1, 1, 0)
-        spin_button = gtk.SpinButton(adjustment, 1, 0)
+        adjustment = Gtk.Adjustment.new(0, low, up, 1, 1, 0)
+        spin_button = Gtk.SpinButton.new(adjustment, 1, 0)
         spin_button.set_numeric(True)
         spin_button.show()
 
@@ -310,17 +449,17 @@ class EditWidget(gtk.VBox):
 
     def add_float_spin(self, label, property, help, low, up, digits=2):
 
-        lbl = gtk.Label(label)
+        lbl = Gtk.Label(label=label)
         lbl.show()
 
-        align = gtk.Alignment()
+        align = Gtk.Alignment()
         align.show()
         align.add(lbl)
 
         value = self.__get_config(property)
 
-        adjustment = gtk.Adjustment(value, low, up, 10 ** -digits, 1, 0)
-        spin_button = gtk.SpinButton(adjustment, 1, digits)
+        adjustment = Gtk.Adjustment.new(value, low, up, 10 ** -digits, 1, 0)
+        spin_button = Gtk.SpinButton.new(adjustment, 10 ** -digits, digits)
         spin_button.set_numeric(True)
         spin_button.show()
 
@@ -332,20 +471,41 @@ class EditWidget(gtk.VBox):
         spin_button.connect('value-changed', self.__on_change, property,
                             self.CHANGE_FLOAT_SPIN)
 
+    def add_accelerator(self, label, property, help):
+
+        lbl = Gtk.Label(label=label)
+        lbl.show()
+
+        align = Gtk.Alignment()
+        align.show()
+        align.add(lbl)
+
+        value = self.__get_config(property)
+
+        key, mods = Gtk.accelerator_parse(value)
+        grabber = KeyGrabber(parent=self.get_toplevel(),
+                             key=key,
+                             mods=mods)
+        grabber.connect('changed', self.__on_change, property, self.CHANGE_ACCELERATOR)
+
+        grabber.set_tooltip_text(help)
+        grabber.show_all()
+        self.__add_line(1, align, grabber)
+
     def add_option(self, label, property, help, options):
 
-        lbl = gtk.Label(label)
+        lbl = Gtk.Label(label=label)
         lbl.show()
 
-        align = gtk.Alignment()
+        align = Gtk.Alignment()
         align.show()
         align.add(lbl)
 
         value = self.__get_config(property)
 
-        store=gtk.ListStore(str, object)
+        store=Gtk.ListStore(str, object)
         active_iter=None
-        for k, v in options.iteritems():
+        for k, v in options.items():
             i=store.append( ( k, v ) )
             if v == value:
                 active_iter=i
@@ -353,8 +513,8 @@ class EditWidget(gtk.VBox):
         if active_iter is None:
             active_iter = store.get_iter_first()
 
-        combo = gtk.ComboBox(store)
-        cell = gtk.CellRendererText()
+        combo = Gtk.ComboBox.new_with_model(store)
+        cell = Gtk.CellRendererText()
         combo.pack_start(cell, True)
         combo.add_attribute(cell, 'text', 0)
         combo.set_active_iter(active_iter)
@@ -368,35 +528,35 @@ class EditWidget(gtk.VBox):
     def add_file_selector(self, label, property, help):
 
         def open_filedialog(self, default_file, entry):
-            fs=gtk.FileChooserDialog(title=_("Choose a file"),
+            fs=Gtk.FileChooserDialog(title=_("Choose a file"),
                                      parent=None,
-                                     action=gtk.FILE_CHOOSER_ACTION_OPEN,
-                                     buttons=( gtk.STOCK_OPEN,
-                                               gtk.RESPONSE_OK,
-                                               gtk.STOCK_CANCEL,
-                                               gtk.RESPONSE_CANCEL ))
+                                     action=Gtk.FileChooserAction.OPEN,
+                                     buttons=( Gtk.STOCK_OPEN,
+                                               Gtk.ResponseType.OK,
+                                               Gtk.STOCK_CANCEL,
+                                               Gtk.ResponseType.CANCEL ))
             if default_file and os.path.exists(default_file):
                 fs.set_filename(default_file)
             res=fs.run()
             filename=None
-            if res == gtk.RESPONSE_OK:
+            if res == Gtk.ResponseType.OK:
                 filename=fs.get_filename()
                 entry.set_text(filename)
             fs.destroy()
 
-        lbl = gtk.Label(label)
+        lbl = Gtk.Label(label=label)
         lbl.show()
-        align = gtk.Alignment()
+        align = Gtk.Alignment()
         align.show()
         align.add(lbl)
 
-        hbox = gtk.HBox()
+        hbox = Gtk.HBox()
         hbox.show()
-        entry = gtk.Entry()
+        entry = Gtk.Entry()
         entry.show()
         hbox.pack_start(entry, True, True, 0)
 
-        btn = gtk.Button(stock = gtk.STOCK_OPEN)
+        btn = Gtk.Button(stock = Gtk.STOCK_OPEN)
         btn.show()
         hbox.pack_end(btn, True, True, 4)
 
@@ -415,35 +575,35 @@ class EditWidget(gtk.VBox):
     def add_dir_selector(self, label, property, help):
 
         def open_filedialog(self, default_file, entry):
-            fs=gtk.FileChooserDialog(title=_("Choose a directory"),
+            fs=Gtk.FileChooserDialog(title=_("Choose a directory"),
                                      parent=None,
-                                     action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
-                                     buttons=( gtk.STOCK_OPEN,
-                                               gtk.RESPONSE_OK,
-                                               gtk.STOCK_CANCEL,
-                                               gtk.RESPONSE_CANCEL ))
+                                     action=Gtk.FileChooserAction.SELECT_FOLDER,
+                                     buttons=( Gtk.STOCK_OPEN,
+                                               Gtk.ResponseType.OK,
+                                               Gtk.STOCK_CANCEL,
+                                               Gtk.ResponseType.CANCEL ))
             if default_file:
                 fs.set_filename(default_file)
             res=fs.run()
             filename=None
-            if res == gtk.RESPONSE_OK:
+            if res == Gtk.ResponseType.OK:
                 filename=fs.get_filename()
                 entry.set_text(filename)
             fs.destroy()
 
-        lbl = gtk.Label(label)
+        lbl = Gtk.Label(label=label)
         lbl.show()
-        align = gtk.Alignment()
+        align = Gtk.Alignment()
         align.show()
         align.add(lbl)
 
-        hbox = gtk.HBox()
+        hbox = Gtk.HBox()
         hbox.show()
-        entry = gtk.Entry()
+        entry = Gtk.Entry()
         entry.show()
         hbox.pack_start(entry, True, True, 0)
 
-        btn = gtk.Button(stock = gtk.STOCK_OPEN)
+        btn = Gtk.Button(stock = Gtk.STOCK_OPEN)
         btn.show()
         hbox.pack_end(btn, True, True, 4)
 
@@ -460,21 +620,21 @@ class EditWidget(gtk.VBox):
         self.__add_line(1, align, hbox)
 
     def popup(self):
-        d = gtk.Dialog(title=self.get_name(),
+        d = Gtk.Dialog(title=self.get_name(),
                        parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_OK, gtk.RESPONSE_OK,
-                                 gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL ))
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_OK, Gtk.ResponseType.OK,
+                                 Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL ))
         d.vbox.add(self)
 
         def dialog_keypressed_cb(widget=None, event=None):
             """Generic dialog keypress handler.
             """
-            if event.keyval == gtk.keysyms.Return:
-                widget.response(gtk.RESPONSE_OK)
+            if event.keyval == Gdk.KEY_Return:
+                widget.response(Gtk.ResponseType.OK)
                 return True
-            elif event.keyval == gtk.keysyms.Escape:
-                widget.response(gtk.RESPONSE_CANCEL)
+            elif event.keyval == Gdk.KEY_Escape:
+                widget.response(Gtk.ResponseType.CANCEL)
                 return True
             return False
         d.connect('key-press-event', dialog_keypressed_cb)
@@ -482,7 +642,7 @@ class EditWidget(gtk.VBox):
         self.show_all()
         res=d.run()
         d.destroy()
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             return True
         else:
             return False
@@ -509,10 +669,10 @@ class OptionParserGUI(EditWidget):
                 val = o.default
             # FIXME: should implement store_const, append, count? and (less likely) callback
             if o.action == 'store_true':
-                self.options[o.dest] = False
+                self.options[o.dest] = val
                 self.add_checkbox(name, o.dest, o.help)
             elif o.action == 'store_false':
-                self.options[o.dest] = True
+                self.options[o.dest] = not val
                 self.add_checkbox(name, o.dest, o.help)
             elif o.action == 'store':
                 if o.type in ('int', 'long'):
@@ -530,18 +690,20 @@ class OptionParserGUI(EditWidget):
                         self.add_entry(name, o.dest, o.help)
                 elif o.type == 'float':
                     self.options[o.dest] = val
-                    self.add_float_spin(name, o.dest, o.help, -sys.maxint, sys.maxint, 2)
+                    self.add_float_spin(name, o.dest, o.help, -sys.maxsize, sys.maxsize, 2)
                 elif o.type == 'choice':
                     self.options[o.dest] = val
                     self.add_option(name, o.dest, o.help, dict( (c, c) for c in o.choices) )
             else:
-                print "Ignoring option", name
+                if name != 'help':
+                    logger.info("Ignoring option %s", name)
                 continue
 
 def test():
     val = {
         'string': 'String',
         'option': 'fee',
+        'float': .42,
         'filename': '/tmp',
         }
     def set_config(name, value):
@@ -554,6 +716,7 @@ def test():
     ew.set_name("Test")
     ew.add_title("Main values")
     ew.add_entry("Name", "string", "Enter a valid name")
+    ew.add_float_spin("Float", "float", "Choose a float value", -1, 1, 2)
     ew.add_option("Option", 'option', "Choose the option", {"Fee": "fee",
                                                             "Fi": "fi",
                                                             "Fo": "fo",
@@ -562,11 +725,10 @@ def test():
 
     res=ew.popup()
     if res:
-        print "Modified: " + str(val)
+        logger.info("Modified: %s", str(val))
     else:
-        print "Cancel"
-
-    gtk.main()
+        logger.info("Cancel")
 
 if __name__ == '__main__':
+    logging.basicConfig(level=logging.INFO)
     test()
diff --git a/lib/advene/gui/edit/rules.py b/lib/advene/gui/edit/rules.py
index 77d73a4..50fce9e 100755
--- a/lib/advene/gui/edit/rules.py
+++ b/lib/advene/gui/edit/rules.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,7 +18,11 @@
 #
 """Display and edit a Rule."""
 
-import gtk
+import logging
+logger = logging.getLogger(__name__)
+
+from gi.repository import Gdk
+from gi.repository import Gtk
 
 import re
 
@@ -68,7 +72,7 @@ class EditRuleSet(EditGeneric):
 
     def get_packed_widget(self):
         """Return an enriched widget (with rules add and remove buttons)."""
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
         vbox.set_homogeneous (False)
 
         def add_rule_cb(button=None):
@@ -81,7 +85,7 @@ class EditRuleSet(EditGeneric):
             for p in ra.parameters:
                 action.add_parameter(p, ra.defaults.get(p, ''))
             # Find the next rulename index
-            l=[ int(i) for i in re.findall(unicode(_('Rule')+'\s*(\d+)'), ''.join(r.name for r in self.model)) ]
+            l=[ int(i) for i in re.findall(_('Rule')+'\s*(\d+)', ''.join(r.name for r in self.model)) ]
             idx=max(l or [ 0 ] ) + 1
             rule=Rule(name=_("Rule") + str(idx),
                       event=event,
@@ -111,32 +115,32 @@ class EditRuleSet(EditGeneric):
                 self.model.remove(edit.model)
                 self.widget.remove_page(current)
             elif len(l) > 1:
-                print "Error in remove_rule"
+                logger.error("Error in remove_rule")
             return True
 
-        hb=gtk.HBox()
+        hb=Gtk.HBox()
 
-        b=gtk.Button(stock=gtk.STOCK_ADD)
+        b=Gtk.Button(stock=Gtk.STOCK_ADD)
         b.connect('clicked', add_rule_cb)
         b.set_sensitive(self.editable)
         b.set_tooltip_text(_("Add a new rule"))
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
-        b=gtk.Button(stock=gtk.STOCK_SELECT_COLOR)
+        b=Gtk.Button(stock=Gtk.STOCK_SELECT_COLOR)
         b.set_label(_("Subview"))
         b.connect('clicked', add_subview_cb)
         b.set_sensitive(self.editable)
         b.set_tooltip_text(_("Add a subview list"))
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
-        b=gtk.Button(stock=gtk.STOCK_REMOVE)
+        b=Gtk.Button(stock=Gtk.STOCK_REMOVE)
         b.connect('clicked', remove_rule_cb)
         b.set_sensitive(self.editable)
         b.set_tooltip_text(_("Remove the current rule"))
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
 
-        vbox.pack_start(hb, expand=False)
+        vbox.pack_start(hb, False, True, 0)
 
         vbox.add(self.get_widget())
 
@@ -151,22 +155,20 @@ class EditRuleSet(EditGeneric):
         elif isinstance(rule, SubviewList):
             edit=EditSubviewList(rule, controller=self.controller)
 
-        eb=gtk.EventBox()
-        l=gtk.Label(rule.name)
+        eb=Gtk.EventBox()
+        l=Gtk.Label(label=rule.name)
         edit.set_update_label(l)
         eb.add(l)
 
         eb.connect('drag-data-get', self.drag_sent)
-        eb.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                           config.data.drag_type['rule'],
-                           gtk.gdk.ACTION_COPY )
+        eb.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                           config.data.get_target_types('rule'),
+                           Gdk.DragAction.COPY )
         eb.show_all()
 
         self.editlist.append(edit)
-        #print "Model: %d rules" % len(self.model)
         if append and not rule in self.model:
             self.model.add_rule(rule)
-        #print "-> Model: %d rules" % len(self.model)
         self.widget.append_page(edit.get_widget(), eb)
         self.widget.set_current_page(-1)
         return True
@@ -185,14 +187,13 @@ class EditRuleSet(EditGeneric):
             dialog.message_dialog(
                 _("The following items seem to be\ninvalid TALES expressions:\n\n%s") %
                 "\n".join(iv),
-                icon=gtk.MESSAGE_ERROR)
+                icon=Gtk.MessageType.ERROR)
             return False
         for e in self.editlist:
             e.update_value()
         return True
 
     def drag_sent(self, widget, context, selection, targetType, eventTime):
-        #print "drag_sent event from %s" % widget.annotation.content.data
         if targetType == config.data.target_type['rule']:
             # Get the current rule's content
 
@@ -204,19 +205,18 @@ class EditRuleSet(EditGeneric):
             if len(l) == 1:
                 edit=l[0]
                 # We have the model. Convert it to XML
-                selection.set(selection.target, 8, edit.model.xml_repr().encode('utf8'))
+                selection.set(selection.get_target(), 8, edit.model.xml_repr().encode('utf8'))
             elif len(l) > 1:
-                print "Error in drag"
+                logger.error("Error in drag")
             return True
 
         else:
-            print "Unknown target type for drag: %d" % targetType
+            logger.warn("Unknown target type for drag: %d" % targetType)
         return True
 
     def drag_received(self, widget, context, x, y, selection, targetType, time):
-        #print "drag_received event for %s" % widget.annotation.content.data
         if targetType == config.data.target_type['rule']:
-            xml=unicode(selection.data, 'utf8')
+            xml=str(selection.get_data(), 'utf8')
             if 'subviewlist' in xml:
                 rule=SubviewList()
             else:
@@ -231,24 +231,24 @@ class EditRuleSet(EditGeneric):
             rule.name = name
             self.add_rule(rule)
         else:
-            print "Unknown target type for drop: %d" % targetType
+            logger.warn("Unknown target type for drop: %d" % targetType)
         return True
 
 
     def build_widget(self):
         # Create a notebook:
-        notebook=gtk.Notebook()
-        notebook.set_tab_pos(gtk.POS_LEFT)
+        notebook=Gtk.Notebook()
+        notebook.set_tab_pos(Gtk.PositionType.LEFT)
         notebook.popup_enable()
         notebook.set_scrollable(True)
 
         notebook.connect('drag-data-received', self.drag_received)
-        notebook.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                               gtk.DEST_DEFAULT_HIGHLIGHT |
-                               gtk.DEST_DEFAULT_ALL,
-                               config.data.drag_type['rule'],
-                               gtk.gdk.ACTION_COPY)
-        #b=gtk.Button(rule.name)
+        notebook.drag_dest_set(Gtk.DestDefaults.MOTION |
+                               Gtk.DestDefaults.HIGHLIGHT |
+                               Gtk.DestDefaults.ALL,
+                               config.data.get_target_types('rule'),
+                               Gdk.DragAction.COPY)
+        #b=Gtk.Button(rule.name)
         #b.connect('clicked', popup_edit, rule, catalog)
         #b.show()
         #vbox.add(b)
@@ -284,11 +284,11 @@ class EditQuery(EditGeneric):
     def update_value(self):
         if not self.editable:
             return False
-        self.model.sources=unicode(self.sourceentry.get_text()).split(';')
+        self.model.sources=self.sourceentry.get_text().split(';')
         if self.valueentry is None:
             v='element'
         else:
-            v=unicode(self.valueentry.get_text())
+            v=self.valueentry.get_text()
         if v == '' or v == 'element':
             self.model.rvalue=None
         else:
@@ -318,7 +318,7 @@ class EditQuery(EditGeneric):
         return True
 
     def add_condition_widget(self, cond, conditionsbox):
-        hb=gtk.HBox()
+        hb=Gtk.HBox()
         conditionsbox.add(hb)
 
         w=EditCondition(cond, editable=self.editable,
@@ -330,25 +330,25 @@ class EditQuery(EditGeneric):
         hb.add(w.get_widget())
         w.get_widget().show()
 
-        b=gtk.Button(stock=gtk.STOCK_REMOVE)
+        b=Gtk.Button(stock=Gtk.STOCK_REMOVE)
         b.set_sensitive(self.editable)
         b.connect('clicked', self.remove_condition, w, hb)
         b.show()
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
         hb.show()
 
         return True
 
     def build_widget(self):
-        frame=gtk.Frame()
+        frame=Gtk.Frame()
 
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
         frame.add(vbox)
         vbox.show()
 
         # Event
-        ef=gtk.Frame(_("For all elements in "))
+        ef=Gtk.Frame.new(_("For all elements in "))
         predef=[ ('package/annotations', _("All annotations of the package")),
                  ('package/views', _("All views of the package")),
                  ('here/annotations', _("The context annotations")),
@@ -363,11 +363,11 @@ class EditQuery(EditGeneric):
         self.sourceentry.set_editable(self.editable)
         ef.add(self.sourceentry.widget)
         ef.show_all()
-        vbox.pack_start(ef, expand=False)
+        vbox.pack_start(ef, False, True, 0)
 
         if config.data.preferences['expert-mode']:
             # Return value
-            vf=gtk.Frame(_("Return "))
+            vf=Gtk.Frame.new(_("Return "))
             self.valueentry=TALESEntry(context=self.model,
                                        predefined=[ ('element', _("The element")),
                                                     ('element/content/data', _("The element's content")) ],
@@ -379,27 +379,27 @@ class EditQuery(EditGeneric):
             self.valueentry.set_editable(self.editable)
             vf.add(self.valueentry.widget)
             vf.show_all()
-            vbox.pack_start(vf, expand=False)
+            vbox.pack_start(vf, False, True, 0)
         else:
             self.valueentry=None
 
         # Conditions
         if config.data.preferences['expert-mode']:
-            cf=gtk.Frame(_("If the element matches "))
+            cf=Gtk.Frame.new(_("If the element matches "))
         else:
-            cf=gtk.Frame(_("Return the element if it matches "))
-        conditionsbox=gtk.VBox()
+            cf=Gtk.Frame.new(_("Return the element if it matches "))
+        conditionsbox=Gtk.VBox()
         cf.add(conditionsbox)
 
         # "Add condition" button
-        hb=gtk.HBox()
-        b=gtk.Button(stock=gtk.STOCK_ADD)
+        hb=Gtk.HBox()
+        b=Gtk.Button(stock=Gtk.STOCK_ADD)
         b.connect('clicked', self.add_condition, conditionsbox)
         b.set_sensitive(self.editable)
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
         hb.set_homogeneous(False)
 
-        hb.add(gtk.HBox())
+        hb.add(Gtk.HBox())
 
         def change_composition(combo):
             self.composition=combo.get_current_element()
@@ -409,9 +409,9 @@ class EditQuery(EditGeneric):
                                          ('or', _("Any condition can be met") ) ],
                                        preselect=self.composition,
                                        callback=change_composition)
-        hb.pack_start(c, expand=False)
+        hb.pack_start(c, False, True, 0)
 
-        conditionsbox.pack_start(hb, expand=False, fill=False)
+        conditionsbox.pack_start(hb, False, False, 0)
 
         cf.show_all()
 
@@ -419,7 +419,7 @@ class EditQuery(EditGeneric):
             for c in self.model.condition:
                 self.add_condition_widget(c, conditionsbox)
 
-        vbox.pack_start(cf, expand=False)
+        vbox.pack_start(cf, False, True, 0)
 
         frame.show()
 
@@ -449,9 +449,9 @@ class EditRule(EditGeneric):
 
     def drag_sent(self, widget, context, selection, targetType, eventTime):
         if targetType == config.data.target_type['rule']:
-            selection.set(selection.target, 8, self.model.xml_repr().encode('utf8'))
+            selection.set(selection.get_target(), 8, self.model.xml_repr().encode('utf8'))
         else:
-            print "Unknown target type for drag: %d" % targetType
+            logger.warn("Unknown target type for drag: %d" % targetType)
         return True
 
     def invalid_items(self):
@@ -472,7 +472,7 @@ class EditRule(EditGeneric):
         for w in self.editconditionlist:
             w.update_value()
 
-        self.model.name=unicode(self.name_entry.get_text())
+        self.model.name=self.name_entry.get_text()
 
         self.model.event=Event(self.editevent.current_event)
 
@@ -489,8 +489,8 @@ class EditRule(EditGeneric):
 
     def update_name(self, entry):
         if self.namelabel:
-            self.namelabel.set_label(unicode(entry.get_text()))
-        self.framelabel.set_markup(_("Rule <b>%s</b>") % unicode(entry.get_text()).replace('<', '<'))
+            self.namelabel.set_label(entry.get_text())
+        self.framelabel.set_markup(_("Rule <b>%s</b>") % entry.get_text().replace('<', '<'))
         return True
 
     def remove_condition(self, widget, conditionwidget, hbox):
@@ -511,7 +511,7 @@ class EditRule(EditGeneric):
         return True
 
     def add_condition_widget(self, cond, conditionsbox):
-        hb=gtk.HBox()
+        hb=Gtk.HBox()
         conditionsbox.add(hb)
 
         w=EditCondition(cond, editable=self.editable, controller=self.controller, parent=self)
@@ -521,11 +521,11 @@ class EditRule(EditGeneric):
         hb.add(w.get_widget())
         w.get_widget().show()
 
-        b=gtk.Button(stock=gtk.STOCK_REMOVE)
+        b=Gtk.Button(stock=Gtk.STOCK_REMOVE)
         b.set_sensitive(self.editable)
         b.connect('clicked', self.remove_condition, w, hb)
         b.show()
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
         hb.show()
 
@@ -540,7 +540,7 @@ class EditRule(EditGeneric):
     def add_action_widget(self, action, actionsbox):
         """Add an action widget to the given actionsbox."""
 
-        hb=gtk.HBox()
+        hb=Gtk.HBox()
         actionsbox.add(hb)
 
         w=EditAction(action, self.catalog, editable=self.editable,
@@ -548,67 +548,67 @@ class EditRule(EditGeneric):
         self.editactionlist.append(w)
         hb.add(w.get_widget())
         w.get_widget().show()
-        b=gtk.Button(stock=gtk.STOCK_REMOVE)
+        b=Gtk.Button(stock=Gtk.STOCK_REMOVE)
         b.connect('clicked', self.remove_action, w, hb)
         b.set_sensitive(self.editable)
         b.show()
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
         hb.show()
         return True
 
     def build_widget(self):
-        frame=gtk.Frame()
-        self.framelabel=gtk.Label()
+        frame=Gtk.Frame()
+        self.framelabel=Gtk.Label()
         self.framelabel.set_markup(_("Rule <b>%s</b>") % self.model.name.replace('<', '<'))
         self.framelabel.show()
         frame.set_label_widget(self.framelabel)
 
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
         frame.add(vbox)
         vbox.show()
 
         # Rule name
-        hbox=gtk.HBox()
+        hbox=Gtk.HBox()
 
-        hbox.pack_start(gtk.Label(_("Rule name")), expand=False)
-        self.name_entry=gtk.Entry()
+        hbox.pack_start(Gtk.Label(_("Rule name")), False, False, 0)
+        self.name_entry=Gtk.Entry()
         self.name_entry.set_text(self.model.name)
         self.name_entry.set_editable(self.editable)
         self.name_entry.connect('changed', self.update_name)
         hbox.add(self.name_entry)
 
-        b=gtk.Button(stock=gtk.STOCK_COPY)
+        b=Gtk.Button(stock=Gtk.STOCK_COPY)
         b.connect('drag-data-get', self.drag_sent)
-        b.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                          config.data.drag_type['rule'], gtk.gdk.ACTION_COPY)
-        hbox.pack_start(b, expand=False)
+        b.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                          config.data.get_target_types('rule'), Gdk.DragAction.COPY)
+        hbox.pack_start(b, False, True, 0)
 
         hbox.show_all()
-        vbox.pack_start(hbox, expand=False)
+        vbox.pack_start(hbox, False, True, 0)
 
         # Event
-        ef=gtk.Frame(_("Event"))
+        ef=Gtk.Frame.new(_("Event"))
         self.editevent=EditEvent(self.model.event, catalog=self.catalog,
                                  editable=self.editable, controller=self.controller)
         ef.add(self.editevent.get_widget())
         ef.show_all()
-        vbox.pack_start(ef, expand=False)
+        vbox.pack_start(ef, False, True, 0)
 
         # Conditions
-        cf=gtk.Frame(_("If"))
-        conditionsbox=gtk.VBox()
+        cf=Gtk.Frame.new(_("If"))
+        conditionsbox=Gtk.VBox()
         cf.add(conditionsbox)
 
         # "Add condition" button
-        hb=gtk.HBox()
-        b=gtk.Button(stock=gtk.STOCK_ADD)
+        hb=Gtk.HBox()
+        b=Gtk.Button(stock=Gtk.STOCK_ADD)
         b.connect('clicked', self.add_condition, conditionsbox)
         b.set_sensitive(self.editable)
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
         hb.set_homogeneous(False)
 
-        hb.add(gtk.HBox())
+        hb.add(Gtk.HBox())
 
         def change_composition(combo):
             self.composition=combo.get_current_element()
@@ -618,9 +618,9 @@ class EditRule(EditGeneric):
                                          ('or', _("Any condition can be met") ) ],
                                        preselect=self.composition,
                                        callback=change_composition)
-        hb.pack_start(c, expand=False)
+        hb.pack_start(c, False, True, 0)
 
-        conditionsbox.pack_start(hb, expand=False, fill=False)
+        conditionsbox.pack_start(hb, False, False, 0)
 
         cf.show_all()
 
@@ -632,25 +632,25 @@ class EditRule(EditGeneric):
                 # Should not happen
                 raise Exception("condition should be a conditionlist")
 
-        vbox.pack_start(cf, expand=False)
+        vbox.pack_start(cf, False, True, 0)
 
         # Actions
-        af=gtk.Frame(_("Then"))
-        actionsbox=gtk.VBox()
+        af=Gtk.Frame.new(_("Then"))
+        actionsbox=Gtk.VBox()
         af.add(actionsbox)
-        hb=gtk.HBox()
+        hb=Gtk.HBox()
         # Add Action button
-        b=gtk.Button(stock=gtk.STOCK_ADD)
+        b=Gtk.Button(stock=Gtk.STOCK_ADD)
         b.connect('clicked', self.add_action, actionsbox)
         b.set_sensitive(self.editable)
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
         hb.set_homogeneous(False)
-        actionsbox.pack_start(hb, expand=False, fill=False)
+        actionsbox.pack_start(hb, False, False, 0)
 
         for a in self.model.action:
             self.add_action_widget(a, actionsbox)
 
-        vbox.pack_start(af, expand=False)
+        vbox.pack_start(af, False, True, 0)
         af.show_all()
 
         frame.show()
@@ -677,11 +677,11 @@ class EditEvent(EditGeneric):
             self.current_event=event
 
     def build_widget(self):
-        hbox=gtk.HBox()
+        hbox=Gtk.HBox()
         hbox.set_homogeneous(False)
 
-        label=gtk.Label(_("When the "))
-        hbox.pack_start(label)
+        label=Gtk.Label(label=_("When the "))
+        hbox.pack_start(label, True, True, 0)
 
         eventlist=self.catalog.get_described_events(expert=self.expert)
         if self.current_event not in eventlist:
@@ -693,7 +693,7 @@ class EditEvent(EditGeneric):
                                           editable=self.editable)
         hbox.add(eventname)
 
-        label=gtk.Label(_(" occurs,"))
+        label=Gtk.Label(_(" occurs,"))
         hbox.add(label)
 
         hbox.show_all()
@@ -720,10 +720,10 @@ class EditCondition(EditGeneric):
     def invalid_items(self):
         iv=[]
         if not self.lhs.is_valid():
-            iv.append(_("Condition expression: %s") % unicode(self.lhs.get_text()))
+            iv.append(_("Condition expression: %s") % self.lhs.get_text())
         if (self.current_operator in Condition.binary_operators
             and not self.rhs.is_valid()):
-            iv.append(_("Condition expression: %s") % unicode(self.lhs.get_text()))
+            iv.append(_("Condition expression: %s") % self.lhs.get_text())
         return iv
 
     def update_value(self):
@@ -731,9 +731,9 @@ class EditCondition(EditGeneric):
             return False
         c=self.model
         c.operator=self.current_operator
-        c.lhs=unicode(self.lhs.get_text())
+        c.lhs=self.lhs.get_text()
         if c.operator in Condition.binary_operators:
-            c.rhs=unicode(self.rhs.get_text())
+            c.rhs=self.rhs.get_text()
         return True
 
     def update_widget(self):
@@ -758,7 +758,7 @@ class EditCondition(EditGeneric):
         return True
 
     def build_widget(self):
-        hbox=gtk.HBox()
+        hbox=Gtk.HBox()
 
         if self.parent is None or isinstance(self.parent, EditRule):
             predefined=[
@@ -832,13 +832,13 @@ class EditCondition(EditGeneric):
                 return operators[element][0]
 
         self.selector=dialog.CategorizedSelector(title=_("Select a condition"),
-                                          elements=operators.keys(),
-                                          categories=Condition.condition_categories.keys(),
-                                          current=self.current_operator,
-                                          description_getter=description_getter,
-                                          category_getter=lambda e: operators[e][1],
-                                          callback=self.on_change_operator,
-                                          editable=self.editable)
+                                                 elements=list(operators),
+                                                 categories=list(Condition.condition_categories),
+                                                 current=self.current_operator,
+                                                 description_getter=description_getter,
+                                                 category_getter=lambda e: operators[e][1],
+                                                 callback=self.on_change_operator,
+                                                 editable=self.editable)
         self.operator=self.selector.get_button()
 
         hbox.add(self.lhs.widget)
@@ -886,17 +886,16 @@ class EditAction(EditGeneric):
         ra=self.catalog.get_action(self.current_name)
         self.model = Action(registeredaction=ra, catalog=self.catalog)
         regexp=re.compile('^(\(.+\)|)$')
-        for n, v in self.current_parameters.iteritems():
+        for n, v in self.current_parameters.items():
             # We ignore parameters fields that are empty or that match '^\(.+\)$'
             if not regexp.match(v):
-                #print "Updating %s = %s" % (n, v)
                 self.model.add_parameter(n, v)
         return True
 
     def sorted(self, l):
         """Return a sorted version of the list."""
         if isinstance(l, dict):
-            res=l.keys()
+            res=list(l)
         else:
             res=l[:]
         res.sort()
@@ -933,14 +932,14 @@ class EditAction(EditGeneric):
         return True
 
     def on_change_parameter(self, entry, talesentry, name):
-        value=unicode(talesentry.get_text())
+        value=talesentry.get_text()
         self.current_parameters[name]=value
         return True
 
     def build_parameter_widget(self, name, value, description):
-        hbox=gtk.HBox()
-        label=gtk.Label(name)
-        hbox.pack_start(label, expand=False)
+        hbox=Gtk.HBox()
+        label=Gtk.Label(label=name)
+        hbox.pack_start(label, False, True, 0)
 
         ra=self.registeredaction
         if ra:
@@ -961,14 +960,14 @@ class EditAction(EditGeneric):
 
         hbox.entry=entry
 
-        hbox.pack_start(entry.widget)
+        hbox.pack_start(entry.widget, True, True, 0)
         hbox.show_all()
         return hbox
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        vbox.add(gtk.HSeparator())
+        vbox.add(Gtk.HSeparator())
 
         def description_getter(element):
             if hasattr(element, 'description'):
@@ -991,7 +990,7 @@ class EditAction(EditGeneric):
 
         self.selector=dialog.CategorizedSelector(title=_("Select an action"),
                                                  elements=expert_filter(sorted(c.actions.values()), 'category'),
-                                                 categories=expert_filter(c.action_categories.keys()),
+                                                 categories=expert_filter(list(c.action_categories)),
                                                  current=c.actions[self.current_name],
                                                  description_getter=description_getter,
                                                  category_getter=lambda e: e.category,
@@ -1022,7 +1021,7 @@ class EditAction(EditGeneric):
                 self.paramlist[name]=p
                 vbox.add(p)
 
-        vbox.add(gtk.HSeparator())
+        vbox.add(Gtk.HSeparator())
 
         vbox.show_all()
         return vbox
@@ -1050,7 +1049,7 @@ class EditSubviewList(EditGeneric):
 
     def update_name(self, entry):
         if self.namelabel:
-            self.namelabel.set_label(unicode(entry.get_text()))
+            self.namelabel.set_label(entry.get_text())
         return True
 
     def refresh(self):
@@ -1070,32 +1069,32 @@ class EditSubviewList(EditGeneric):
         return True
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        self.store=gtk.ListStore( object, str, str, bool )
+        self.store=Gtk.ListStore( object, str, str, bool )
         self.refresh()
 
-        self.treeview=gtk.TreeView(model=self.store)
+        self.treeview=Gtk.TreeView(model=self.store)
 
-        renderer = gtk.CellRendererToggle()
+        renderer = Gtk.CellRendererToggle()
         renderer.set_property('activatable', True)
         renderer.connect('toggled', self.toggled_cb, self.store, self.COLUMN_STATUS)
-        column = gtk.TreeViewColumn(_('Activate?'), renderer, active=self.COLUMN_STATUS)
+        column = Gtk.TreeViewColumn(_('Activate?'), renderer, active=self.COLUMN_STATUS)
         self.treeview.append_column(column)
 
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(_('View'), renderer, text=self.COLUMN_LABEL)
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn(_('View'), renderer, text=self.COLUMN_LABEL)
         column.set_resizable(True)
         self.treeview.append_column(column)
 
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(_('Id'), renderer, text=self.COLUMN_ID)
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn(_('Id'), renderer, text=self.COLUMN_ID)
         column.set_resizable(True)
         self.treeview.append_column(column)
 
-        sw=gtk.ScrolledWindow()
+        sw=Gtk.ScrolledWindow()
         sw.add(self.treeview)
-        vbox.pack_start(sw, expand=True)
+        vbox.pack_start(sw, True, True, 0)
 
         vbox.show_all()
         return vbox
diff --git a/lib/advene/gui/edit/schemaeditor.py b/lib/advene/gui/edit/schemaeditor.py
deleted file mode 100644
index 89e3457..0000000
--- a/lib/advene/gui/edit/schemaeditor.py
+++ /dev/null
@@ -1,1589 +0,0 @@
-#
-# Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2009-2012 Bertrand Richard <bertrand.richard at liris.cnrs.fr>
-#
-# Advene is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# Advene is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Foobar; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-"""SchemaEditor GUI classes and methods.
-
-This module provides a schema editor form
-
-"""
-
-import advene.core.config as config
-from gettext import gettext as _
-
-import gtk
-try:
-    import goocanvas
-    from goocanvas import Group
-except ImportError:
-    # Goocanvas is not available. Define some globals in order not to
-    # fail the module loading, and use them as a guard in register()
-    goocanvas=None
-    Group=object
-import cairo
-from advene.model.schema import Schema, AnnotationType, RelationType
-from advene.gui.views import AdhocView
-from advene.gui.util import dialog, name2color, get_pixmap_button
-from advene.gui.edit.create import CreateElementPopup
-import advene.util.helper as helper
-from math import sqrt
-import advene.gui.popup
-
-
-name="Schema editor view"
-
-def register(controller):
-    #print "Registering plugin SchemaEditor"
-    if goocanvas is None:
-        controller.log("Cannot register SchemaEditor: the goocanvas python module does not seem to be available.")
-    else:
-        controller.register_viewclass(SchemaEditor)
-
-class SchemaEditor (AdhocView):
-    view_name = _("Schema Editor")
-    view_id = 'schemaeditor'
-    tooltip=("Graphical editor of Advene schemas")
-    def __init__ (self, controller=None, parameters=None, package=None):
-        super(SchemaEditor, self).__init__(controller=controller)
-        self.close_on_package_load = False
-        self.contextual_actions = (
-            (_("Refresh"), self.refresh),
-            )
-        self.listeSchemas = None
-        self.controller=controller
-        self.TE=None
-        self.hboxEspaceSchema=None
-        self.schemaArea = None
-        self.canvas = None
-        self.hboxButton = None
-        self.canvasX = 1200
-        self.canvasY = 1000
-        self.swX = 0
-        self.swY = 0
-        self.sepV = None
-        self.sepH = None
-        self.openedschemas = {}
-        self.dragging = False
-        self.drag_x = 0
-        self.drag_y = 0
-        self.timer_motion_max=3
-        self.timer_motion=self.timer_motion_max
-        self.drag_coordinates=None
-        self.dfont = 22
-
-        if package is None and controller is not None:
-            package=controller.package
-        self.__package=package
-        self.widget = self.build_widget()
-
-    def build_widget(self):
-        #HPaned containing schema area and Type explorer and Constraint explorer
-        self.hboxEspaceSchema = gtk.HPaned()
-        #   schema area
-        self.schemaArea = self.createSchemaArea()
-        self.openedschemas = []
-        self.hboxEspaceSchema.pack1(self.schemaArea, resize=True)
-
-        vbox=gtk.VBox()
-        #   type explorer
-        self.TE= TypeExplorer(self.controller, self.controller.package)
-
-        # Store (schema, schema title, is_displayed?)
-        store=gtk.ListStore( object, str, bool )
-
-        self.listeSchemas = gtk.TreeView(store)
-
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(_('Schema'), renderer, text=1)
-        column.set_resizable(True)
-
-        self.listeSchemas.append_column(column)
-        renderer = gtk.CellRendererToggle()
-        renderer.set_property('activatable', True)
-
-        def toggled_schema(rend, path, model, col):
-            schema=model[path][0]
-            if schema in self.openedschemas:
-                # Undisplay
-                self.removeSchemaFromArea(schema)
-                model[path][col]=False
-            else:
-                if len(self.openedschemas) >= 4:
-                    self.log("Too many opened schemas")
-                    return True
-                self.openSchema(schema)
-                model[path][col]=True
-            return True
-        renderer.connect('toggled', toggled_schema, store, 2)
-        column = gtk.TreeViewColumn(_('Display'), renderer, active=2)
-        self.listeSchemas.append_column(column)
-        self.listeSchemas.show_all()
-        self.update_list_schemas()
-        vbox.pack_start(self.listeSchemas, expand=False)
-
-        def popup_menu(widget, event):
-            retval = False
-            button = event.button
-            x = int(event.x)
-            y = int(event.y)
-
-            if button == 3:
-                if event.window is widget.get_bin_window():
-                    model = widget.get_model()
-                    t = widget.get_path_at_pos(x, y)
-                    if t is not None:
-                        path, col, cx, cy = t
-                        schema=model[path][0]
-                        widget.get_selection().select_path(path)
-
-                        menu=gtk.Menu()
-
-                        i=gtk.MenuItem(_("Delete"))
-                        i.connect("activate", lambda e: self.delSchema(schema))
-                        menu.append(i)
-
-                        menu.show_all()
-                        menu.popup(None, None, None, button, event.time)
-                        retval = True
-            return retval
-
-        self.listeSchemas.connect('button-press-event', popup_menu)
-
-        vbox.add(self.TE)
-        self.hboxEspaceSchema.pack2(vbox)
-        #self.hboxEspaceSchema.set_position(150)
-        self.hboxEspaceSchema.show_all()
-
-        return self.hboxEspaceSchema
-
-    def createSchemaArea(self):
-        #Constraint explorer
-        hboxConExplorer = gtk.HBox()
-        labelConExplorer = gtk.Label("Constraint Explorer")
-        hboxConExplorer.pack_start(labelConExplorer, expand=False)
-
-        bg_color = gtk.gdk.Color (55000, 55000, 65535, 0)
-        hbox = gtk.HBox (False, 4)
-        #Create the canvas
-        canvas = goocanvas.Canvas()
-        canvas.modify_base (gtk.STATE_NORMAL, bg_color)
-        canvas.set_bounds (0, 0, self.canvasX, self.canvasY)
-        scrolled_win = gtk.ScrolledWindow ()
-        scrolled_win.add(canvas)
-
-        def on_background_scroll(widget, event):
-            zoom=event.state & gtk.gdk.CONTROL_MASK
-            if zoom:
-                # Control+scroll: zoom in/out
-                a = self.zoom_adj
-                incr = -a.step_increment
-            elif (event.state & gtk.gdk.SHIFT_MASK or event.direction in (gtk.gdk.SCROLL_LEFT, gtk.gdk.SCROLL_RIGHT)):
-                # Horizontal scroll
-                a = scrolled_win.get_hadjustment()
-                incr = a.step_increment
-            else:
-                # Vertical scroll
-                a = scrolled_win.get_vadjustment()
-                incr = a.step_increment
-
-            if event.direction == gtk.gdk.SCROLL_DOWN or event.direction == gtk.gdk.SCROLL_RIGHT:
-                val = a.value + incr
-                if val > a.upper - a.page_size:
-                    val = a.upper - a.page_size
-                elif val < a.lower:
-                    val = a.lower
-                if val != a.value:
-                    a.value = val
-            elif event.direction == gtk.gdk.SCROLL_UP or event.direction == gtk.gdk.SCROLL_LEFT:
-                val = a.value - incr
-                if val < a.lower:
-                    val = a.lower
-                elif val > a.upper - a.page_size:
-                    val = a.upper - a.page_size
-                if val != a.value:
-                    a.value = val
-
-            return True
-        canvas.connect('scroll-event', on_background_scroll)
-
-        def on_background_motion(widget, event):
-            if not event.state & gtk.gdk.BUTTON1_MASK:
-                return False
-            if self.dragging:
-                return False
-            if not self.drag_coordinates:
-                self.drag_coordinates=(event.x_root, event.y_root)
-                return False
-            x, y = self.drag_coordinates
-            wa = widget.get_allocation()
-            a=scrolled_win.get_hadjustment()
-            v=a.value + x - event.x_root
-            if v > a.lower and v+wa.width < a.upper:
-                a.value=v
-            a=scrolled_win.get_vadjustment()
-            v=a.value + y - event.y_root
-            if v > a.lower and v+wa.height < a.upper:
-                a.value=v
-
-            self.drag_coordinates= (event.x_root, event.y_root)
-            return False
-        canvas.connect('motion-notify-event', on_background_motion)
-
-        self.canvas = canvas
-
-        #Zoom
-        w = gtk.Label ("Zoom:")
-        hbox.pack_start (w, False, False, 0)
-        self.zoom_adj = gtk.Adjustment(1, 0.2, 2, 0.1, 0.5)
-        self.zoom_adj.connect('value-changed', self.zoom_changed, canvas)
-        w = gtk.SpinButton (self.zoom_adj, 0.0, 2)
-        w.set_size_request (50, -1)
-        hbox.pack_start (w, False, False, 0)
-        w = gtk.Button('A+')
-        w.connect('clicked', self.font_up_clicked, canvas)
-        hbox.pack_start (w, False, False, 0)
-        w = gtk.Button('A-')
-        w.connect('clicked', self.font_down_clicked, canvas)
-        hbox.pack_start (w, False, False, 0)
-
-        rotButton=get_pixmap_button('rotate.png', self.rotateSchemaAreas)
-        rotButton.set_no_show_all(True)
-        exchButton=get_pixmap_button('exchange.png', self.exchangeSchemaAreas)
-        exchButton.set_no_show_all(True)
-        hbox.pack_start(rotButton, False, False, 4)
-        hbox.pack_start(exchButton, False, False, 4)
-        self.hboxButton = hbox
-
-        canvas.connect('size-allocate', self.sw_resize, self.zoom_adj)
-
-        #schemaArea
-        schemaArea = gtk.VBox(False, 4)
-        schemaArea.set_border_width(4)
-        schemaArea.pack_start (hbox, False, False, 0)
-        schemaArea.pack_start (gtk.VSeparator(), expand=False)
-        schemaArea.pack_start(scrolled_win, True, True, 0)
-        schemaArea.pack_start(gtk.HSeparator(), expand=False)
-        schemaArea.pack_start(hboxConExplorer, expand=False)
-
-        return schemaArea
-
-    def font_up_clicked(self, w, canvas):
-        root = canvas.get_root_item ()
-        for i in range(0, root.get_n_children()):
-            if hasattr(root.get_child(i), 'type') and root.get_child(i).text:
-                fontsize = root.get_child(i).fontsize
-                self.dfont = root.get_child(i).fontsize = fontsize+3
-                root.get_child(i).text.props.font="Sans Bold %s" % str(self.dfont)
-        for i in self.findSchemaTitles(canvas):
-            i.props.font = "Sans Bold %s" % str(self.dfont)
-        return
-
-    def font_down_clicked(self, w, canvas):
-        root = canvas.get_root_item ()
-        for i in range(0, root.get_n_children()):
-            if hasattr(root.get_child(i), 'type') and root.get_child(i).text:
-                fontsize = root.get_child(i).fontsize
-                self.dfont = root.get_child(i).fontsize = fontsize-3
-                if fontsize >3:
-                    root.get_child(i).text.props.font="Sans Bold %s" % str(self.dfont)
-        for i in self.findSchemaTitles(canvas):
-            i.props.font = "Sans Bold %s" % str(self.dfont)
-        return
-
-    def sw_resize(self, w, size, adj):
-        #print adj.get_value()
-        self.swX = size.width
-        self.swY = size.height
-        self.canvasX=size.width*4
-        self.canvasY=size.height*4
-        self.canvas.set_bounds(0, 0, self.canvasX, self.canvasY)
-        self.setup_canvas()
-        #print self.canvas.get_bounds()
-        #print "%s %s" % (size.width, size.height)
-
-###
-#
-# Functions to update the gui when an event occurs
-#
-###
-
-    def update_model(self, package):
-        self.update_list_schemas()
-        self.openedschemas=[]
-        self.setup_canvas()
-        return True
-
-    def update_schema(self, schema=None, event=None):
-        self.update_list_schemas()
-        if schema in self.openedschemas:
-            self.setup_canvas()
-        return True
-
-    def update_relation(self, relation=None, event=None):
-        if event == 'RelationCreate' or event == 'RelationDelete':
-            rt = relation.getType()
-            sc = rt.getSchema()
-            if sc in self.openedschemas:
-                rtg = self.findRelationTypeGroup(rt.getId(),self.canvas)
-                rtg.update()
-        return True
-
-    def update_annotation (self, annotation=None, event=None):
-        if event == 'AnnotationCreate' or event == 'AnnotationDelete':
-            at = annotation.getType()
-            sc = at.getSchema()
-            if sc in self.openedschemas:
-                atg = self.findAnnotationTypeGroup(at.getId(),self.canvas)
-                atg.update()
-        return True
-
-    def update_annotationtype(self, annotationtype=None, event=None):
-        schema = annotationtype.getSchema()
-        if schema in self.openedschemas:
-            if event == 'AnnotationTypeCreate':
-                atg = self.findAnnotationTypeGroup(annotationtype.getId(),self.canvas)
-                if atg is None:
-                    self.addAnnotationTypeGroup(canvas=self.canvas, schema=schema, type=annotationtype)
-            elif event == 'AnnotationTypeDelete':
-                atg = self.findAnnotationTypeGroup(annotationtype.getId(),self.canvas)
-                if atg is not None:
-                    atg.remove_drawing_only()
-                if self.TE is not None and self.TE.type == annotationtype:
-                    self.TE.initWithType(None)
-            elif event == 'AnnotationTypeEditEnd':
-                atg = self.findAnnotationTypeGroup(annotationtype.getId(),self.canvas)
-                if atg is not None:
-                    atg.update()
-                if self.TE is not None and self.TE.type == annotationtype:
-                    self.TE.initWithType(annotationtype)
-        return True
-
-    def update_relationtype(self, relationtype=None, event=None):
-        schema = relationtype.getSchema()
-        if schema in self.openedschemas:
-            if event == 'RelationTypeCreate':
-                rtg = self.findRelationTypeGroup(relationtype.getId(),self.canvas)
-                if rtg is None:
-                    self.addRelationTypeGroup(canvas=self.canvas, schema=schema, type=relationtype)
-            elif event == 'RelationTypeDelete':
-                rtg = self.findRelationTypeGroup(relationtype.getId(),self.canvas)
-                if rtg is not None:
-                    rtg.remove_drawing_only()
-                if self.TE is not None and self.TE.type == relationtype:
-                    self.TE.initWithType(None)
-            elif event == 'RelationTypeEditEnd':
-                rtg = self.findRelationTypeGroup(relationtype.getId(),self.canvas)
-                if rtg is not None:
-                    rtg.update()
-                if self.TE is not None and self.TE.type == relationtype:
-                    self.TE.initWithType(relationtype)
-        return True
-
-    def refresh(self, *p):
-        self.update_model(None)
-        return True
-
-    def update_list_schemas(self):
-        store=self.listeSchemas.get_model()
-        store.clear()
-        for s in self.controller.package.schemas:
-            store.append( [ s, self.controller.get_title(s), s in self.openedschemas ] )
-
-##
-#
-#   Functions to create and delete elements
-#
-##
-
-    def newSchema(self, w):
-        cr = CreateElementPopup(type_=Schema,
-                                    parent=self.controller.package,
-                                    controller=self.controller)
-        schema=cr.popup(modal=True)
-        if schema:
-            self.update_list_schemas()
-            self.openSchema(schema)
-
-    def delSchema(self, sc):
-        tsc = sc.title
-        if (sc is None):
-            return False
-        if dialog.message_dialog(label="Voulez-vous effacer le schema %s ?" % tsc, icon=gtk.MESSAGE_QUESTION, callback=None):
-            if sc in self.openedschemas:
-                self.removeSchemaFromArea(sc)
-            self.controller.delete_element(sc)
-            self.update_list_schemas()
-            return True
-        else:
-            return False
-
-    def openSchema(self, schema):
-        if (schema is None):
-            print "Error opening schema : None"
-            return
-        if len(self.openedschemas)>=4:
-            print "too many schemas opened, 4 max."
-            return
-        if schema not in self.openedschemas:
-            self.addSchemaToArea(schema)
-        else:
-            print "schema already opened"
-        return
-
-    def addSchemaToArea(self, schema):
-        self.openedschemas.append(schema)
-        self.setup_canvas()
-        return
-
-    def removeSchemaFromArea(self, schema):
-        self.openedschemas.remove(schema)
-        self.setup_canvas()
-        return
-
-    def rotateSchemaAreas(self, w):
-        temp=self.openedschemas.pop()
-        self.openedschemas.insert(0,temp)
-        self.setup_canvas()
-
-    def exchangeSchemaAreas(self, w):
-        t1 =self.openedschemas[0]
-        self.openedschemas[0]=self.openedschemas[1]
-        self.openedschemas[1]=t1
-        self.setup_canvas()
-        #print "Exchanged %s and %s" % (self.openedschemas[0].title, self.openedschemas[1].title)
-
-    def addTransformButtons(self, nb_schemas):
-        if nb_schemas < 3:
-            self.hboxButton.foreach(lambda w: w.hide())
-            self.hboxButton.show_all()
-        else:
-            self.hboxButton.foreach(lambda w: w.show())
-
-    def setup_canvas (self):
-        root = self.canvas.get_root_item ()
-        root.connect('button-press-event', self.on_background_button_press)
-        root.connect('button-release-event', self.on_background_button_release)
-        #deleting old drawing
-        while root.get_n_children()>0:
-            root.remove_child (0)
-
-        size = len(self.openedschemas)
-        self.sepV = None
-        self.sepH = None
-        # add buttons to rotate and change schemas place
-        self.addTransformButtons(size)
-        if size<=0:
-            #print "No schema to draw"
-            return
-        if size>4:
-            print "More than 4 schema, fixme!!!"
-            return
-        if size==1:
-            schema = self.openedschemas[0]
-            self.draw_schema_annots(self.canvas, schema, 20, 60, self.canvasX, self.canvasY)
-        if size==2:
-            # vertical separation between the 2 schemas
-            self.draw_schema_annots(self.canvas, self.openedschemas[0], 20, 60, self.canvasX/2, self.canvasY)
-            p = goocanvas.Points ([(self.canvasX/2, 0), (self.canvasX/2, self.canvasY)])
-            self.sepV = goocanvas.Polyline (parent = root,
-                                        close_path = False,
-                                        points = p,
-                                        stroke_color = "black",
-                                        line_width = 6.0,
-                                        start_arrow = False,
-                                        end_arrow = False
-                                        )
-            self.draw_schema_annots(self.canvas, self.openedschemas[1], 20+self.canvasX/2, 60, self.canvasX, self.canvasY)
-        if size==3:
-            # 1+1/1
-            self.draw_schema_annots(self.canvas, self.openedschemas[0], 20, 60, self.canvasX/2, self.canvasY/2)
-            p = goocanvas.Points ([(self.canvasX/2, 0), (self.canvasX/2, self.canvasY/2)])
-            self.sepV = goocanvas.Polyline (parent = root,
-                                        close_path = False,
-                                        points = p,
-                                        stroke_color = "black",
-                                        line_width = 6.0,
-                                        start_arrow = False,
-                                        end_arrow = False
-                                        )
-            self.draw_schema_annots(self.canvas, self.openedschemas[1], 20+self.canvasX/2, 60, self.canvasX, self.canvasY/2)
-            p = goocanvas.Points ([(0, self.canvasY/2), (self.canvasX, self.canvasY/2)])
-            self.sepH = goocanvas.Polyline (parent = root,
-                                        close_path = False,
-                                        points = p,
-                                        stroke_color = "black",
-                                        line_width = 6.0,
-                                        start_arrow = False,
-                                        end_arrow = False
-                                        )
-            self.draw_schema_annots(self.canvas, self.openedschemas[2], 20, 60+self.canvasY/2, self.canvasX, self.canvasY)
-        if size==4:
-            self.draw_schema_annots(self.canvas, self.openedschemas[0], 20, 60, self.canvasX/2, self.canvasY/2)
-            p = goocanvas.Points ([(self.canvasX/2, 0), (self.canvasX/2, self.canvasY)])
-            self.sepV = goocanvas.Polyline (parent = root,
-                                        close_path = False,
-                                        points = p,
-                                        stroke_color = "black",
-                                        line_width = 6.0,
-                                        start_arrow = False,
-                                        end_arrow = False
-                                        )
-            self.draw_schema_annots(self.canvas, self.openedschemas[1], 20+self.canvasX/2, 60, self.canvasX, self.canvasY/2)
-            self.draw_schema_annots(self.canvas, self.openedschemas[3], 20, 60+self.canvasY/2, self.canvasX/2, self.canvasY)
-            p = goocanvas.Points ([(0, self.canvasY/2), (self.canvasX, self.canvasY/2)])
-            self.sepH = goocanvas.Polyline (parent = root,
-                                        close_path = False,
-                                        points = p,
-                                        stroke_color = "black",
-                                        line_width = 6.0,
-                                        start_arrow = False,
-                                        end_arrow = False
-                                        )
-            self.draw_schema_annots(self.canvas, self.openedschemas[2], 20+self.canvasX/2, 60+self.canvasY/2, self.canvasX, self.canvasY)
-        self.draw_schemas_rels(self.canvas, self.openedschemas)
-
-
-    def draw_schemas_rels(self, canvas, schemas):
-        r=0
-        for sc in schemas:
-            relTypes = sc.getRelationTypes()
-            for j in relTypes:
-                self.addRelationTypeGroup(canvas, sc, j.getTitle(), j)
-                r=r+1
-        #print "%s RelationTypes drawn" % r
-
-    def draw_schema_annots(self, canvas, schema, xoffset, yoffset, xmax, ymax):
-        self.addSchemaTitle(canvas, schema, xoffset+(xmax-xoffset)/2, yoffset+(ymax-yoffset)/2)
-        annotTypes = schema.getAnnotationTypes()
-        a=0
-        b=0
-        an=0
-        for i in annotTypes:
-            x = xoffset+b*300
-            y = yoffset+a*80
-            self.addAnnotationTypeGroup(canvas, schema, i.getTitle(), i, x, y)
-            an=an+1
-            if x+600<xmax:
-                b=b+1
-            elif y+160<ymax:
-                b=0
-                a=a+1
-        #print "%s AnnotationTypes drawn" % an
-        return
-
-    def addSchemaTitle(self, canvas, schema, xx, yy):
-        color = self.controller.get_element_color(schema)
-        goocanvas.Text (parent = canvas.get_root_item (),
-                                        text = schema.title,
-                                        x = xx,
-                                        y = yy,
-                                        fill_color = color,
-                                        width = -1,
-                                        anchor = gtk.ANCHOR_CENTER,
-                                        font = "Sans Bold %s" % str(self.dfont))
-
-    def findSchemaTitles(self, canvas, schema=None):
-        res = []
-        root = canvas.get_root_item ()
-        for i in range(0, root.get_n_children()):
-            if isinstance(root.get_child(i), goocanvas.Text):
-                if schema is None or schema.title == root.get_child(i).props.text:
-                    res.append(root.get_child(i))
-        return res
-
-###
-#
-#  Functions to add remove modify RelationTypesGroup and redraw them when moving AnnotationTypeGroup
-#
-###
-    def addRelationTypeGroup(self, canvas, schema, name=" ", type=None, members=[]):
-        if schema is None:
-            return
-        cvgroup = RelationTypeGroup(self.controller, canvas, schema, name, type, members, self.dfont)
-        if cvgroup is not None:
-            self.setup_rel_signals (cvgroup)
-            #self.drawFocusOn(cvgroup)
-            #self.TE.initWithType(cvgroup.type)
-        return cvgroup
-
-    def findRelationTypeGroup(self, typeId, canvas):
-        #Find relationGroup from type id
-        root = canvas.get_root_item ()
-        for i in range(0, root.get_n_children()):
-            if hasattr(root.get_child(i), 'type') and root.get_child(i).type.id== typeId:
-                return root.get_child(i)
-        return None
-
-    def findAnnotationTypeGroup(self, typeId, canvas):
-        root = canvas.get_root_item ()
-        for i in range(0, root.get_n_children()):
-            if hasattr(root.get_child(i), 'type') and root.get_child(i).type.id == typeId:
-                return root.get_child(i)
-        return None
-
-    def rel_redraw(self, rtg):
-        rtg.redraw()
-
-    def removeRelationTypeGroup(self, group):
-        group.remove()
-
-###
-#
-#  Functions to add remove modify AnnotationTypesGroup
-#
-###
-
-    def addAnnotationTypeGroup(self, canvas, schema, name=" ", type=None, rx =None, ry=None):
-        if schema is None:
-            return
-        part = self.openedschemas.index(schema)
-        if rx is None or ry is None:
-            if part == 0:
-                rx = 20
-                ry = 60
-            if part == 1:
-                rx = self.sepV.get_bounds().x2 + 20
-                ry = 60
-            if (part == 2 and len(self.openedschemas)==3) or part == 3:
-                rx = 20
-                ry = self.sepH.get_bounds().y2 + 60
-            if part == 2 and len(self.openedschemas)==4:
-                rx = self.sepV.get_bounds().x2 + 20
-                ry = self.sepH.get_bounds().y2 + 60
-        cvgroup = AnnotationTypeGroup(self.controller, canvas, schema, name, type, rx, ry, self.dfont)
-        if cvgroup is not None:
-            self.setup_annot_signals(cvgroup, schema)
-            self.drawFocusOn(cvgroup.rect)
-            self.TE.initWithType(cvgroup.type)
-            #self.widget.set_focus(self.TE.TName)
-        return cvgroup
-
-
-    def removeAnnotationTypeGroup(self, group, schema):
-        group.remove()
-        ### FIXME : delete relation types based on this annotation type in other schemas
-
-    def create_view_based_on(self, model_obj):
-        id_= model_obj.id+'_view'
-        title_= model_obj.title+' view'
-        if self.controller.package._idgenerator.exists(id_):
-            #on remplace le contenu
-            print 'pas encore fait'
-        else:
-            self.controller.package._idgenerator.add(id_)
-            el=self.controller.package.createView(
-                ident=id_,
-                author=config.data.userid,
-                date=self.controller.get_timestamp(),
-                clazz=self.controller.package.viewableClass,
-                content_mimetype='text/html',
-                )
-            el.title=title_
-            # contenu a adapter
-            el.content.data=u'<h1>test</h1>'
-            if isinstance(model_obj, Schema):
-                el.content.data=u'<h1>Schema %s</h1>\n' % model_obj.title
-                el.content.data += u'<p>Containing the following Annotation Types:</p>\n<ul>\n'
-                for at in model_obj.annotationTypes:
-                    el.content.data += u'<li>%s (%s)</li>\n' % (at, len(at.annotations))
-                el.content.data += u'</ul><p>And the following Relation Types:</p>\n<ul>\n'
-                for rt in model_obj.relationTypes:
-                    el.content.data += u'<li>%s (%s)</li>\n' % (rt, len(rt.relations))
-                el.content.data += u'</ul>\n'
-            # elif isinstance(model_obj, AnnotationType):
-            # elif isinstance(model_obj, RelationType):
-            self.controller.package.views.append(el)
-            self.controller.notify('ViewCreate', view=el)
-
-        print id_
-###
-#
-#  Functions to handle notification signals
-#
-###
-
-    def setup_rel_signals (self, item):
-        #pour capter les events sur les relations du dessin
-        #item.connect ("motion_notify_event", self.rel_on_motion_notify)
-        item.connect ('button-press-event', self.rel_on_button_press)
-        item.connect ('button-release-event', self.rel_on_button_release)
-
-
-    def setup_annot_signals (self, item, schema):
-        #pour capter les events sur les annotations du dessin
-        item.connect ('motion-notify-event', self.annot_on_motion_notify)
-        item.connect ('button-press-event', self.annot_on_button_press, schema)
-        item.connect ('button-release-event', self.annot_on_button_release)
-
-
-    def rel_on_button_press (self, item, target, event):
-        self.TE.initWithType(item.type)
-        self.drawFocusOn(item.line)
-        if event.button == 1:
-            if event.type == gtk.gdk._2BUTTON_PRESS:
-                self.controller.gui.open_adhoc_view('generictable', elements=item.type.relations)
-                canvas = item.get_canvas ()
-                canvas.pointer_ungrab (item, event.time)
-                self.dragging = False
-                return True
-            self.drag_x = event.x
-            self.drag_y = event.y
-            fleur = gtk.gdk.Cursor (gtk.gdk.FLEUR)
-            canvas = item.get_canvas ()
-            canvas.pointer_grab (item,
-                                gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.BUTTON_RELEASE_MASK,
-                                fleur,
-                                event.time)
-            self.dragging = True
-        elif event.button == 3:
-            def menuRem(w, item):
-                self.removeRelationTypeGroup(item)
-                return True
-            def menuView(w, item):
-                self.create_view_based_on(item.type)
-
-            m=advene.gui.popup.Menu(element=item.type, controller=self.controller)
-            menu=m.menu
-
-            itemM = gtk.MenuItem(_("Remove relation type"))
-            itemM.connect('activate', menuRem, item )
-            menu.insert(itemM, 1)
-            itemM = gtk.MenuItem(_("Create HTML view"))
-            itemM.connect('activate', menuView, item )
-            menu.insert(itemM, 1)
-            menu.show_all()
-            m.popup()
-        return True
-
-    def rel_on_button_release (self, item, target, event):
-        canvas = item.get_canvas ()
-        canvas.pointer_ungrab (item, event.time)
-        self.dragging = False
-
-###
-#
-#  events on annotationTypeGroup
-#
-###
-
-    def annot_on_motion_notify (self, item, target, event):
-        if (self.dragging == True) and (event.state & gtk.gdk.BUTTON1_MASK):
-            new_x = event.x
-            new_y = event.y
-            item.translate (new_x - self.drag_x, new_y - self.drag_y)
-            # Hack not to redraw at every step
-            self.timer_motion= self.timer_motion-1
-            if self.timer_motion<=0:
-                self.timer_motion=self.timer_motion_max
-                for rtg in item.rels:
-                    self.rel_redraw(rtg)
-        return True
-
-    def annot_on_button_press (self, item, target, event, schema):
-        self.TE.initWithType(item.type)
-        self.drawFocusOn(item.rect)
-        if event.button == 1:
-            if event.type == gtk.gdk._2BUTTON_PRESS:
-                self.controller.gui.open_adhoc_view('table', elements=item.type.annotations)
-                canvas = item.get_canvas ()
-                canvas.pointer_ungrab (item, event.time)
-                self.dragging = False
-                return True
-            self.drag_x = event.x
-            self.drag_y = event.y
-            self.orig_x = item.rect.get_bounds().x1
-            self.orig_y = item.rect.get_bounds().y1
-            self.timer_motion=self.timer_motion_max
-            fleur = gtk.gdk.Cursor (gtk.gdk.FLEUR)
-            canvas = item.get_canvas ()
-            canvas.pointer_grab (item,
-                                    gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.BUTTON_RELEASE_MASK,
-                                    fleur,
-                                    event.time)
-            self.dragging = True
-        elif event.button == 3:
-            def menuRem(w, item, schema):
-                self.removeAnnotationTypeGroup(item, schema)
-                return True
-            def menuNew(w, item, schema, member2):
-                mem = []
-                mem.append(item.type)
-                mem.append(member2)
-                self.addRelationTypeGroup(item.get_canvas(), schema, members=mem)
-                return True
-            m=advene.gui.popup.Menu(element=item.type, controller=self.controller)
-            menu=m.menu
-            menu.insert(gtk.SeparatorMenuItem(), 1)
-            itemM = gtk.MenuItem(_("Remove annotation type"))
-            itemM.connect('activate', menuRem, item, schema )
-            menu.insert(itemM, 2)
-            itemM = gtk.MenuItem(_("Create relation type between this one and..."))
-            ssmenu = gtk.Menu()
-            itemM.set_submenu(ssmenu)
-            for s in self.controller.package.getSchemas():
-                sssmenu = gtk.Menu()
-                itemSM = gtk.MenuItem(s.title)
-                itemSM.set_submenu(sssmenu)
-                for a in s.getAnnotationTypes():
-                    itemSSM = gtk.MenuItem(a.title)
-                    itemSSM.connect('activate', menuNew, item, schema, a )
-                    sssmenu.append(itemSSM)
-                ssmenu.append(itemSM)
-            menu.insert(itemM, 3)
-            menu.show_all()
-            m.popup()
-        return True
-
-    def findGroupFromXY(self,x,y):
-        root = self.canvas.get_root_item ()
-        for i in range(0, root.get_n_children()):
-            if hasattr(root.get_child(i), 'rect'):
-                x1 = root.get_child(i).get_bounds().x1
-                x2 = root.get_child(i).get_bounds().x2
-                y1 = root.get_child(i).get_bounds().y1
-                y2 = root.get_child(i).get_bounds().y2
-                if x>x1 and x<x2 and y>y1 and y<y2:
-                    return root.get_child(i)
-        return None
-
-    def annot_on_button_release (self, item, target, event):
-        canvas = item.get_canvas ()
-        canvas.pointer_ungrab (item, event.time)
-        self.dragging = False
-        if (event.state & gtk.gdk.CONTROL_MASK):
-            dropObj = self.findGroupFromXY(item.get_bounds().x1,
-                                            item.get_bounds().y1)
-            x = item.rect.get_bounds().x1
-            y = item.rect.get_bounds().y1
-            item.translate (self.orig_x - x, self.orig_y - y)
-            # HACK : to avoid to redraw relations before the item goes back to origin
-            while item.get_bounds().x1 != self.orig_x and item.get_bounds().y1 != self.orig_y:
-                pass
-            if dropObj is not None and dropObj.type is not None:
-                #print "creating relation between %s and %s" % (item.type, dropObj.type)
-                self.addRelationTypeGroup(self.canvas, item.type.getSchema(), name="New Relation", type=None, members=[item.type,dropObj.type])
-
-        # TODO
-        # events drag & drop non implemantes pour goocanvas.group
-        # drag-motion : on arrive dessus
-        # drag-leave : on en part
-        # drag-data-received quand on lache sur un objet
-        # ...
-        else:
-            x = item.rect.get_bounds().x1
-            y = item.rect.get_bounds().y1
-            newsc = self.findSchemaFromXY(x, y)
-            oldsc = item.type.getSchema()
-            if oldsc != newsc:
-                #if (dialog.message_dialog(label="Do you want to move %s to the %s schema ?" % (item.type.title, newsc.title), icon=gtk.MESSAGE_QUESTION, callback=None)):
-                # gerer si des types de relation sont accroches
-                #    print "todo"
-                #    oldsc.annotationTypes.remove(item.type)
-                #    newsc.annotationTypes.append(item.type)
-                #    item.type.setSchema(newsc)
-                #    self.controller.notify("SchemaEditEnd",schema=oldsc,comment="AnnotationType removed")
-                #    self.controller.notify("SchemaEditEnd",schema=newsc,comment="AnnotationType added")
-                #    self.controller.notify("AnnotationTypeEditEnd",annotationtype=item.type,comment="Schema changed")
-                # notify
-                # __parent apparemment en lecture seule,
-                # si on ne peut pas, oblige de supprimer le type
-                # et en creer un nouveau
-                #else:
-                item.translate (self.orig_x - x, self.orig_y - y)
-                    # HACK : to avoid to redraw relations before the item goes back to origin
-                while item.get_bounds().x1 != self.orig_x and item.get_bounds().y1 != self.orig_y:
-                    pass
-        # Relations redraw
-        for rtg in item.rels:
-            self.rel_redraw(rtg)
-
-###
-#
-#  events on background
-#
-###
-
-    def findSchemaFromXY(self, x, y):
-        size=len(self.openedschemas)
-        if size<=0 or size>4:
-            return None
-        if size==1:
-            return self.openedschemas[0]
-        if size==2:
-            if x>self.sepV.get_bounds().x2:
-                return self.openedschemas[1]
-            return self.openedschemas[0]
-        if size==3:
-            if y>self.sepH.get_bounds().y2:
-                return self.openedschemas[2]
-            if x>self.sepV.get_bounds().x2:
-                return self.openedschemas[1]
-            return self.openedschemas[0]
-        if size==4:
-            #
-            #       1  |  2
-            #       ___|___
-            #          |
-            #       4  |  3
-            #
-            if x>self.sepV.get_bounds().x2 and y>self.sepH.get_bounds().y2:
-                return self.openedschemas[2]
-            if x>self.sepV.get_bounds().x2 and y<self.sepH.get_bounds().y1:
-                return self.openedschemas[1]
-            if x<self.sepV.get_bounds().x1 and y >self.sepH.get_bounds().y2:
-                return self.openedschemas[3]
-            return self.openedschemas[0]
-        return None
-
-    def on_background_button_release(self, item, widget, event):
-        if event.button == 1:
-            self.drag_coordinates=None
-        return False
-
-    def on_background_button_press (self, item, target, event):
-        if event.button != 3:
-            return False
-
-        self.TE.initWithType(None)
-        openedschema = True
-        if len(self.openedschemas)<=0:
-            openedschema=False
-        canvas = item.get_canvas()
-        self.drawFocusOn(canvas)
-        schema = self.findSchemaFromXY(event.x, event.y)
-        menu = gtk.Menu()
-        itemM = gtk.MenuItem(_("New schema"))
-        itemM.connect("activate", self.newSchema )
-        menu.append(itemM)
-        if openedschema:
-            def newRel(w, canvas, schema):
-                self.addRelationTypeGroup(canvas, schema)
-                return True
-            def newAnn(w, canvas, schema, x, y):
-                self.addAnnotationTypeGroup(canvas, schema, rx=x, ry=y)
-                return True
-            def pick_color(w, schema):
-                self.controller.gui.update_color(schema)
-            def hide(w, schema):
-                self.removeSchemaFromArea(schema)
-            def menuView(w, schema):
-                self.create_view_based_on(schema)
-            itemM = gtk.MenuItem(_("Select a color"))
-            itemM.connect('activate', pick_color, schema)
-            menu.append(itemM)
-            itemM = gtk.MenuItem(_("New annotation type"))
-            itemM.connect('activate', newAnn, canvas, schema, event.x, event.y )
-            menu.append(itemM)
-            itemM = gtk.MenuItem(_("New relation type"))
-            itemM.connect('activate', newRel, canvas, schema )
-            menu.append(itemM)
-            itemM = gtk.MenuItem(_("Hide this schema"))
-            itemM.connect('activate', hide, schema )
-            menu.append(itemM)
-            itemM = gtk.MenuItem(_("Create HTML view"))
-            itemM.connect('activate', menuView, schema )
-            menu.append(itemM)
-            itemM = gtk.MenuItem(_("Export drawing to pdf"))
-            itemM.connect('activate', self.export_to_pdf, canvas)
-            menu.append(itemM)
-        #itemM = gtk.MenuItem(_("Move annotation type from Schema..."))
-        #itemM.connect("activate", menuMove, canvas )
-        #menu.append(itemM)
-        menu.show_all()
-        menu.popup(None, None, None, 0, gtk.get_current_event_time())
-        return True
-
-    def drawFocusOn(self, item):
-        #print "focus on %s" % item
-        canvas=None
-        if isinstance(item, goocanvas.Canvas):
-            canvas=item
-        else:
-            canvas = item.get_canvas()
-            item.props.line_width = 4.0
-
-        root = canvas.get_root_item()
-
-        for i in range(root.get_n_children()):
-            if hasattr(root.get_child(i), 'rect'):
-                ite=root.get_child(i).rect
-            elif hasattr(root.get_child(i), 'line'):
-                ite=root.get_child(i).line
-            else:
-                ite=None
-            if ite is not None and ite != item:
-                ite.props.line_width = 2.0
-
-    def zoom_changed (self, adj, canvas):
-        canvas.set_scale (adj.get_value()/4)
-
-
-
-    def export_to_pdf (self, w, canvas):
-
-        nompdf = config.data.path['settings']
-        for sc in self.openedschemas:
-            nompdf += sc.id + '_'
-        nompdf += u'.pdf'
-        name=dialog.get_filename(title=_("Choose a filename to export the schema as PDF"),
-                                 action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                 button=gtk.STOCK_SAVE,
-                                 default_file=nompdf,
-                                 filter='any')
-        if name is None:
-            return
-        surface = cairo.PDFSurface (name, self.canvasX, self.canvasY)
-        cr = cairo.Context (surface)
-        #cr.translate (20, 130)
-        #if we want to export only 1/4 schema, we need to change X, Y and translate the frame to the middle of the screen
-        canvas.render (cr, None, 1.0)
-        cr.show_page ()
-        dialog.message_dialog(u"%s exported" % name)
-
-### Type Explorer class
-class TypeExplorer (gtk.ScrolledWindow):
-    def __init__ (self, controller=None, package=None):
-        gtk.ScrolledWindow.__init__(self)
-        self.controller=controller
-        self.type=None
-        if package is None and controller is not None:
-            package=controller.package
-        vbox=gtk.VBox()
-        hboxNom = gtk.HBox()
-        labelNom = gtk.Label("Title : ")
-        entryNom = gtk.Entry()
-        self.TName = entryNom
-        hboxNom.pack_start(labelNom)
-        hboxNom.pack_start(entryNom)
-        hboxAddAtt = gtk.HBox()
-        labelAddAtt = gtk.Label("Add attribute")
-        boutonAddAtt = gtk.Button("Add")
-        boutonAddAtt.connect('clicked', self.addAttributeSpace )
-        hboxAddAtt.pack_start(labelAddAtt)
-        hboxAddAtt.pack_start(boutonAddAtt)
-        hboxMime = gtk.HBox()
-        labelMime = gtk.Label("Mime Type : ")
-        self.TMimeType = dialog.list_selector_widget(
-            members=[ ('text/plain', _("Plain text content")),
-                              ('application/x-advene-structured', _("Simple-structured content")),
-                              ('image/svg+xml', _("SVG graphics content")),
-                              ])
-        # a remplacer par la selection de type Mime
-        hboxMime.pack_start(labelMime)
-        hboxMime.pack_start(self.TMimeType)
-        hboxColor = gtk.HBox()
-        self.bcol = gtk.ColorButton()
-        self.bcol.set_use_alpha(False)
-        self.bcol.connect('color-set', self.colorChange)
-        self.entryCol = gtk.Entry()
-        self.entryCol.connect('changed', self.colorTextChange)
-        hboxColor.pack_start(self.bcol)
-        hboxColor.pack_start(self.entryCol)
-        hboxDesc = gtk.HBox()
-        labelDesc = gtk.Label("Description : ")
-        entryDesc = gtk.Entry()
-        self.TDesc = entryDesc
-        hboxDesc. pack_start(labelDesc)
-        hboxDesc. pack_start(entryDesc)
-        hboxId = gtk.HBox()
-        labelId1 = gtk.Label("Id :")
-        labelId2 = gtk.Label("")
-        self.TId = labelId2
-        hboxId.pack_start(labelId1)
-        hboxId.pack_start(labelId2)
-        labelAtt = gtk.Label("Attributes : ")
-        labelTypeExplorer = gtk.Label("Type Explorer")
-        espaceAtt = gtk.VBox()
-        self.TAttsSpace = espaceAtt
-        self.TAtts = []
-        espaceBoutons = gtk.HBox()
-        self.boutonSave = gtk.Button("Save")
-        self.boutonSave.connect('clicked', self.saveType)
-        self.boutonCancel = gtk.Button("Cancel")
-        self.boutonCancel.connect('clicked', self.cancelType )
-        espaceBoutons.pack_end(self.boutonCancel, expand=False, fill=False)
-        espaceBoutons.pack_end(self.boutonSave, expand=False, fill=False)
-        vbox.pack_start(labelTypeExplorer, expand=False)
-        vbox.pack_start(gtk.HSeparator(), expand=False)
-        vbox.pack_start(hboxId, expand=False)
-        vbox.pack_start(gtk.HSeparator(), expand=False)
-        vbox.pack_start(hboxNom, expand=False)
-        vbox.pack_start(gtk.HSeparator(), expand=False)
-        vbox.pack_start(hboxMime, expand=False, fill=False)
-        vbox.pack_start(gtk.HSeparator(), expand=False)
-        vbox.pack_start(hboxColor, expand=False, fill=False)
-        vbox.pack_start(gtk.HSeparator(), expand=False)
-        #vbox.pack_start(hboxAddAtt, expand=False, fill=False)
-        #vbox.pack_start(gtk.HSeparator(), expand=False)
-        #vbox.pack_start(labelAtt, expand=False, fill=False)
-        #vbox.pack_start(espaceAtt, expand=False, fill=False)
-        #vbox.pack_start(gtk.HSeparator(), expand=False)
-        vbox.pack_start(espaceBoutons, expand=False, fill=False)
-        self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-        self.add_with_viewport(vbox)
-        self.initWithType(None)
-
-
-    def colorTextChange(self, w):
-        col = unicode(self.entryCol.get_text())
-        color=name2color(col)
-        if color is not None:
-            self.bcol.set_color(color)
-
-    def colorChange(self, but):
-        col=self.bcol.get_color()
-        self.entryCol.set_text("#%04x%04x%04x" % (col.red, col.green, col.blue))
-
-    def refresh(self, *p):
-        return True
-
-    def setTypeDesc(self, desc=""):
-        if desc is None:
-            return False
-        self.TDesc.set_text(desc)
-        return True
-
-    def getTypeDesc(self):
-        return unicode(self.TDesc.get_text())
-
-    def setTypeColor(self, v):
-        if v is None :
-            v="#000000000000"
-        try:
-            gtk_color=name2color(v)
-            self.bcol.set_color(gtk_color)
-        except:
-            print "exception in color change"
-            pass
-        col=self.bcol.get_color()
-        self.entryCol.set_text("#%04x%04x%04x" % (col.red, col.green, col.blue))
-        return True
-
-    def getTypeColor(self):
-        return self.bcol.get_color()
-
-    def getTypeId(self):
-        return unicode(self.TId.get_text())
-
-    def setTypeId(self, name=""):
-        if (name is None):
-            return False
-        self.TId.set_text(name)
-        return True
-
-    def getTypeName(self):
-        return unicode(self.TName.get_text())
-
-    def setTypeName(self, name=""):
-        if (name is None):
-            return False
-        self.TName.set_text(name)
-        return True
-
-    def getMimeType(self):
-        m = self.TMimeType.get_current_element()
-        return m
-
-    def setMimeType(self, mimetype):
-        store, i = dialog.generate_list_model( elements = [ ('text/plain', _("Plain text content")),
-                              ('application/x-advene-structured', _("Simple-structured content")),
-                              ('image/svg+xml', _("SVG graphics content")),
-                              ],active_element=mimetype)
-        self.TMimeType.set_model(store)
-        if i is None:
-            i = store.get_iter_first()
-        if i is not None:
-            self.TMimeType.set_active_iter(i)
-        return True
-
-    def addAttributeSpace(self, w, nom="New Attribute", type="None", con=""):
-        #ajouter eventuellement un contenu directement avec x params
-        #print "%s" % len(self.get_children()[0].get_children()[0].get_children())
-        boxAtt = gtk.HBox()
-        eNom = gtk.Entry()
-        eNom.set_text(nom)
-        eNom.set_size_request(100, 20)
-        eType = gtk.combo_box_new_text()
-        eType.append_text("None") # ajouter tous les types et focus sur le type type
-        eContrainte = gtk.Entry() # liste + entry ? bouton + fenetre pour creer ?
-        eContrainte.set_text(con)
-        eContrainte.set_size_request(50, 20)
-        bSuppr = gtk.Button("Remove")
-        bSuppr.set_size_request(50, 20)
-        boxAtt.pack_start(eNom)
-        boxAtt.pack_start(eType)
-        boxAtt.pack_start(eContrainte)
-        boxAtt.pack_start(bSuppr)
-        self.TAtts.append(boxAtt)
-        self.TAttsSpace.pack_start(boxAtt)
-        self.TAttsSpace.show_all()
-        return True
-
-    def initWithType(self, type):
-        if type is None:
-            # tout remettre a vide
-            self.type=None
-            self.setTypeName("")
-            self.setTypeId("")
-            self.setMimeType("")
-            self.setTypeColor(None)
-            self.setTypeDesc("")
-            self.TName.set_sensitive(False)
-            self.bcol.set_sensitive(False)
-            self.entryCol.set_sensitive(False)
-            self.TMimeType.set_sensitive(False)
-            return True
-        self.TName.set_sensitive(True)
-        self.bcol.set_sensitive(True)
-        self.entryCol.set_sensitive(True)
-        self.TMimeType.set_sensitive(True)
-        self.type = type
-        self.setTypeName(self.type.title)
-        self.setTypeId(self.type.id)
-        self.setMimeType(self.type.mimetype)
-        self.setTypeDesc("Non dipsonible actuellement")
-        self.setTypeColor(self.controller.get_element_color(self.type))
-        #boucle sur les attributs pour creer et remplir les lignes
-        #if (self.type.mimetype=='application/x-advene-relaxNG'):
-            # appel de la fonction qui parse l'arbre
-            # pour chaque element attribut, appel de la fonction qui ajoute une case aux attributs.
-        #    pass
-        self.TName.grab_focus()
-        return True
-
-    def saveType(self, button):
-        if self.type is None:
-            return
-        self.type.title=self.getTypeName()
-        self.type.mimetype=self.getMimeType()
-        col = self.getTypeColor()
-        try:
-            self.type.setMetaData(config.data.namespace, 'color', u"string:#%04x%04x%04x" % (col.red,col.green,col.blue))
-        except:
-            print "Error saving color for %s" % self.type
-
-        if isinstance(self.type, AnnotationType):
-            self.controller.notify('AnnotationTypeEditEnd', annotationtype=self.type)
-        elif isinstance(self.type, RelationType):
-            self.controller.notify('RelationTypeEditEnd', relationtype=self.type)
-        #save attributes
-        # send controller an event
-
-    def cancelType(self, button):
-        self.initWithType(self.type)
-
-class AnnotationTypeGroup (Group):
-    def __init__(self, controller=None, canvas=None, schema=None, name=" ", type=None, rx =0, ry=0, fontsize=22):
-        Group.__init__(self, parent = canvas.get_root_item ())
-        self.controller=controller
-        self.schema=schema
-        self.name=name
-        self.type=type
-        self.rect = None
-        self.text = None
-        self.color = "black"
-        self.fontsize=fontsize
-        self.rels=[] # rel groups
-        if type is None:
-            id_ = self.controller.package._idgenerator.get_id(AnnotationType)
-            self.controller.package._idgenerator.add(id_)
-            el=self.schema.createAnnotationType(
-                    ident=id_)
-            el.author=config.data.userid
-            el.date=self.controller.get_timestamp()
-            el.title=id_
-            el.mimetype='text/plain'
-            el.setMetaData(config.data.namespace, 'color', self.schema.rootPackage._color_palette.next())
-            el.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
-            self.schema.annotationTypes.append(el)
-            self.controller.notify('AnnotationTypeCreate', annotationtype=el)
-            if el is None:
-                return None
-            self.type=el
-        self.name=self.type.title
-        nbannot = len(self.type.getAnnotations())
-        if (self.controller.get_element_color(self.type) is not None):
-            self.color = self.controller.get_element_color(self.type)
-
-        self.rect = self.newRect (rx,ry,self.color)
-        self.text = self.newText (self.formattedName(),rx+5,ry+30)
-
-    def formattedName(self):
-        nbann = str(len(self.type.getAnnotations()))
-        if len(self.name)+len(nbann)>17:
-            e = 16-len(nbann)
-            return self.name[0:e] + ".. ("+nbann+")"
-        return self.name + " ("+nbann+")"
-
-    def newRect(self, xx, yy, color):
-        return goocanvas.Rect (parent = self,
-                                    x = xx,
-                                    y = yy,
-                                    width = 280,
-                                    height = 60,
-                                    fill_color_rgba = 0x3cb37150,
-                                    stroke_color = color,
-                                    line_width = 2.0)
-
-    def newText(self, txt, xx, yy):
-        return goocanvas.Text (parent = self,
-                                        text = txt,
-                                        x = xx,
-                                        y = yy,
-                                        width = -1,
-                                        anchor = gtk.ANCHOR_W,
-                                        font = "Sans Bold %s" % str(self.fontsize))
-
-    def remove(self):
-        while (len(self.rels)>0):
-            self.rels[0].remove()
-        self.controller.delete_element(self.type)
-        self.remove_drawing_only()
-
-    def remove_drawing_only(self):
-        for rel in self.rels:
-            rel.remove_drawing_only()
-        parent = self.get_parent()
-        child_num = parent.find_child (self)
-        parent.remove_child (child_num)
-
-    def update(self):
-        self.name=self.type.title
-        self.color = "black"
-        if (self.controller.get_element_color(self.type) is not None):
-            self.color = self.controller.get_element_color(self.type)
-            if self.rect is not None:
-                self.rect.props.stroke_color = self.color
-        if self.text is not None:
-            self.text.props.text = self.formattedName()
-
-class RelationTypeGroup (Group):
-    def __init__(self, controller=None, canvas=None, schema=None, name=" ", type=None, members=[], fontsize=22):
-        Group.__init__(self, parent = canvas.get_root_item ())
-        self.controller=controller
-        self.schema=schema
-        self.name=name
-        self.type=type
-        self.line=None
-        self.text=None
-        self.fontsize=fontsize
-        self.color = "black"
-        self.members=members
-        if self.type is None:
-            cr=CreateElementPopup(type_=RelationType,
-                                    parent=schema,
-                                    controller=self.controller)
-            rt=cr.popup(modal=True)
-            if rt is None:
-                return None
-            self.type=rt
-            if not self.members:
-                self.controller.gui.edit_element(self.type)
-            else:
-                # FIXME if more than 2 members
-                self.type.hackedMemberTypes=( '#' + self.members[0].id, '#' + self.members[1].id )
-                #need to propagate edition event
-        linked = self.type.getHackedMemberTypes()
-        #print "%s %s %s %s %s" % (self.type, self.name, self.schema, self.members, linked)
-        #print "%s" % self.members
-        self.members=[]
-        for i in linked:
-            # Add annotations types to members
-            typeA = self.getIdFromURI(i)
-            typ = helper.get_id(self.controller.package.getAnnotationTypes(), typeA)
-            #print "%s" % typ
-            if typ is not None:
-                self.members.append(typ)
-                #print "%s %s %s %s" % (i, typeA, typ, self.members)
-        #print "%s" % self.members
-        self.name=self.type.title
-        self.color = "black"
-        if (self.controller.get_element_color(self.type) is not None):
-            self.color = self.controller.get_element_color(self.type)
-        temp=[]
-        for i in self.members:
-            gr = self.findAnnotationTypeGroup(i.id, canvas)
-            #print "%s %s" % i.id, gr
-            x=1
-            y=1
-            w=0
-            h=0
-            if gr is not None:
-                x = gr.rect.get_bounds().x1
-                y = gr.rect.get_bounds().y1
-                w = gr.rect.props.width
-                h = gr.rect.props.height
-                if self not in gr.rels:
-                    gr.rels.append(self)
-            # 8 points of rect
-            temp.append([[x+w/2,y],[x+w/2,y+h],[x,y+h/2],[x+w,y+h/2],[x,y],[x+w,y],[x+w,y+h],[x,y+h]])
-        if len(temp)<2:
-            self.line=None
-            self.text=None
-            return None
-        # FIXME if more than 2 linked types
-        it=0
-        x1,y1,x2,y2,d = self.distMin(temp[it],temp[it+1])
-
-        if d==0:
-            # verify slot to attach the relation on annotation type before doing that
-            p = goocanvas.Points ([(x1, y1), (x1,y1-40), (x1+30, y1-40), (x2+30, y2)])
-        else:
-            p = goocanvas.Points ([(x1, y1), (x2, y2)])
-        #ligne
-        self.line = self.newLine (p,self.color)
-        if (d==0):
-            self.text = self.newText (self.formattedName(),x1+15,y1-40)	
-        else:
-            self.text = self.newText (self.formattedName(),(x1+x2)/2, (y1+y2)/2)
-
-
-    def formattedName(self):
-        nbrel = str(len(self.type.getRelations()))
-        #if len(self.name)+len(nbrel)>17:
-        #    e = 16-len(nbrel)
-        #    return self.name[0:e] + ".. ("+nbrel+")"
-        return self.name + " ("+str(nbrel)+")"
-
-    def newText(self, txt, xx, yy):
-        return goocanvas.Text (parent = self,
-                                        text = txt,
-                                        x = xx,
-                                        y = yy,
-                                        width = -1,
-                                        anchor = gtk.ANCHOR_CENTER,
-                                        font = "Sans Bold %s" % str(self.fontsize))
-    def newLine(self, p, color):
-        return goocanvas.Polyline (parent = self,
-                                        close_path = False,
-                                        points = p,
-                                        stroke_color = color,
-                                        line_width = 3.0,
-                                        start_arrow = False,
-                                        end_arrow = True,
-                                        arrow_tip_length =3.0,
-                                        arrow_length = 4.0,
-                                        arrow_width = 3.0
-                                        )
-
-    #FIXME : hack to find id from type's uri
-    def getIdFromURI(self, uri):
-        return uri[1:]
-
-    def findAnnotationTypeGroup(self, typeId, canvas):
-        root = canvas.get_root_item ()
-        for i in range(0, root.get_n_children()):
-            if hasattr(root.get_child(i), 'type') and root.get_child(i).type.id == typeId:
-                return root.get_child(i)
-        return None
-
-    # function to calculate min distance between x points
-    def distMin(self,l1,l2):
-        d=-1
-        xd1=xd2=yd1=yd2=0
-        for i in range(len(l1)):
-            x1 = l1[i][0]
-            y1 = l1[i][1]
-            for j in range(len(l2)):
-                x2 = l2[j][0]
-                y2 = l2[j][1]
-                nd=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
-                if ((d==-1) or (nd < d)):
-                    d = nd
-                    xd1 = x1
-                    xd2 = x2
-                    yd1 = y1
-                    yd2 = y2
-        return xd1,yd1,xd2,yd2,d
-
-    def redraw(self):
-        #print self.members
-        temp=[]
-        for i in self.members:
-            gr = self.findAnnotationTypeGroup(i.id, self.get_canvas())
-            x=1
-            y=1
-            w=0
-            h=0
-            if gr is not None:
-                x = gr.rect.get_bounds().x1
-                y = gr.rect.get_bounds().y1
-                w = gr.rect.props.width
-                h = gr.rect.props.height
-                if self not in gr.rels:
-                    gr.rels.append(self)
-            # 8 points
-            temp.append([[x+w/2,y],[x+w/2,y+h],[x,y+h/2],[x+w,y+h/2],[x,y],[x+w,y],[x+w,y+h],[x,y+h]])
-        if len(temp)<2:
-            self.line=None
-            self.text=None
-            return None
-        x1,y1,x2,y2,d = self.distMin(temp[0],temp[1])
-        nbrel = len(self.type.getRelations())
-        if d==0:
-            # modifier en fonction du slot
-            p = goocanvas.Points ([(x1, y1), (x1,y1-40), (x1+30, y1-40), (x2+30, y2)])
-            if self.text is None:
-                self.text = self.newText (self.formattedName(),x1,y1)	
-            self.text.translate(x1-130-self.text.get_bounds().x1, y1-60-self.text.get_bounds().y1)
-        else:
-            p = goocanvas.Points ([(x1, y1), (x2, y2)])
-            if self.text is None:
-                self.text = self.newText (self.formattedName(),(x1+x2)/2, (y1+y2)/2)
-            self.text.translate((x1+x2)/2-self.text.get_bounds().x1, (y1+y2)/2-self.text.get_bounds().y1)
-        if self.line  is None:
-            self.line = self.newLine (p,self.color)
-        self.line.props.points=p
-
-    def remove(self):
-        self.controller.delete_element(self.type)
-        self.remove_drawing_only()
-
-    def remove_drawing_only(self):
-        for i in self.members:
-            gr = self.findAnnotationTypeGroup(i.id, self.get_canvas())
-            if gr is not None and self in gr.rels:
-                gr.rels.remove(self)
-            else:
-                #Annotation group outside schema
-                #we don't remove the link because it doesn't have one
-                print "%s n'est pas dans ce schema ou a deja ete traite" % i.id
-        parent = self.get_parent()
-        child_num = parent.find_child (self)
-        parent.remove_child(child_num)
-
-    def update(self):
-        linked = self.type.getHackedMemberTypes()
-        self.members=[]
-        for i in linked:
-            # Add annotations types to members
-            typeA = self.getIdFromURI(i)
-            typ = helper.get_id(self.controller.package.getAnnotationTypes(), typeA)
-            if typ is not None:
-                self.members.append(typ)
-        self.name=self.type.title
-        self.color = "black"
-        if (self.controller.get_element_color(self.type) is not None):
-            self.color = self.controller.get_element_color(self.type)
-            if self.line is not None:
-                self.line.props.stroke_color = self.color
-        if self.text is not None:
-            nbrel = len(self.type.getRelations())
-            self.text.props.text = self.formattedName()
-        self.redraw()
-
-
diff --git a/lib/advene/gui/edit/shapewidget.py b/lib/advene/gui/edit/shapewidget.py
index e957475..779cb74 100755
--- a/lib/advene/gui/edit/shapewidget.py
+++ b/lib/advene/gui/edit/shapewidget.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -36,12 +36,20 @@ FIXME: XML load/dump should try to preserve unhandled information (especially TA
 FIXME: find a way to pass search paths for xlink:href elements resolution
 FIXME: find a way to pass the background path
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import os
 import sys
-import gtk
+import gi
+gi.require_version('Gdk', '3.0')
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import Gtk
 import cairo
-import urllib
+import math
+import urllib.request, urllib.parse, urllib.error
 import re
 import types
 from math import atan2, cos, sin
@@ -88,8 +96,8 @@ class Shape(object):
     # created. This implies a different interaction.
     MULTIPOINT = False
 
-    def __init__(self, name=SHAPENAME, color="green", dimensions=None):
-        self.name=name
+    def __init__(self, name=None, color="green", dimensions=None):
+        self.name=name or self.SHAPENAME
         self.color=color
         self.linewidth=2
         self.opacity = 1.0
@@ -125,16 +133,30 @@ class Shape(object):
         """
         return ( (0, 0), (10, 10) )
 
-    def render(self, pixmap, invert=False):
-        """Render the shape on the given pixmap.
+    def render(self, context, invert=False):
+        """Render the shape on the given context
 
-        @param pixmap: the destination pixmap
-        @type pixmap: gtk.gdk.Pixmap
+        @param context: the destination context
+        @type context: cairo.Context
         @param invert: should the rendering inverse the selection ?
         @type invert: boolean
         """
         return
 
+    def render_setup(self, context, invert=False):
+        """Setup context for common attributes.
+        """
+        context.set_line_width(self.linewidth)
+        col = Gdk.RGBA()
+        col.parse(self.color)
+        col.alpha = self.opacity
+        Gdk.cairo_set_source_rgba(context, col)
+
+        if invert:
+            context.set_operator(cairo.OPERATOR_XOR)
+        else:
+            context.set_operator(cairo.OPERATOR_OVER)
+
     def translate(self, vector):
         """Translate the shape.
 
@@ -199,7 +221,7 @@ class Shape(object):
                 # Default fallback
                 s.color = 'green'
         c=cls.xml2coords(cls.coords, element.attrib, context)
-        for n, v in c.iteritems():
+        for n, v in c.items():
             setattr(s, n, v)
         s.svg_attrib=dict(element.attrib)
         if hasattr(s, 'post_parse'):
@@ -307,31 +329,31 @@ class Shape(object):
     def edit_properties_widget(self):
         """Build a widget to edit the shape properties.
         """
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
         def label_widget(label, widget, expand=False):
-            hb=gtk.HBox()
-            hb.add(gtk.Label(label))
-            hb.pack_start(widget, expand=expand)
+            hb=Gtk.HBox()
+            hb.add(Gtk.Label(label=label))
+            hb.pack_start(widget, expand, True, 0)
             return hb
 
         # Name
-        namesel = gtk.Entry()
+        namesel = Gtk.Entry()
         namesel.set_text(self.name)
-        vbox.pack_start(label_widget(_("Name"), namesel), expand=False)
+        vbox.pack_start(label_widget(_("Name"), namesel), False, False, 0)
 
         # Link
-        linksel = gtk.Entry()
+        linksel = Gtk.Entry()
         linksel.set_text(self.link or '')
-        vbox.pack_start(label_widget(_("Link"), linksel), expand=False)
+        vbox.pack_start(label_widget(_("Link"), linksel), False, False, 0)
 
         # Linklabel
-        linklabelsel = gtk.Entry()
+        linklabelsel = Gtk.Entry()
         linklabelsel.set_text(self.link_label or '')
-        vbox.pack_start(label_widget(_("Link label"), linklabelsel), expand=False)
+        vbox.pack_start(label_widget(_("Link label"), linklabelsel), False, False, 0)
 
         # Color
-        colorsel = gtk.combo_box_new_text()
+        colorsel = Gtk.ComboBoxText()
         for s in COLORS:
             colorsel.append_text(s)
         try:
@@ -339,47 +361,47 @@ class Shape(object):
         except IndexError:
             i=0
         colorsel.set_active(i)
-        vbox.pack_start(label_widget(_("Color"), colorsel), expand=False)
+        vbox.pack_start(label_widget(_("Color"), colorsel), False, False, 0)
 
         # Linewidth
-        linewidthsel = gtk.HScale()
+        linewidthsel = Gtk.HScale()
         linewidthsel.set_range(1, 15)
         linewidthsel.set_increments(1, 1)
         linewidthsel.set_value(self.linewidth)
-        vbox.pack_start(label_widget(_("Linewidth"), linewidthsel, True), expand=True)
+        vbox.pack_start(label_widget(_("Linewidth"), linewidthsel, True), True, True, 0)
 
         # Filled
-        filledsel = gtk.ToggleButton()
+        filledsel = Gtk.ToggleButton()
         filledsel.set_active(self.filled)
-        vbox.pack_start(label_widget(_("Filled"), filledsel), expand=False)
+        vbox.pack_start(label_widget(_("Filled"), filledsel), False, False, 0)
 
         # Linewidth
-        opacitysel = gtk.HScale()
+        opacitysel = Gtk.HScale()
         opacitysel.set_range(0, 1)
         opacitysel.set_digits(1)
         opacitysel.set_increments(.1, .2)
         opacitysel.set_value(self.opacity)
-        vbox.pack_start(label_widget(_("Opacity"), opacitysel, True), expand=True)
+        vbox.pack_start(label_widget(_("Opacity"), opacitysel, True), True, True, 0)
 
         # svg_attrib
-        store=gtk.ListStore(str, str)
-        for k, v in self.svg_attrib.iteritems():
+        store=Gtk.ListStore(str, str)
+        for k, v in self.svg_attrib.items():
             store.append([k, v])
-        treeview=gtk.TreeView(model=store)
+        treeview=Gtk.TreeView(model=store)
 
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn("Attribute", renderer, text=0)
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn("Attribute", renderer, text=0)
         column.set_resizable(True)
         treeview.append_column(column)
 
-        renderer = gtk.CellRendererText()
+        renderer = Gtk.CellRendererText()
         renderer.set_property('editable', True)
-        column = gtk.TreeViewColumn("Value", renderer, text=1)
+        column = Gtk.TreeViewColumn("Value", renderer, text=1)
         column.set_resizable(True)
         treeview.append_column(column)
 
         treeview.show_all()
-        e=gtk.Expander('SVG attributes')
+        e=Gtk.Expander.new('SVG attributes')
         e.add(treeview)
         e.set_expanded(False)
         vbox.add(e)
@@ -401,31 +423,31 @@ class Shape(object):
         """
         edit=self.edit_properties_widget()
 
-        d = gtk.Dialog(title=_("Properties of %s") % self.name,
+        d = Gtk.Dialog(title=_("Properties of %s") % self.name,
                        parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_OK, gtk.RESPONSE_OK,
-                                 gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL ) )
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_OK, Gtk.ResponseType.OK,
+                                 Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL ) )
 
         d.vbox.add(edit)
 
         def keypressed_cb(widget=None, event=None):
-            if event.keyval == gtk.keysyms.Return:
-                d.response(gtk.RESPONSE_OK)
+            if event.keyval == Gdk.KEY_Return:
+                d.response(Gtk.ResponseType.OK)
                 return True
-            elif event.keyval == gtk.keysyms.Escape:
-                d.response(gtk.RESPONSE_CANCEL)
+            elif event.keyval == Gdk.KEY_Escape:
+                d.response(Gtk.ResponseType.CANCEL)
                 return True
             return False
         d.connect('key-press-event', keypressed_cb)
 
         edit.show_all()
         res=d.run()
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             # Get new values
             for n in ('name', 'link', 'link_label', 'uri', 'text'):
                 if n in edit.widgets:
-                    setattr(self, n, unicode(edit.widgets[n].get_text()))
+                    setattr(self, n, edit.widgets[n].get_text())
             self.color = COLORS[edit.widgets['color'].get_active()]
             for n in ('linewidth', 'textsize', 'arrowwidth'):
                 if n in edit.widgets:
@@ -468,17 +490,16 @@ class Rectangle(Shape):
     def get_bounds(self):
         return ( (self.x, self.y), (self.x + self.width, self.y + self.height) )
 
-    def render(self, pixmap, invert=False):
-        col=pixmap.get_colormap().alloc_color(self.color)
-        gc=pixmap.new_gc(foreground=col, line_width=self.linewidth)
-        if invert:
-            gc.set_function(gtk.gdk.INVERT)
-        pixmap.draw_rectangle(gc,
-                  self.filled,
-                  self.x,
-                  self.y,
-                  self.width,
-                  self.height)
+    def render(self, context, invert=False):
+        self.render_setup(context, invert)
+        context.rectangle(self.x,
+                      self.y,
+                      self.width,
+                      self.height)
+        if self.filled:
+            context.fill()
+        else:
+            context.stroke()
         return
 
     def translate(self, vector):
@@ -543,33 +564,26 @@ class Text(Rectangle):
         # FIXME: maybe we should consider a relative size (wrt. canvas size)
         self.textsize=20
 
-    def render(self, pixmap, invert=False):
-        width, height=pixmap.get_size()
-        context=pixmap.cairo_create()
+    def get_bounds(self):
+        return ( (self.x, self.y - self.height), (self.x + self.width, self.y) )
 
+    def render(self, context, invert=False):
+        self.render_setup(context, invert)
         context.select_font_face("Helvetica", cairo.FONT_SLANT_NORMAL,
                                  cairo.FONT_WEIGHT_NORMAL)
         context.set_font_size(self.textsize)
 
-        extents=context.text_extents(self.text)
+        extents = context.text_extents(self.text)
 
         # Fix width, height attributes
         self.width = extents[2]
         self.height = extents[3]
-
-        # FIXME: does not work correctly...
-        if invert:
-            context.set_operator(cairo.OPERATOR_ADD)
-        color=gtk.gdk.color_parse(self.color)
-        rgba=(color.red / 65536.0, color.green / 65536.0, color.blue / 65536.0, 1.0)
-        context.set_source_rgba(*rgba)
-
         context.move_to(self.x, self.y)
         try:
             context.show_text(self.text)
             self.width, self.height = extents[2:4]
         except MemoryError:
-            print "MemoryError while rendering text"
+            logger.error("MemoryError while rendering text")
         return
 
     def control_point(self, point):
@@ -597,7 +611,7 @@ class Text(Rectangle):
         if m:
             s.linewidth=int(m.group(1))
         c=cls.xml2coords(cls.coords, element.attrib, context)
-        for n, v in c.iteritems():
+        for n, v in c.items():
             setattr(s, n, v)
         s.svg_attrib=dict(element.attrib)
         if hasattr(s, 'post_parse'):
@@ -641,27 +655,27 @@ class Text(Rectangle):
         vbox=super(Text, self).edit_properties_widget()
 
         def label_widget(label, widget):
-            hb=gtk.HBox()
-            hb.add(gtk.Label(label))
-            hb.pack_start(widget, expand=False)
+            hb=Gtk.HBox()
+            hb.add(Gtk.Label(label=label))
+            hb.pack_start(widget, False, True, 0)
             return hb
 
         # Text
-        textsel = gtk.Entry()
+        textsel = Gtk.Entry()
         textsel.set_text(self.text)
         l=label_widget(_("Text"), textsel)
-        vbox.pack_start(l, expand=False)
+        vbox.pack_start(l, False, True, 0)
         # Put the text at the beginning
         vbox.reorder_child(l, 0)
         vbox.widgets['text']=textsel
 
         # Text size
-        textsizesel = gtk.SpinButton()
+        textsizesel = Gtk.SpinButton()
         textsizesel.set_range(4, 80)
         textsizesel.set_increments(1, 4)
         textsizesel.set_value(self.textsize)
         l=label_widget(_("Textsize"), textsizesel)
-        vbox.pack_start(l, expand=False)
+        vbox.pack_start(l, False, True, 0)
         vbox.reorder_child(l, 1)
         vbox.widgets['textsize']=textsizesel
 
@@ -689,7 +703,7 @@ class Image(Rectangle):
         super(Image, self).__init__(name, color, dimensions)
         self.uri=uri
 
-    def render(self, pixmap, invert=False):
+    def render(self, context, invert=False):
         # FIXME
         return
 
@@ -709,7 +723,7 @@ class Image(Rectangle):
         s=cls(name=element.attrib.get('name', cls.SHAPENAME))
         s.uri=element.attrib.get('xlink:href', element.attrib.get('{http://www.w3.org/1999/xlink}href', ''))
         c=cls.xml2coords(cls.coords, element.attrib, context)
-        for n, v in c.iteritems():
+        for n, v in c.items():
             setattr(s, n, v)
         s.svg_attrib=dict(element.attrib)
         if hasattr(s, 'post_parse'):
@@ -750,15 +764,15 @@ class Image(Rectangle):
         vbox=super(Image, self).edit_properties_widget()
 
         def label_widget(label, widget):
-            hb=gtk.HBox()
-            hb.add(gtk.Label(label))
-            hb.pack_start(widget, expand=False)
+            hb=Gtk.HBox()
+            hb.add(Gtk.Label(label=label))
+            hb.pack_start(widget, False, True, 0)
             return hb
 
         # URI
-        urisel = gtk.Entry()
+        urisel = Gtk.Entry()
         urisel.set_text(self.uri)
-        vbox.pack_start(label_widget(_("Href"), urisel), expand=False)
+        vbox.pack_start(label_widget(_("Href"), urisel), False, False, 0)
         vbox.widgets['uri']=urisel
         return vbox
 
@@ -790,31 +804,26 @@ class Line(Rectangle):
     def get_bounds(self):
         return ( (self.x1, self.y1), (self.x2, self.y2 ) )
 
-    def render(self, pixmap, invert=False):
-        col=pixmap.get_colormap().alloc_color(self.color)
-        gc=pixmap.new_gc(foreground=col, line_width=self.linewidth)
-        if invert:
-            gc.set_function(gtk.gdk.INVERT)
-        if self.filled:
-            gc.set_fill(gtk.gdk.SOLID)
-        pixmap.draw_line(gc,
-                  self.x1,
-                  self.y1,
-                  self.x2,
-                  self.y2)
+    def render(self, context, invert=False):
+        self.render_setup(context, invert)
+        context.move_to(self.x1, self.y1)
+        context.line_to(self.x2, self.y2)
         if self.arrow:
             theta=atan2( self.width, self.height )
-            ox=self.arrowwidth / 2 + 1
+            ox=int(self.arrowwidth / 2) + 1
             oy=self.arrowwidth
-            pixmap.draw_polygon(gc,
-                                True,
-                                ( (self.x2, self.y2),
-                                  (int(self.x2 - ox * cos(theta) - oy * sin(theta)),
-                                   int(self.y2 + ox * sin(theta) - oy * cos(theta)) ),
-                                  (int(self.x2 + ox * cos(theta) - oy * sin(theta)),
-                                   int(self.y2 - ox * sin(theta) - oy * cos(theta)) ),
-                                  )
-                                )
+            context.stroke()
+            context.new_path()
+            context.move_to(self.x2, self.y2)
+            context.line_to(int(self.x2 - ox * cos(theta) - oy * sin(theta)),
+                            int(self.y2 + ox * sin(theta) - oy * cos(theta)))
+            context.line_to(int(self.x2 + ox * cos(theta) - oy * sin(theta)),
+                            int(self.y2 - ox * sin(theta) - oy * cos(theta)))
+            context.close_path()
+        if self.filled:
+            context.fill()
+        else:
+            context.stroke()
         return
 
     def translate(self, vector):
@@ -864,24 +873,24 @@ class Line(Rectangle):
         vbox=super(Line, self).edit_properties_widget()
 
         def label_widget(label, widget):
-            hb=gtk.HBox()
-            hb.add(gtk.Label(label))
-            hb.pack_start(widget, expand=False)
+            hb=Gtk.HBox()
+            hb.add(Gtk.Label(label=label))
+            hb.pack_start(widget, False, True, 0)
             return hb
 
-        draw_arrow = gtk.CheckButton(_("Draw an arrow"))
+        draw_arrow = Gtk.CheckButton(_("Draw an arrow"))
         draw_arrow.set_active(self.arrow)
-        vbox.pack_start(draw_arrow)
+        vbox.pack_start(draw_arrow, True, True, 0)
         vbox.reorder_child(draw_arrow, 0)
         vbox.widgets['arrow']=draw_arrow
 
         # Arrow size
-        arrowsize = gtk.SpinButton()
+        arrowsize = Gtk.SpinButton()
         arrowsize.set_range(1, 40)
         arrowsize.set_increments(1, 4)
         arrowsize.set_value(self.arrowwidth)
         l=label_widget(_("Arrow size"), arrowsize)
-        vbox.pack_start(l, expand=False)
+        vbox.pack_start(l, False, True, 0)
         vbox.reorder_child(l, 1)
         vbox.widgets['arrowwidth']=arrowsize
         return vbox
@@ -901,7 +910,7 @@ class Line(Rectangle):
         <polyline points="0,0 10,5 0,10 1,5" fill="darkblue" />
         </marker></defs>
         """
-        e=super(Line, self).get_svg(relative, size).next()
+        e=next(super(Line, self).get_svg(relative, size))
         if self.arrow:
             if e.tag == 'a' or e.tag == ET.QName(SVGNS, 'a'):
                 # It is a link. Use the child.
@@ -915,7 +924,7 @@ class Line(Rectangle):
                     'refX': '5',
                     'refY': '5',
                     'orient': 'auto',
-                    'markerWidth': str(self.arrowwidth / 2 + 1),
+                    'markerWidth': str(int(self.arrowwidth / 2) + 1),
                     'markerHeight': str(self.arrowwidth) })
             defs.append(marker)
             marker.append(ET.Element('polyline', {
@@ -955,9 +964,9 @@ class Path(Shape):
         """Returns the coordinates of the lines composing the path
         """
         if self.closed:
-            return zip(self.path, self.path[1:] + self.path[:1])
+            return list(zip(self.path, self.path[1:] + self.path[:1]))
         else:
-            return zip(self.path, self.path[1:])
+            return list(zip(self.path, self.path[1:]))
 
     def set_controlled_point(self, index=None, point=None):
         """Specify the index of the controlled point.
@@ -1005,26 +1014,22 @@ class Path(Shape):
                  (max(x for x, y in self.path),
                   max(y for x, y in self.path)) )
 
-    def render(self, pixmap, invert=False, partial=False):
-        col = pixmap.get_colormap().alloc_color(self.color)
-        gc = pixmap.new_gc(foreground=col, line_width=self.linewidth)
-        if invert:
-            gc.set_function(gtk.gdk.INVERT)
+    def render(self, context, invert=False, partial=False):
+        self.render_setup(context, invert)
         if partial:
             # Only redraw last line
             for (x1, y1), (x2, y2) in self.pathlines[-1:]:
-                pixmap.draw_line(gc,
-                                 x1,
-                                 y1,
-                                 x2,
-                                 y2)
+                context.move_to(x1, y1)
+                context.line_to(x2, y2)
         else:
             for (x1, y1), (x2, y2) in self.pathlines:
-                pixmap.draw_line(gc,
-                                 x1,
-                                 y1,
-                                 x2,
-                                 y2)
+                context.move_to(x1, y1)
+                context.line_to(x2, y2)
+        if self.filled:
+            context.close_path()
+            context.fill()
+        else:
+            context.stroke()
         return
 
     def translate(self, vector):
@@ -1099,9 +1104,9 @@ class Path(Shape):
         """
         vbox=super(Path, self).edit_properties_widget()
 
-        closed_path = gtk.CheckButton(_("Close path"))
+        closed_path = Gtk.CheckButton(_("Close path"))
         closed_path.set_active(self.closed)
-        vbox.pack_start(closed_path)
+        vbox.pack_start(closed_path, True, True, 0)
         vbox.reorder_child(closed_path, 0)
         vbox.widgets['closed']=closed_path
 
@@ -1118,7 +1123,7 @@ class Path(Shape):
 
         if not data or data.pop() != 'M':
             # We need at least a starting point and a first line
-            print "SVG Path parsing error - wrong initial path element"
+            logger.error("SVG Path parsing error - wrong initial path element")
             return
 
         try:
@@ -1141,9 +1146,9 @@ class Path(Shape):
                     # Closed path
                     self.closed = True
                 else:
-                    print "SVG Path parsing error - unknown command:", command
-        except (IndexError, ValueError), e:
-            print "SVG Path parsing error - invalid conversion", unicode(e)
+                    logger.error("SVG Path parsing error - unknown command: %s", command)
+        except (IndexError, ValueError):
+            logger.error("SVG Path parsing error - invalid conversion", exc_info=True)
 
     def get_svg(self, relative=False, size=None):
        """Return a SVG representation of the path
@@ -1152,7 +1157,7 @@ class Path(Shape):
 
        Z is optional (used for closed paths).
        """
-       e = super(Path, self).get_svg(relative, size).next()
+       e = next(super(Path, self).get_svg(relative, size))
        if e.tag == 'a' or e.tag == ET.QName(SVGNS, 'a'):
            # It is a link. Use the child.
            el=e[0]
@@ -1194,18 +1199,15 @@ class Circle(Rectangle):
         self.cx = int( (bounds[0][0] + bounds[1][0]) / 2)
         self.cy = int( (bounds[0][1] + bounds[1][1]) / 2)
         #self.r = int(sqrt( (self.width / 2) ** 2 + (self.height / 2) ** 2))
-        self.r = self.width / 2
+        self.r = int(self.width / 2)
 
-    def render(self, pixmap, invert=False):
-        col=pixmap.get_colormap().alloc_color(self.color)
-        gc=pixmap.new_gc(foreground=col, line_width=self.linewidth)
-        if invert:
-            gc.set_function(gtk.gdk.INVERT)
-        pixmap.draw_arc(gc,
-                  self.filled,
-                  self.x, self.y,
-                  self.width, self.width,
-                  0, 360 * 64)
+    def render(self, context, invert=False):
+        self.render_setup(context, invert)
+        context.arc(self.x, self.y, self.width, 0, 2 * math.pi)
+        if self.filled:
+            context.fill()
+        else:
+            context.stroke()
         return
 
     def __contains__(self, point):
@@ -1252,19 +1254,22 @@ class Ellipse(Rectangle):
 
         self.cx = int( (bounds[0][0] + bounds[1][0]) / 2)
         self.cy = int( (bounds[0][1] + bounds[1][1]) / 2)
-        self.rx = self.width / 2
-        self.ry = self.height / 2
-
-    def render(self, pixmap, invert=False):
-        col=pixmap.get_colormap().alloc_color(self.color)
-        gc=pixmap.new_gc(foreground=col, line_width=self.linewidth)
-        if invert:
-            gc.set_function(gtk.gdk.INVERT)
-        pixmap.draw_arc(gc,
-                  self.filled,
-                  self.x, self.y,
-                  self.width, self.height,
-                  0, 360 * 64)
+        self.rx = int(self.width / 2)
+        self.ry = int(self.height / 2)
+
+    def render(self, context, invert=False):
+        self.render_setup(context, invert)
+        context.save()
+        context.translate(self.x + self.width / 2.,
+                          self.y + self.height / 2.)
+        if self.width and self.height:
+            context.scale(self.width / 2., self.height / 2.)
+        context.arc(0., 0., 1., 0., 2 * math.pi)
+        context.restore()
+        if self.filled:
+            context.fill()
+        else:
+            context.stroke()
         return
 
     def __contains__(self, point):
@@ -1321,7 +1326,7 @@ class Link(Shape):
                 if o is not None:
                     break
         if o is None:
-            print "Invalid <a> content in SVG"
+            logger.error("Invalid <a> content in SVG")
             return None
         o.link=element.attrib.get('xlink:href', element.attrib.get('{http://www.w3.org/1999/xlink}href', ''))
         o.link_label=element.attrib.get('title', 'Link to ' + o.link)
@@ -1339,7 +1344,7 @@ class Link(Shape):
         @return: the SVG representation
         @rtype: elementtree.Element
         """
-        print "Should not happen..."
+        logger.error("Should not happen (abstract method)...")
         yield None
 
 class ShapeDrawer:
@@ -1353,9 +1358,9 @@ class ShapeDrawer:
     @type callback: method taking an object (shape) as parameter
 
     @ivar background: the canvas background
-    @type background: gtk.Image
+    @type background: Gtk.Image
     @ivar objects: the list of defined objects
-    @type objects: gtk.ListStore
+    @type objects: Gtk.ListStore
     @ivar selection: the rectangular selection coordinates
     @type selection: a list of 2 lists
     @ivar feedback_shape: the currently edited shape, displayed as feedback
@@ -1367,25 +1372,26 @@ class ShapeDrawer:
     @ivar mode: the current editing mode ("", "create", "resize" or "translate")
     @type mode: string
 
-    @ivar pixmap: the edited pixmap
-    @type pixmap: gtk.gdk.Pixmap
+    @ivar surface: the cached surface
+    @type surface: cairo.Surface
+
     @ivar canvaswidth, canvasheight: the canvas dimensions
     @type canvaswidth, canvasheight: int
 
     @ivar widget: the gtk Widget for the component
-    @type widget: gtk.Widget
+    @type widget: Gtk.Widget
 
     """
     def __init__(self, callback=None, background=None):
         """
         @param callback: the callback method
         @param background: an optional background image
-        @type background: gtk.gdk.Pixbuf
+        @type background: GdkPixbuf.Pixbuf
         """
         self.callback = callback or self.default_callback
 
         # Couples object - name
-        self.objects = gtk.ListStore( object, str )
+        self.objects = Gtk.ListStore( object, str )
         def handle_reorder(*p):
             self.plot()
             return True
@@ -1400,24 +1406,24 @@ class ShapeDrawer:
         self.shape_class = Path
         self.default_color = 'green'
 
-        self.resize_cursor = gtk.gdk.Cursor(gtk.gdk.HAND2)
-        self.inside_cursor = gtk.gdk.Cursor(gtk.gdk.FLEUR)
+        self.resize_cursor = Gdk.Cursor.new(Gdk.CursorType.HAND2)
+        self.inside_cursor = Gdk.Cursor.new(Gdk.CursorType.FLEUR)
 
         self._svg_dimensions = None
 
         # mode: "create", "resize" or "translate"
         self.mode = ""
 
-        self.pixmap = None
+        self.surface = None
 
-        self.widget = gtk.DrawingArea()
-        self.widget.connect('expose-event', self.expose_event)
-        self.widget.connect('configure-event', self.configure_event)
+        self.widget = Gtk.DrawingArea()
+        self.widget.connect('configure-event', self.configure_cb)
+        self.widget.connect('draw', self.draw_cb)
         self.widget.connect('button-press-event', self.button_press_event)
         self.widget.connect('button-release-event', self.button_release_event)
         self.widget.connect('motion-notify-event', self.motion_notify_event)
-        self.widget.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.LEAVE_NOTIFY_MASK | gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK
-                               | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK | gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK )
+        self.widget.set_events(Gdk.EventMask.EXPOSURE_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK
+                               | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.POINTER_MOTION_HINT_MASK | Gdk.EventMask.KEY_PRESS_MASK | Gdk.EventMask.KEY_RELEASE_MASK )
 
         self.background=None
         # FIXME: Hardcoded dimensions are bad.
@@ -1430,7 +1436,7 @@ class ShapeDrawer:
     def default_callback(self, shape):
         """Default callback.
         """
-        print "Created shape ", str(shape)
+        logger.warn("Created shape %s", str(shape))
 
     def set_background(self, pixbuf, reset_dimensions=False):
         """Set a new background pixbuf.
@@ -1442,13 +1448,13 @@ class ShapeDrawer:
             if reset_dimensions:
                 # FIXME: if we have objects, we should scale them...
                 if self.objects:
-                    print "Resizing SVG editor with existing objects... Strange things will happen"
+                    logger.warn("Resizing SVG editor with existing objects... Strange things will happen")
                 self.canvaswidth = w
                 self.canvasheight = h
                 self.widget.set_size_request(self.canvaswidth, self.canvasheight)
             else:
                 # Resize background pixbuf
-                pixbuf=pixbuf.scale_simple(self.canvaswidth, self.canvasheight, gtk.gdk.INTERP_BILINEAR)
+                pixbuf=pixbuf.scale_simple(self.canvaswidth, self.canvasheight, GdkPixbuf.InterpType.BILINEAR)
         self.background = pixbuf
         self.plot()
 
@@ -1464,7 +1470,7 @@ class ShapeDrawer:
 
         @param o: the searched object
         @return: the iterator
-        @rtype: gtk.Iterator
+        @rtype: Gtk.Iterator
         """
         i = self.objects.get_iter_first()
         while i is not None:
@@ -1513,24 +1519,32 @@ class ShapeDrawer:
         self._svg_dimensions = t
     svg_dimensions = property(get_svg_dimensions, set_svg_dimensions)
 
-    def configure_event(self, widget, event):
-        if self.background:
-            w=self.background.get_width()
-            h=self.background.get_height()
-        else:
-            x, y, w, h = widget.get_allocation()
-
-        self.pixmap = gtk.gdk.Pixmap(widget.window, w, h)
-        self.canvaswidth = w
-        self.canvasheight = h
+    def configure_cb(self, drawingarea, event=None):
+        allocation = drawingarea.get_allocation()
+        self.surface = drawingarea.get_window().create_similar_surface(cairo.CONTENT_COLOR,
+                                                                       allocation.width,
+                                                                       allocation.height)
         self.plot()
         return True
 
-    # Redraw the screen from the backing pixmap
-    def expose_event(self, widget, event):
-        x, y, w, h = event.area
-        widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, x, y, x, y, w, h)
-        return False
+    def draw_cb(self, drawingarea, context):
+        context.set_source_surface(self.surface, 0, 0)
+        context.paint()
+        if self.feedback_shape is not None:
+            self.feedback_shape.render(context)
+        return True
+
+    # Redraw the cached surface
+    def draw_objects(self, context):
+        if self.background:
+            Gdk.cairo_set_source_pixbuf(context, self.background, 0, 0)
+            context.paint()
+        for o in self.objects:
+            # o[0] may be None, if plot() is called from the callback
+            # of a ListStore signal
+            if o[0] is not None:
+                o[0].render(context)
+        return
 
     def clicked_shape(self, point):
         """Check if point is on a shape.
@@ -1553,15 +1567,15 @@ class ShapeDrawer:
 
     def add_menuitem(self, menu=None, item=None, action=None, *param, **kw):
         if item is None or item == "":
-            i = gtk.SeparatorMenuItem()
+            i = Gtk.SeparatorMenuItem()
         else:
-            i = gtk.MenuItem(item)
+            i = Gtk.MenuItem(item)
         if action is not None:
             i.connect('activate', action, *param, **kw)
         menu.append(i)
 
     def popup_menu(self, shape):
-        menu = gtk.Menu()
+        menu = Gtk.Menu()
 
         def add_item(*p, **kw):
             self.add_menuitem(menu, *p, **kw)
@@ -1589,14 +1603,14 @@ class ShapeDrawer:
         add_item(_("SVG"), dump_svg, shape)
 
         menu.show_all()
-        menu.popup(None, None, None, 0, gtk.get_current_event_time())
+        menu.popup_at_pointer(None)
 
         return True
 
     # Start marking selection
     def button_press_event(self, widget, event):
         point = (int(event.x), int(event.y))
-        if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+        if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
             if self.feedback_shape and self.feedback_shape.MULTIPOINT and self.mode == 'create':
                 # Validate the shape
                 self.feedback_shape.validate()
@@ -1646,7 +1660,7 @@ class ShapeDrawer:
                 self.feedback_shape.remove_controlled_point()
                 self.plot()
             else:
-                if event.state & gtk.gdk.SHIFT_MASK:
+                if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
                     sel, c = self.controlled_shape( point )
                     if sel is not None:
                         # Right click on a control point - remove it
@@ -1662,10 +1676,6 @@ class ShapeDrawer:
 
     # End of selection
     def button_release_event(self, widget, event):
-        x = int(event.x)
-        y = int(event.y)
-
-        retval = ( self.selection[0][:], self.selection[1][:])
         if self.mode in ('resize', 'translate'):
             self.mode = ''
 
@@ -1691,19 +1701,18 @@ class ShapeDrawer:
     # Draw rectangle during mouse movement
     def motion_notify_event(self, widget, event):
         if event.is_hint:
-            x, y, state = event.window.get_pointer()
+            pointer = event.get_window().get_pointer()
+            x = pointer[1]
+            y = pointer[2]
         else:
             x = event.x
             y = event.y
-            state = event.state
 
         if self.feedback_shape is not None:
-            if self.selection[1][0] is not None:
-                # Remove previous feedback shape (with old dimensions)
-                self.feedback_shape.render(self.pixmap, invert=True)
-
             self.selection[1][0], self.selection[1][1] = int(x), int(y)
 
+            oldbounds = self.feedback_shape.get_bounds()
+
             if self.mode == "translate":
                 self.feedback_shape.translate( (x - self.selection[0][0],
                                                 y - self.selection[0][1] ) )
@@ -1712,11 +1721,17 @@ class ShapeDrawer:
             elif self.mode == "resize" or self.mode == "create":
                 self.feedback_shape.set_bounds( self.selection )
 
-            if self.feedback_shape.MULTIPOINT and self.mode == 'create':
-                self.feedback_shape.render(self.pixmap, invert=True, partial=True)
-            else:
-                self.feedback_shape.render(self.pixmap, invert=True)
-            self.draw_drawable()
+            bounds = self.feedback_shape.get_bounds()
+            minx = sys.maxsize
+            miny = sys.maxsize
+            maxx = 0
+            maxy = 0
+            for l in (oldbounds, bounds):
+                minx = min( (l[0][0], l[1][0], minx) )
+                miny = min( (l[0][1], l[1][1], miny) )
+                maxx = max( (l[0][0], l[1][0], maxx) )
+                maxy = max( (l[0][1], l[1][1], maxx) )
+            widget.queue_draw_area(minx - 1, miny - 1, maxx - minx + 2, maxy - miny + 2)
         else:
             # Check for control points
             cursor = None
@@ -1728,42 +1743,16 @@ class ShapeDrawer:
                 if point in o[0]:
                     cursor = self.inside_cursor
                     break
-            self.widget.window.set_cursor(cursor)
-
-    def draw_drawable(self):
-        """Render the pixmap in the drawingarea."""
-        if self.widget.window is None:
-            # The widget may not be realized, in which case simply return
-            return
-        x, y, w, h = self.widget.get_allocation()
-        self.widget.window.draw_drawable(self.widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, 0, 0, 0, 0, w, h)
+            self.widget.get_window().set_cursor(cursor)
 
     def plot(self):
-        """Draw in the pixmap.
+        """Draw in the cached surface
         """
-        if self.pixmap is None:
-            return
-        gc=self.widget.get_style().white_gc
-        if gc is None:
-            return
-        self.pixmap.draw_rectangle(gc, True, 0, 0, self.canvaswidth, self.canvasheight)
-
-        if self.background:
-            self.pixmap.draw_pixbuf(gc,
-                                    self.background,
-                                    0, 0,
-                                    0, 0)
-
-        for o in self.objects:
-            # o[0] may be None, if plot() is called from the callback
-            # of a ListStore signal
-            if o[0] is not None:
-                o[0].render(self.pixmap)
-
-        if self.feedback_shape is not None:
-            self.feedback_shape.render(self.pixmap, invert=True)
-
-        self.draw_drawable()
+        if self.surface:
+            context = cairo.Context(self.surface)
+            self.draw_objects(context)
+        self.widget.queue_draw()
+        return
 
     def get_svg(self, relative=False):
         """Return a SVG representation.
@@ -1815,16 +1804,16 @@ class ShapeDrawer:
         """
         m=re.match('(\d+)(\w*)', s)
         if m:
-            val=long(m.group(1))
+            val=int(m.group(1))
             unit=m.group(2)
             if unit in ('px', 'pt'):
                 return val
             elif unit == '%':
-                return long(val * 100.0 / self.dimensions[dimindex])
+                return int(val * 100.0 / self.dimensions[dimindex])
             else:
-                print 'SVG: Unspecified unit for ', s
+                logger.warn('SVG: Unspecified unit for %s', s)
                 return val
-        print 'Unhandled SVG dimension format for ', s
+        logger.warn('Unhandled SVG dimension format for %s', s)
         return 0
 
     def parse_svg(self, et, current_path=''):
@@ -1836,7 +1825,8 @@ class ShapeDrawer:
         hrefs can be resolved)
         """
         if et.tag != 'svg' and et.tag != ET.QName(SVGNS, 'svg'):
-            print "Not a svg file"
+            logger.error("Not a svg file (root tag: %s)", et.tag)
+            return False
         w=et.attrib.get('width')
         h=et.attrib.get('height')
         if w is not None and h is not None:
@@ -1850,9 +1840,9 @@ class ShapeDrawer:
                         # We have a background image.
                         if o.uri.startswith('http:'):
                             # http url, download the file
-                            (fname, header)=urllib.urlretrieve(o.uri)
-                            i=gtk.Image()
-                            print "Loaded background from ", o.uri, " copy in", fname
+                            (fname, header)=urllib.request.urlretrieve(o.uri)
+                            i=Gtk.Image()
+                            logger.warn("Loaded background from %s copy in %s", o.uri, fname)
                             i.set_from_file(fname)
                         else:
                             # Consider it as local.
@@ -1862,14 +1852,14 @@ class ShapeDrawer:
                                 uri=os.path.join( current_path, o.uri)
                             else:
                                 uri=o.uri
-                            i=gtk.Image()
+                            i=Gtk.Image()
                             i.set_from_file(uri)
-                            if i.get_storage_type() != gtk.IMAGE_PIXBUF:
-                                p=gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,
+                            if i.get_storage_type() != Gtk.ImageType.PIXBUF:
+                                p=GdkPixbuf.Pixbuf(GdkPixbuf.Colorspace.RGB,
                                                  True, 8, o.width, o.height)
                                 p.fill(0xdeadbeaf)
                                 i.set_from_pixbuf(p)
-                            print "Loaded background from ", uri
+                            logger.warn("Loaded background from %s", uri)
                         p=i.get_pixbuf()
                         # We insert the background at the beginning of
                         # the object stack, so that other shapes are
@@ -1893,8 +1883,8 @@ class ShapeEditor(object):
 
     This component provides an example of using ShapeWidget.
     """
-    def __init__(self, background=None, pixmap_dir=None):
-        if isinstance(background, gtk.Image):
+    def __init__(self, background=None, icon_dir=None):
+        if isinstance(background, Gtk.Image):
             background = background.get_pixbuf()
         self.drawer = ShapeDrawer(background=background)
         self.shapes = [ Rectangle, Ellipse, Line, Text, Path ]
@@ -1903,15 +1893,15 @@ class ShapeEditor(object):
         self.drawer.default_color = self.colors[0]
 
         self.key_mapping={
-            gtk.keysyms.l: Line,
-            gtk.keysyms.r: Rectangle,
-            gtk.keysyms.t: Text,
-            gtk.keysyms.c: Ellipse,
-            gtk.keysyms.p: Path,
-            #gtk.keysyms.i: Image,
+            Gdk.KEY_l: Line,
+            Gdk.KEY_r: Rectangle,
+            Gdk.KEY_t: Text,
+            Gdk.KEY_c: Ellipse,
+            Gdk.KEY_p: Path,
+            #Gdk.KEY_i: Image,
             }
 
-        self.pixmap_name={
+        self.icon_name={
             Rectangle: 'shape_rectangle.png',
             Line: 'shape_arrow.png',
             Text: 'shape_text.png',
@@ -1919,12 +1909,12 @@ class ShapeEditor(object):
             Image: 'shape_image.png',
             Path: 'shape_path.png',
             }
-        self.widget=self.build_widget(pixmap_dir)
+        self.widget=self.build_widget(icon_dir)
         self.widget.connect('key-press-event', self.key_press_event)
 
     def key_press_event(self, widget, event):
         cl = self.key_mapping.get(event.keyval, None)
-        if isinstance(cl, types.TypeType) and issubclass(cl, Shape):
+        if isinstance(cl, type) and issubclass(cl, Shape):
             # Select the appropriate shape
             self.shape_icon.set_shape(cl)
             self.drawer.shape_class = cl
@@ -1932,7 +1922,7 @@ class ShapeEditor(object):
         elif callable(cl):
             cl(widget, event)
             return True
-        elif event.keyval == gtk.keysyms.Delete:
+        elif event.keyval == Gdk.KEY_Delete:
             s = self.get_selected_node(self.treeview)
             if s is not None:
                 self.drawer.remove_object(s)
@@ -1946,7 +1936,7 @@ class ShapeEditor(object):
         return True
 
     def build_selector(self, l, callback):
-        sel = gtk.combo_box_new_text()
+        sel = Gtk.ComboBoxText()
         for s in l:
             sel.append_text(s)
         sel.connect('changed', callback)
@@ -1974,7 +1964,7 @@ class ShapeEditor(object):
         y = int(event.y)
 
         # On double-click, edit element
-        if event.type == gtk.gdk._2BUTTON_PRESS:
+        if event.type == Gdk.EventType._2BUTTON_PRESS:
             node = self.get_selected_node (widget)
             if node is not None:
                 if node.edit_properties():
@@ -1987,7 +1977,7 @@ class ShapeEditor(object):
             else:
                 retval=False
         elif button == 3:
-            if event.window is widget.get_bin_window():
+            if event.get_window() is widget.get_bin_window():
                 model = widget.get_model()
                 t = widget.get_path_at_pos(x, y)
                 if t is not None:
@@ -2002,33 +1992,33 @@ class ShapeEditor(object):
     def set_background(self, image):
         """Set the background image.
         """
-        if isinstance(image, gtk.Image):
+        if isinstance(image, Gtk.Image):
             self.drawer.set_background(image.get_pixbuf())
-        elif isinstance(image, gtk.gdk.Pixbuf):
+        elif isinstance(image, GdkPixbuf.Pixbuf):
             self.drawer.set_background(image)
         else:
-            raise Exception("set_background requires a gtk.Image or a gtk.gdk.Pixbuf")
+            raise Exception("set_background requires a Gtk.Image or a GdkPixbuf.Pixbuf")
 
-    def build_widget(self, pixmap_dir):
-        vbox=gtk.VBox()
+    def build_widget(self, icon_dir):
+        vbox=Gtk.VBox()
 
-        tb = self.toolbar = gtk.Toolbar()
-        tb.set_style(gtk.TOOLBAR_ICONS)
+        tb = self.toolbar = Gtk.Toolbar()
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
 
-        vbox.pack_start(tb, expand=False)
+        vbox.pack_start(tb, False, True, 0)
 
-        hbox=gtk.HBox()
+        hbox=Gtk.HBox()
 
         vbox.add(hbox)
 
         hbox.pack_start(self.drawer.widget, True, True, 0)
         self.drawer.widget.connect('key-press-event', self.key_press_event)
 
-        self.treeview = gtk.TreeView(self.drawer.objects)
+        self.treeview = Gtk.TreeView(self.drawer.objects)
         self.treeview.set_reorderable(True)
 
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn('Name', renderer,
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn('Name', renderer,
                                     text=1)
         self.treeview.append_column(column)
         self.treeview.connect('button-press-event', self.tree_view_button_cb)
@@ -2036,9 +2026,9 @@ class ShapeEditor(object):
         def set_shape(tb, shape):
             """Update the toolbutton with the appropriate shape information.
             """
-            if pixmap_dir is not None and self.pixmap_name.get(shape, None):
-                i=gtk.Image()
-                i.set_from_file( os.path.join( pixmap_dir, self.pixmap_name.get(shape, None)) )
+            if icon_dir is not None and self.icon_name.get(shape, None):
+                i=Gtk.Image()
+                i.set_from_file( os.path.join( icon_dir, self.icon_name.get(shape, None)) )
                 i.show()
                 tb.set_icon_widget(i)
             else:
@@ -2054,22 +2044,22 @@ class ShapeEditor(object):
             return True
 
         def display_shape_menu(tb):
-            bar=gtk.Toolbar()
-            bar.set_orientation(gtk.ORIENTATION_VERTICAL)
-            bar.set_style(gtk.TOOLBAR_ICONS)
+            bar=Gtk.Toolbar()
+            bar.set_orientation(Gtk.Orientation.VERTICAL)
+            bar.set_style(Gtk.ToolbarStyle.ICONS)
 
             for shape in self.shapes:
-                i=gtk.ToolButton()
+                i=Gtk.ToolButton()
                 i.set_visible_horizontal(True)
                 i.set_visible_vertical(True)
                 set_shape(i, shape)
                 i.connect('clicked', select_shape, shape)
                 bar.insert(i, -1)
 
-            w=gtk.Window(type=gtk.WINDOW_POPUP)
+            w=Gtk.Window(type=Gtk.WindowType.POPUP)
             w.add(bar)
             w.set_transient_for(tb.get_toplevel())
-            w.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_TOOLBAR)
+            w.set_type_hint(Gdk.WindowTypeHint.TOOLBAR)
             w.set_modal(True)
             w.resize(20, 150)
             alloc = tb.get_allocation()
@@ -2083,7 +2073,7 @@ class ShapeEditor(object):
 
             return True
 
-        self.shape_icon=gtk.ToolButton()
+        self.shape_icon=Gtk.ToolButton()
         self.shape_icon.set_shape=set_shape.__get__(self.shape_icon)
         self.shape_icon.set_shape(self.drawer.shape_class)
         self.shape_icon.connect('clicked', display_shape_menu)
@@ -2105,22 +2095,22 @@ class ShapeEditor(object):
             return True
 
         def display_color_menu(tb):
-            bar=gtk.Toolbar()
-            bar.set_orientation(gtk.ORIENTATION_VERTICAL)
-            bar.set_style(gtk.TOOLBAR_ICONS)
+            bar=Gtk.Toolbar()
+            bar.set_orientation(Gtk.Orientation.VERTICAL)
+            bar.set_style(Gtk.ToolbarStyle.ICONS)
 
             for color in self.colors:
-                i=gtk.ToolButton(icon_widget=gtk.Label())
+                i=Gtk.ToolButton(icon_widget=Gtk.Label())
                 i.set_visible_horizontal(True)
                 i.set_visible_vertical(True)
                 set_color(i, color)
                 i.connect('clicked', select_color, color)
                 bar.insert(i, -1)
 
-            w=gtk.Window(type=gtk.WINDOW_POPUP)
+            w=Gtk.Window(type=Gtk.WindowType.POPUP)
             w.add(bar)
             w.set_transient_for(tb.get_toplevel())
-            w.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_TOOLBAR)
+            w.set_type_hint(Gdk.WindowTypeHint.TOOLBAR)
             w.set_modal(True)
             bar.show_all()
             w.resize(20, 200)
@@ -2135,17 +2125,17 @@ class ShapeEditor(object):
 
             return True
 
-        self.color_icon=gtk.ToolButton(icon_widget=gtk.Label())
+        self.color_icon=Gtk.ToolButton(icon_widget=Gtk.Label())
         self.color_icon.set_color=set_color.__get__(self.color_icon)
         self.color_icon.set_color('red')
         self.color_icon.connect('clicked', display_color_menu)
         tb.insert(self.color_icon, -1)
 
         def load_svg(b):
-            fs=gtk.FileChooserDialog(title='Select a svg file',
-                                     buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
+            fs=Gtk.FileChooserDialog(title='Select a svg file',
+                                     buttons=(Gtk.STOCK_OK, Gtk.ResponseType.OK, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL))
             res=fs.run()
-            if res == gtk.RESPONSE_OK:
+            if res == Gtk.ResponseType.OK:
                 name=fs.get_filename()
                 root=ET.parse(name).getroot()
                 self.drawer.parse_svg(root)
@@ -2153,35 +2143,35 @@ class ShapeEditor(object):
             return True
 
         def save_svg(b):
-            fs=gtk.FileChooserDialog(title='Select a svg file to write to',
-                                     action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                     buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
+            fs=Gtk.FileChooserDialog(title='Select a svg file to write to',
+                                     action=Gtk.FileChooserAction.SAVE,
+                                     buttons=(Gtk.STOCK_OK, Gtk.ResponseType.OK, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL))
             res=fs.run()
-            if res == gtk.RESPONSE_OK:
+            if res == Gtk.ResponseType.OK:
                 name = fs.get_filename()
                 tree = ET.ElementTree(self.drawer.get_svg(relative=False))
-                f = open(name, 'w')
-                tree.write(f, encoding='utf-8')
+                f = open(name, 'w', encoding='utf-8')
+                tree.write(f, encoding='unicode')
                 f.close()
             fs.destroy()
             return True
 
-        tb.insert(gtk.SeparatorToolItem(), -1)
+        tb.insert(Gtk.SeparatorToolItem(), -1)
 
-        b=gtk.ToolButton(gtk.STOCK_OPEN)
+        b=Gtk.ToolButton(Gtk.STOCK_OPEN)
         b.set_tooltip_text(_("Load SVG"))
         b.connect('clicked', load_svg)
         tb.insert(b, -1)
 
         if True:
-            b=gtk.ToolButton(gtk.STOCK_SAVE)
+            b=Gtk.ToolButton(Gtk.STOCK_SAVE)
             b.set_tooltip_text(_("Save SVG"))
             b.connect('clicked', save_svg)
             tb.insert(b, -1)
 
-        control = gtk.VBox()
-        control.pack_start(self.treeview, expand=False)
-        hbox.pack_start(control, expand=False)
+        control = Gtk.VBox()
+        control.pack_start(self.treeview, False, True, 0)
+        hbox.pack_start(control, False, True, 0)
 
         vbox.show_all()
 
@@ -2193,33 +2183,33 @@ def main():
     else:
         bg = 'atelier.jpg'
 
-    win = gtk.Window(gtk.WINDOW_TOPLEVEL)
+    win = Gtk.Window(Gtk.WindowType.TOPLEVEL)
     win.set_title("Shape Editor test")
     #win.set_default_size(800, 600)
-    win.connect('delete-event', lambda w, e: gtk.main_quit())
+    win.connect('delete-event', lambda w, e: Gtk.main_quit())
 
     if bg.endswith('.svg'):
         ed=ShapeEditor()
         root=ET.parse(bg).getroot()
         ed.drawer.parse_svg(root)
     else:
-        i=gtk.Image()
+        i=Gtk.Image()
         i.set_from_file(bg)
         ed=ShapeEditor(background=i)
         ed.drawer.add_object(Image(name='background', uri=os.path.basename(bg)))
     win.add(ed.widget)
 
-    ed.key_mapping[gtk.keysyms.q]=lambda w, e: gtk.main_quit()
-    ed.key_mapping[gtk.keysyms.d]=lambda w, e: ET.dump(ed.drawer.get_svg())
+    ed.key_mapping[Gdk.KEY_q]=lambda w, e: Gtk.main_quit()
+    ed.key_mapping[Gdk.KEY_d]=lambda w, e: ET.dump(ed.drawer.get_svg())
     try:
         from evaluator import Evaluator
-        ed.key_mapping[gtk.keysyms.e]=lambda w, e: Evaluator(locals_={'ed': ed}).popup()
+        ed.key_mapping[Gdk.KEY_e]=lambda w, e: Evaluator(locals_={'ed': ed}).popup()
     except ImportError:
         pass
 
     win.show_all()
 
-    gtk.main()
+    Gtk.main()
 
 # Element-tree indent function.
 # in-place prettyprint formatter
@@ -2240,4 +2230,5 @@ defined_shape_classes=[ c for c in locals().values() if hasattr(c, 'SHAPENAME')
 
 # Start it all
 if __name__ == '__main__':
+    logging.basicConfig(level=logging.DEBUG)
     main()
diff --git a/lib/advene/gui/edit/tales.py b/lib/advene/gui/edit/tales.py
index 2eedbe7..e553a9c 100644
--- a/lib/advene/gui/edit/tales.py
+++ b/lib/advene/gui/edit/tales.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-import gtk
+from gi.repository import Gtk
 import re
 
 import advene.core.config as config
@@ -84,7 +84,6 @@ class TALESEntry:
         it=None
         i=m.get_iter_first()
         while i is not None:
-            #print m.get_value(i, 1)
             if m.get_value(i, 1) == t:
                 it=i
                 break
@@ -124,7 +123,7 @@ class TALESEntry:
         return advene.util.helper.is_valid_tales(self.text2tales(expr))
 
     def build_widget(self):
-        hbox=gtk.HBox()
+        hbox=Gtk.HBox()
 
         if self.predefined:
             preselect=self.tales2text(self.predefined[0][0])
@@ -133,16 +132,16 @@ class TALESEntry:
         self.combo=dialog.list_selector_widget(members=[ (self.tales2text(e), d) for (e, d) in self.predefined ],
                                                preselect=preselect,
                                                entry=True)
-        self.entry=self.combo.child
+        self.entry=self.combo.get_child()
         self.entry.connect('changed', lambda e: self.entry.set_tooltip_text(self.combo.get_current_element()))
         self.entry.set_tooltip_text(self.combo.get_current_element())
 
-        hbox.pack_start(self.combo, expand=True)
+        hbox.pack_start(self.combo, True, True, 0)
 
         if config.data.preferences['expert-mode']:
-            b=gtk.Button(stock=gtk.STOCK_FIND)
+            b=Gtk.Button(stock=Gtk.STOCK_FIND)
             b.connect('clicked', self.browse_expression)
-            hbox.pack_start(b, expand=False)
+            hbox.pack_start(b, False, True, 0)
 
         hbox.show_all()
         return hbox
diff --git a/lib/advene/gui/edit/timeadjustment.py b/lib/advene/gui/edit/timeadjustment.py
index 6e8dfe7..73c84d0 100755
--- a/lib/advene/gui/edit/timeadjustment.py
+++ b/lib/advene/gui/edit/timeadjustment.py
@@ -1,6 +1,6 @@
 
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,10 +20,13 @@
 
 It depends on a Controller instance to be able to interact with the video player.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import advene.core.config as config
 
-import gtk
+from gi.repository import Gdk
+from gi.repository import Gtk
 import advene.util.helper as helper
 from advene.gui.widget import TimestampRepresentation
 from advene.gui.util import encode_drop_parameters, decode_drop_parameters
@@ -59,8 +62,8 @@ class TimeAdjustment:
             return True
 
         def image_button_clicked(button):
-            event=gtk.get_current_event()
-            if event.state & gtk.gdk.CONTROL_MASK:
+            event=Gtk.get_current_event()
+            if event.get_state().state & Gdk.ModifierType.CONTROL_MASK:
                 self.use_current_position(button)
                 return True
             else:
@@ -68,31 +71,23 @@ class TimeAdjustment:
                 return True
 
         def image_button_press(button, event):
-            if event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS:
+            if event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
                 # Display the popup menu
-                menu = gtk.Menu()
-                item = gtk.MenuItem(_("Refresh snapshot"))
+                menu = Gtk.Menu()
+                item = Gtk.MenuItem(_("Refresh snapshot"))
                 item.connect('activate', refresh_snapshot)
                 menu.append(item)
                 menu.show_all()
-                menu.popup(None, None, None, 0, gtk.get_current_event_time())
+                menu.popup_at_pointer(None)
                 return True
             return False
 
         def make_button(incr_value, pixmap):
             """Helper function to build the buttons."""
-            b=gtk.Button()
-            i=gtk.Image()
+            b=Gtk.Button()
+            i=Gtk.Image()
             i.set_from_file(config.data.advenefile( ( 'pixmaps', pixmap) ))
-            # FIXME: to re-enable
-            # The proper way is to do
-            #b.set_image(i)
-            # but it works only on linux, gtk 2.10
-            # and is broken on windows and mac
-            al=gtk.Alignment()
-            al.set_padding(0, 0, 0, 0)
-            al.add(i)
-            b.add(al)
+            b.set_image(i)
 
             def increment_value_cb(widget, increment):
                 self.set_value(self.value + increment)
@@ -105,64 +100,67 @@ class TimeAdjustment:
             b.set_tooltip_text(tip)
             return b
 
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        hbox=gtk.HBox()
+        hbox=Gtk.HBox()
         hbox.set_homogeneous(False)
 
         if self.editable:
-            vb=gtk.VBox()
+            vb=Gtk.VBox()
             b=make_button(-self.large_increment, "2leftarrow.png")
-            vb.pack_start(b, expand=False)
+            vb.pack_start(b, False, True, 0)
             b=make_button(-self.small_increment, "1leftarrow.png")
-            vb.pack_start(b, expand=False)
-            hbox.pack_start(vb, expand=False)
+            vb.pack_start(b, False, True, 0)
+            hbox.pack_start(vb, False, True, 0)
 
         if self.compact:
             width=50
         else:
             width=100
-        self.image=TimestampRepresentation(self.value, self.controller, width,
-                                           epsilon=1000/config.data.preferences['default-fps'],
-                                           visible_label=False, callback=self.set_value)
+        self.image = TimestampRepresentation(self.value,
+                                             None,
+                                             self.controller,
+                                             width,
+                                             visible_label=False,
+                                             callback=self.set_value)
         self.image.connect('button-press-event', image_button_press)
         self.image.connect('clicked', image_button_clicked)
         self.image.set_tooltip_text(_("Click to play\nControl+click to set to current time\nScroll to modify value (with control/shift)\nRight-click to invalidate screenshot"))
-        hbox.pack_start(self.image, expand=False)
+        hbox.pack_start(self.image, False, True, 0)
 
         if self.editable:
-            vb=gtk.VBox()
+            vb=Gtk.VBox()
             b=make_button(self.large_increment, "2rightarrow.png")
-            vb.pack_start(b, expand=False)
+            vb.pack_start(b, False, True, 0)
             b=make_button(self.small_increment, "1rightarrow.png")
-            vb.pack_start(b, expand=False)
-            hbox.pack_start(vb, expand=False)
+            vb.pack_start(b, False, True, 0)
+            hbox.pack_start(vb, False, True, 0)
 
-        hb = gtk.HBox()
+        hb = Gtk.HBox()
 
         if self.editable:
-            self.entry=gtk.Entry()
+            self.entry=Gtk.Entry()
             self.entry.set_tooltip_text(_("Enter a timecode.\nAn integer value will be considered as milliseconds.\nA float value (12.2) will be considered as seconds.\nHH:MM:SS.sss values are possible."))
             # Default width of the entry field
             self.entry.set_width_chars(len(helper.format_time(0.0)))
             self.entry.connect('activate', self.convert_entered_value)
             self.entry.connect('focus-out-event', self.convert_entered_value)
             self.entry.set_editable(self.editable)
-            hb.pack_start(self.entry, expand=False)
+            hb.pack_start(self.entry, False, True, 0)
         else:
             self.entry=None
 
         if self.editable:
-            current_pos=gtk.Button()
-            i=gtk.Image()
+            current_pos=Gtk.Button()
+            i=Gtk.Image()
             i.set_from_file(config.data.advenefile( ( 'pixmaps', 'set-to-now.png') ))
             current_pos.set_tooltip_text(_("Set to current player position"))
             current_pos.add(i)
             current_pos.connect('clicked', self.use_current_position)
-            hb.pack_start(current_pos, expand=False)
+            hb.pack_start(current_pos, False, True, 0)
 
-        vbox.pack_start(hbox, expand=False)
-        vbox.pack_start(hb, expand=False)
+        vbox.pack_start(hbox, False, True, 0)
+        vbox.pack_start(hb, False, True, 0)
         hb.set_style(self.image.box.get_style())
         #self.entry.set_style(self.image.box.get_style())
         vbox.set_style(self.image.box.get_style())
@@ -174,17 +172,17 @@ class TimeAdjustment:
         hb.show()
 
         def handle_scroll_event(button, event):
-            if event.state & gtk.gdk.CONTROL_MASK:
+            if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
                 i=config.data.preferences['scroll-increment']
-            elif event.state & gtk.gdk.SHIFT_MASK:
+            elif event.get_state() & Gdk.ModifierType.SHIFT_MASK:
                 i=config.data.preferences['second-scroll-increment']
             else:
                 # 1 frame
-                i=1000 / config.data.preferences['default-fps']
+                i = self.controller.frame2time(1)
 
-            if event.direction == gtk.gdk.SCROLL_DOWN or event.direction == gtk.gdk.SCROLL_LEFT:
+            if event.direction == Gdk.ScrollDirection.DOWN or event.direction == Gdk.ScrollDirection.LEFT:
                 incr=-i
-            elif event.direction == gtk.gdk.SCROLL_UP or event.direction == gtk.gdk.SCROLL_RIGHT:
+            elif event.direction == Gdk.ScrollDirection.UP or event.direction == Gdk.ScrollDirection.RIGHT:
                 incr=i
 
             if not self.set_value(self.value + incr):
@@ -194,12 +192,11 @@ class TimeAdjustment:
         if self.editable:
             # The widget can receive drops from annotations
             vbox.connect('drag-data-received', self.drag_received)
-            vbox.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                               gtk.DEST_DEFAULT_HIGHLIGHT |
-                               gtk.DEST_DEFAULT_ALL,
-                               config.data.drag_type['annotation']
-                               + config.data.drag_type['timestamp'],
-                               gtk.gdk.ACTION_LINK)
+            vbox.drag_dest_set(Gtk.DestDefaults.MOTION |
+                               Gtk.DestDefaults.HIGHLIGHT |
+                               Gtk.DestDefaults.ALL,
+                               config.data.get_target_types('annotation', 'timestamp'),
+                               Gdk.DragAction.LINK)
 
             vbox.connect('scroll-event', handle_scroll_event)
 
@@ -208,32 +205,32 @@ class TimeAdjustment:
 
     def drag_received(self, widget, context, x, y, selection, targetType, time):
         if targetType == config.data.target_type['annotation']:
-            source_uri=unicode(selection.data, 'utf8').split('\n')[0]
+            source_uri=str(selection.get_data(), 'utf8').split('\n')[0]
             source=self.controller.package.annotations.get(source_uri)
             self.set_value(source.fragment.begin)
         elif targetType == config.data.target_type['timestamp']:
-            data=decode_drop_parameters(selection.data)
-            v=long(float(data['timestamp']))
+            data=decode_drop_parameters(selection.get_data().decode('utf-8'))
+            v=int(float(data['timestamp']))
             self.set_value(v)
         else:
-            print "Unknown target type for drop: %d" % targetType
+            logger.warn("Unknown target type for drop: %d" % targetType)
         return True
 
     def drag_sent(self, widget, context, selection, targetType, eventTime):
         """Handle the drag-sent event.
         """
         if targetType == config.data.target_type['timestamp']:
-            selection.set(selection.target, 8, encode_drop_parameters(timestamp=self.value))
+            selection.set(selection.get_target(), 8, encode_drop_parameters(timestamp=self.value))
             return True
         elif targetType in ( config.data.target_type['text-plain'],
                              config.data.target_type['TEXT'],
                              config.data.target_type['STRING'] ):
-            selection.set(selection.target, 8, helper.format_time(self.value))
+            selection.set(selection.get_target(), 8, helper.format_time(self.value))
             return True
         return False
 
     def play_from_here(self, button):
-        self.controller.update_status("set", self.value)
+        self.controller.update_status("seek", self.value)
         return True
 
     def use_current_position(self, button):
@@ -242,11 +239,11 @@ class TimeAdjustment:
 
     def update_snapshot(self, button):
         # FIXME: to implement
-        print "Not implemented yet."
+        logger.warn("Not implemented yet.")
         pass
 
     def convert_entered_value(self, *p):
-        t=unicode(self.entry.get_text())
+        t=self.entry.get_text()
         v=helper.parse_time(t)
         if v is not None and v != self.value:
             if not self.set_value(v):
@@ -289,5 +286,5 @@ class TimeAdjustment:
         self.value=v
         self.update_display()
         if self.sync_video:
-            self.controller.move_position(self.value, relative=False)
+            self.controller.update_status("seek", self.value)
         return True
diff --git a/lib/advene/gui/edit/transcribe.py b/lib/advene/gui/edit/transcribe.py
index 0fc3aed..edadbce 100644
--- a/lib/advene/gui/edit/transcribe.py
+++ b/lib/advene/gui/edit/transcribe.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,21 +18,24 @@
 #
 """Transcription view.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import sys
 import re
 import os
 import operator
 
-import gtk
-import pango
+from gi.repository import Gdk
+from gi.repository import Gtk
+from gi.repository import Pango
 
 try:
-    import gtksourceview2
+    from gi.repository import GtkSource
 except ImportError:
-    gtksourceview2=None
+    GtkSource=None
 
-import urllib
+import urllib.request, urllib.parse, urllib.error
 
 import advene.core.config as config
 
@@ -84,7 +87,6 @@ class TranscriptionEdit(AdhocView):
         self.contextual_actions = (
             (_("Save view"), self.save_view),
             (_("Save default options"), self.save_default_options),
-            (_("Export as static view"), lambda v, t: self.export_as_static_view()),
             )
 
         self.controller=controller
@@ -136,7 +138,6 @@ class TranscriptionEdit(AdhocView):
                 self.load_transcription(buffer=v)
 
     def get_save_arguments(self):
-        b=self.textview.get_buffer()
         arguments = [ ('text', "".join(self.generate_transcription())) ]
         return self.options, arguments
 
@@ -167,11 +168,11 @@ class TranscriptionEdit(AdhocView):
             size=self.options['font-size']
         if size == 0:
             # Get the default value from a temporary textview
-            t=gtk.TextView()
-            size=t.get_pango_context().get_font_description().get_size() / pango.SCALE
+            t=Gtk.TextView()
+            size=int(t.get_pango_context().get_font_description().get_size() / Pango.SCALE)
             del t
         f=self.textview.get_pango_context().get_font_description()
-        f.set_size(size * pango.SCALE)
+        f.set_size(size * Pango.SCALE)
         self.textview.modify_font(f)
 
     def show_searchbox(self, *p):
@@ -191,7 +192,7 @@ class TranscriptionEdit(AdhocView):
         finished=False
 
         while not finished:
-            res=begin.forward_search(searched, gtk.TEXT_SEARCH_TEXT_ONLY)
+            res=begin.forward_search(searched, Gtk.TextSearchFlags.TEXT_ONLY)
             if not res:
                 finished=True
             else:
@@ -201,28 +202,28 @@ class TranscriptionEdit(AdhocView):
 
     def textview_drag_received(self, widget, context, x, y, selection, targetType, time):
         if targetType == config.data.target_type['timestamp']:
-            data=decode_drop_parameters(selection.data)
-            position=long(data['timestamp'])
-            #(x, y) = self.textview.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT,
+            data=decode_drop_parameters(selection.get_data().decode('utf-8'))
+            position=int(data['timestamp'])
+            #(x, y) = self.textview.get_window()_to_buffer_coords(Gtk.TextWindowType.TEXT,
             #                                               int(x),
             #                                               int(y))
             it=self.textview.get_iter_at_location(x, y)
             if it is None:
                 return False
             # Check that preceding mark.value is lower
-            m, i=self.find_preceding_mark(it)
+            m, i=self.find_preceding_mark(it.iter)
             if m is not None and m.value > position:
                 self.message(_("Invalid timestamp mark"))
                 return False
-            m, i=self.find_following_mark(it)
+            m, i=self.find_following_mark(it.iter)
             if m is not None and m.value < position:
                 self.message(_("Invalid timestamp mark"))
                 return False
             # Create the timestamp
-            self.create_timestamp_mark(position, it)
+            self.create_timestamp_mark(position, it.iter)
 
             # If the drag originated from our own widgets, remove it.
-            source=context.get_source_widget()
+            source=Gtk.drag_get_source_widget(context)
             if source in self.marks:
                 self.remove_timestamp_mark(source)
             return True
@@ -231,7 +232,7 @@ class TranscriptionEdit(AdhocView):
     def can_undo(self):
         try:
             return hasattr(self.textview.get_buffer(), 'can_undo')
-        except AttributeError, e:
+        except AttributeError:
             return False
 
     def undo(self, *p):
@@ -241,27 +242,27 @@ class TranscriptionEdit(AdhocView):
         return True
 
     def build_widget(self):
-        vbox = gtk.VBox()
+        vbox = Gtk.VBox()
 
-        if gtksourceview2 is not None:
-            self.textview=gtksourceview2.View()
-            self.textview.set_buffer(gtksourceview2.Buffer())
+        if GtkSource is not None:
+            self.textview=GtkSource.View()
+            self.textview.set_buffer(GtkSource.Buffer())
         else:
-            self.textview = gtk.TextView()
+            self.textview = Gtk.TextView()
 
         # We could make it editable and modify the annotation
         self.textview.set_editable(True)
-        self.textview.set_wrap_mode (gtk.WRAP_WORD)
+        self.textview.set_wrap_mode (Gtk.WrapMode.WORD)
 
-        hb=gtk.HBox()
-        vbox.pack_start(hb, expand=False)
+        hb=Gtk.HBox()
+        vbox.pack_start(hb, False, True, 0)
         if self.controller.gui:
             self.player_toolbar=self.controller.gui.get_player_control_toolbar()
             hb.add(self.player_toolbar)
         hb.add(self.get_toolbar())
 
-        sw = gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        sw = Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         vbox.add (sw)
 
 
@@ -277,12 +278,11 @@ class TranscriptionEdit(AdhocView):
         self.textview.get_buffer().create_tag("past", background="#dddddd")
         self.textview.get_buffer().create_tag("ignored", strikethrough=True)
 
-        self.textview.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                    gtk.DEST_DEFAULT_HIGHLIGHT |
-                                    gtk.DEST_DEFAULT_ALL,
-                                    config.data.drag_type['timestamp']
-                                    ,
-                                    gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
+        self.textview.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                    Gtk.DestDefaults.HIGHLIGHT |
+                                    Gtk.DestDefaults.ALL,
+                                    config.data.get_target_types('timestamp'),
+                                    Gdk.DragAction.COPY | Gdk.DragAction.MOVE)
         self.textview.connect('drag-data-received', self.textview_drag_received)
 
         # Hook the completer component
@@ -301,7 +301,7 @@ class TranscriptionEdit(AdhocView):
         b.create_tag("current", background="lightblue")
         b.create_tag("searched_string", background="green")
 
-        self.searchbox=gtk.HBox()
+        self.searchbox=Gtk.HBox()
 
         def hide_searchbox(*p):
             # Clear the searched_string tags
@@ -311,39 +311,38 @@ class TranscriptionEdit(AdhocView):
             return True
 
         close_button=get_pixmap_button('small_close.png', hide_searchbox)
-        close_button.set_relief(gtk.RELIEF_NONE)
-        self.searchbox.pack_start(close_button, expand=False, fill=False)
+        close_button.set_relief(Gtk.ReliefStyle.NONE)
+        self.searchbox.pack_start(close_button, False, False, 0)
 
         def search_entry_cb(e):
-            self.highlight_search_forward(unicode(e.get_text()))
+            self.highlight_search_forward(e.get_text())
             return True
 
         def search_entry_key_press_cb(e, event):
-            if event.keyval == gtk.keysyms.Escape:
+            if event.keyval == Gdk.KEY_Escape:
                 hide_searchbox()
                 return True
             return False
 
-        self.searchbox.entry=gtk.Entry()
+        self.searchbox.entry=Gtk.Entry()
         self.searchbox.entry.connect('activate', search_entry_cb)
-        self.searchbox.pack_start(self.searchbox.entry, expand=False, fill=False)
+        self.searchbox.pack_start(self.searchbox.entry, False, False, 0)
         self.searchbox.entry.connect('key-press-event', search_entry_key_press_cb)
 
-        b=get_small_stock_button(gtk.STOCK_FIND)
-        b.connect('clicked', lambda b: self.highlight_search_forward(unicode(self.searchbox.entry.get_text())))
-        self.searchbox.pack_start(b, expand=False)
+        b=get_small_stock_button(Gtk.STOCK_FIND)
+        b.connect('clicked', lambda b: self.highlight_search_forward(self.searchbox.entry.get_text()))
+        self.searchbox.pack_start(b, False, True, 0)
 
-        fill=gtk.HBox()
-        self.searchbox.pack_start(fill, expand=True, fill=True)
+        fill=Gtk.HBox()
+        self.searchbox.pack_start(fill, True, True, 0)
         self.searchbox.show_all()
         self.searchbox.hide()
 
         self.searchbox.set_no_show_all(True)
-        vbox.pack_start(self.searchbox, expand=False)
+        vbox.pack_start(self.searchbox, False, True, 0)
 
-        self.statusbar=gtk.Statusbar()
-        self.statusbar.set_has_resize_grip(False)
-        vbox.pack_start(self.statusbar, expand=False)
+        self.statusbar=Gtk.Statusbar()
+        vbox.pack_start(self.statusbar, False, True, 0)
         vbox.show_all()
 
         return vbox
@@ -388,39 +387,37 @@ class TranscriptionEdit(AdhocView):
     def button_press_event_cb(self, textview, event):
         if not self.options['timestamp']:
             return False
-        if event.state & gtk.gdk.CONTROL_MASK:
+        if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             return False
 
         if self.options['insert-on-single-click']:
-            t=gtk.gdk.BUTTON_PRESS
+            t=Gdk.EventType.BUTTON_PRESS
         else:
-            t=gtk.gdk._2BUTTON_PRESS
+            t=Gdk.EventType._2BUTTON_PRESS
         if not (event.button == 1 and event.type == t):
             return False
-        textwin=textview.get_window(gtk.TEXT_WINDOW_TEXT)
+        textwin=textview.get_window(Gtk.TextWindowType.TEXT)
 
-        if event.window != textwin:
-            print "Event.window: %s" % str(event.window)
-            print "Textwin: %s" % str(textwin)
+        if event.get_window() != textwin:
+            logger.error("Event.get_window(): %s - Textwin: %s", str(event.get_window()), str(textwin))
             return False
 
-        (x, y) = textview.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT,
+        (x, y) = textview.window_to_buffer_coords(Gtk.TextWindowType.TEXT,
                                                   int(event.x),
                                                   int(event.y))
         it=textview.get_iter_at_location(x, y)
         if it is None:
-            print "Error in get_iter_at_location"
+            logger.error("Error in get_iter_at_location")
             return False
 
-        p=self.controller.player
-        if (p.status == p.PlayingStatus or p.status == p.PauseStatus):
+        if self.controller.player.is_playing():
             self.insert_timestamp_mark(it=it)
             return True
         return False
 
     def buffer_is_empty(self):
         b=self.textview.get_buffer()
-        return len(b.get_text(*b.get_bounds())) == 0
+        return len(b.get_text(*b.get_bounds() + (False,))) == 0
 
     def toggle_ignore(self, button):
         button.ignore = not button.ignore
@@ -450,11 +447,7 @@ class TranscriptionEdit(AdhocView):
         """
         timestamp=button.value
         def popup_goto (win, position):
-            c=self.controller
-            pos = c.create_position (value=position,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-            c.update_status (status="set", position=pos)
+            self.controller.update_status(status="seek", position=position)
             return True
 
         def popup_edit(i, button):
@@ -474,15 +467,15 @@ class TranscriptionEdit(AdhocView):
         def popup_modify(win, t):
             timestamp=child.value + t
             child.set_tooltip_text("%s" % helper.format_time(timestamp))
-            # FIXME: find a way to do this in the new gtk.Tooltip API?
+            # FIXME: find a way to do this in the new Gtk.Tooltip API?
             #if self.tooltips.active_tips_data is None:
-            #    button.emit('show-help', gtk.WIDGET_HELP_TOOLTIP)
+            #    button.emit('show-help', Gtk.WIDGET_HELP_TOOLTIP)
             child.value=timestamp
             if self.options['play-on-scroll']:
                 popup_goto(child, timestamp)
             return True
 
-        if event.button == 1 and event.state & gtk.gdk.CONTROL_MASK:
+        if event.button == 1 and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             # Set current video time
             popup_modify(None, self.controller.player.current_position_value - timestamp)
             return True
@@ -491,73 +484,69 @@ class TranscriptionEdit(AdhocView):
             return False
 
         # Create a popup menu for timestamp
-        menu = gtk.Menu()
+        menu = Gtk.Menu()
 
-        item = gtk.MenuItem(_("Position %s") % helper.format_time(timestamp))
+        item = Gtk.MenuItem(_("Position %s") % helper.format_time(timestamp))
         menu.append(item)
 
-        item = gtk.SeparatorMenuItem()
+        item = Gtk.SeparatorMenuItem()
         menu.append(item)
 
-        item = gtk.MenuItem(_("Go to..."))
+        item = Gtk.MenuItem(_("Go to..."))
         item.connect('activate', popup_goto, timestamp)
         menu.append(item)
 
-        item = gtk.MenuItem(_("Edit"))
+        item = Gtk.MenuItem(_("Edit"))
         item.connect('activate', popup_edit, button)
         menu.append(item)
 
-        item = gtk.MenuItem(_("Ignore the following text (toggle)"))
+        item = Gtk.MenuItem(_("Ignore the following text (toggle)"))
         item.connect('activate', popup_ignore, button)
         menu.append(item)
 
-        item = gtk.MenuItem(_("Remove mark"))
+        item = Gtk.MenuItem(_("Remove mark"))
         item.connect('activate', popup_remove)
         menu.append(item)
 
-        item = gtk.MenuItem(_("Reaction-time offset"))
+        item = Gtk.MenuItem(_("Reaction-time offset"))
         item.connect('activate', popup_modify, -self.options['delay'])
         menu.append(item)
 
-        item = gtk.MenuItem(_("-1 sec"))
+        item = Gtk.MenuItem(_("-1 sec"))
         item.connect('activate', popup_modify, -1000)
         menu.append(item)
-        item = gtk.MenuItem(_("-0.5 sec"))
+        item = Gtk.MenuItem(_("-0.5 sec"))
         item.connect('activate', popup_modify, -500)
         menu.append(item)
-        item = gtk.MenuItem(_("-0.1 sec"))
+        item = Gtk.MenuItem(_("-0.1 sec"))
         item.connect('activate', popup_modify, -100)
         menu.append(item)
 
-        item = gtk.MenuItem(_("+1 sec"))
+        item = Gtk.MenuItem(_("+1 sec"))
         item.connect('activate', popup_modify, 1000)
         menu.append(item)
-        item = gtk.MenuItem(_("+0.5 sec"))
+        item = Gtk.MenuItem(_("+0.5 sec"))
         item.connect('activate', popup_modify, 500)
         menu.append(item)
-        item = gtk.MenuItem(_("+0.1 sec"))
+        item = Gtk.MenuItem(_("+0.1 sec"))
         item.connect('activate', popup_modify, 100)
         menu.append(item)
 
         menu.show_all()
 
-        menu.popup(None, None, None, 0, gtk.get_current_event_time())
+        menu.popup_at_pointer(None)
         return True
 
     def create_timestamp_mark(self, timestamp, it):
         def popup_goto (b):
-            c=self.controller
-            pos = c.create_position (value=b.value,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-            c.update_status (status="set", position=pos)
+            self.controller.update_status(status="seek", position=b.value)
             return True
 
         b=self.textview.get_buffer()
         b.begin_user_action()
         anchor=b.create_child_anchor(it)
         # Create the mark representation
-        child=TimestampRepresentation(timestamp, self.controller, width=self.options['snapshot-size'], visible_label=False)
+        child=TimestampRepresentation(timestamp, None, self.controller, width=self.options['snapshot-size'], visible_label=False)
         child.anchor=anchor
         child.connect('clicked', popup_goto)
         child.popup_menu=None
@@ -565,22 +554,22 @@ class TranscriptionEdit(AdhocView):
         b.end_user_action()
 
         def handle_scroll_event(button, event):
-            if not (event.state & gtk.gdk.CONTROL_MASK):
+            if not (event.get_state() & Gdk.ModifierType.CONTROL_MASK):
                 return False
-            if event.state & gtk.gdk.SHIFT_MASK:
+            if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
                 i='second-scroll-increment'
             else:
                 i='scroll-increment'
 
-            if event.direction == gtk.gdk.SCROLL_DOWN or event.direction == gtk.gdk.SCROLL_RIGHT:
+            if event.direction == Gdk.ScrollDirection.DOWN or event.direction == Gdk.ScrollDirection.RIGHT:
                 button.value -= config.data.preferences[i]
-            elif event.direction == gtk.gdk.SCROLL_UP or event.direction == gtk.gdk.SCROLL_LEFT:
+            elif event.direction == Gdk.ScrollDirection.UP or event.direction == Gdk.ScrollDirection.LEFT:
                 button.value += config.data.preferences[i]
 
                 button.set_tooltip_text("%s" % helper.format_time(button.value))
-            # FIXME: find a way to do this in the new gtk.Tooltip API?
+            # FIXME: find a way to do this in the new Gtk.Tooltip API?
             #if self.tooltips.active_tips_data is None:
-            #    button.emit('show-help', gtk.WIDGET_HELP_TOOLTIP)
+            #    button.emit('show-help', Gtk.WIDGET_HELP_TOOLTIP)
             self.timestamp_play = button.value
             button.grab_focus()
             return True
@@ -589,7 +578,7 @@ class TranscriptionEdit(AdhocView):
             """Handler for key release on timestamp mark.
             """
             # Control key released. Goto the position if we were scrolling a mark
-            if self.timestamp_play is not None and (event.state & gtk.gdk.CONTROL_MASK):
+            if self.timestamp_play is not None and (event.get_state() & Gdk.ModifierType.CONTROL_MASK):
                 # self.timestamp_play contains the new value, but child.timestamp
                 # as well. So we can use popup_goto
                 self.timestamp_play = None
@@ -630,7 +619,7 @@ class TranscriptionEdit(AdhocView):
                 pass
             it=b.get_iter_at_mark(b.get_insert())
             self.create_timestamp_mark(begin, it)
-            b.insert_at_cursor(unicode(a.content.data))
+            b.insert_at_cursor(str(a.content.data))
             it=b.get_iter_at_mark(b.get_insert())
             self.create_timestamp_mark(end, it)
             last_end=end
@@ -668,34 +657,21 @@ class TranscriptionEdit(AdhocView):
         c=self.controller
         if self.current_mark is None:
             if self.marks:
-                pos = c.create_position (value=self.marks[0].value,
-                                         key=c.player.MediaTime,
-                                         origin=c.player.AbsolutePosition)
-                c.update_status (status="set", position=pos)
+                c.update_status(status="seek", position=self.marks[0].value)
         else:
             i=self.marks.index(self.current_mark) - 1
             m=self.marks[i]
-            pos = c.create_position (value=m.value,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-            c.update_status (status="set", position=pos)
+            c.update_status(status="seek", position=m.value)
         return True
 
     def goto_next_mark(self):
-        c=self.controller
         if self.current_mark is None:
             if self.marks:
-                pos = c.create_position (value=self.marks[-1].value,
-                                         key=c.player.MediaTime,
-                                         origin=c.player.AbsolutePosition)
-                c.update_status (status="set", position=pos)
+                self.controller.update_status(status="seek", position=self.marks[-1].value)
         else:
             i=(self.marks.index(self.current_mark) + 1) % len(self.marks)
             m=self.marks[i]
-            pos = c.create_position (value=m.value,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-            c.update_status (status="set", position=pos)
+            self.controller.update_status(status="seek", position=m.value)
         return True
 
     def update_position(self, pos):
@@ -714,7 +690,7 @@ class TranscriptionEdit(AdhocView):
                 if it is not None:
                     b.apply_tag_by_name('past', begin, it)
                     if self.options['autoscroll']:
-                        self.textview.scroll_to_iter(it, 0.3)
+                        self.textview.scroll_to_iter(it, 0.3, False, 0, 0)
                 self.current_mark = cm
         else:
             if self.current_mark is not None:
@@ -762,7 +738,7 @@ class TranscriptionEdit(AdhocView):
                     self.log(_('Invalid timestamp mark in conversion: %s') % helper.format_time_reference(timestamp))
                     t=timestamp
                     continue
-                text=unicode(b.get_text(begin, end, include_hidden_chars=False))
+                text=b.get_text(begin, end, include_hidden_chars=False)
                 if strip_blank:
                     text=text.rstrip().lstrip()
                 if self.empty_re.match(text) and not self.options['empty-annotations']:
@@ -783,7 +759,7 @@ class TranscriptionEdit(AdhocView):
                 begin=end.copy()
         # End of buffer. Create the last annotation
         timestamp=self.controller.cached_duration
-        text=unicode(b.get_text(begin, end, include_hidden_chars=False))
+        text=b.get_text(begin, end, include_hidden_chars=False)
         if self.empty_re.match(text) or ignore_next:
             # Last timestsamp mark
             pass
@@ -826,7 +802,7 @@ class TranscriptionEdit(AdhocView):
                 # Found a TextAnchor
                 child=a.get_widgets()[0]
 
-                text=unicode(b.get_text(begin, end, include_hidden_chars=False)).replace('\n', '<br />')
+                text=b.get_text(begin, end, include_hidden_chars=False).replace('\n', '<br />')
                 if ignore_next:
                     res.extend( ('<strike>', text, '</strike>') )
                 else:
@@ -837,7 +813,7 @@ class TranscriptionEdit(AdhocView):
                 begin=end.copy()
 
         # End of buffer.
-        text=unicode(b.get_text(begin, end, include_hidden_chars=False)).replace('\n', '<br />')
+        text=b.get_text(begin, end, include_hidden_chars=False).replace('\n', '<br />')
         if ignore_next:
             res.extend( ('<strike>', text, '</strike>') )
         else:
@@ -855,12 +831,12 @@ class TranscriptionEdit(AdhocView):
         else:
             # Use current movie filename as basename
             default_name='transcribe.txt'
-            l=self.controller.player.playlist_get_list()
-            if l:
-                default_name=os.path.splitext(os.path.basename(l[0]))[0] + ".txt"
+            uri = self.controller.player.get_uri()
+            if uri:
+                default_name=os.path.splitext(os.path.basename(uri))[0] + ".txt"
             fname=dialog.get_filename(title= ("Save transcription to..."),
-                                               action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                               button=gtk.STOCK_SAVE,
+                                               action=Gtk.FileChooserAction.SAVE,
+                                               button=Gtk.STOCK_SAVE,
                                                default_dir=config.data.path['data'],
                                                default_file=default_name
                                                )
@@ -873,14 +849,13 @@ class TranscriptionEdit(AdhocView):
             # No extension was given. Add '.txt'
             filename=filename+'.txt'
         try:
-            f=open(filename, "w")
-        except IOError, e:
+            with open(filename, "w", encoding='utf-8') as f:
+                f.writelines(self.generate_transcription())
+        except IOError as e:
             dialog.message_dialog(
-                _("Cannot save the file: %s") % unicode(e),
-                icon=gtk.MESSAGE_ERROR)
+                _("Cannot save the file: %s") % str(e),
+                icon=Gtk.MessageType.ERROR)
             return True
-        f.writelines(self.generate_transcription())
-        f.close()
         self.message(_("Transcription saved to %s") % filename)
         self.sourcefile=filename
         return True
@@ -888,7 +863,7 @@ class TranscriptionEdit(AdhocView):
     def load_transcription_cb(self, button=None):
         if not self.buffer_is_empty():
             if not dialog.message_dialog(_("This will overwrite the current textual content. Are you sure?"),
-                                                  icon=gtk.MESSAGE_QUESTION):
+                                                  icon=Gtk.MessageType.QUESTION):
                 return True
         fname=dialog.get_filename(title=_("Select transcription file to load"),
                                            default_dir=config.data.path['data'])
@@ -902,29 +877,21 @@ class TranscriptionEdit(AdhocView):
                 if re.match('[a-zA-Z]:', filename):
                     # Windows drive: notation. Convert it to
                     # a more URI-compatible syntax
-                    fname=urllib.pathname2url(filename)
+                    fname=urllib.request.pathname2url(filename)
                 else:
                     fname=filename
-                f=urllib.urlopen(fname)
-            except IOError, e:
+                f=urllib.request.urlopen(fname)
+            except IOError as e:
                 self.message(_("Cannot open %(filename)s: %(error)s") % {'filename': filename,
-                                                                         'error': unicode(e) })
+                                                                         'error': str(e) })
                 return
-            lines="".join(f.readlines())
+            data="".join(f.readlines())
             f.close()
         else:
-            lines=buffer
+            data=buffer
 
-        try:
-            data=unicode(lines)
-        except UnicodeDecodeError:
-            # Try UTF-16, which is used in quicktime text format
-            try:
-                data=unicode(lines, 'utf16')
-            except UnicodeDecodeError:
-                # Fallback on latin1, which is very common, but may
-                # sometimes fail
-                data=unicode(lines, 'latin1')
+        if isinstance(data, bytes):
+            data = data.decode('utf-8')
 
         b=self.textview.get_buffer()
         begin,end=b.get_bounds()
@@ -978,7 +945,7 @@ class TranscriptionEdit(AdhocView):
 
         if not self.buffer_is_empty():
             if not dialog.message_dialog(_("This will overwrite the current textual content. Are you sure?"),
-                                                  icon=gtk.MESSAGE_QUESTION):
+                                                  icon=Gtk.MessageType.QUESTION):
                 return True
 
         b=self.textview.get_buffer()
@@ -988,15 +955,15 @@ class TranscriptionEdit(AdhocView):
         al=at.annotations
         al.sort(key=lambda a: a.fragment.begin)
 
-        last_time=None
+        last_time=-1
 
         for a in al:
             if a.fragment.begin > last_time:
                 it=b.get_iter_at_mark(b.get_insert())
-                mark=self.create_timestamp_mark(a.fragment.begin, it)
+                self.create_timestamp_mark(a.fragment.begin, it)
             b.insert_at_cursor(a.content.data)
             it=b.get_iter_at_mark(b.get_insert())
-            mark=self.create_timestamp_mark(a.fragment.end, it)
+            self.create_timestamp_mark(a.fragment.end, it)
             last_time = a.fragment.end
         return True
 
@@ -1005,21 +972,21 @@ class TranscriptionEdit(AdhocView):
             self.message(_("Cannot convert the data: no associated package"))
             return True
 
-        d = gtk.Dialog(title=_("Converting transcription"),
-                       parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                                 gtk.STOCK_OK, gtk.RESPONSE_OK,
+        d = Gtk.Dialog(title=_("Converting transcription"),
+                       parent=self.controller.gui.gui.win,
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+                                 Gtk.STOCK_OK, Gtk.ResponseType.OK,
                                  ))
-        l=gtk.Label(_("Choose the annotation-type where to create annotations.\n"))
+        l=Gtk.Label(label=_("Choose the annotation-type where to create annotations.\n"))
         l.set_line_wrap(True)
         l.show()
-        d.vbox.pack_start(l, expand=False)
+        d.vbox.pack_start(l, False, True, 0)
 
         # Anticipated declaration of some widgets, which need to be
         # updated in the handle_new_type_selection callback.
-        new_type_dialog=gtk.VBox()
-        delete_existing_toggle=gtk.CheckButton(_("Delete existing annotations in this type"))
+        new_type_dialog=Gtk.VBox()
+        delete_existing_toggle=Gtk.CheckButton(_("Delete existing annotations in this type"))
         delete_existing_toggle.set_active(False)
 
         ats=list(self.controller.package.annotationTypes)
@@ -1041,44 +1008,44 @@ class TranscriptionEdit(AdhocView):
                                                    callback=handle_new_type_selection,
                                                    preselect=self.controller.package.get_element_by_id(self.options['annotation-type-id']))
 
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Select type") + " "), expand=False)
-        hb.pack_start(type_selection, expand=False)
-        d.vbox.pack_start(hb, expand=False)
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Select type") + " "), False, False, 0)
+        hb.pack_start(type_selection, False, True, 0)
+        d.vbox.pack_start(hb, False, True, 0)
 
-        l=gtk.Label(_("You want to create a new type. Please specify its schema and title."))
+        l=Gtk.Label(label=_("You want to create a new type. Please specify its schema and title."))
         l.set_line_wrap(True)
         l.show()
-        new_type_dialog.pack_start(l, expand=False)
+        new_type_dialog.pack_start(l, False, True, 0)
 
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Title") + " "), expand=False)
-        new_title=gtk.Entry()
-        hb.pack_start(new_title)
-        new_type_dialog.pack_start(hb, expand=False)
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Title") + " "), False, False, 0)
+        new_title=Gtk.Entry()
+        hb.pack_start(new_title, True, True, 0)
+        new_type_dialog.pack_start(hb, False, True, 0)
 
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Containing schema") + " "), expand=False)
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Containing schema") + " "), False, False, 0)
         schemas=list(self.controller.package.schemas)
         schema_selection=dialog.list_selector_widget(members=[ (s, self.controller.get_title(s)) for s in schemas])
-        hb.pack_start(schema_selection, expand=False)
-        new_type_dialog.pack_start(hb, expand=False)
+        hb.pack_start(schema_selection, False, True, 0)
+        new_type_dialog.pack_start(hb, False, True, 0)
 
         new_type_dialog.show_all()
         new_type_dialog.set_no_show_all(True)
         new_type_dialog.hide()
 
-        d.vbox.pack_start(new_type_dialog)
+        d.vbox.pack_start(new_type_dialog, True, True, 0)
 
-        l=gtk.Label()
+        l=Gtk.Label()
         l.set_markup("<b>" + _("Export options") + "</b>")
-        d.vbox.pack_start(l, expand=False)
+        d.vbox.pack_start(l, False, True, 0)
 
-        d.vbox.pack_start(delete_existing_toggle, expand=False)
+        d.vbox.pack_start(delete_existing_toggle, False, True, 0)
 
-        empty_contents_toggle=gtk.CheckButton(_("Generate annotations for empty contents"))
+        empty_contents_toggle=Gtk.CheckButton(_("Generate annotations for empty contents"))
         empty_contents_toggle.set_active(self.options['empty-annotations'])
-        d.vbox.pack_start(empty_contents_toggle, expand=False)
+        d.vbox.pack_start(empty_contents_toggle, False, True, 0)
 
         d.connect('key-press-event', dialog.dialog_keypressed_cb)
 
@@ -1088,10 +1055,10 @@ class TranscriptionEdit(AdhocView):
         finished=None
         while not finished:
             res=d.run()
-            if res == gtk.RESPONSE_OK:
+            if res == Gtk.ResponseType.OK:
                 at=type_selection.get_current_element()
                 if at == newat:
-                    new_type_title=unicode(new_title.get_text())
+                    new_type_title=new_title.get_text()
                     if new_type_title == '':
                         # Empty title. Generate one.
                         id_=self.controller.package._idgenerator.get_id(AnnotationType)
@@ -1102,7 +1069,7 @@ class TranscriptionEdit(AdhocView):
                         if self.controller.package._idgenerator.exists(id_):
                             dialog.message_dialog(
                                 _("The %s identifier already exists. Choose another one.") % id_,
-                                icon=gtk.MESSAGE_WARNING)
+                                icon=Gtk.MessageType.WARNING)
                             at=None
                             continue
                     # Creating a new type
@@ -1112,7 +1079,7 @@ class TranscriptionEdit(AdhocView):
                     at.date=self.controller.get_timestamp()
                     at.title=new_type_title
                     at.mimetype='text/plain'
-                    at.setMetaData(config.data.namespace, 'color', s.rootPackage._color_palette.next())
+                    at.setMetaData(config.data.namespace, 'color', next(s.rootPackage._color_palette))
                     at.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
                     s.annotationTypes.append(at)
                     self.controller.notify('AnnotationTypeCreate', annotationtype=at)
@@ -1158,7 +1125,7 @@ class TranscriptionEdit(AdhocView):
             self.set_snapshot_scale(s)
             return True
 
-        m=gtk.Menu()
+        m=Gtk.Menu()
         for size, label in (
             ( 8, _("Smallish")),
             (16, _("Small")),
@@ -1167,46 +1134,46 @@ class TranscriptionEdit(AdhocView):
             (64, _("Larger")),
             (128, _("Huge")),
             ):
-            i=gtk.MenuItem(label)
+            i=Gtk.MenuItem(label)
             i.connect('activate', set_scale, size)
             m.append(i)
         m.show_all()
-        m.popup(None, None, None, 0, gtk.get_current_event_time())
+        m.popup(None, None, None, 0, Gtk.get_current_event_time())
         return True
 
     def get_toolbar(self):
-        tb=gtk.Toolbar()
-        tb.set_style(gtk.TOOLBAR_ICONS)
+        tb=Gtk.Toolbar()
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
 
         def center_on_current(*p):
             # Make sure that the current mark is visible
             if self.current_mark is not None:
                 it=self.textview.get_buffer().get_iter_at_child_anchor(self.current_mark.anchor)
                 if it:
-                    self.textview.scroll_to_iter(it, 0.2)
+                    self.textview.scroll_to_iter(it, 0.2, False, 0, 0)
             return True
 
         tb_list = (
-            (_("Open"),    _("Open"), gtk.STOCK_OPEN, self.load_transcription_cb),
-            (_("Save"),    _("Save"), gtk.STOCK_SAVE, self.save_transcription_cb),
-            (_("Save As"), _("Save As"), gtk.STOCK_SAVE_AS, self.save_as_cb),
-            (_("Import"), _("Import from annotations"), gtk.STOCK_EXECUTE, self.import_annotations_cb),
-            (_("Convert"), _("Convert to annotations"), gtk.STOCK_CONVERT, self.convert_transcription_cb),
-            (_("Preferences"), _("Preferences"), gtk.STOCK_PREFERENCES, self.edit_preferences),
-            (_("Center"), _("Center on the current mark"), gtk.STOCK_JUSTIFY_CENTER, center_on_current),
-            (_("Find"), _("Search a string"), gtk.STOCK_FIND, self.show_searchbox),
-            (_("Scale"), _("Set the size of snaphots"), gtk.STOCK_FULLSCREEN, self.scale_snaphots_menu),
+            (_("Open"),    _("Open"), Gtk.STOCK_OPEN, self.load_transcription_cb),
+            (_("Save"),    _("Save"), Gtk.STOCK_SAVE, self.save_transcription_cb),
+            (_("Save As"), _("Save As"), Gtk.STOCK_SAVE_AS, self.save_as_cb),
+            (_("Import"), _("Import from annotations"), Gtk.STOCK_EXECUTE, self.import_annotations_cb),
+            (_("Convert"), _("Convert to annotations"), Gtk.STOCK_CONVERT, self.convert_transcription_cb),
+            (_("Preferences"), _("Preferences"), Gtk.STOCK_PREFERENCES, self.edit_preferences),
+            (_("Center"), _("Center on the current mark"), Gtk.STOCK_JUSTIFY_CENTER, center_on_current),
+            (_("Find"), _("Search a string"), Gtk.STOCK_FIND, self.show_searchbox),
+            (_("Scale"), _("Set the size of snaphots"), Gtk.STOCK_FULLSCREEN, self.scale_snaphots_menu),
             )
 
         for text, tooltip, icon, callback in tb_list:
-            b=gtk.ToolButton(label=text)
+            b=Gtk.ToolButton(label=text)
             b.set_stock_id(icon)
             b.set_tooltip_text(tooltip)
             b.connect('clicked', callback)
             tb.insert(b, -1)
 
         if self.can_undo():
-            b=gtk.ToolButton(gtk.STOCK_UNDO)
+            b=Gtk.ToolButton(Gtk.STOCK_UNDO)
             b.connect('clicked', lambda i: self.undo())
             b.set_tooltip_text(_("Undo"))
             tb.insert(b, -1)
@@ -1216,16 +1183,16 @@ class TranscriptionEdit(AdhocView):
             self.options[option_name]=t.get_active()
             return True
 
-        b=gtk.ToggleToolButton(gtk.STOCK_JUMP_TO)
+        b=Gtk.ToggleToolButton(Gtk.STOCK_JUMP_TO)
         b.set_active(self.options['autoscroll'])
         b.set_tooltip_text(_("Automatically scroll to the mark position when playing"))
         b.connect('toggled', handle_toggle, 'autoscroll')
         b.set_label(_("Autoscroll"))
         tb.insert(b, -1)
 
-        i=gtk.Image()
+        i=Gtk.Image()
         i.set_from_file(config.data.advenefile( ( 'pixmaps', 'clock.png') ))
-        b=gtk.ToggleToolButton()
+        b=Gtk.ToggleToolButton()
         b.set_icon_widget(i)
         b.set_label(_("Autoinsert"))
         b.set_active(self.options['autoinsert'])
@@ -1245,27 +1212,27 @@ class TranscriptionEdit(AdhocView):
         if c.gui and c.gui.process_player_shortcuts(win, event):
             return True
 
-        if event.state & gtk.gdk.CONTROL_MASK:
-            if event.keyval == gtk.keysyms.Return:
+        if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
+            if event.keyval == Gdk.KEY_Return:
                 # Insert current timestamp mark
-                if p.status == p.PlayingStatus or p.status == p.PauseStatus:
-                    if event.state & gtk.gdk.SHIFT_MASK:
+                if p.is_playing():
+                    if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
                         # If Shift is held, pause/resume the video
                         c.update_status("pause")
                     self.insert_timestamp_mark()
                 return True
-            elif event.keyval == gtk.keysyms.Page_Down:
+            elif event.keyval == Gdk.KEY_Page_Down:
                 self.goto_next_mark()
                 return True
-            elif event.keyval == gtk.keysyms.Page_Up:
+            elif event.keyval == Gdk.KEY_Page_Up:
                 self.goto_previous_mark()
                 return True
-            elif event.keyval == gtk.keysyms.c:
+            elif event.keyval == Gdk.KEY_c and event.get_state() & Gdk.ModifierType.SHIFT_MASK:
                 self.convert_transcription_cb()
                 return True
         elif self.options['autoinsert'] and self.options['automatic-mark-insertion-delay']:
-            if (gtk.gdk.keyval_to_unicode(event.keyval)
-                and event.keyval != gtk.keysyms.space
+            if (Gdk.keyval_to_unicode(event.keyval)
+                and event.keyval != Gdk.KEY_space
                 and (event.time - self.last_keypress_time >= self.options['automatic-mark-insertion-delay'])):
                 # Insert a mark if the user pressed a character key, except space
                 # Is there any text after the cursor ? If so, do not insert the mark
@@ -1292,16 +1259,17 @@ class TranscriptionEdit(AdhocView):
         return False
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
     if len(sys.argv) < 2:
-        print "Should provide a package name"
+        logger.error("Should provide a package name")
         sys.exit(1)
 
     class DummyController:
         def log(self, *p):
-            print p
+            logger.error(p)
 
         def notify(self, *p, **kw):
-            print "Notify %s %s" % (p, kw)
+            logger.info("Notify %s %s", p, kw)
 
 
     controller=DummyController()
@@ -1321,7 +1289,7 @@ if __name__ == "__main__":
 
     window = transcription.popup()
 
-    window.connect('destroy', lambda e: gtk.main_quit())
+    window.connect('destroy', lambda e: Gtk.main_quit())
 
-    gtk.main ()
+    Gtk.main ()
 
diff --git a/lib/advene/gui/evaluator.py b/lib/advene/gui/evaluator.py
old mode 100644
new mode 100755
index fc8fc32..2873df3
--- a/lib/advene/gui/evaluator.py
+++ b/lib/advene/gui/evaluator.py
@@ -1,6 +1,7 @@
+#! /usr/bin/env python3
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,21 +19,21 @@
 #
 """Python expression evaluator.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import os
 import time
-try:
-    import StringIO
-except ImportError:
-    import io as StringIO
+import io
 import traceback
-import gtk
-import gobject
+import gi
+gi.require_version('Gtk', '3.0')
+gi.require_version('Gdk', '3.0')
+from gi.repository import Gdk
+from gi.repository import Gtk
+from gi.repository import GObject
 import re
-try:
-    import builtins
-except ImportError: # python2.*
-    import __builtin__ as builtins
+import builtins
 import inspect
 import collections
 
@@ -85,20 +86,20 @@ class Evaluator:
         self.history_index = None
 
         self.control_shortcuts = {
-            gtk.keysyms.w: self.close,
-            gtk.keysyms.b: self.add_bookmark,
-            gtk.keysyms.space: self.display_bookmarks,
-            gtk.keysyms.l: self.clear_expression,
-            gtk.keysyms.f: lambda: self.fill_method_parameters(),
-            gtk.keysyms.d: lambda: self.display_completion(completeprefix=False),
-            gtk.keysyms.h: lambda: self.display_info(self.get_selection_or_cursor(), typ="doc"),
-            gtk.keysyms.H: lambda: self.display_info(self.get_selection_or_cursor(), typ="source"),
-            gtk.keysyms.Return: self.evaluate_expression,
-            gtk.keysyms.s: self.save_output_cb,
-            gtk.keysyms.n: self.next_entry,
-            gtk.keysyms.p: self.previous_entry,
-            gtk.keysyms.Page_Down: lambda: self.scroll_output(+1),
-            gtk.keysyms.Page_Up: lambda: self.scroll_output(-1),
+            Gdk.KEY_w: self.close,
+            Gdk.KEY_b: self.add_bookmark,
+            Gdk.KEY_space: self.display_bookmarks,
+            Gdk.KEY_l: self.clear_expression,
+            Gdk.KEY_f: lambda: self.fill_method_parameters(),
+            Gdk.KEY_d: lambda: self.display_completion(completeprefix=False),
+            Gdk.KEY_h: lambda: self.display_info(self.get_selection_or_cursor(), typ="doc"),
+            Gdk.KEY_H: lambda: self.display_info(self.get_selection_or_cursor(), typ="source"),
+            Gdk.KEY_Return: self.evaluate_expression,
+            Gdk.KEY_s: self.save_output_cb,
+            Gdk.KEY_n: self.next_entry,
+            Gdk.KEY_p: self.previous_entry,
+            Gdk.KEY_Page_Down: lambda: self.scroll_output(+1),
+            Gdk.KEY_Page_Up: lambda: self.scroll_output(-1),
             }
 
         self.widget=self.build_widget()
@@ -138,7 +139,7 @@ class Evaluator:
         if name is None:
             return res
         try:
-            f=open(name, 'r')
+            f=open(name, 'r', encoding='utf-8')
         except IOError:
             return []
         for l in f:
@@ -152,7 +153,7 @@ class Evaluator:
         if name is None:
             return
         try:
-            f=open(name, 'w')
+            f=open(name, 'w', encoding='utf-8')
         except IOError:
             return []
         for l in data:
@@ -168,9 +169,9 @@ class Evaluator:
         """
         self.save_history()
 
-        if isinstance(self.widget.parent, gtk.Window):
+        if isinstance(self.widget.get_parent(), Gtk.Window):
             # Embedded in a toplevel window
-            self.widget.parent.destroy()
+            self.widget.get_parent().destroy()
         else:
             # Embedded in another component, just destroy the widget
             self.widget.destroy()
@@ -185,28 +186,26 @@ class Evaluator:
 
     def scroll_output(self, d):
         a=self.resultscroll.get_vadjustment()
-        new=a.value + d * a.page_increment
-        if  new >= 0 and new < a.upper:
-            a.value=new
+        new=a.get_property("value") + d * a.get_property("page_increment")
+        if new < 0:
+            new = 0
+        if new < a.get_property("upper"):
+            a.set_property("value", new)
         a.value_changed ()
         return True
 
     def save_output_cb(self, *p, **kw):
         """Callback for save output functionality.
         """
-        fs = gtk.FileSelection ("Save output to...")
-
-        def close_and_save(button, fs):
-            """Save the output and close the fileselector dialog.
-            """
+        fs = Gtk.FileChooserDialog ("Save output to...",
+                                    self.widget.get_toplevel(),
+                                    Gtk.FileChooserAction.SAVE,
+                                    ("_Cancel", Gtk.ResponseType.CANCEL,
+                                     "_Save", Gtk.ResponseType.ACCEPT))
+        ret = fs.run()
+        if ret == Gtk.ResponseType.ACCEPT:
             self.save_output(filename=fs.get_filename())
-            fs.destroy()
-            return True
-
-        fs.ok_button.connect_after ('clicked', close_and_save, fs)
-        fs.cancel_button.connect('clicked', lambda win: fs.destroy ())
-
-        fs.show ()
+        fs.destroy()
         return True
 
     def save_output(self, filename=None):
@@ -214,8 +213,8 @@ class Evaluator:
         """
         b=self.output.get_buffer()
         begin,end=b.get_bounds()
-        out=str(b.get_text(begin, end))
-        f=open(filename, "w")
+        out=b.get_text(begin, end, False)
+        f=open(filename, "w", encoding='utf-8')
         f.write(out)
         f.close()
         self.status_message("Output saved to %s" % filename)
@@ -225,7 +224,12 @@ class Evaluator:
         """Return the content of the expression window.
         """
         b=self.source.get_buffer()
-        return str(b.get_text(*b.get_bounds()))
+        if b.get_selection_bounds():
+            begin, end = b.get_selection_bounds()
+            b.place_cursor(end)
+        else:
+            begin,end=b.get_bounds()
+        return b.get_text(begin, end, False)
 
     def set_expression(self, e, clear=True):
         """Set the content of the expression window.
@@ -253,6 +257,8 @@ class Evaluator:
         end=b.get_bounds()[1]
         b.place_cursor(end)
         for l in p:
+            if not isinstance(l, str):
+                l = str(l, 'utf-8')
             b.insert_at_cursor(l)
         return True
 
@@ -347,7 +353,7 @@ class Evaluator:
                 else:
                     self.log("Cannot get source for %s" % expr)
         except Exception:
-            f=StringIO.StringIO()
+            f=io.StringIO()
             traceback.print_exc(file=f)
             self.clear_output()
             self.log("Error in fetching %s for %s:\n\n" % (typ, expr))
@@ -361,28 +367,29 @@ class Evaluator:
         If a part of the expression is selected, then evaluate only
         the selection.
         """
-        b=self.source.get_buffer()
-        if b.get_selection_bounds():
-            begin, end = b.get_selection_bounds()
-            b.place_cursor(end)
-        else:
-            begin,end=b.get_bounds()
-        expr=str(b.get_text(begin, end))
+        expr = self.get_expression()
         if (not self.history) or self.history[-1] != expr:
             self.history.append(expr)
         symbol=None
 
-        m=re.match('import\s+(\S+)', expr)
+        silent_mode = expr.startswith('@')
+        expr = expr.lstrip('@')
+
+        m=re.match('(from\s+(\S+)\s+)?import\s+(\S+)(\s+as\s+(\S+))?', expr)
         if m is not None:
-            modname=m.group(1)
+            modname = m.group(2)
+            symname = m.group(3)
+            alias = m.group(5) or symname or modname
+            if modname and symname:
+                modname = '.'.join((modname, symname))
             self.clear_output()
             try:
-                mod=__import__(modname)
-                self.globals_[modname]=mod
-                self.log("Successfully imported %s" % modname)
+                mod = __import__(modname or symname)
+                self.globals_[alias]=mod
+                self.log("Successfully imported %s as %s" % (modname or symname, alias))
             except ImportError:
                 self.log("Cannot import module %s:" % modname)
-                f=StringIO.StringIO()
+                f=io.StringIO()
                 traceback.print_exc(file=f)
                 self.log(f.getvalue())
                 f.close()
@@ -400,11 +407,16 @@ class Evaluator:
             t0=time.time()
             res=eval(expr, self.globals_, self.locals_)
             self.status_message("Execution time: %f s" % (time.time() - t0))
-            self.clear_output()
-            try:
-                self.log(str(res))
-            except UnicodeDecodeError:
-                self.log(str(repr(res)))
+            if not silent_mode:
+                self.clear_output()
+                try:
+                    view = str(res)
+                except UnicodeDecodeError:
+                    view = str(repr(res))
+                try:
+                    self.log(view)
+                except Exception as e:
+                    self.log("Exception in result visualisation: ", str(e))
             if symbol is not None:
                 if not '.' in symbol and not symbol.endswith(']'):
                     self.log('\n\n[Value stored in %s]' % symbol)
@@ -437,7 +449,7 @@ class Evaluator:
                         self.log('\n\n[Value stored in %s]' % symbol)
 
         except Exception as e:
-            f=StringIO.StringIO()
+            f=io.StringIO()
             traceback.print_exc(file=f)
             self.clear_output()
             self.log(f.getvalue())
@@ -461,15 +473,7 @@ class Evaluator:
     def display_completion(self, completeprefix=True):
         """Display the completion.
         """
-        b=self.source.get_buffer()
-        if b.get_selection_bounds():
-            begin, end = b.get_selection_bounds()
-            cursor=end
-            b.place_cursor(end)
-        else:
-            begin,end=b.get_bounds()
-            cursor=b.get_iter_at_mark(b.get_insert())
-        expr=str(b.get_text(begin, cursor))
+        expr = self.get_selection_or_cursor().lstrip('@')
         if expr.endswith('.'):
             expr=expr[:-1]
             trailingdot=True
@@ -519,7 +523,7 @@ class Evaluator:
                                      for a in dir(res)
                                      if a.startswith(attr) ]
                     except Exception as e:
-                        print("Exception when trying to complete attribute for %s starting with %s:\n%s" % (expr, attr, e))
+                        logger.error("Exception when trying to complete attribute for %s starting with %s:\n%s", expr, attr, e)
                         self.status_message("Completion exception for %s starting with %s" % (expr, attr))
                     if completion and attr == '':
                         # Do not display private elements by default.
@@ -535,15 +539,15 @@ class Evaluator:
                         try:
                             o=eval(obj, self.globals_, self.locals_)
                             completion=[ k
-                                         for k in o.keys()
+                                         for k in list(o.keys())
                                          if k.startswith(key) ]
                         except Exception as e:
-                            print("Exception when trying to complete dict key for %s starting with %s:\n%s" % (expr, attr, e))
+                            logger.error("Exception when trying to complete dict key for %s starting with %s:\n%s", expr, attr, e)
                             self.status_message("Completion exception for %s starting with %s" % (expr, attr))
 
         self.clear_output()
         if completion is None:
-            f=StringIO.StringIO()
+            f=io.StringIO()
             traceback.print_exc(file=f)
             self.log(f.getvalue())
             f.close()
@@ -555,6 +559,7 @@ class Evaluator:
                 element = self.commonprefix(completion)
 
             if element != "":
+                b = self.source.get_buffer()
                 # Got one completion. We can complete the buffer.
                 if attr is not None:
                     element=element.replace(attr, "", 1)
@@ -574,15 +579,7 @@ class Evaluator:
     def fill_method_parameters(self):
         """Fill the parameter names for the method before cursor.
         """
-        b=self.source.get_buffer()
-        if b.get_selection_bounds():
-            begin, end = b.get_selection_bounds()
-            cursor=end
-            b.place_cursor(end)
-        else:
-            begin,end=b.get_bounds()
-            cursor=b.get_iter_at_mark(b.get_insert())
-        expr=str(b.get_text(begin, cursor))
+        expr = self.get_selection_or_cursor().lstrip('@')
 
         m=re.match('.+[=\(\[\s](.+?)$', expr)
         if m:
@@ -615,6 +612,8 @@ class Evaluator:
             args=re.findall('\((.*?)\)', res.__doc__.splitlines()[0])
 
         if args is not None:
+            b = self.source.get_buffer()
+            cursor=b.get_iter_at_mark(b.get_insert())
             beginmark=b.create_mark(None, cursor, True)
             b.insert_at_cursor("(%s)" % ", ".join(args))
             it=b.get_iter_at_mark(beginmark)
@@ -637,54 +636,54 @@ class Evaluator:
         else:
             cursor=b.get_iter_at_mark(b.get_insert())
             begin=b.get_iter_at_line(cursor.get_line())
-        expr=str(b.get_text(begin, cursor))
+        expr=b.get_text(begin, cursor, False)
         return expr
 
     def make_window(self, widget=None):
         """Built the application window.
         """
-        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
-        vbox=gtk.VBox()
+        window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
+        vbox=Gtk.VBox()
         window.add(vbox)
 
-        window.vbox = gtk.VBox()
+        window.vbox = Gtk.VBox()
         vbox.add(window.vbox)
         if widget:
             window.vbox.add(widget)
 
-        hb=gtk.HButtonBox()
-        b=gtk.Button(stock=gtk.STOCK_CLOSE)
+        hb=Gtk.HButtonBox()
+        b=Gtk.Button("window-close")
         b.connect('clicked', lambda b: window.destroy())
         hb.add(b)
-        vbox.pack_start(hb, expand=False)
+        vbox.pack_start(hb, False, True, 0)
 
         return window
 
     def popup(self, embedded=True):
         """Popup the application window.
         """
-        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+        window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
         window.connect('key-press-event', self.key_pressed_cb)
         window.set_title ("Python evaluation")
 
-        b=gtk.SeparatorToolItem()
+        b=Gtk.SeparatorToolItem()
         b.set_expand(True)
         b.set_draw(False)
         self.toolbar.insert(b, -1)
 
         if embedded:
             # Add the Close button to the toolbar
-            b=gtk.ToolButton(gtk.STOCK_CLOSE)
+            b=Gtk.ToolButton("window-close")
             b.connect('clicked', self.close)
             self.toolbar.insert(b, -1)
-            self.control_shortcuts[gtk.keysyms.w] = self.close
+            self.control_shortcuts[Gdk.KEY_w] = self.close
         else:
             # Add the Quit button to the toolbar
-            b=gtk.ToolButton(gtk.STOCK_QUIT)
+            b=Gtk.ToolButton("window-quit")
             b.connect('clicked', lambda b: window.destroy())
             self.toolbar.insert(b, -1)
-            window.connect('destroy', lambda e: gtk.main_quit())
-            self.control_shortcuts[gtk.keysyms.q] = lambda: gtk.main_quit()
+            window.connect('destroy', lambda e: Gtk.main_quit())
+            self.control_shortcuts[Gdk.KEY_q] = lambda: Gtk.main_quit()
 
         window.add (self.widget)
         window.show_all()
@@ -693,29 +692,44 @@ class Evaluator:
         self.source.grab_focus()
         return window
 
+    def run(self):
+        self.locals_['self'] = self
+        window = self.popup(embedded=False)
+        center_on_mouse(window)
+        self.locals_['w'] = window
+        window.connect('destroy', lambda e: Gtk.main_quit())
+        Gtk.main ()
+        self.save_history()
+
     def status_message(self, m):
         cid=self.statusbar.get_context_id('info')
-        message_id=self.statusbar.push(cid, str(m))
+        self.statusbar.push(cid, str(m))
         # Display the message only 4 seconds
         def undisplay():
             self.statusbar.pop(cid)
             return False
-        gobject.timeout_add(4000, undisplay)
+        GObject.timeout_add(4000, undisplay)
 
     def key_pressed_cb(self, win, event):
         """Handle key press event.
         """
-        if event.keyval == gtk.keysyms.F1:
+        if event.keyval == Gdk.KEY_F1:
             self.help()
             return True
-        if event.keyval == gtk.keysyms.Tab:
+        if event.keyval == Gdk.KEY_Tab:
             self.display_completion()
             return True
 
-        if event.state & gtk.gdk.CONTROL_MASK:
+        if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             action=self.control_shortcuts.get(event.keyval)
             if action:
-                action()
+                try:
+                    action()
+                except Exception:
+                    f=io.StringIO()
+                    traceback.print_exc(file=f)
+                    self.log(f.getvalue())
+                    f.close()
                 return True
 
         return False
@@ -748,13 +762,13 @@ class Evaluator:
             return True
         if not self.bookmarks:
             return True
-        m=gtk.Menu()
+        m=Gtk.Menu()
         for b in reversed(self.bookmarks):
-            i=gtk.MenuItem(b, use_underline=False)
+            i=Gtk.MenuItem(b, use_underline=False)
             i.connect('activate', set_expression, b)
             m.append(i)
         m.show_all()
-        m.popup(None, widget, None, 0, gtk.get_current_event_time())
+        m.popup(None, widget, None, 0, 1, Gtk.get_current_event_time())
         return True
 
     def info(self, *p):
@@ -763,63 +777,73 @@ class Evaluator:
                 self.logbuffer.insert_at_cursor(time.strftime("%H:%M:%S") + l + "\n")
         return True
 
+    def dump_tree(self, w, indent=0):
+        """Dump a tree representation of the widget and its children.
+        """
+        tree = "%s%s %s %s\n%s%s" % (" " * indent, w.get_name(), w.get_css_name(), repr(w),
+                                     " " * indent, " ".join(".%s" % cl for cl in w.get_style_context().list_classes()))
+        try:
+            tree = "\n\n".join((tree, "\n".join(self.dump_tree(c, indent + 8) for c in w.get_children())))
+        except AttributeError:
+            pass
+        return tree
+
     def build_widget(self):
         """Build the evaluator widget.
         """
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
+        self.vbox = vbox
 
-        tb=gtk.Toolbar()
-        tb.set_style(gtk.TOOLBAR_ICONS)
-        # Use small toolbar button everywhere
-        gtk.settings_get_default().set_property('gtk_toolbar_icon_size', gtk.ICON_SIZE_SMALL_TOOLBAR)
+        tb=Gtk.Toolbar()
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
 
         for (icon, tip, action) in (
-            (gtk.STOCK_SAVE, "Save output window (C-s)", self.save_output_cb),
-            (gtk.STOCK_CLEAR, "Clear output window", self.clear_output),
-            (gtk.STOCK_DELETE, "Clear expression (C-l)", self.clear_expression),
-            (gtk.STOCK_EXECUTE, "Evaluate expression (C-Return)", self.evaluate_expression),
-            (gtk.STOCK_ADD, "Add a bookmark (C-b)", self.add_bookmark),
-            (gtk.STOCK_REMOVE, "Remove a bookmark", self.remove_bookmark),
-            (gtk.STOCK_INDEX, "Display bookmarks (C-Space)", self.display_bookmarks),
+            (Gtk.STOCK_SAVE, "Save output window (C-s)", self.save_output_cb),
+            (Gtk.STOCK_CLEAR, "Clear output window", self.clear_output),
+            (Gtk.STOCK_DELETE, "Clear expression (C-l)", self.clear_expression),
+            (Gtk.STOCK_EXECUTE, "Evaluate expression (C-Return)", self.evaluate_expression),
+            (Gtk.STOCK_ADD, "Add a bookmark (C-b)", self.add_bookmark),
+            (Gtk.STOCK_REMOVE, "Remove a bookmark", self.remove_bookmark),
+            (Gtk.STOCK_INDEX, "Display bookmarks (C-Space)", self.display_bookmarks),
             ):
-            b=gtk.ToolButton(icon)
+            b=Gtk.ToolButton(icon)
             b.connect('clicked', action)
             b.set_tooltip_text(tip)
             tb.insert(b, -1)
 
         # So that applications can define their own buttons
         self.toolbar=tb
-        vbox.pack_start(tb, expand=False)
+        vbox.pack_start(tb, False, True, 0)
 
-        self.source=gtk.TextView ()
+        self.source=Gtk.TextView ()
         self.source.set_editable(True)
-        self.source.set_wrap_mode (gtk.WRAP_CHAR)
+        self.source.set_wrap_mode (Gtk.WrapMode.CHAR)
 
-        f=gtk.Frame("Expression")
-        s=gtk.ScrolledWindow()
-        s.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        f=Gtk.Frame.new(label="Expression")
+        s=Gtk.ScrolledWindow()
+        s.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         s.add(self.source)
         f.add(s)
-        vbox.pack_start(f, expand=False)
+        vbox.pack_start(f, True, True, 0)
 
-        self.output=gtk.TextView()
+        self.output=Gtk.TextView()
         self.output.set_editable(False)
-        self.output.set_wrap_mode (gtk.WRAP_CHAR)
+        self.output.set_wrap_mode (Gtk.WrapMode.CHAR)
 
-        f=gtk.Frame("Result")
-        self.resultscroll=gtk.ScrolledWindow()
-        self.resultscroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        f=Gtk.Frame.new(label="Result")
+        self.resultscroll=Gtk.ScrolledWindow()
+        self.resultscroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         self.resultscroll.add(self.output)
         self.resultscroll.set_size_request( -1, 200 )
         f.add(self.resultscroll)
 
         if self.display_info_widget:
-            self.logwidget = gtk.TextView()
+            self.logwidget = Gtk.TextView()
             self.logbuffer = self.logwidget.get_buffer()
-            sw=gtk.ScrolledWindow()
+            sw=Gtk.ScrolledWindow()
             sw.add(self.logwidget)
 
-            pane=gtk.VPaned()
+            pane=Gtk.VPaned()
             vbox.add(pane)
             pane.add1(f)
             pane.pack2(sw)
@@ -829,16 +853,16 @@ class Evaluator:
         self.source.connect('key-press-event', self.key_pressed_cb)
         self.output.connect('key-press-event', self.key_pressed_cb)
 
-        self.statusbar=gtk.Statusbar()
-        self.statusbar.set_has_resize_grip(False)
-        vbox.pack_start(self.statusbar, expand=False)
+        self.statusbar=Gtk.Statusbar()
+        #self.statusbar.set_has_resize_grip(False)
+        vbox.pack_start(self.statusbar, False, True, 0)
 
         vbox.show_all()
 
         return vbox
 
 def center_on_mouse(w):
-    """Center the given gtk.Window on the mouse position.
+    """Center the given Gtk.Window on the mouse position.
     """
     root=w.get_toplevel().get_root_window()
     (screen, x, y, mod) = root.get_display().get_pointer()
@@ -847,34 +871,22 @@ def center_on_mouse(w):
     # Let's try to center the window on the mouse as much as possible.
     width, height = w.get_size()
 
-    posx = max(r.x, x - width / 2)
+    posx = max(r.x, x - int(width / 2))
     if posx + width > r.x + r.width:
         posx = r.x + r.width - width
 
-    posy = max(r.y, y - height / 2)
+    posy = max(r.y, y - int(height / 2))
     if posy + height > r.y + r.height:
         posy = r.y + r.height - height
 
     w.move(posx, posy)
 
 def launch(globals_=None, locals_=None, historyfile=None):
-    if globals_ is None:
-        globals_={}
-    if locals_ is None:
-        locals_={}
     if historyfile is None:
         historyfile=os.path.join(os.getenv('HOME'), '.pyeval.log')
-    ev=Evaluator(globals_=globals_, locals_=locals_, historyfile=historyfile)
-
-    ev.locals_['self']=ev
-    window=ev.popup(embedded=False)
-    center_on_mouse(window)
-    ev.locals_['w']=window
-
-    window.connect('destroy', lambda e: gtk.main_quit())
-
-    gtk.main ()
-    ev.save_history()
+    ev = Evaluator(globals_=globals_, locals_=locals_, historyfile=historyfile)
+    ev.run()
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
     launch(globals(), locals())
diff --git a/lib/advene/gui/main.py b/lib/advene/gui/main.py
index 3e5ac0c..b6709ca 100755
--- a/lib/advene/gui/main.py
+++ b/lib/advene/gui/main.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -23,43 +23,53 @@ important methods and the various GUI callbacks (generally all methods
 with the C{on_} prefix).
 """
 
-import sys
-import time
+import logging
+logger = logging.getLogger(__name__)
+
+from collections import OrderedDict
+import io
+import locale
 import os
-import subprocess
-import signal
-import shutil
-import tempfile
-import StringIO
-import textwrap
+import pprint
+import queue
 import re
-import urllib2
 import socket
+import sys
+import textwrap
 import threading
-import Queue
+import time
+import urllib.request, urllib.error, urllib.parse
 
 import advene.core.config as config
 import advene.core.version
 
+import gi
+gi.require_version('Gdk', '3.0')
+gi.require_version('Gtk', '3.0')
+from gi.repository import GObject
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import Gtk
+from gi.repository import Pango
 if config.data.os == 'win32':
-    import win32process
-
-import gtk
-import gobject
-import pango
-import pprint
+    gi.require_version('GdkWin32', '3.0')
+    from gi.repository import GdkWin32
 
-import gettext
-import locale
+if config.data.debug:
+    #Gdk.set_show_events(True)
+    try:
+        from advene.util.debug import debug_slow_update_hook
+    except:
+        logger.debug("No debug_slow_update_hook function in advene.util.debug")
+        debug_slow_update_hook = None
 
-print "Using localedir %s" % config.data.path['locale']
+logger.info("Using localedir %s" % config.data.path['locale'])
 
 # Locale initialisation
 try:
     locale.setlocale(locale.LC_ALL, '')
 except locale.Error:
-    print "Error in locale initialization. Interface translation may be incorrect."
-    pass
+    logger.error("Error in locale initialization. Interface translation may be incorrect.")
 config.init_gettext()
 # The following line is useless, since gettext.install defines _ as a
 # builtin. However, code checking applications need to be explicitly
@@ -81,7 +91,6 @@ import advene.model.tal.context
 import advene.core.mediacontrol
 import advene.util.helper as helper
 import xml.etree.ElementTree as ET
-from advene.util.odict import odict
 
 import advene.util.importer
 from advene.gui.util.completer import Indexer, Completer
@@ -91,7 +100,6 @@ from advene.gui.util import get_pixmap_button, get_small_stock_button, image_fro
 from advene.gui.util.playpausebutton import PlayPauseButton
 import advene.gui.plugins.actions
 import advene.gui.plugins.contenthandlers
-import advene.gui.views.tree
 from advene.gui.views import AdhocViewParametersParser
 import advene.gui.views.timeline
 import advene.gui.views.table
@@ -123,48 +131,47 @@ class DummyGlade:
     def __init__(self, menu_definition):
         """Main window definition.
         """
-        self.win=gtk.Window()
+        self.win=Gtk.Window()
 
-        v=gtk.VBox()
+        v=Gtk.VBox()
         self.win.add(v)
 
-        self.menubar=gtk.MenuBar()
+        self.menubar=Gtk.MenuBar()
         self.build_menubar(menu_definition, self.menubar)
-        v.pack_start(self.menubar, expand=False)
+        v.pack_start(self.menubar, False, True, 0)
 
-        self.toolbar_container=gtk.HBox()
+        self.toolbar_container=Gtk.HBox()
 
-        self.fileop_toolbar=gtk.Toolbar()
-        self.fileop_toolbar.set_style(gtk.TOOLBAR_ICONS)
+        self.fileop_toolbar=Gtk.Toolbar()
+        self.fileop_toolbar.set_style(Gtk.ToolbarStyle.ICONS)
         self.fileop_toolbar.set_show_arrow(False)
-        self.toolbar_container.pack_start(self.fileop_toolbar, expand=True)
+        self.toolbar_container.pack_start(self.fileop_toolbar, True, True, 0)
 
-        self.adhoc_hbox=gtk.HBox()
-        self.toolbar_container.pack_start(self.adhoc_hbox, expand=True)
+        self.adhoc_hbox=Gtk.HBox()
+        self.toolbar_container.pack_start(self.adhoc_hbox, True, True, 0)
 
-        self.traces_switch=gtk.HBox()
-        self.toolbar_container.pack_start(self.traces_switch, expand=False)
+        self.traces_switch=Gtk.HBox()
+        self.toolbar_container.pack_start(self.traces_switch, False, True, 0)
 
-        self.search_hbox=gtk.HBox()
-        self.toolbar_container.pack_start(self.search_hbox, expand=False)
-        v.pack_start(self.toolbar_container, expand=False)
+        self.search_hbox=Gtk.HBox()
+        self.toolbar_container.pack_start(self.search_hbox, False, True, 0)
+        v.pack_start(self.toolbar_container, False, True, 0)
 
-        self.application_space = gtk.VBox()
+        self.application_space = Gtk.VBox()
         v.add(self.application_space)
 
-        self.bottombar = gtk.HBox()
+        self.bottombar = Gtk.HBox()
 
-        self.statusbar = gtk.Statusbar()
+        self.statusbar = Gtk.Statusbar()
 
         # Modify font size. First find the embedded label
         w=self.statusbar
         while hasattr(w, 'get_children'):
             w=w.get_children()[0]
-        w.modify_font(pango.FontDescription("sans 9"))
+        w.modify_font(Pango.FontDescription("sans 9"))
 
-        self.statusbar.set_has_resize_grip(False)
-        self.bottombar.pack_start(self.statusbar, expand=True)
-        v.pack_start(self.bottombar, expand=False)
+        self.bottombar.pack_start(self.statusbar, True, True, 0)
+        v.pack_start(self.bottombar, False, True, 0)
 
         self.win.show_all()
 
@@ -172,14 +179,14 @@ class DummyGlade:
         """Populate the menu with data taken from items.
         """
         if menu is None:
-            menu=gtk.Menu()
+            menu=Gtk.Menu()
         for (name, action, tooltip) in items:
             if name.startswith('gtk-'):
-                i=gtk.ImageMenuItem(stock_id=name)
+                i=Gtk.ImageMenuItem(stock_id=name)
             elif not name:
-                i=gtk.SeparatorMenuItem()
+                i=Gtk.SeparatorMenuItem()
             else:
-                i=gtk.MenuItem(name)
+                i=Gtk.MenuItem.new_with_mnemonic(name)
             if isinstance(action, tuple):
                 # There is a submenu
                 m=self.build_menubar(action)
@@ -195,7 +202,7 @@ class DummyGlade:
             elif name == _("_View"):
                 self.adhoc_view_menuitem=i
             elif name == _("Packages"):
-                self.package_list_menu=gtk.Menu()
+                self.package_list_menu=Gtk.Menu()
                 i.set_submenu(self.package_list_menu)
             elif name == _("Open recent"):
                 self.recent_menuitem = i
@@ -229,8 +236,14 @@ class AdveneGUI(object):
     def __init__ (self):
         """Initializes the GUI and other attributes.
         """
-        self.logbuffer = gtk.TextBuffer()
-        self.busy_cursor = gtk.gdk.Cursor(gtk.gdk.WATCH)
+        self.init_config()
+        self.main_thread = threading.currentThread()
+        self.logbuffer = Gtk.TextBuffer()
+        self.busy_cursor = Gdk.Cursor.new(Gdk.CursorType.WATCH)
+
+        # Default value
+        self.player_shortcuts_modifier = Gdk.ModifierType.CONTROL_MASK
+        self.update_player_control_modifier()
 
         self.controller = advene.core.controller.AdveneController()
         self.controller.register_gui(self)
@@ -238,7 +251,6 @@ class AdveneGUI(object):
         # available through the request/keyname TALES expression
         self.controller.register_event('KeyboardInput', _("Input from the keyboard (function keys)"))
 
-        # FIXME: we should use gtk.UIManager
         menu_definition=(
             (_("_File"), (
                     ( _("_New package"), self.on_new1_activate, _("Create a new package")),
@@ -291,16 +303,14 @@ class AdveneGUI(object):
                     ( _("Simplify interface"), self.on_simplify_interface_activate, _("Simplify the application interface (toggle)")),
                     ( _("Evaluator") + " [Ctrl-e]", self.on_evaluator2_activate, _("Open python evaluator window") ),
                     ( _("Webserver log"), self.on_webserver_log1_activate, "" ),
-                    #( _("_MediaInformation"), self.on_view_mediainformation_activate, _("Display information about the media") ),
                     ), "" ),
             (_("_Player"), (
                     ( _("Go to _Time"), self.goto_time_dialog, _("Goto a specified time code") ),
                     ( _("Save _ImageCache"), self.on_save_imagecache1_activate, _("Save the contents of the ImageCache to disk") ),
                     ( _("Reset ImageCache"), self.on_reset_imagecache_activate, _("Reset the ImageCache") ),
                     ( _("_Restart player"), self.on_restart_player1_activate, _("Restart the player") ),
-                    #( _("Capture screenshots"), self.generate_screenshots, _("Generate screenshots for the current video") ),
+                    ( _("Display _Media information"), self.on_view_mediainformation_activate, _("Display information about the current media") ),
                     ( _("Update annotation screenshots"), self.update_annotation_screenshots, _("Update screenshots for annotation bounds") ),
-                    ( _("Detect shots"), self.on_shotdetect_activate, _("Automatically detect shots")),
                     ( _("_Select player"), None, _("Select the player plugin") ),
                     ), "" ),
             (_("Packages"), (
@@ -311,7 +321,7 @@ class AdveneGUI(object):
                     ( _("Get support"), self.on_support1_activate, "" ),
                     ( _("Check for updates"), self.check_for_update, "" ),
                     ( _("Display shortcuts"), self.on_helpshortcuts_activate, "" ),
-                    ( _("Display logfile"), self.on_advene_log_display, _("Display log file")),
+                    ( _("Display logfile"), self.on_advene_log_display, _("Display log messages")),
                     ( _("Open logfile folder"), self.on_advene_log_folder_display, _("Display logfile folder. It can help when sending the advene.log file by e-mail.")),
                     ( _("_About"), self.on_about1_activate, "" ),
                     ), "" ),
@@ -319,58 +329,56 @@ class AdveneGUI(object):
 
         self.gui = DummyGlade(menu_definition)
 
-        f = gtk.RecentFilter()
-        f.add_application(gobject.get_application_name())
-        recent = gtk.RecentChooserMenu()
+        dialog.set_default_transient_parent(self.gui.win)
+
+        f = Gtk.RecentFilter()
+        f.add_application(GObject.get_application_name())
+        recent = Gtk.RecentChooserMenu()
         recent.add_filter(f)
         recent.set_show_icons(False)
-        recent.set_sort_type(gtk.RECENT_SORT_MRU)
+        recent.set_sort_type(Gtk.RecentSortType.MRU)
         self.gui.recent_menuitem.set_submenu(recent)
         def open_history_file(rec):
             fname = rec.get_current_uri()
-            try:
-                self.set_busy_cursor(True)
-                self.controller.load_package (uri=fname)
-            except (OSError, IOError), e:
-                self.set_busy_cursor(False)
-                dialog.message_dialog(_("Cannot load package %(filename)s:\n%(error)s") % {
-                        'filename': fname,
-                        'error': unicode(e)}, gtk.MESSAGE_ERROR)
+            fname = urllib.parse.unquote(fname)
+            if fname.startswith('file:///'):
+                fname = fname[7:]
+            self.on_open1_activate(filename=fname)
             return True
         recent.connect('item-activated', open_history_file)
 
         self.toolbuttons = {}
         for (ident, stock, callback, tip) in (
-            ('open', gtk.STOCK_OPEN, self.on_open1_activate, _("Open a package file")),
-            ('save', gtk.STOCK_SAVE, self.on_save1_activate, _("Save the current package")),
-            ('save_as', gtk.STOCK_SAVE_AS, self.on_save_as1_activate, _("Save the package with a new name")),
+            ('open', Gtk.STOCK_OPEN, self.on_open1_activate, _("Open a package file")),
+            ('save', Gtk.STOCK_SAVE, self.on_save1_activate, _("Save the current package")),
+            ('save_as', Gtk.STOCK_SAVE_AS, self.on_save_as1_activate, _("Save the package with a new name")),
             ('select_file', 'moviefile.png', self.on_b_addfile_clicked, _("Select movie file...")),
-            ('select_dvd', gtk.STOCK_CDROM, self.on_b_selectdvd_clicked, _("Select DVD")),
+            ('select_dvd', Gtk.STOCK_CDROM, self.on_b_selectdvd_clicked, _("Select DVD")),
             (None, None, None, None),
-            ('undo', gtk.STOCK_UNDO, self.undo, _("Undo")),
+            ('undo', Gtk.STOCK_UNDO, self.undo, _("Undo")),
             (None, None, None, None),
             ('create_text_annotation', 'text_annotation.png', self.on_create_text_annotation, _("Create a text annotation")),
             ('create_svg_annotation', 'svg_annotation.png', self.on_create_svg_annotation, _("Create a graphical annotation")),
            ):
             if stock is None:
-                b = gtk.SeparatorToolItem()
+                b = Gtk.SeparatorToolItem()
             elif ident == 'open':
-                b = gtk.MenuToolButton(stock)
+                b = Gtk.MenuToolButton(stock)
                 b.set_arrow_tooltip_text(_("List recently opened packages"))
-                f = gtk.RecentFilter()
-                f.add_application(gobject.get_application_name())
-                recent = gtk.RecentChooserMenu()
+                f = Gtk.RecentFilter()
+                f.add_application(GObject.get_application_name())
+                recent = Gtk.RecentChooserMenu()
                 recent.add_filter(f)
                 recent.set_show_icons(False)
-                recent.set_sort_type(gtk.RECENT_SORT_MRU)
+                recent.set_sort_type(Gtk.RecentSortType.MRU)
                 b.set_menu(recent)
                 recent.connect('item-activated', open_history_file)
             elif stock.startswith('gtk-'):
-                b = gtk.ToolButton(stock)
+                b = Gtk.ToolButton(stock)
             else:
-                i = gtk.Image()
+                i = Gtk.Image()
                 i.set_from_file( config.data.advenefile( ('pixmaps', stock ) ) )
-                b = gtk.ToolButton(icon_widget=i)
+                b = Gtk.ToolButton(icon_widget=i)
             if tip is not None:
                 b.set_tooltip_text(tip)
             if callback is not None:
@@ -384,24 +392,24 @@ class AdveneGUI(object):
         def display_snapshot_monitor_menu(v):
             s = getattr(self.controller.player, 'snapshotter', None)
 
-            m = gtk.Menu()
+            m = Gtk.Menu()
             if s:
-                m.append(gtk.MenuItem(_("Snapshotter activity")))
-                m.append(gtk.SeparatorMenuItem())
-                m.append(gtk.MenuItem(_("%d queued requests") % s.timestamp_queue.qsize()))
-                i = gtk.MenuItem(_("Cancel all requests"))
+                m.append(Gtk.MenuItem(_("Snapshotter activity")))
+                m.append(Gtk.SeparatorMenuItem())
+                m.append(Gtk.MenuItem(_("%d queued requests") % s.timestamp_queue.qsize()))
+                i = Gtk.MenuItem(_("Cancel all requests"))
                 i.connect('activate', lambda i: s.clear() or True)
                 m.append(i)
 
             else:
-                m.append(gtk.MenuItem(_("No snapshotter")))
+                m.append(Gtk.MenuItem(_("No snapshotter")))
             m.show_all()
-            m.popup(None, None, None, 0, gtk.get_current_event_time())
+            m.popup_at_pointer(None)
             return True
 
         self.snapshotter_image = {
-            'idle': gtk.image_new_from_file( config.data.advenefile( ( 'pixmaps', 'snapshotter-idle.png') )),
-            'running': gtk.image_new_from_file( config.data.advenefile( ( 'pixmaps', 'snapshotter-running.png') )),
+            'idle': Gtk.Image.new_from_file( config.data.advenefile( ( 'pixmaps', 'snapshotter-idle.png') )),
+            'running': Gtk.Image.new_from_file( config.data.advenefile( ( 'pixmaps', 'snapshotter-running.png') )),
             }
 
         def set_state(b, state=None):
@@ -426,20 +434,19 @@ class AdveneGUI(object):
 
         b = get_pixmap_button('snapshotter-idle.png', display_snapshot_monitor_menu)
         b._state = None
-        b.set_relief(gtk.RELIEF_NONE)
-        self.gui.bottombar.pack_start(b, expand=False)
+        b.set_relief(Gtk.ReliefStyle.NONE)
+        self.gui.bottombar.pack_start(b, False, True, 0)
         self.snapshotter_monitor_icon = b
         b.set_state=set_state.__get__(b)
 
         # Log messages button
         def display_log_messages(v):
-            v=self.open_adhoc_view('logmessages', destination='south')
-            v.autoscroll()
+            self.open_adhoc_view('logmessages', destination='south')
             return True
         b=get_pixmap_button('logmessages.png', display_log_messages)
         b.set_tooltip_text(_("Display application log messages"))
-        b.set_relief(gtk.RELIEF_NONE)
-        self.gui.bottombar.pack_start(b, expand=False)
+        b.set_relief(Gtk.ReliefStyle.NONE)
+        self.gui.bottombar.pack_start(b, False, True, 0)
         b.show()
 
         # Resize the main window
@@ -447,7 +454,7 @@ class AdveneGUI(object):
         window.connect('key-press-event', self.on_win_key_press_event)
         window.connect('destroy', self.on_exit)
         self.init_window_size(window, 'main')
-        window.set_icon_list(*self.get_icon_list())
+        window.set_icon_list(self.get_icon_list())
 
         # Last auto-save time (in ms)
         self.last_auto_save=time.time()*1000
@@ -473,34 +480,33 @@ class AdveneGUI(object):
                                                prefix="advene_gui_%s" % n)
                 self.gui_plugins.extend(l)
             except OSError:
-                print "OSerror"
-                pass
+                logger.error("OSerror while trying to load %s plugins" % n)
 
         def update_quicksearch_sources(mi):
             """Display a dialog allowing to edit quicksearch-sources setting.
             """
-            d = gtk.Dialog(title=_("Quicksearch lists"),
-                   parent=None,
-                   flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                   buttons=( gtk.STOCK_OK, gtk.RESPONSE_OK,
-                             gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL ))
+            d = Gtk.Dialog(title=_("Quicksearch lists"),
+                   parent=self.gui.win,
+                   flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                   buttons=( Gtk.STOCK_OK, Gtk.ResponseType.OK,
+                             Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL ))
 
-            d.vbox.pack_start(gtk.Label(_("Please specify the lists of elements to be searched.")), expand=False)
+            d.vbox.pack_start(Gtk.Label(_("Please specify the lists of elements to be searched.")), False, False, 0)
             for el in self.controller.defined_quicksearch_sources:
-                b=gtk.CheckButton(el.title, use_underline=False)
+                b=Gtk.CheckButton(el.title, use_underline=False)
                 b._element = el
                 b.set_active(el.value in config.data.preferences['quicksearch-sources'])
-                d.vbox.pack_start(b, expand=False)
+                d.vbox.pack_start(b, False, True, 0)
             d.vbox.show_all()
             d.connect('key-press-event', dialog.dialog_keypressed_cb)
             d.show()
             dialog.center_on_mouse(d)
             res=d.run()
-            if res == gtk.RESPONSE_OK:
+            if res == Gtk.ResponseType.OK:
                 # Update quicksearch-sources
-                elements=[ b._element
-                           for b in d.vbox.get_children()
-                           if hasattr(b, 'get_active') and b.get_active() ]
+                elements=[ but._element
+                           for but in d.vbox.get_children()
+                           if hasattr(but, 'get_active') and but.get_active() ]
                 config.data.preferences['quicksearch-sources']=[ el.value for el in elements ]
                 # Update tooltip
                 label="\n".join( el.title for el in elements )
@@ -511,10 +517,10 @@ class AdveneGUI(object):
 
         # Trace switch button
         tsb = self.gui.traces_switch
-        b=gtk.Button()
+        b=Gtk.Button()
 
         def trace_toggle(w):
-            i=gtk.Image()
+            i=Gtk.Image()
             if config.data.preferences['record-actions']:
                 config.data.preferences['record-actions']=False
                 i.set_from_file(config.data.advenefile( ( 'pixmaps', 'traces_off.png') ))
@@ -530,45 +536,44 @@ class AdveneGUI(object):
         config.data.preferences['record-actions']=not config.data.preferences['record-actions']
         trace_toggle(b)
         b.connect('clicked', trace_toggle)
-        tsb.pack_start(b, expand=False)
+        tsb.pack_start(b, False, True, 0)
         tsb.show_all()
-        self.quicksearch_button=get_small_stock_button(gtk.STOCK_FIND)
-        self.quicksearch_entry=gtk.Entry()
+        self.quicksearch_button=get_small_stock_button(Gtk.STOCK_FIND)
+        self.quicksearch_entry=Gtk.Entry()
         self.quicksearch_entry.set_tooltip_text(_('String to search'))
 
         def quicksearch_options(button, event):
             """Generate the quicksearch options menu.
             """
-            if event.type != gtk.gdk.BUTTON_PRESS:
+            if event.type != Gdk.EventType.BUTTON_PRESS:
                 return False
-            menu=gtk.Menu()
-            item=gtk.MenuItem(_("Launch search"))
+            menu=Gtk.Menu()
+            item=Gtk.MenuItem(_("Launch search"))
             item.connect('activate', self.do_quicksearch)
             if not self.quicksearch_entry.get_text():
                 item.set_sensitive(False)
             menu.append(item)
-            item=gtk.CheckMenuItem(_("Ignore case"))
+            item=Gtk.CheckMenuItem(_("Ignore case"))
             item.set_active(config.data.preferences['quicksearch-ignore-case'])
             item.connect('toggled', lambda i: config.data.preferences.__setitem__('quicksearch-ignore-case', i.get_active()))
             menu.append(item)
 
-            item=gtk.MenuItem(_("Searched elements"))
+            item=Gtk.MenuItem(_("Searched elements"))
             item.connect('activate', update_quicksearch_sources)
             menu.append(item)
 
             menu.show_all()
-            menu.popup(None, None, None, 0, gtk.get_current_event_time())
+            menu.popup_at_pointer(None)
             return True
 
         hb=self.gui.search_hbox
         self.quicksearch_entry.connect('activate', self.do_quicksearch)
-        hb.pack_start(self.quicksearch_entry, expand=False)
+        hb.pack_start(self.quicksearch_entry, False, True, 0)
         self.quicksearch_button.connect('button-press-event', quicksearch_options)
-        hb.pack_start(self.quicksearch_button, expand=False, fill=False)
+        hb.pack_start(self.quicksearch_button, False, False, 0)
         hb.show_all()
 
         # Player status
-        p=self.controller.player
         self.update_player_labels()
         self.oldstatus = "NotStarted"
         self.last_slow_position = 0
@@ -599,11 +604,26 @@ class AdveneGUI(object):
         """
         config.init_gettext()
 
+    def init_config(self):
+        """Enrich config module with Gtk-related elements.
+        """
+        def log_error(prov, section, error):
+            logger.error("Error while parsing advene.css file in %s: %s" % (section, error))
+        for name, item in config.data.drag_type.items():
+            config.data.target_entry[name] = Gtk.TargetEntry.new(item[0][0], 0, item[0][2])
+        # Load advene.css file
+        css_provider = Gtk.CssProvider()
+        css_provider.connect('parsing-error', log_error)
+        css_provider.load_from_path(config.data.advenefile('advene.css'))
+        context = Gtk.StyleContext()
+        context.add_provider_for_screen(Gdk.Screen.get_default(), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
+
+
     def get_icon_list(self):
         """Return the list of icon pixbuf appropriate for Window.set_icon_list.
         """
         if not hasattr(self, '_icon_list'):
-            l=[ gtk.gdk.pixbuf_new_from_file(config.data.advenefile(
+            l=[ GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile(
                         ( 'pixmaps', 'icon_advene%d.png' % size ) ))
                               for size in (16, 32, 48, 64, 128) ]
             self._icon_list=[ i for i in l if i is not None ]
@@ -612,7 +632,7 @@ class AdveneGUI(object):
     def set_busy_cursor(self, busy=False):
         """Un/Set the busy cursor for the main window.
         """
-        self.gui.win.window.set_cursor(self.busy_cursor if busy else None)
+        self.gui.win.get_window().set_cursor(self.busy_cursor if busy else None)
 
     def update_player_labels(self):
         """Update the representation of player status.
@@ -629,6 +649,17 @@ class AdveneGUI(object):
             p.UndefinedStatus: _("Undefined"),
             }
 
+    def update_player_control_modifier(self):
+        """Update the actual value of player control modifier.
+        """
+        pref = config.data.preferences['player-shortcuts-modifier']
+        modifier = Gtk.accelerator_parse(pref).accelerator_mods
+        if int(modifier) != 0:
+            self.player_shortcuts_modifier = modifier
+        else:
+            logger.error(_("Wrong player shortcut modifier %s in configuration. Fallback on Control."), pref)
+            self.player_shortcuts_modifier = Gdk.ModifierType.CONTROL_MASK
+
     def annotation_lifecycle(self, context, parameters):
         """Method used to update the active views.
 
@@ -641,9 +672,11 @@ class AdveneGUI(object):
         self.updated_element(event, annotation)
         for v in self.adhoc_views:
             try:
-                v.update_annotation(annotation=annotation, event=event)
-            except AttributeError:
-                pass
+                m = getattr(v, 'update_annotation', None)
+                if m:
+                    m(annotation=annotation, event=event)
+            except Exception:
+                logger.error(_("Exception in update_annotation"), exc_info=True)
         # Update the content indexer
         if event.endswith('EditEnd') or event.endswith('Create'):
             # Update the type fieldnames
@@ -651,7 +684,7 @@ class AdveneGUI(object):
                 annotation.type._fieldnames.update(helper.common_fieldnames([ annotation ]))
 
         # Refresh the edit popup for the associated relations
-        for e in [ e for e in self.edit_popups if e.element in annotation.relations ]:
+        for e in [ el for el in self.edit_popups if el.element in annotation.relations ]:
             e.refresh()
         return True
 
@@ -667,11 +700,13 @@ class AdveneGUI(object):
         self.updated_element(event, relation)
         for v in self.adhoc_views:
             try:
-                v.update_relation(relation=relation, event=event)
-            except AttributeError:
-                pass
+                m = getattr(v, 'update_relation', None)
+                if m:
+                    m(relation=relation, event=event)
+            except Exception:
+                logger.error(_("Exception in update_relation"), exc_info=True)
         # Refresh the edit popup for the members
-        for e in [ e for e in self.edit_popups if e.element in relation.members ]:
+        for e in [ el for el in self.edit_popups if el.element in relation.members ]:
             e.refresh()
         return True
 
@@ -687,9 +722,11 @@ class AdveneGUI(object):
         self.updated_element(event, view)
         for v in self.adhoc_views:
             try:
-                v.update_view(view=view, event=event)
-            except AttributeError:
-                pass
+                m = getattr(v, 'update_view', None)
+                if m:
+                    m(view=view, event=event)
+            except Exception:
+                logger.error(_("Exception in update_view"), exc_info=True)
 
         if view.content.mimetype == 'application/x-advene-ruleset':
             # Update the combo box
@@ -713,9 +750,12 @@ class AdveneGUI(object):
         self.updated_element(event, query)
         for v in self.adhoc_views:
             try:
+                m = getattr(v, 'update_query', None)
+                if m:
+                    m(query=query, event=event)
                 v.update_query(query=query, event=event)
-            except AttributeError:
-                pass
+            except Exception:
+                logger.error(_("Exception in update_query"), exc_info=True)
         return True
 
     def resource_lifecycle(self, context, parameters):
@@ -731,9 +771,11 @@ class AdveneGUI(object):
 
         for v in self.adhoc_views:
             try:
-                v.update_resource(resource=resource, event=event)
-            except AttributeError:
-                pass
+                m = getattr(v, 'update_resource', None)
+                if m:
+                    m(resource=resource, event=event)
+            except Exception:
+                logger.error(_("Exception in update_resource"), exc_info=True)
         return True
 
     def schema_lifecycle(self, context, parameters):
@@ -749,9 +791,11 @@ class AdveneGUI(object):
 
         for v in self.adhoc_views:
             try:
-                v.update_schema(schema=schema, event=event)
-            except AttributeError:
-                pass
+                m = getattr(v, 'update_schema', None)
+                if m:
+                    m(schema=schema, event=event)
+            except Exception:
+                logger.error(_("Exception in update_schema"), exc_info=True)
         return True
 
     def annotationtype_lifecycle(self, context, parameters):
@@ -767,9 +811,11 @@ class AdveneGUI(object):
         self.updated_element(event, at)
         for v in self.adhoc_views:
             try:
-                v.update_annotationtype(annotationtype=at, event=event)
-            except AttributeError:
-                pass
+                m = getattr(v, 'update_annotationtype', None)
+                if m:
+                    m(annotationtype=at, event=event)
+            except Exception:
+                logger.error(_("Exception in update_annotationtype"), exc_info=True)
         # Update the current type menu
         self.update_gui()
         # Update the content indexer
@@ -790,9 +836,13 @@ class AdveneGUI(object):
         self.updated_element(event, rt)
         for v in self.adhoc_views:
             try:
-                v.update_relationtype(relationtype=rt, event=event)
+                m = getattr(v, 'update_relationtype', None)
+                if m:
+                    m(relationtype=rt, event=event)
             except AttributeError:
                 pass
+            except Exception:
+                logger.error(_("Exception in update_relationtype"), exc_info=True)
         # Update the content indexer
         if event.endswith('Create'):
             self.controller.package._indexer.element_update(rt)
@@ -892,28 +942,28 @@ class AdveneGUI(object):
         """
         t = self.input_time_dialog()
         if t is not None:
-            self.controller.update_status ("set", self.controller.create_position(t))
+            self.controller.update_status("seek", t)
         return True
 
     def input_time_dialog(self, *p):
         """Display a dialog to enter a time value.
         """
-        d = gtk.Dialog(title=_("Enter the new time value"),
-                       parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_OK, gtk.RESPONSE_OK,
-                                 gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL ))
+        d = Gtk.Dialog(title=_("Enter the new time value"),
+                       parent=self.gui.win,
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_OK, Gtk.ResponseType.OK,
+                                 Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL ))
 
         ta=TimeAdjustment(value=self.gui.slider.get_value(), controller=self.controller, videosync=False, editable=True, compact=False)
-        ta.entry.connect("activate", lambda w: d.response(gtk.RESPONSE_OK))
-        d.vbox.pack_start(ta.widget, expand=False)
+        ta.entry.connect("activate", lambda w: d.response(Gtk.ResponseType.OK))
+        d.vbox.pack_start(ta.widget, False, True, 0)
         d.show_all()
         dialog.center_on_mouse(d)
         ta.entry.select_region(0, -1)
         ta.entry.grab_focus()
         res=d.run()
         retval=None
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             retval = ta.get_value()
         d.destroy()
         return retval
@@ -923,37 +973,37 @@ class AdveneGUI(object):
         """
         if title is None:
             title = _("Replace content in %d elements") % len(elements)
-        d = gtk.Dialog(title=title,
-                       parent=None,
-                       flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                                 gtk.STOCK_OK, gtk.RESPONSE_OK,
+        d = Gtk.Dialog(title=title,
+                       parent=self.gui.win,
+                       flags=Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+                                 Gtk.STOCK_OK, Gtk.ResponseType.OK,
                                  ))
-        l=gtk.Label(title)
+        l=Gtk.Label(label=title)
         l.set_line_wrap(True)
         l.show()
-        d.vbox.pack_start(l, expand=False)
+        d.vbox.pack_start(l, False, True, 0)
 
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Find word") + " "), expand=False)
-        search_entry=gtk.Entry()
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Find word") + " "), False, False, 0)
+        search_entry=Gtk.Entry()
         search_entry.set_text(default_search or "")
-        hb.pack_start(search_entry, expand=False)
-        d.vbox.pack_start(hb, expand=False)
+        hb.pack_start(search_entry, False, True, 0)
+        d.vbox.pack_start(hb, False, True, 0)
 
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Replace by") + " "), expand=False)
-        replace_entry=gtk.Entry()
-        hb.pack_start(replace_entry, expand=False)
-        d.vbox.pack_start(hb, expand=False)
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Replace by") + " "), False, False, 0)
+        replace_entry=Gtk.Entry()
+        hb.pack_start(replace_entry, False, True, 0)
+        d.vbox.pack_start(hb, False, True, 0)
 
         d.connect('key-press-event', dialog.dialog_keypressed_cb)
         d.show_all()
         dialog.center_on_mouse(d)
         res=d.run()
-        if res == gtk.RESPONSE_OK:
-            search=unicode(search_entry.get_text()).replace('\\n', '\n').replace('%n', '\n').replace('\\t', '\t').replace('%t', '\t')
-            replace=unicode(replace_entry.get_text()).replace('\\n', '\n').replace('%n', '\n').replace('\\t', '\t').replace('%t', '\t')
+        if res == Gtk.ResponseType.OK:
+            search=search_entry.get_text().replace('\\n', '\n').replace('%n', '\n').replace('\\t', '\t').replace('%t', '\t')
+            replace=replace_entry.get_text().replace('\\n', '\n').replace('%n', '\n').replace('\\t', '\t').replace('%t', '\t')
             count=0
             batch_id=object()
             for a in elements:
@@ -987,32 +1037,32 @@ class AdveneGUI(object):
             label = _("Exporting video montage/fragment to %%(filename)s")
 
         filename = dialog.get_filename(title=_("Please choose a destination filename"),
-                                       action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                       button=gtk.STOCK_SAVE,
+                                       action=Gtk.FileChooserAction.SAVE,
+                                       button=Gtk.STOCK_SAVE,
                                        default_file = basename,
                                        filter='video')
         if filename is None:
             return
         m = MontageRenderer(self.controller, elements)
 
-        w = gtk.Window()
+        w = Gtk.Window()
         w.set_title(title)
-        v = gtk.VBox()
-        l = gtk.Label(label % { 'filename': filename } )
+        v = Gtk.VBox()
+        l = Gtk.Label(label=label % { 'filename': filename } )
         v.add(l)
 
-        pg = gtk.ProgressBar()
-        v.pack_start(pg, expand=False)
+        pg = Gtk.ProgressBar()
+        v.pack_start(pg, False, True, 0)
 
-        hb = gtk.HButtonBox()
-        b = gtk.Button(stock=gtk.STOCK_CLOSE)
+        hb = Gtk.HButtonBox()
+        b = Gtk.Button(stock=Gtk.STOCK_CLOSE)
         def close_encoder(b):
             m.finalize()
             w.destroy()
             return True
         b.connect('clicked', close_encoder)
-        hb.pack_start(b, expand=False)
-        v.pack_start(hb, expand=False)
+        hb.pack_start(b, False, True, 0)
+        v.pack_start(hb, False, True, 0)
 
         w.add(v)
         w.show_all()
@@ -1044,9 +1094,9 @@ class AdveneGUI(object):
         if args is None:
             args=[]
         try:
-            gtk.gdk.threads_init ()
+            Gdk.threads_init ()
         except RuntimeError:
-            print "*** WARNING*** : gtk.threads_init not available.\nThis may lead to unexpected behaviour."
+            logger.warning("*** WARNING*** : Gtk.threads_init not available.\nThis may lead to unexpected behaviour.")
         # FIXME: We have to register LogWindow actions before we load the ruleset
         # but we should have an introspection method to do this automatically
         self.logwindow=advene.gui.views.logwindow.LogWindow(controller=self.controller)
@@ -1065,7 +1115,7 @@ class AdveneGUI(object):
             uri=context.globals['uri']
             if not uri:
                 msg=_("No media association is defined in the package. Please use the 'File/Associate a video file' menu item to associate a media file.")
-            elif not os.path.exists(unicode(uri).encode(sys.getfilesystemencoding(), 'ignore')) and not uri.startswith('http:') and not uri.startswith('dvd'):
+            elif not os.path.exists(uri) and not uri.startswith('http:') and not uri.startswith('dvd'):
                 msg=_("The associated media %s could not be found. Please use the 'File/Associate a video file' menu item to associate a media file.") % uri
             else:
                 msg=_("You are now working with the following video:\n%s") % uri
@@ -1108,7 +1158,7 @@ class AdveneGUI(object):
               self.handle_element_delete),
             ('MediaChange', media_changed),
             ):
-            if isinstance(events, basestring):
+            if isinstance(events, str):
                 self.controller.event_handler.internal_rule (event=events,
                                                              method=method)
             else:
@@ -1120,45 +1170,24 @@ class AdveneGUI(object):
 
         self.visual_id = None
 
-        def build_player_menu(menu):
-            if menu.get_children():
-                # The menu was previously populated, but the player may have changed.
-                # Clear it to update it.
-                menu.foreach(menu.remove)
-
-            # Populate the "Select player" menu
-            for ident, p in config.data.players.iteritems():
-                def select_player(i, p):
-                    self.controller.select_player(p)
-                    return True
-                if self.controller.player.player_id == ident:
-                    ident="> %s" % ident
-                else:
-                    ident="   %s" % ident
-                i=gtk.MenuItem(ident)
-                i.connect('activate', select_player, p)
-                menu.append(i)
-                i.show()
-            return True
-
         # Adhoc view toolbuttons signal handling
         def adhoc_view_drag_sent(widget, context, selection, targetType, eventTime, name):
             if targetType == config.data.target_type['adhoc-view']:
-                selection.set(selection.target, 8, encode_drop_parameters(name=name))
+                selection.set(selection.get_target(), 8, encode_drop_parameters(name=name))
                 return True
             return False
 
         def adhoc_view_drag_begin(widget, context, pixmap, view_name):
-            w=gtk.Window(gtk.WINDOW_POPUP)
+            w=Gtk.Window(Gtk.WindowType.POPUP)
             w.set_decorated(False)
-            hb=gtk.HBox()
-            i=gtk.Image()
+            hb=Gtk.HBox()
+            i=Gtk.Image()
             i.set_from_file(config.data.advenefile( ( 'pixmaps', pixmap) ))
-            hb.pack_start(i, expand=False)
-            hb.pack_start(gtk.Label(view_name), expand=False)
+            hb.pack_start(i, False, True, 0)
+            hb.pack_start(Gtk.Label(view_name), False, False, 0)
             w.add(hb)
             w.show_all()
-            context.set_icon_widget(w, 16, 16)
+            Gtk.drag_set_icon_widget(context, w, 16, 16)
             return True
 
         def open_view(widget, name, destination='default'):
@@ -1182,7 +1211,7 @@ class AdveneGUI(object):
                 open_view(widget, name)
                 return True
 
-            menu=gtk.Menu()
+            menu=Gtk.Menu()
 
             for (label, destination) in (
                 (_("Open this view..."), 'default'),
@@ -1191,25 +1220,25 @@ class AdveneGUI(object):
                 (_("...embedded west of the video"), 'west'),
                 (_("...embedded south of the video"), 'south'),
                 (_("...embedded at the right of the window"), 'fareast')):
-                item = gtk.MenuItem(label)
+                item = Gtk.MenuItem(label)
                 item.connect('activate', open_view, name, destination)
                 menu.append(item)
 
             menu.show_all()
-            menu.popup(None, None, None, 0, gtk.get_current_event_time())
+            menu.popup_at_pointer(None)
 
             return True
 
         # Populate the View submenu
         menu = self.gui.adhoc_view_menuitem.get_submenu()
-        it = gtk.MenuItem(_("_All available views"))
+        it = Gtk.MenuItem(_("_All available views"))
         menu.prepend(it)
         it.show()
-        m = gtk.Menu()
+        m = Gtk.Menu()
         it.set_submenu(m)
         for name in sorted(self.registered_adhoc_views, reverse=True):
             cl=self.registered_adhoc_views[name]
-            it=gtk.MenuItem('_' + cl.view_name, use_underline=True)
+            it=Gtk.MenuItem('_' + cl.view_name, use_underline=True)
             it.set_tooltip_text(cl.tooltip)
             it.connect('activate', open_view_menu, name)
             m.prepend(it)
@@ -1219,14 +1248,13 @@ class AdveneGUI(object):
         item_index = 0
         for name, tip, pixmap in (
             ('timeline', _('Timeline'), 'timeline.png'),
-            ('tree', _('Tree view'), 'treeview.png'),
             ('finder', _('Package finder'), 'finder.png'),
             ('transcription', _('Transcription of annotations'), 'transcription.png'),
+            ('table', _('Annotation table'), 'table.png'),
 
             ('', '', ''),
             ('transcribe', _('Note-taking editor'), 'transcribe.png'),
             ('activebookmarks', _('Active bookmarks'), 'bookmarks.png'),
-            ('schemaeditor', _("Schema editor"), 'schemaeditor.png'),
             ('', '', ''),
 
             ('tagbag', _("Bag of tags"), 'tagbag.png'),
@@ -1241,15 +1269,13 @@ class AdveneGUI(object):
 
             ('editaccumulator', _('Edit window placeholder (annotation and relation edit windows will be put here)'), 'editaccumulator.png'),
             ('editionhistory', _("Display edition history"), 'editionhistory.png'),
-            ('tracepreview', _("Visualise the activity trace preview"), 'trace.png'),
-            ('tracetimeline', _("Visualise the activity trace as a timeline"), 'tracetimeline.png'),
             ):
             if not name:
                 # Separator
-                b=gtk.VSeparator()
-                hb.pack_start(b, expand=False, padding=5)
+                b=Gtk.VSeparator()
+                hb.pack_start(b, False, False, 5)
 
-                it = gtk.SeparatorMenuItem()
+                it = Gtk.SeparatorMenuItem()
                 menu.insert(it, item_index)
                 item_index = item_index + 1
                 continue
@@ -1258,22 +1284,22 @@ class AdveneGUI(object):
             if name not in ('webbrowser', 'comment') and not name in self.registered_adhoc_views:
                 self.log("Missing basic adhoc view %s" % name)
                 continue
-            b=gtk.Button()
-            i=gtk.Image()
+            b=Gtk.Button()
+            i=Gtk.Image()
             i.set_from_file(config.data.advenefile( ( 'pixmaps', pixmap) ))
             b.add(i)
             b.set_tooltip_text(tip)
             b.connect('drag-begin', adhoc_view_drag_begin, pixmap, tip)
             b.connect('drag-data-get', adhoc_view_drag_sent, name)
             b.connect('clicked', open_view_menu, name)
-            b.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                              config.data.drag_type['adhoc-view'], gtk.gdk.ACTION_COPY)
-            hb.pack_start(b, expand=False)
+            b.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                              config.data.get_target_types('adhoc-view'), Gdk.DragAction.COPY)
+            hb.pack_start(b, False, True, 0)
             if name == 'webbrowser' and (self.controller.server is None or not self.controller.server.is_running()):
                 b.set_sensitive(False)
                 b.set_tooltip_text(_("The webserver could not be started. Static views cannot be accessed."))
             if name in self.registered_adhoc_views:
-                it = gtk.MenuItem(self.registered_adhoc_views[name].view_name, use_underline=False)
+                it = Gtk.MenuItem(self.registered_adhoc_views[name].view_name, use_underline=False)
                 it.connect('activate', open_view_menu, name)
                 it.set_tooltip_text(tip)
                 menu.insert(it, item_index)
@@ -1281,18 +1307,21 @@ class AdveneGUI(object):
         hb.show_all()
         menu.show_all()
 
-        menu=gtk.Menu()
+        menu=Gtk.Menu()
         self.gui.select_player_menuitem.set_submenu(menu)
-        menu.connect('map', build_player_menu)
+        self.build_player_menu()
 
         defaults=config.data.advenefile( ('defaults', 'workspace.xml'), 'settings')
         if os.path.exists(defaults):
-            # a default workspace has been saved. Load it and
-            # ignore the default adhoc view specification.
-            stream=open(defaults)
-            tree=ET.parse(stream)
-            stream.close()
-            self.workspace_restore(tree.getroot())
+            try:
+                # a default workspace has been saved. Load it and
+                # ignore the default adhoc view specification.
+                stream=open(defaults, encoding='utf-8')
+                tree=ET.parse(stream)
+                stream.close()
+                self.workspace_restore(tree.getroot())
+            except:
+                logger.error("Cannot restore default workspace", exc_info=True)
         else:
             # Open default views
             self.open_adhoc_view('timeline', destination='south')
@@ -1303,14 +1332,14 @@ class AdveneGUI(object):
             self.open_adhoc_view('importerview', filename=uri)
 
         # Use small toolbar button everywhere
-        gtk.settings_get_default().set_property('gtk_toolbar_icon_size', gtk.ICON_SIZE_SMALL_TOOLBAR)
+        Gtk.Settings.get_default().set_property('gtk_toolbar_icon_size', Gtk.IconSize.SMALL_TOOLBAR)
         play=self.player_toolbar.get_children()[0]
-        play.set_flags(play.flags() | gtk.CAN_FOCUS)
+        play.set_can_focus(True)
         play.grab_focus()
         self.update_control_toolbar(self.player_toolbar)
 
-        self.event_source_update_display=gobject.timeout_add (100, self.update_display)
-        self.event_source_slow_update_display=gobject.timeout_add (1000, self.slow_update_display)
+        self.event_source_update_display=GObject.timeout_add (100, self.update_display)
+        self.event_source_slow_update_display=GObject.timeout_add (1000, self.slow_update_display)
         # Do we need to make an update check
         if (config.data.preferences['update-check']
             and time.time() - config.data.preferences['last-update'] >= 7 * 24 * 60 * 60):
@@ -1320,22 +1349,22 @@ class AdveneGUI(object):
         self.controller.notify ("ApplicationStart")
         if config.data.debug:
             self.controller._state=self.controller.event_handler.dump()
-        gtk.gdk.threads_enter()
-        gtk.main ()
-        gtk.gdk.threads_leave()
+        Gdk.threads_enter()
+        Gtk.main ()
+        Gdk.threads_leave()
         self.controller.notify ("ApplicationEnd")
 
     def check_for_update(self, *p):
         timeout=socket.getdefaulttimeout()
         try:
             socket.setdefaulttimeout(1)
-            u=urllib2.urlopen('http://liris.cnrs.fr/advene/version.txt')
-        except Exception, e:
+            u=urllib.request.urlopen('http://www.advene.org/version.txt')
+        except Exception:
             socket.setdefaulttimeout(timeout)
             return
         socket.setdefaulttimeout(timeout)
         try:
-            data=u.read()
+            data=u.read().decode('utf-8')
         except:
             data=""
         u.close()
@@ -1348,18 +1377,18 @@ class AdveneGUI(object):
         info['current']=advene.core.version.version
         if (1000 * major + minor) > (1000 * advene.core.version.major + advene.core.version.minor):
             # An update is available.
-            v=gtk.VBox()
-            msg=textwrap.fill(_("""<span background="#ff8888" size="large"><b>Advene %(version)s has been released</b> on %(date)s, but you are running version %(current)s.\nYou can download the latest version from the Advene website: http://liris.cnrs.fr/advene/</span>""") % info, 55)
-            l=gtk.Label()
+            v=Gtk.VBox()
+            msg=textwrap.fill(_("""<span background="#ff8888" size="large"><b>Advene %(version)s has been released</b> on %(date)s, but you are running version %(current)s.\nYou can download the latest version from the Advene website: http://advene.org/</span>""") % info, 55)
+            l=Gtk.Label()
             l.set_markup(msg)
             #l.set_line_wrap_mode(True)
             v.add(l)
-            b=gtk.Button(_("Go to the website"))
+            b=Gtk.Button(_("Go to the website"))
             def open_site(b):
-                self.controller.open_url('http://liris.cnrs.fr/advene/download.html')
+                self.controller.open_url('http://www.advene.org/download.html')
                 return True
             b.connect('clicked', open_site)
-            v.pack_start(b, expand=False)
+            v.pack_start(b, False, True, 0)
             self.popupwidget.display(v, title=_("Advene release"))
         elif p:
             # There were parameters, then we were called from a menu
@@ -1380,13 +1409,13 @@ class AdveneGUI(object):
             gtk_color=name2color(colname)
         except:
             gtk_color=None
-        d=gtk.ColorSelectionDialog(_("Choose a color"))
+        d=Gtk.ColorSelectionDialog(_("Choose a color"))
         if gtk_color:
             d.colorsel.set_current_color(gtk_color)
         res=d.run()
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             col=d.colorsel.get_current_color()
-            element.setMetaData(config.data.namespace, 'color', u"string:#%04x%04x%04x" % (col.red,
+            element.setMetaData(config.data.namespace, 'color', "string:#%04x%04x%04x" % (col.red,
                                                                                            col.green,
                                                                                            col.blue))
             # Notify the change
@@ -1429,13 +1458,25 @@ class AdveneGUI(object):
         # south, fareast)
         self.pane={}
 
-        # Video player socket
-        self.drawable=gtk.Socket()
-
         def handle_remove(socket):
             # Do not kill the widget if the application exits
             return True
-        self.drawable.connect('plug-removed', handle_remove)
+
+        # Video player socket
+        if config.data.os == 'win32':
+            self.drawable = Gtk.DrawingArea()
+            def get_id(widget):
+                if hasattr(GdkWin32.Win32Window, 'get_handle'):
+                    return GdkWin32.Win32Window.get_handle(widget.get_window())
+                else:
+                    logger.error("Cannot embed player on win32 - missing API")
+                    return None
+            # Define the get_id method on the drawable, so that it can
+            # be used by the player plugin code.
+            self.drawable.get_id = get_id.__get__(self.drawable)
+        else:
+            self.drawable=Gtk.Socket()
+            self.drawable.connect('plug-removed', handle_remove)
 
         def register_drawable(drawable):
             # The player is initialized. We can register the drawable id
@@ -1447,35 +1488,34 @@ class AdveneGUI(object):
                 except AttributeError:
                     self.visual_id = self.drawable.get_id()
                     self.controller.player.set_visual(self.visual_id)
-            except Exception, e:
-                self.log("Cannot set visual: %s" % unicode(e))
+            except Exception:
+                logger.error("Cannot embed video player", exc_info=True)
             return True
         self.drawable.connect_after('realize', register_drawable)
 
-        black=gtk.gdk.Color(0, 0, 0)
-        for state in (gtk.STATE_ACTIVE, gtk.STATE_NORMAL,
-                      gtk.STATE_SELECTED, gtk.STATE_INSENSITIVE,
-                      gtk.STATE_PRELIGHT):
+        black=Gdk.Color(0, 0, 0)
+        for state in (Gtk.StateType.ACTIVE, Gtk.StateType.NORMAL,
+                      Gtk.StateType.SELECTED, Gtk.StateType.INSENSITIVE,
+                      Gtk.StateType.PRELIGHT):
             self.drawable.modify_bg (state, black)
 
-        self.drawable.set_size_request(320, 200)
-        self.drawable.add_events(gtk.gdk.BUTTON_PRESS)
+        self.drawable.add_events(Gdk.EventType.BUTTON_PRESS)
         self.drawable.connect_object('button-press-event', self.debug_cb, self.drawable)
 
         self.player_toolbar = self.get_player_control_toolbar()
         self.playpause_button = self.player_toolbar.buttons['playpause']
 
         # Dynamic view selection
-        hb=gtk.HBox()
-        #hb.pack_start(gtk.Label(_('D.view')), expand=False)
-        self.gui.stbv_combo = gtk.ComboBox()
-        cell = gtk.CellRendererText()
-        cell.props.ellipsize = pango.ELLIPSIZE_MIDDLE
+        hb=Gtk.HBox()
+        #hb.pack_start(Gtk.Label(_('D.view')), False, False, 0)
+        self.gui.stbv_combo = Gtk.ComboBox()
+        cell = Gtk.CellRendererText()
+        cell.props.ellipsize = Pango.EllipsizeMode.MIDDLE
         self.gui.stbv_combo.pack_start(cell, True)
         self.gui.stbv_combo.add_attribute(cell, 'text', 0)
         self.gui.stbv_combo.props.tooltip_text=_("No active dynamic view")
 
-        hb.pack_start(self.gui.stbv_combo, expand=True)
+        hb.pack_start(self.gui.stbv_combo, True, True, 0)
 
         def new_stbv(*p):
             cr = CreateElementPopup(type_=View,
@@ -1483,9 +1523,9 @@ class AdveneGUI(object):
                                     controller=self.controller)
             cr.popup()
             return True
-        b=get_small_stock_button(gtk.STOCK_ADD, new_stbv)
+        b=get_small_stock_button(Gtk.STOCK_ADD, new_stbv)
         b.set_tooltip_text(_("Create a new dynamic view."))
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
         def on_edit_current_stbv_clicked(button):
             """Handle current stbv edition.
@@ -1502,9 +1542,9 @@ class AdveneGUI(object):
             self.edit_element(stbv)
             return True
 
-        edit_stbv_button=get_small_stock_button(gtk.STOCK_EDIT, on_edit_current_stbv_clicked)
+        edit_stbv_button=get_small_stock_button(Gtk.STOCK_EDIT, on_edit_current_stbv_clicked)
         edit_stbv_button.set_tooltip_text(_("Edit the current dynamic view."))
-        hb.pack_start(edit_stbv_button, expand=False)
+        hb.pack_start(edit_stbv_button, False, True, 0)
 
         def on_stbv_combo_changed (combo=None):
             """Callback used to select the current stbv.
@@ -1530,9 +1570,9 @@ class AdveneGUI(object):
                 self.controller.player.sound_set_volume(int(value * 100))
             return True
 
-        self.audio_volume = gtk.VolumeButton()
+        self.audio_volume = Gtk.VolumeButton()
         self.audio_volume.set_value(self.controller.player.sound_get_volume() / 100.0)
-        ti = gtk.ToolItem()
+        ti = Gtk.ToolItem()
         ti.add(self.audio_volume)
         self.audio_volume.connect('value-changed', volume_change)
         self.player_toolbar.insert(ti, -1)
@@ -1545,10 +1585,9 @@ class AdveneGUI(object):
                 self.controller.player.set_rate(v)
             return True
 
-        self.rate_control = gtk.SpinButton(gtk.Adjustment(1.0, 0.1, 100.0, 0.2, 0.5),
-                                           0.2, 1)
+        self.rate_control = Gtk.SpinButton.new(Gtk.Adjustment.new(1.0, 0.1, 100.0, 0.2, 0.5, 10), 0.2, 1)
         self.rate_control.set_tooltip_text(_("Playing rate"))
-        ti = gtk.ToolItem()
+        ti = Gtk.ToolItem()
         ti.add(self.rate_control)
         self.rate_control.connect('value-changed', rate_change)
         self.player_toolbar.insert(ti, -1)
@@ -1563,13 +1602,13 @@ class AdveneGUI(object):
                     def action_loop(context, target):
                         if (self.player_toolbar.buttons['loop'].get_active()
                             and context.globals['annotation'] == self.current_annotation):
-                            self.controller.update_status('set', self.current_annotation.fragment.begin)
+                            self.controller.update_status('seek', self.current_annotation.fragment.begin)
                         return True
 
                     def reg():
                         # If we are already in the current annotation, do not goto it
                         if not self.controller.player.current_position_value in self.current_annotation.fragment:
-                            self.controller.update_status('set', self.current_annotation.fragment.begin)
+                            self.controller.update_status('seek', self.current_annotation.fragment.begin)
                         self.annotation_loop_rule=self.controller.event_handler.internal_rule (event="AnnotationEnd",
                                                                                                method=action_loop)
                         return True
@@ -1581,26 +1620,26 @@ class AdveneGUI(object):
                         self.controller.event_handler.remove_rule(self.annotation_loop_rule, type_="internal")
             return True
 
-        b = gtk.ToggleToolButton(gtk.STOCK_REFRESH)
+        b = Gtk.ToggleToolButton(Gtk.STOCK_REFRESH)
         self.player_toolbar.buttons['loop'] = b
         self.update_loop_button()
         b.connect('toggled', loop_toggle_cb)
         self.player_toolbar.insert(b, -1)
 
         # Append the player status label to the toolbar
-        ts=gtk.SeparatorToolItem()
+        ts=Gtk.SeparatorToolItem()
         ts.set_draw(False)
         ts.set_expand(True)
         self.player_toolbar.insert(ts, -1)
 
-        ti=gtk.ToolItem()
-        self.gui.player_status=gtk.Label('--')
+        ti=Gtk.ToolItem()
+        self.gui.player_status=Gtk.Label(label='--')
         ti.add(self.gui.player_status)
         self.player_toolbar.insert(ti, -1)
 
         # Create the slider
-        adj = gtk.Adjustment(0, 0, 100, 1, 1, 10)
-        self.gui.slider = gtk.HScale(adj)
+        adj = Gtk.Adjustment.new(0, 0, 100, 1, 1, 10)
+        self.gui.slider = Gtk.Scale.new(Gtk.Orientation.HORIZONTAL, adj)
         self.gui.slider.set_draw_value(False)
         self.gui.slider.connect('button-press-event', self.on_slider_button_press_event)
         self.gui.slider.connect('button-release-event', self.on_slider_button_release_event)
@@ -1611,30 +1650,30 @@ class AdveneGUI(object):
         self.gui.slider.connect('value-changed', update_timelabel)
 
         # Stack the video components
-        v=gtk.VBox()
-        v.pack_start(hb, expand=False)
-        eb=gtk.EventBox()
+        v=Gtk.VBox()
+        v.pack_start(hb, False, True, 0)
+        eb=Gtk.EventBox()
         eb.set_above_child(True)
         eb.set_visible_window(True)
         eb.add(self.drawable)
-        v.pack_start(eb, expand=True)
+        v.pack_start(eb, True, True, 0)
         eb.connect('scroll-event', self.on_slider_scroll_event)
         eb.connect('button-press-event', self.on_video_button_press_event)
         eb.connect('key-press-event', self.on_win_key_press_event)
 
         if config.data.preferences['display-scroller']:
             self.scroller=ScrollerView(controller=self.controller)
-            v.pack_start(self.scroller.widget, expand=False)
+            v.pack_start(self.scroller.widget, False, True, 0)
         if config.data.preferences['display-caption']:
             self.captionview=CaptionView(controller=self.controller)
             self.register_view(self.captionview)
-            v.pack_start(self.captionview.widget, expand=False)
+            v.pack_start(self.captionview.widget, False, True, 0)
         else:
             self.captionview=None
 
-        h=gtk.HBox()
-        eb=gtk.EventBox()
-        self.time_label = gtk.Label()
+        h=Gtk.HBox()
+        eb=Gtk.EventBox()
+        self.time_label = Gtk.Label()
         self.time_label.value = None
         def set_time(s, t):
             s.set_text(helper.format_time(t))
@@ -1644,33 +1683,33 @@ class AdveneGUI(object):
         # Make sure that we use a fixed-size font, so that the
         # time_label width is constant and does not constantly modify
         # the slider available width.
-        self.time_label.modify_font(pango.FontDescription("courier 10"))
+        self.time_label.modify_font(Pango.FontDescription("courier 10"))
         if config.data.os == 'darwin':
             self.time_label.set_size_request(90, -1)
         self.time_label.set_time(None)
         eb.add(self.time_label)
 
         def time_pressed(w, event):
-            if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+            if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
                 self.goto_time_dialog()
                 return True
             return True
 
         eb.connect('button-press-event', time_pressed)
-        h.pack_start(eb, expand=False)
-        h.pack_start(self.gui.slider, expand=True)
-        v.pack_start(h, expand=False)
+        h.pack_start(eb, False, True, 0)
+        h.pack_start(self.gui.slider, True, True, 0)
+        v.pack_start(h, False, True, 0)
 
-        v.pack_start(self.player_toolbar, expand=False)
+        v.pack_start(self.player_toolbar, False, True, 0)
 
         # create the viewbooks
         for pos in ('east', 'west', 'south', 'fareast'):
             self.viewbook[pos]=ViewBook(controller=self.controller, location=pos)
 
-        self.pane['west']=gtk.HPaned()
-        self.pane['east']=gtk.HPaned()
-        self.pane['south']=gtk.VPaned()
-        self.pane['fareast']=gtk.HPaned()
+        self.pane['west']=Gtk.HPaned()
+        self.pane['east']=Gtk.HPaned()
+        self.pane['south']=Gtk.VPaned()
+        self.pane['fareast']=Gtk.HPaned()
 
         # pack all together
         self.pane['west'].add1(self.viewbook['west'].widget)
@@ -1720,22 +1759,22 @@ class AdveneGUI(object):
         height = pane.get_allocation().height
         if paneid == 'fareast':
             need_adjust = (abs(width - pane.get_position()) < 200)
-            step = - (pane.get_position() - (width - 256)) / 8
+            step = - int((pane.get_position() - (width - 256)) / 8)
             condition = lambda p: (p < width - 256)
         elif paneid == 'south':
             need_adjust = (abs(height - pane.get_position()) < 200)
-            step = - (pane.get_position() - (height - 256)) / 8
+            step = - int((pane.get_position() - (height - 256)) / 8)
             condition = lambda p: (p < height - 256)
         elif paneid == 'west':
             # We should ideally also check for height adjustment (in
             # south pane), but the video player is generally always
             # visible anyway, so height should already be OK.
             need_adjust = (pane.get_position() < 200)
-            step = 256 / 8
+            step = int(256 / 8)
             condition = lambda p: (p > 256)
         elif paneid == 'east':
             need_adjust = (abs(width - pane.get_position()) < 200)
-            step = - (pane.get_position() - (width - 256)) / 8
+            step = - int((pane.get_position() - (width - 256)) / 8)
             condition = lambda p: (p < width - 256)
         else:
             need_adjust = False
@@ -1747,7 +1786,7 @@ class AdveneGUI(object):
                     return False
                 pane.set_position(pos)
                 return True
-            gobject.timeout_add(100, enlarge_view)
+            GObject.timeout_add(100, enlarge_view)
         return True
 
     def find_bookmark_view(self):
@@ -1794,146 +1833,144 @@ class AdveneGUI(object):
         except AttributeError:
             p.set_visual(self.drawable.get_id())
         self.update_control_toolbar(self.player_toolbar)
+        self.build_player_menu()
 
     def player_play_pause(self, event):
         p=self.controller.player
-        if p.status == p.PlayingStatus or p.status == p.PauseStatus:
+        if p.is_playing():
             self.controller.update_status('pause')
         else:
             self.controller.update_status('start')
 
     def player_forward(self, event):
-        if event.state & gtk.gdk.SHIFT_MASK:
+        if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
             i='second-time-increment'
         else:
             i='time-increment'
-        self.controller.move_position (config.data.preferences[i], notify=False)
+        self.controller.update_status("seek_relative", config.data.preferences[i], notify=False)
 
     def player_rewind(self, event):
-        if event.state & gtk.gdk.SHIFT_MASK:
+        if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
             i='second-time-increment'
         else:
             i='time-increment'
-        self.controller.move_position (-config.data.preferences[i], notify=False)
+        self.controller.update_status("seek_relative", -config.data.preferences[i], notify=False)
 
     def player_forward_frame(self, event):
-        if config.data.preferences['custom-updown-keys'] or event.state & gtk.gdk.SHIFT_MASK:
-            self.controller.move_position(+config.data.preferences['third-time-increment'], notify=False)
+        if config.data.preferences['custom-updown-keys'] or event.get_state() & Gdk.ModifierType.SHIFT_MASK:
+            self.controller.update_status("seek_relative", +config.data.preferences['third-time-increment'], notify=False)
         else:
             self.controller.move_frame(+1)
 
     def player_rewind_frame(self, event):
-        if config.data.preferences['custom-updown-keys'] or event.state & gtk.gdk.SHIFT_MASK:
-            self.controller.move_position(-config.data.preferences['third-time-increment'], notify=False)
+        if config.data.preferences['custom-updown-keys'] or event.get_state() & Gdk.ModifierType.SHIFT_MASK:
+            self.controller.update_status("seek_relative", -config.data.preferences['third-time-increment'], notify=False)
         else:
             self.controller.move_frame(-1)
 
     def player_create_bookmark(self, event):
         p=self.controller.player
-        if p.status in (p.PlayingStatus, p.PauseStatus):
+        if p.is_playing():
             self.create_bookmark(p.current_position_value,
-                                 insert_after_current=(event.state & gtk.gdk.SHIFT_MASK))
+                                 insert_after_current=(event.get_state() & Gdk.ModifierType.SHIFT_MASK))
 
     def player_home(self, event):
-        self.controller.update_status ("set", self.controller.create_position (0))
+        self.controller.update_status("seek", 0)
 
     def player_end(self, event):
         c=self.controller
-        pos = c.create_position (value = -config.data.preferences['time-increment'],
-                                 key = c.player.MediaTime,
-                                 origin = c.player.ModuloPosition)
-        c.update_status ("set", pos)
+        c.update_status("seek_relative", -config.data.preferences['time-increment'])
 
     def player_set_fraction(self, f):
-        self.controller.update_status("set", self.controller.create_position(long(self.controller.cached_duration * f)))
+        self.controller.update_status("seek", self.controller.cached_duration * f)
 
     def function_key(self, event):
-        if gtk.keysyms.F1 <= event.keyval <= gtk.keysyms.F12:
-            self.controller.notify('KeyboardInput', request={ 'keyname': gtk.gdk.keyval_name(event.keyval) })
+        if Gdk.KEY_F1 <= event.keyval <= Gdk.KEY_F12:
+            self.controller.notify('KeyboardInput', request={ 'keyname': Gdk.keyval_name(event.keyval) })
 
     control_key_shortcuts={
-        gtk.keysyms.Tab: player_play_pause,
-        gtk.keysyms.space: player_play_pause,
-        gtk.keysyms.Up: player_forward_frame,
-        gtk.keysyms.Down: player_rewind_frame,
-        gtk.keysyms.Right: player_forward,
-        gtk.keysyms.Left: player_rewind,
-        gtk.keysyms.Home: player_home,
-        gtk.keysyms.End: player_end,
-        gtk.keysyms.Insert: player_create_bookmark,
+        Gdk.KEY_Tab: player_play_pause,
+        Gdk.KEY_space: player_play_pause,
+        Gdk.KEY_Up: player_forward_frame,
+        Gdk.KEY_Down: player_rewind_frame,
+        Gdk.KEY_Right: player_forward,
+        Gdk.KEY_Left: player_rewind,
+        Gdk.KEY_Home: player_home,
+        Gdk.KEY_End: player_end,
+        Gdk.KEY_Insert: player_create_bookmark,
         }
 
     key_shortcuts={
-        gtk.keysyms.Insert: player_create_bookmark,
+        Gdk.KEY_Insert: player_create_bookmark,
 
         # Numeric keypad
-        gtk.keysyms.KP_5: player_play_pause,
-        gtk.keysyms.KP_8: player_forward_frame,
-        gtk.keysyms.KP_2: player_rewind_frame,
-        gtk.keysyms.KP_6: player_forward,
-        gtk.keysyms.KP_4: player_rewind,
-        gtk.keysyms.KP_7: player_home,
-        gtk.keysyms.KP_1: player_end,
-        gtk.keysyms.KP_0: player_create_bookmark,
+        Gdk.KEY_KP_5: player_play_pause,
+        Gdk.KEY_KP_8: player_forward_frame,
+        Gdk.KEY_KP_2: player_rewind_frame,
+        Gdk.KEY_KP_6: player_forward,
+        Gdk.KEY_KP_4: player_rewind,
+        Gdk.KEY_KP_7: player_home,
+        Gdk.KEY_KP_1: player_end,
+        Gdk.KEY_KP_0: player_create_bookmark,
 
         # Symbolic keypad
-        gtk.keysyms.KP_Begin: player_play_pause,
-        gtk.keysyms.KP_Up: player_forward_frame,
-        gtk.keysyms.KP_Down: player_rewind_frame,
-        gtk.keysyms.KP_Right: player_forward,
-        gtk.keysyms.KP_Left: player_rewind,
-        gtk.keysyms.KP_Home: player_home,
-        gtk.keysyms.KP_End: player_end,
-        gtk.keysyms.KP_Insert: player_create_bookmark,
+        Gdk.KEY_KP_Begin: player_play_pause,
+        Gdk.KEY_KP_Up: player_forward_frame,
+        Gdk.KEY_KP_Down: player_rewind_frame,
+        Gdk.KEY_KP_Right: player_forward,
+        Gdk.KEY_KP_Left: player_rewind,
+        Gdk.KEY_KP_Home: player_home,
+        Gdk.KEY_KP_End: player_end,
+        Gdk.KEY_KP_Insert: player_create_bookmark,
 
         # Function keys
-        gtk.keysyms.F1:   function_key,
-        gtk.keysyms.F2:   function_key,
-        gtk.keysyms.F3:   function_key,
-        gtk.keysyms.F4:   function_key,
-        gtk.keysyms.F5:   function_key,
-        gtk.keysyms.F6:   function_key,
-        gtk.keysyms.F7:   function_key,
-        gtk.keysyms.F8:   function_key,
-        gtk.keysyms.F9:   function_key,
-        gtk.keysyms.F10:  function_key,
-        gtk.keysyms.F11:  function_key,
-        gtk.keysyms.F12:  function_key,
+        Gdk.KEY_F1:   function_key,
+        Gdk.KEY_F2:   function_key,
+        Gdk.KEY_F3:   function_key,
+        Gdk.KEY_F4:   function_key,
+        Gdk.KEY_F5:   function_key,
+        Gdk.KEY_F6:   function_key,
+        Gdk.KEY_F7:   function_key,
+        Gdk.KEY_F8:   function_key,
+        Gdk.KEY_F9:   function_key,
+        Gdk.KEY_F10:  function_key,
+        Gdk.KEY_F11:  function_key,
+        Gdk.KEY_F12:  function_key,
         }
 
     fullscreen_key_shortcuts = {
-        gtk.keysyms.Tab: player_play_pause,
-        gtk.keysyms.space: player_play_pause,
-        gtk.keysyms.Up: player_forward_frame,
-        gtk.keysyms.Down: player_rewind_frame,
-        gtk.keysyms.Right: player_forward,
-        gtk.keysyms.Left: player_rewind,
-        gtk.keysyms.Home: player_home,
-        gtk.keysyms.Insert: player_create_bookmark,
+        Gdk.KEY_Tab: player_play_pause,
+        Gdk.KEY_space: player_play_pause,
+        Gdk.KEY_Up: player_forward_frame,
+        Gdk.KEY_Down: player_rewind_frame,
+        Gdk.KEY_Right: player_forward,
+        Gdk.KEY_Left: player_rewind,
+        Gdk.KEY_Home: player_home,
+        Gdk.KEY_Insert: player_create_bookmark,
 
         # AZERTY keyboard navigation
-        gtk.keysyms.ampersand:  lambda s, e: s.player_set_fraction(.0),
-        gtk.keysyms.eacute:     lambda s, e: s.player_set_fraction(.1),
-        gtk.keysyms.quotedbl:   lambda s, e: s.player_set_fraction(.2),
-        gtk.keysyms.apostrophe: lambda s, e: s.player_set_fraction(.3),
-        gtk.keysyms.parenleft:  lambda s, e: s.player_set_fraction(.4),
-        gtk.keysyms.minus:      lambda s, e: s.player_set_fraction(.5),
-        gtk.keysyms.egrave:     lambda s, e: s.player_set_fraction(.6),
-        gtk.keysyms.underscore: lambda s, e: s.player_set_fraction(.7),
-        gtk.keysyms.ccedilla:   lambda s, e: s.player_set_fraction(.8),
-        gtk.keysyms.agrave:     lambda s, e: s.player_set_fraction(.9),
+        Gdk.KEY_ampersand:  lambda s, e: s.player_set_fraction(.0),
+        Gdk.KEY_eacute:     lambda s, e: s.player_set_fraction(.1),
+        Gdk.KEY_quotedbl:   lambda s, e: s.player_set_fraction(.2),
+        Gdk.KEY_apostrophe: lambda s, e: s.player_set_fraction(.3),
+        Gdk.KEY_parenleft:  lambda s, e: s.player_set_fraction(.4),
+        Gdk.KEY_minus:      lambda s, e: s.player_set_fraction(.5),
+        Gdk.KEY_egrave:     lambda s, e: s.player_set_fraction(.6),
+        Gdk.KEY_underscore: lambda s, e: s.player_set_fraction(.7),
+        Gdk.KEY_ccedilla:   lambda s, e: s.player_set_fraction(.8),
+        Gdk.KEY_agrave:     lambda s, e: s.player_set_fraction(.9),
 
         # QWERTY keyboard navigation
-        gtk.keysyms._1:  lambda s, e: s.player_set_fraction(.0),
-        gtk.keysyms._2:  lambda s, e: s.player_set_fraction(.1),
-        gtk.keysyms._3:  lambda s, e: s.player_set_fraction(.2),
-        gtk.keysyms._4:  lambda s, e: s.player_set_fraction(.3),
-        gtk.keysyms._5:  lambda s, e: s.player_set_fraction(.4),
-        gtk.keysyms._6:  lambda s, e: s.player_set_fraction(.5),
-        gtk.keysyms._7:  lambda s, e: s.player_set_fraction(.6),
-        gtk.keysyms._8:  lambda s, e: s.player_set_fraction(.7),
-        gtk.keysyms._9:  lambda s, e: s.player_set_fraction(.8),
-        gtk.keysyms._0:  lambda s, e: s.player_set_fraction(.9),
+        Gdk.KEY_1:  lambda s, e: s.player_set_fraction(.0),
+        Gdk.KEY_2:  lambda s, e: s.player_set_fraction(.1),
+        Gdk.KEY_3:  lambda s, e: s.player_set_fraction(.2),
+        Gdk.KEY_4:  lambda s, e: s.player_set_fraction(.3),
+        Gdk.KEY_5:  lambda s, e: s.player_set_fraction(.4),
+        Gdk.KEY_6:  lambda s, e: s.player_set_fraction(.5),
+        Gdk.KEY_7:  lambda s, e: s.player_set_fraction(.6),
+        Gdk.KEY_8:  lambda s, e: s.player_set_fraction(.7),
+        Gdk.KEY_9:  lambda s, e: s.player_set_fraction(.8),
+        Gdk.KEY_0:  lambda s, e: s.player_set_fraction(.9),
 
         }
 
@@ -1944,7 +1981,7 @@ class AdveneGUI(object):
         """
         # For the moment, we only check if we are in full or simplified GUI state.
         # FIXME: it is not as simple as this:
-        #print "FOCUS", [ isinstance(w.get_focus(), gtk.Editable) for w in  gtk.window_list_toplevels() if w.get_focus() is not None ]
+        #print "FOCUS", [ isinstance(w.get_focus(), Gtk.Editable) for w in  Gtk.window_list_toplevels() if w.get_focus() is not None ]
         # since we can want to use the standard gtk keyboard navigation among widgets.
         return self.viewbook['east'].widget.get_visible()
 
@@ -1956,19 +1993,12 @@ class AdveneGUI(object):
         Control-home/-end: start/end of the stream
         """
 
-        p=self.controller.player
-
-        if (event.keyval == gtk.keysyms.nobreakspace
-            or (event.state & gtk.gdk.MOD1_MASK and event.keyval == gtk.keysyms.space)):
-            # Alt-Space on MacOS X generates nobreakspace
-            self.player_create_bookmark(event)
-            return True
-        elif event.keyval in self.key_shortcuts:
+        if event.keyval in self.key_shortcuts:
             self.key_shortcuts[event.keyval](self, event)
             return True
         elif event.keyval in self.control_key_shortcuts and (
-            event.state & gtk.gdk.CONTROL_MASK
-            or not self.is_focus_on_editable()):
+                event.get_state() & self.player_shortcuts_modifier == self.player_shortcuts_modifier
+                or not self.is_focus_on_editable()):
             self.control_key_shortcuts[event.keyval](self, event)
             return True
         return False
@@ -1978,7 +2008,7 @@ class AdveneGUI(object):
         """
         c=self.controller
         p=self.controller.player
-        if event.keyval == gtk.keysyms.Return:
+        if event.keyval == Gdk.KEY_Return:
             # FIXME: reset data (validate or abort?) when leaving fullscreen
             if self.edited_annotation_text is None:
                 # Not yet editing, entering edit mode
@@ -2012,7 +2042,7 @@ class AdveneGUI(object):
                         at.date = self.controller.get_timestamp()
                         at.title = _("Default annotation type")
                         at.mimetype = 'text/plain'
-                        at.setMetaData(config.data.namespace, 'color', self.controller.package._color_palette.next())
+                        at.setMetaData(config.data.namespace, 'color', next(self.controller.package._color_palette))
                         at.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
                         at._fieldnames = set()
                         sc.annotationTypes.append(at)
@@ -2024,8 +2054,8 @@ class AdveneGUI(object):
                 self.edited_annotation_begin = None
                 p.display_text(_('Annotation created'), p.current_position_value, p.current_position_value + 1000)
             return True
-        elif gtk.gdk.keyval_to_unicode(event.keyval):
-            c = unicode(gtk.gdk.keyval_name(event.keyval))
+        elif Gdk.keyval_to_unicode(event.keyval):
+            c = str(Gdk.keyval_name(event.keyval))
             if len(c) == 1 and (c.isalnum() or c.isspace()):
                 if self.edited_annotation_text is None:
                     # Not yet editing, entering edit mode
@@ -2035,7 +2065,7 @@ class AdveneGUI(object):
                 # Display feedback
                 p.display_text(self.edited_annotation_text + '_', p.current_position_value, p.current_position_value + 10000)
                 return True
-        elif event.keyval == gtk.keysyms.BackSpace and self.edited_annotation_text is not None:
+        elif event.keyval == Gdk.KEY_BackSpace and self.edited_annotation_text is not None:
             # Delete last char
             self.edited_annotation_text = self.edited_annotation_text[:-1]
             p.display_text(self.edited_annotation_text + '_', p.current_position_value, p.current_position_value + 10000)
@@ -2050,16 +2080,34 @@ class AdveneGUI(object):
 
         It has a buttons attribute, which holds references to the buttons according to an identifier.
         """
-        tb=gtk.Toolbar()
-        tb.set_style(gtk.TOOLBAR_ICONS)
+        tb=Gtk.Toolbar()
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
 
         tb_list = [
-            ('playpause', _("Play/Pause [Control-Tab / Control-Space]"), gtk.STOCK_MEDIA_PLAY, self.on_b_play_clicked),
-            ('rewind', _("Rewind (%.02f s) [Control-Left]") % (config.data.preferences['time-increment'] / 1000.0), gtk.STOCK_MEDIA_REWIND, lambda i: self.controller.move_position (-config.data.preferences['time-increment'])),
-            ('forward', _("Forward (%.02f s) [Control-Right]" % (config.data.preferences['time-increment'] / 1000.0)), gtk.STOCK_MEDIA_FORWARD, lambda i: self.controller.move_position (config.data.preferences['time-increment'])),
-            ('previous_frame', _("Previous frame [Control-Down]"), gtk.STOCK_MEDIA_PREVIOUS, lambda i: self.controller.move_frame(-1)),
-            ('next_frame', _("Next frame [Control-Up]"), gtk.STOCK_MEDIA_NEXT, lambda i: self.controller.move_frame(+1)),
-            ('fullscreen', _("Fullscreen"), gtk.STOCK_FULLSCREEN, lambda i: self.controller.player.fullscreen(self.connect_fullscreen_handlers) ),
+            ('playpause',
+             _("Play/Pause [Control-Tab / Control-Space]"),
+             Gtk.STOCK_MEDIA_PLAY,
+             self.on_b_play_clicked),
+            ('rewind',
+             _("Rewind (%.02f s) [Control-Left]") % (config.data.preferences['time-increment'] / 1000.0),
+             Gtk.STOCK_MEDIA_REWIND,
+             lambda i: self.controller.update_status("seek_relative", -config.data.preferences['time-increment'])),
+            ('forward',
+             _("Forward (%.02f s) [Control-Right]" % (config.data.preferences['time-increment'] / 1000.0)),
+             Gtk.STOCK_MEDIA_FORWARD,
+             lambda i: self.controller.update_status("seek_relative", config.data.preferences['time-increment'])),
+            ('previous_frame',
+             _("Previous frame [Control-Down]"),
+             Gtk.STOCK_MEDIA_PREVIOUS,
+             lambda i: self.controller.move_frame(-1)),
+            ('next_frame',
+             _("Next frame [Control-Up]"),
+             Gtk.STOCK_MEDIA_NEXT,
+             lambda i: self.controller.move_frame(+1)),
+            ('fullscreen',
+             _("Fullscreen"),
+             Gtk.STOCK_FULLSCREEN,
+             lambda i: self.controller.player.fullscreen(self.connect_fullscreen_handlers) ),
             ]
 
         tb.buttons = {}
@@ -2067,7 +2115,7 @@ class AdveneGUI(object):
             if name == 'playpause':
                 b = PlayPauseButton(stock)
             else:
-                b = gtk.ToolButton(stock)
+                b = Gtk.ToolButton(stock)
             b.set_tooltip_text(text)
             b.connect('clicked', callback)
             tb.insert(b, -1)
@@ -2078,6 +2126,28 @@ class AdveneGUI(object):
         self.update_control_toolbar(tb)
         return tb
 
+    def build_player_menu(self):
+        menu = self.gui.select_player_menuitem.get_submenu()
+        if menu.get_children():
+            # The menu was previously populated, but the player may have changed.
+            # Clear it to update it.
+            menu.foreach(menu.remove)
+
+        # Populate the "Select player" menu
+        for ident, p in config.data.players.items():
+            def select_player(i, p):
+                self.controller.select_player(p)
+                return True
+            if self.controller.player.player_id == ident:
+                ident="> %s" % ident
+            else:
+                ident="   %s" % ident
+            i=Gtk.MenuItem(ident)
+            i.connect('activate', select_player, p)
+            menu.append(i)
+            i.show()
+        return True
+
     def update_control_toolbar(self, tb=None):
         """Update player control toolbar.
 
@@ -2088,14 +2158,14 @@ class AdveneGUI(object):
         p=self.controller.player
 
         if 'record' in p.player_capabilities:
-            tb.buttons['playpause'].set_stock_ids(gtk.STOCK_MEDIA_RECORD, gtk.STOCK_MEDIA_STOP)
-            for name, b in tb.buttons.iteritems():
+            tb.buttons['playpause'].set_stock_ids(Gtk.STOCK_MEDIA_RECORD, Gtk.STOCK_MEDIA_STOP)
+            for name, b in tb.buttons.items():
                 if name == 'playpause':
                     continue
                 b.set_sensitive(False)
         else:
-            tb.buttons['playpause'].set_stock_ids(gtk.STOCK_MEDIA_PLAY, gtk.STOCK_MEDIA_PAUSE)
-            for b in tb.buttons.itervalues():
+            tb.buttons['playpause'].set_stock_ids(Gtk.STOCK_MEDIA_PLAY, Gtk.STOCK_MEDIA_PAUSE)
+            for b in tb.buttons.values():
                 b.set_sensitive(True)
 
         if 'frame-by-frame' in p.player_capabilities:
@@ -2128,10 +2198,10 @@ class AdveneGUI(object):
         return True
 
     def debug_cb(self, window, event, *p):
-        print "Got event %s (%d, %d) in window %s" % (str(event),
-                                                      event.x,
-                                                      event.y,
-                                                      str(window))
+        logger.debug("Got event %s (%d, %d) in window %s" % (str(event),
+                                                             event.x,
+                                                             event.y,
+                                                             str(window)))
         return False
 
     def init_window_size(self, window, name):
@@ -2141,15 +2211,21 @@ class AdveneGUI(object):
             # Do not update position/size for edit popups
             return True
         if config.data.preferences['remember-window-size']:
+            screen = window.get_screen()
+            w = screen.get_width()
+            h = screen.get_height()
             s=config.data.preferences['windowsize'].setdefault(name, (640,480))
+            s = (min(s[0], w), min(s[1], h))
             window.resize(*s)
             pos=config.data.preferences['windowposition'].get(name, None)
             if pos:
-                window.move(*pos)
+                if pos[0] < w and pos[1] < h:
+                    # Do not use if it would display the window out of the screen
+                    window.move(*pos)
             if name != 'main':
                 # The main GUI is regularly reallocated (at each update_display), so
                 # do not update continuously. Just do it on application exit.
-                window.connect('size-request', self.resize_cb, name)
+                window.connect_after('size-allocate', self.resize_cb, name)
         return True
 
     def resize_cb (self, widget, allocation, name):
@@ -2168,14 +2244,14 @@ class AdveneGUI(object):
             # specific to svg though) crashes in the write method on
             # win32.  So we have to make sure the method is executed
             # in the main thread context.
-            q=Queue.Queue(1)
+            q=queue.Queue(1)
             def process_overlay(queue=None):
                 queue.put(overlay_svg_as_png(png_data, svg_data))
                 return False
-            gobject.timeout_add(0, process_overlay, q)
+            GObject.timeout_add(0, process_overlay, q)
             try:
                 data=q.get(True, 2)
-            except Queue.Empty:
+            except queue.Empty:
                 data=None
             return data
         else:
@@ -2209,13 +2285,13 @@ class AdveneGUI(object):
         def do_save_as(fname, png_data, notify=False):
             try:
                 f = open(fname, 'wb')
-                f.write(str(png_data))
+                f.write(bytes(png_data))
                 f.close()
                 self.controller.log(_("Screenshot saved to %s") % fname)
                 if notify:
-                    self.controller.queue_action(dialog.message_dialog, _("Screenshot saved in\n %s") % unicode(fname), modal=False)
-            except (IOError, OSError), e:
-                self.controller.queue_action(dialog.message_dialog, _("Could not save screenshot:\n %s") % unicode(e), icon=gtk.MESSAGE_ERROR, modal=False)
+                    self.controller.queue_action(dialog.message_dialog, _("Screenshot saved in\n %s") % str(fname), modal=False)
+            except Exception as e:
+                self.controller.queue_action(dialog.message_dialog, _("Could not save screenshot:\n %s") % str(e), icon=Gtk.MessageType.ERROR, modal=False)
 
         if filename is None:
             name = "%s-%010d.png" % (
@@ -2224,8 +2300,8 @@ class AdveneGUI(object):
                         self.controller.get_default_media()))[0],
                 position)
             filename = dialog.get_filename(title=_("Save screenshot to..."),
-                                           action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                           button=gtk.STOCK_SAVE,
+                                           action=Gtk.FileChooserAction.SAVE,
+                                           button=Gtk.STOCK_SAVE,
                                            default_file=name)
 
         if filename is not None:
@@ -2284,11 +2360,11 @@ class AdveneGUI(object):
             title=_("Export annotation type %s") % self.controller.get_title(element)
         else:
             title=_("Export element %s") % self.controller.get_title(element)
-        fs = gtk.FileChooserDialog(title=title,
+        fs = Gtk.FileChooserDialog(title=title,
                                    parent=self.gui.win,
-                                   action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                   buttons=( gtk.STOCK_CONVERT, gtk.RESPONSE_OK,
-                                             gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL ))
+                                   action=Gtk.FileChooserAction.SAVE,
+                                   buttons=( Gtk.STOCK_CONVERT, Gtk.ResponseType.OK,
+                                             Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL ))
         def update_extension(sel):
             filter=sel.get_current_element()
             f=generate_default_filename(filter, os.path.basename(fs.get_filename() or ""))
@@ -2308,9 +2384,9 @@ class AdveneGUI(object):
         exporters=dialog.list_selector_widget( [ (v, v.title) for v in self.controller.get_export_filters()
                                                  if valid_filter(v) ],
                                                callback=update_extension )
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Export format")), expand=False)
-        hb.pack_start(exporters)
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Export format")), False, False, 0)
+        hb.pack_start(exporters, True, True, 0)
         fs.set_extra_widget(hb)
 
         fs.show_all()
@@ -2318,7 +2394,7 @@ class AdveneGUI(object):
         self.fs=fs
         res=fs.run()
 
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             self.controller.apply_export_filter(element,
                                                 exporters.get_current_element(),
                                                 fs.get_filename())
@@ -2338,7 +2414,7 @@ class AdveneGUI(object):
         menu.foreach(menu.remove)
 
         # Rebuild the list
-        for a, p in self.controller.packages.iteritems():
+        for a, p in self.controller.packages.items():
             if a == 'advene':
                 continue
             if p == self.controller.package:
@@ -2347,7 +2423,7 @@ class AdveneGUI(object):
                 name = '  ' + a
             if p._modified:
                 name += _(' (modified)')
-            i=gtk.MenuItem(label=unicode(name), use_underline=False)
+            i=Gtk.MenuItem(label=str(name), use_underline=False)
             i.connect('activate', activate_package, a)
             i.set_tooltip_text(_("Activate %s") % self.controller.get_title(p))
             menu.append(i)
@@ -2355,9 +2431,9 @@ class AdveneGUI(object):
         menu.show_all()
         return True
 
-    arrow_list={ 'linux': u'\u25b8',
-                 'darwin': u'\u25b6',
-                 'win32': u'>' }
+    arrow_list={ 'linux': '\u25b8',
+                 'darwin': '\u25b6',
+                 'win32': '>' }
     def update_stbv_list (self):
         """Update the STBV list.
         """
@@ -2365,7 +2441,7 @@ class AdveneGUI(object):
         if stbv_combo is None:
             return True
         l=[ helper.TitledElement(value=None, title=_("No active dynamic view")) ]
-        l.extend( [ helper.TitledElement(value=i, title=u'%s %s %s' % (self.arrow_list[config.data.os],
+        l.extend( [ helper.TitledElement(value=i, title='%s %s %s' % (self.arrow_list[config.data.os],
                                                                        self.controller.get_title(i),
                                                                        self.arrow_list[config.data.os]))
                     for i in self.controller.get_stbv_list() ] )
@@ -2388,9 +2464,9 @@ class AdveneGUI(object):
             action (u)
             return True
 
-        menu=gtk.Menu()
+        menu=Gtk.Menu()
         for title, url in self.controller.get_utbv_list():
-            i=gtk.MenuItem(label=title, use_underline=False)
+            i=Gtk.MenuItem(label=title, use_underline=False)
             i.connect('activate', open_utbv, url)
             menu.append(i)
         menu.show_all()
@@ -2411,7 +2487,6 @@ class AdveneGUI(object):
                 # because they are not opened through open_adhoc_view
                 pass
             if dest == 'popup':
-                print "Closing ", v
                 v.close()
 
     def workspace_serialize(self, with_arguments=True):
@@ -2451,12 +2526,12 @@ class AdveneGUI(object):
         w=self.gui.win
         d={}
         d['x'], d['y']=w.get_position()
-        d['width'], d['height']=w.get_size()
-        for k, v in d.iteritems():
-            d[k]=unicode(v)
+        d['width'], d['height'] = w.get_size()
+        for k, v in d.items():
+            d[k]=str(v)
         layout=ET.SubElement(workspace, 'layout', d)
         for n in ('west', 'east', 'fareast', 'south'):
-            ET.SubElement(layout, 'pane', id=n, position=unicode(self.pane[n].get_position()))
+            ET.SubElement(layout, 'pane', id=n, position=str(self.pane[n].get_position()))
         # Now save adhoc views
         for v in self.adhoc_views:
             if not hasattr(v, '_destination'):
@@ -2476,12 +2551,12 @@ class AdveneGUI(object):
             element.attrib['title']=v._label
             if v._destination == 'popup':
                 # Additional parameters
-                w=v.window
+                w=v.get_window()
                 d={}
                 d['x'], d['y']=w.get_position()
-                d['width'], d['height']=w.get_size()
-                for k, v in d.iteritems():
-                    element.attrib[k]=unicode(v)
+                d['width'], d['height'] = w.get_width(), w.get_height()
+                for k, v in d.items():
+                    element.attrib[k]=str(v)
             workspace.append(element)
         return workspace
 
@@ -2503,19 +2578,19 @@ class AdveneGUI(object):
                                        parameters=node)
                 if node.attrib['destination'] == 'popup':
                     # Restore popup windows positions
-                    v.window.move(long(node.attrib['x']), long(node.attrib['y']))
-                    v.window.resize(long(node.attrib['width']), long(node.attrib['height']))
+                    v.get_window().move(int(node.attrib['x']), int(node.attrib['y']))
+                    v.get_window().resize(int(node.attrib['width']), int(node.attrib['height']))
             elif node.tag == 'layout':
                 layout=node
         # Restore layout
         if layout is not None and not preserve_layout:
             w=self.gui.win
-            w.move(long(layout.attrib['x']), long(layout.attrib['y']))
-            w.resize(min(long(layout.attrib['width']), gtk.gdk.screen_width()),
-                     min(long(layout.attrib['height']), gtk.gdk.screen_height()))
+            w.move(int(layout.attrib['x']), int(layout.attrib['y']))
+            w.resize(min(int(layout.attrib['width']), Gdk.Screen.width()),
+                     min(int(layout.attrib['height']), Gdk.Screen.height()))
             for pane in layout:
                 if pane.tag == 'pane' and pane.attrib['id'] in self.pane:
-                    self.pane[pane.attrib['id']].set_position(long(pane.attrib['position']))
+                    self.pane[pane.attrib['id']].set_position(int(pane.attrib['position']))
 
     def workspace_save(self, viewid=None):
         """Save the workspace in the given viewid.
@@ -2534,9 +2609,10 @@ class AdveneGUI(object):
         v.date=self.controller.get_timestamp()
 
         workspace=self.workspace_serialize()
-        stream=StringIO.StringIO()
+        stream=io.StringIO()
         helper.indent(workspace)
-        ET.ElementTree(workspace).write(stream, encoding='utf-8')
+        tree = ET.ElementTree(workspace)
+        tree.write(stream, encoding='unicode')
         v.content.setData(stream.getvalue())
         stream.close()
 
@@ -2572,30 +2648,30 @@ class AdveneGUI(object):
                 tree=ET.parse(name.content.stream)
 
                 if kw.get('ask', True):
-                    d = gtk.Dialog(title=_("Restoring workspace..."),
-                                   parent=None,
-                                   flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                                   buttons=( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                                             gtk.STOCK_OK, gtk.RESPONSE_OK,
+                    d = Gtk.Dialog(title=_("Restoring workspace..."),
+                                   parent=self.gui.win,
+                                   flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                                   buttons=( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+                                             Gtk.STOCK_OK, Gtk.ResponseType.OK,
                                              ))
-                    l=gtk.Label(_("Do you wish to restore the %s workspace ?") % name.title)
+                    l=Gtk.Label(label=_("Do you wish to restore the %s workspace ?") % name.title)
                     l.set_line_wrap(True)
                     l.show()
-                    d.vbox.pack_start(l, expand=False)
+                    d.vbox.pack_start(l, False, True, 0)
 
-                    delete_existing_toggle=gtk.CheckButton(_("Clear the current workspace"))
+                    delete_existing_toggle=Gtk.CheckButton(_("Clear the current workspace"))
                     delete_existing_toggle.set_active(True)
                     delete_existing_toggle.show()
-                    d.vbox.pack_start(delete_existing_toggle, expand=False)
+                    d.vbox.pack_start(delete_existing_toggle, False, True, 0)
 
                     res=d.run()
                     clear=delete_existing_toggle.get_active()
                     d.destroy()
                 else:
-                    res=gtk.RESPONSE_OK
+                    res=Gtk.ResponseType.OK
                     clear=True
 
-                if res == gtk.RESPONSE_OK:
+                if res == Gtk.ResponseType.OK:
                     def restore(clr):
                         if clr:
                             self.workspace_clear()
@@ -2645,7 +2721,7 @@ class AdveneGUI(object):
                 view.open_url(self.controller.get_default_url(alias='advene'))
             elif self.controller.package is not None:
                 m=self.build_utbv_menu()
-                m.popup(None, None, None, 0, gtk.get_current_event_time())
+                m.popup_at_pointer(None)
             else:
                 self.log (("No current package"))
         elif name == 'transcribe':
@@ -2663,10 +2739,9 @@ class AdveneGUI(object):
                 return None
             try:
                 view=get_edit_popup(element, self.controller)
-            except TypeError, e:
-                print (_(u"Error: unable to find an edit popup for %(element)s:\n%(error)s") % {
-                        'element': unicode(element),
-                        'error': unicode(e)}).encode('latin1')
+            except TypeError:
+                logger.warn(_("Error: unable to find an edit popup for %(element)s") % {
+                    'element': str(element) })
                 view=None
             if view is not None and view.widget.get_parent() is not None:
                 # Widget is already displayed. Present it.
@@ -2695,15 +2770,15 @@ class AdveneGUI(object):
             return view
         # Store destination and label, used when moving the view
         view._destination=destination
-        label=unicode(label or view.view_name)
+        label=str(label or view.view_name)
         view.set_label(label)
 
         if destination == 'popup':
             w=view.popup(label=label)
-            if isinstance(w, gtk.Window):
+            if isinstance(w, Gtk.Window):
                 dialog.center_on_mouse(w)
         elif destination in ('south', 'east', 'west', 'fareast'):
-            self.viewbook[destination].add_view(view, name=unicode(label))
+            self.viewbook[destination].add_view(view, name=str(label))
         return view
 
     def get_adhoc_view_instance_from_id(self, ident):
@@ -2799,7 +2874,7 @@ class AdveneGUI(object):
                                                         len(p.relations))
                 })
         if not p.uri.endswith('new_pkg'):
-            gtk.recent_manager_get_default().add_item(p.uri)
+            Gtk.RecentManager.get_default().add_item(p.uri)
 
         # Create the content indexer
         p._indexer=Indexer(controller=self.controller,
@@ -2816,21 +2891,20 @@ class AdveneGUI(object):
         default_adhoc = package.getMetaData (config.data.namespace, "default_adhoc")
         view=helper.get_id(package.views, default_adhoc)
         if view:
-            load=False
             if config.data.preferences['restore-default-workspace'] == 'always':
                 self.controller.queue_action(self.open_adhoc_view, view, ask=False)
             elif config.data.preferences['restore-default-workspace'] == 'ask':
                 def open_view():
                     self.open_adhoc_view(view, ask=False)
                     return True
-                load=dialog.message_dialog(_("Do you want to restore the saved workspace ?"),
-                                           icon=gtk.MESSAGE_QUESTION,
-                                           callback=open_view)
+                dialog.message_dialog(_("Do you want to restore the saved workspace ?"),
+                                      icon=Gtk.MessageType.QUESTION,
+                                      callback=open_view)
         return False
 
     def update_window_title(self):
         # Update the main window title
-        t=" - ".join((_("Advene"), unicode(os.path.basename(self.controller.package.uri)), self.controller.get_title(self.controller.package)))
+        t=" - ".join((_("Advene"), str(os.path.basename(self.controller.package.uri)), self.controller.get_title(self.controller.package)))
         if self.controller.package._modified:
             t += " (*)"
             self.toolbuttons['save'].set_sensitive(True)
@@ -2839,7 +2913,12 @@ class AdveneGUI(object):
         self.gui.win.set_title(t)
         return True
 
-    def log (self, msg, level=None):
+    def log(self, msg, level=None):
+        """Display log messages.
+        """
+        logger.info(msg)
+
+    def log_message(self, msg, level=None):
         """Add a new log message to the logmessage window.
 
         @param msg: the message
@@ -2847,44 +2926,53 @@ class AdveneGUI(object):
         @param level: the error level
         @type level: int
         """
+        if threading.currentThread().ident != self.main_thread.ident:
+            GObject.timeout_add(0, self.log_message, msg, level)
+            return False
+
+        # Do not clobber GUI log with Cherrypy log
+        if 'cherrypy.error' in msg:
+            return
+
         def undisplay(ctxid, msgid):
-            self.gui.statusbar.remove_message(ctxid, msgid)
+            self.gui.statusbar.remove(ctxid, msgid)
             return False
 
         # Display in statusbar
         cid=self.gui.statusbar.get_context_id('info')
-        message_id=self.gui.statusbar.push(cid, unicode(msg).replace("\n", " - "))
+        if not isinstance(msg, str):
+            msg = str(msg, 'utf-8', 'replace')
+        message_id=self.gui.statusbar.push(cid, msg.replace("\n", " - "))
         # Display the message only 4 seconds
-        gobject.timeout_add(4000, undisplay, cid, message_id)
+        GObject.timeout_add(4000, undisplay, cid, message_id)
 
         # Store into logbuffer
         buf = self.logbuffer
-        mes = "".join(("\n", time.strftime("%H:%M:%S"), " - ", unicode(msg)))
+        mes = "".join(("\n", time.strftime("%H:%M:%S"), " - ", str(msg)))
         # FIXME: handle level (bold?)
         buf.place_cursor(buf.get_end_iter ())
         buf.insert_at_cursor (mes)
 
-        # Dump to terminal
-        if config.data.preferences['log-to-terminal']:
-            print unicode(msg).encode('utf-8')
-        return
+        if 'gst-stream-error' in msg:
+            dialog.message_dialog(_("Video player error: %s") % msg, modal=False, icon=Gtk.MessageType.ERROR)
+        return False
 
     def get_illustrated_text(self, text, position=None, vertical=False, height=40, color=None):
         """Return a HBox with the given text and a snapshot corresponding to position.
         """
         if vertical:
-            box=gtk.VBox()
+            box=Gtk.VBox()
         else:
-            box=gtk.HBox()
+            box=Gtk.HBox()
         box.pack_start(image_from_position(self.controller,
                                            position=position,
-                                           height=height), expand=False)
-        l=gtk.Label()
+                                           height=height), False, False, 0)
+        l=Gtk.Label()
         if color:
             l.set_markup('<span background="%s">%s</span>' % (color, text))
         else:
             l.set_text(text)
-        box.pack_start(l, expand=False)
+        box.pack_start(l, False, True, 0)
         return box
 
     def register_viewclass(self, viewclass, name=None):
@@ -2999,12 +3087,12 @@ class AdveneGUI(object):
             ev.locals_[v.view_id]=v
 
         # Hook completer
-        completer=Completer(textview=ev.source,
-                            controller=self.controller,
-                            indexer=self.controller.package._indexer)
+        ev.completer=Completer(textview=ev.source,
+                               controller=self.controller,
+                               indexer=getattr(self.controller, '_indexer', None))
 
         w=ev.popup()
-        w.set_icon_list(*self.get_icon_list())
+        w.set_icon_list(self.get_icon_list())
         return True
 
     def update_display (self):
@@ -3020,25 +3108,12 @@ class AdveneGUI(object):
         # Synopsis:
         # Ask the controller to update its status
         # If we are moving the slider, don't update the display
-        #gtk.threads_enter()
+        #Gtk.threads_enter()
         try:
             pos=self.controller.update()
-        except p.InternalException:
-            # FIXME: something sensible to do here ?
-            print "Internal error on video player"
-            #gtk.threads_leave()
-            return True
-        except Exception, e:
-            # Catch-all exception, in order to keep the mainloop
-            # runnning
-            #gtk.threads_leave()
-            import traceback
-            s=StringIO.StringIO()
-            traceback.print_exc (file = s)
-            self.log(_("Got exception %s. Trying to continue.") % str(e), s.getvalue())
-            traceback.print_exc()
+        except:
+            logger.exception("Internal exception on video player")
             return True
-        #gtk.threads_leave()
 
         if self.slider_move:
             # FIXME: we could have a cache of key images (i.e. 50 equidistant
@@ -3050,9 +3125,9 @@ class AdveneGUI(object):
                 self.time_label.set_time(pos)
             # Update the display
             d = self.controller.cached_duration
-            if d > 0 and d != self.gui.slider.get_adjustment ().upper:
+            if d > 0 and d != self.gui.slider.get_adjustment ().get_upper():
                 self.gui.slider.set_range (0, d)
-                self.gui.slider.set_increments (d / 100, d / 10)
+                self.gui.slider.set_increments (int(d / 100), int(d / 10))
 
             if self.gui.slider.get_value() != pos:
                 self.gui.slider.set_value(pos)
@@ -3100,7 +3175,7 @@ class AdveneGUI(object):
             self.audio_volume.set_value(vol)
 
         def do_save(aliases):
-            for alias, p in c.packages.iteritems():
+            for alias, p in c.packages.items():
                 if alias == 'advene':
                     continue
                 if p._modified:
@@ -3116,7 +3191,7 @@ class AdveneGUI(object):
         if self.gui.win.get_title().endswith('(*)') ^ c.package._modified:
             self.update_window_title()
         self.toolbuttons['undo'].set_sensitive(bool(c.undomanager.history))
-        is_playing = (c.player.status in (c.player.PlayingStatus, c.player.PauseStatus))
+        is_playing = c.player.is_playing()
         self.toolbuttons['create_text_annotation'].set_sensitive(is_playing)
         self.toolbuttons['create_svg_annotation'].set_sensitive(is_playing)
         for l in ('rewind', 'forward', 'previous_frame', 'next_frame', 'loop'):
@@ -3137,33 +3212,25 @@ class AdveneGUI(object):
             t=time.time() * 1000
             if t - self.last_auto_save > config.data.preferences['package-auto-save-interval']:
                 # Need to save
-                l=[ alias for (alias, p) in self.controller.packages.iteritems() if p._modified and alias != 'advene' ]
+                l=[ alias for (alias, p) in self.controller.packages.items() if p._modified and alias != 'advene' ]
                 if l:
                     if c.tracers and config.data.preferences['record-actions']:
                         try:
                             fn = c.tracers[0].export()
-                            print "trace exported to %s" % fn
-                        except Exception, e:
-                            print "error exporting trace : %s" % unicode(e).encode('utf-8')
+                            logger.info("trace exported to %s" % fn)
+                        except Exception:
+                            logger.error("error exporting trace", exc_info=True)
                     if config.data.preferences['package-auto-save'] == 'always':
                         c.queue_action(do_save, l)
                     else:
                         # Ask before saving. Use the non-modal dialog
                         # to avoid locking the interface
                         dialog.message_dialog(label=_("""The package(s) %s are modified.\nSave them now?""") % ", ".join(l),
-                                              icon=gtk.MESSAGE_QUESTION,
+                                              icon=Gtk.MessageType.QUESTION,
                                               callback=lambda: do_save(l))
                 self.last_auto_save=t
-
-        # Fix the webserver reaction time on win32
-        if config.data.os == 'win32':
-            if c.player.status in self.active_player_status:
-                i = config.data.play_interval
-            else:
-                i = config.data.noplay_interval
-            if sys.getcheckinterval() != i:
-                sys.setcheckinterval(i)
-
+        if config.data.debug and debug_slow_update_hook:
+            debug_slow_update_hook(self.controller)
         return True
 
     def search_string(self, s):
@@ -3180,11 +3247,11 @@ class AdveneGUI(object):
                                              case_sensitive=not config.data.preferences['quicksearch-ignore-case'])
 
     def do_quicksearch(self, *p):
-        s=unicode(self.quicksearch_entry.get_text())
+        s=self.quicksearch_entry.get_text()
         if not s:
             self.log(_("Empty quicksearch string"))
             return True
-        res=self.search_string(unicode(s))
+        res=self.search_string(s)
         self.open_adhoc_view('interactiveresult', destination='east', result=res, label=_("'%s'") % s, query=s)
         return True
 
@@ -3201,16 +3268,16 @@ class AdveneGUI(object):
         """
         if text is None:
             text=_("Choose an annotation type.")
-        d = gtk.Dialog(title=text,
-                       parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                                 gtk.STOCK_OK, gtk.RESPONSE_OK,
+        d = Gtk.Dialog(title=text,
+                       parent=self.gui.win,
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+                                 Gtk.STOCK_OK, Gtk.ResponseType.OK,
                                  ))
-        l=gtk.Label(text)
+        l=Gtk.Label(label=text)
         l.set_line_wrap(True)
         l.show()
-        d.vbox.pack_start(l, expand=False)
+        d.vbox.pack_start(l, False, True, 0)
 
         if create and force_create:
             ats=[]
@@ -3224,8 +3291,8 @@ class AdveneGUI(object):
 
         # Anticipated declaration of some widgets, which need to be
         # updated in the handle_new_type/schema_selection callback.
-        new_type_dialog=gtk.VBox()
-        new_schema_dialog=gtk.VBox()
+        new_type_dialog=Gtk.VBox()
+        new_schema_dialog=Gtk.VBox()
 
         def handle_new_type_selection(combo):
             el=combo.get_current_element()
@@ -3245,29 +3312,29 @@ class AdveneGUI(object):
                                                       callback=handle_new_type_selection)
         else:
             dialog.message_dialog(_("No annotation type is defined."),
-                                  icon=gtk.MESSAGE_ERROR)
+                                  icon=Gtk.MessageType.ERROR)
             return None
 
-        d.vbox.pack_start(type_selector, expand=False)
+        d.vbox.pack_start(type_selector, False, True, 0)
         type_selector.show_all()
 
         if create:
-            d.vbox.pack_start(new_type_dialog, expand=False)
-            new_type_dialog.pack_start(gtk.Label(_("Creating a new type.")))
+            d.vbox.pack_start(new_type_dialog, False, True, 0)
+            new_type_dialog.pack_start(Gtk.Label(_("Creating a new type.")), True, True, 0)
             ident=self.controller.package._idgenerator.get_id(AnnotationType)
             new_type_title_dialog=dialog.title_id_widget(element_title=ident,
                                                          element_id=ident)
             new_type_title_dialog.title_entry.set_tooltip_text(_("Title of the new type"))
             new_type_title_dialog.id_entry.set_tooltip_text(_("Id of the new type. It is generated from the title, but you may change it if necessary."))
-            new_type_dialog.pack_start(new_type_title_dialog, expand=False)
+            new_type_dialog.pack_start(new_type_title_dialog, False, True, 0)
 
             mimetype_selector = dialog.list_selector_widget(members=predefined_content_mimetypes, entry=True)
             mimetype_selector.set_tooltip_text(_("Specify the content-type for the annotation type"))
 
-            new_type_title_dialog.attach(gtk.Label(_("Content type")), 0, 1, 2, 3)
+            new_type_title_dialog.attach(Gtk.Label(label=_("Content type")), 0, 1, 2, 3)
             new_type_title_dialog.attach(mimetype_selector, 1, 2, 2, 3)
 
-            new_type_title_dialog.attach(gtk.Label(_("Schema")), 0, 1, 3, 4)
+            new_type_title_dialog.attach(Gtk.Label(label=_("Schema")), 0, 1, 3, 4)
 
             schemas=list(self.controller.package.schemas)
             newschema=helper.TitledElement(value=None,
@@ -3287,13 +3354,13 @@ class AdveneGUI(object):
             schema_selector.set_tooltip_text(_("Choose an existing schema for the new type, or create a new one"))
             new_type_title_dialog.attach(schema_selector, 1, 2, 3, 4)
             new_type_title_dialog.attach(new_schema_dialog, 1, 2, 4, 5)
-            new_schema_dialog.pack_start(gtk.Label(_("Specify the schema title")), expand=False)
+            new_schema_dialog.pack_start(Gtk.Label(_("Specify the schema title")), False, False, 0)
             ident=self.controller.package._idgenerator.get_id(Schema)
             new_schema_title_dialog=dialog.title_id_widget(element_title=ident,
                                                            element_id=ident)
             new_schema_title_dialog.title_entry.set_tooltip_text(_("Title of the new schema"))
             new_schema_title_dialog.id_entry.set_tooltip_text(_("Id of the new schema. It is generated from the title, but you may change it if necessary."))
-            new_schema_dialog.pack_start(new_schema_title_dialog, expand=False)
+            new_schema_dialog.pack_start(new_schema_title_dialog, False, True, 0)
 
         d.vbox.show_all()
         if force_create:
@@ -3307,12 +3374,12 @@ class AdveneGUI(object):
         d.connect('key-press-event', dialog.dialog_keypressed_cb)
         dialog.center_on_mouse(d)
         res=d.run()
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             at=type_selector.get_current_element()
             if at == newat:
                 # Creation of a new type.
-                attitle=unicode(new_type_title_dialog.title_entry.get_text())
-                atid=unicode(new_type_title_dialog.id_entry.get_text())
+                attitle=new_type_title_dialog.title_entry.get_text()
+                atid=new_type_title_dialog.id_entry.get_text()
                 at=self.controller.package.get_element_by_id(atid)
                 if at is not None:
                     dialog.message_dialog(_("You specified a annotation-type identifier that already exists. Aborting."))
@@ -3320,8 +3387,8 @@ class AdveneGUI(object):
                     return None
                 sc=schema_selector.get_current_element()
                 if sc == newschema:
-                    sctitle=unicode(new_schema_title_dialog.title_entry.get_text())
-                    scid=unicode(new_schema_title_dialog.id_entry.get_text())
+                    sctitle=new_schema_title_dialog.title_entry.get_text()
+                    scid=new_schema_title_dialog.id_entry.get_text()
                     sc=self.controller.package.get_element_by_id(scid)
                     if sc is None:
                         # Create the schema
@@ -3344,7 +3411,7 @@ class AdveneGUI(object):
                 at.date=self.controller.get_timestamp()
                 at.title=attitle
                 at.mimetype=mimetype_selector.get_current_element()
-                at.setMetaData(config.data.namespace, 'color', self.controller.package._color_palette.next())
+                at.setMetaData(config.data.namespace, 'color', next(self.controller.package._color_palette))
                 at.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
                 at._fieldnames=set()
                 sc.annotationTypes.append(at)
@@ -3363,20 +3430,20 @@ class AdveneGUI(object):
         """
         if text is None:
             text=_("Choose a schema.")
-        d = gtk.Dialog(title=text,
-                       parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                                 gtk.STOCK_OK, gtk.RESPONSE_OK,
+        d = Gtk.Dialog(title=text,
+                       parent=self.gui.win,
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+                                 Gtk.STOCK_OK, Gtk.ResponseType.OK,
                                  ))
-        l=gtk.Label(text)
+        l=Gtk.Label(label=text)
         l.set_line_wrap(True)
         l.show()
-        d.vbox.pack_start(l, expand=False)
+        d.vbox.pack_start(l, False, True, 0)
 
         # Anticipated declaration of some widgets, which need to be
         # updated in the handle_new_type/schema_selection callback.
-        new_schema_dialog=gtk.VBox()
+        new_schema_dialog=Gtk.VBox()
 
         schemas=list(self.controller.package.schemas)
         newschema=helper.TitledElement(value=None,
@@ -3393,13 +3460,13 @@ class AdveneGUI(object):
 
         schema_selector=dialog.list_selector_widget(members=[ (a, self.controller.get_title(a), self.controller.get_element_color(a)) for a in schemas],
                                                     callback=handle_new_schema_selection)
-        d.vbox.pack_start(schema_selector, expand=False)
-        d.vbox.pack_start(new_schema_dialog, expand=False)
-        new_schema_dialog.pack_start(gtk.Label(_("Specify the schema title")), expand=False)
+        d.vbox.pack_start(schema_selector, False, True, 0)
+        d.vbox.pack_start(new_schema_dialog, False, True, 0)
+        new_schema_dialog.pack_start(Gtk.Label(_("Specify the schema title")), False, False, 0)
         ident=self.controller.package._idgenerator.get_id(Schema)
         new_schema_title_dialog=dialog.title_id_widget(element_title=ident,
                                                        element_id=ident)
-        new_schema_dialog.pack_start(new_schema_title_dialog, expand=False)
+        new_schema_dialog.pack_start(new_schema_title_dialog, False, True, 0)
 
         d.vbox.show_all()
         new_schema_dialog.hide()
@@ -3407,11 +3474,11 @@ class AdveneGUI(object):
         d.show()
         dialog.center_on_mouse(d)
         res=d.run()
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             sc=schema_selector.get_current_element()
             if sc == newschema:
-                sctitle=unicode(new_schema_title_dialog.title_entry.get_text())
-                scid=unicode(new_schema_title_dialog.id_entry.get_text())
+                sctitle=new_schema_title_dialog.title_entry.get_text()
+                scid=new_schema_title_dialog.id_entry.get_text()
                 sc=self.controller.package.get_element_by_id(scid)
                 if sc is None:
                     # Create the schema
@@ -3437,45 +3504,45 @@ class AdveneGUI(object):
 
     def on_exit(self, source=None, event=None):
         """Generic exit callback."""
-        for a, p in self.controller.packages.iteritems():
+        for a, p in self.controller.packages.items():
             if a == 'advene':
                 continue
             if p._modified:
                 t = self.controller.get_title(p)
                 response=dialog.yes_no_cancel_popup(title=_("Package %s modified") % t,
                                                              text=_("The package %s has been modified but not saved.\nSave it now?") % t)
-                if response == gtk.RESPONSE_CANCEL:
+                if response == Gtk.ResponseType.CANCEL:
                     return True
-                elif response == gtk.RESPONSE_YES:
+                elif response == Gtk.ResponseType.YES:
                     self.on_save1_activate(package=p)
-                elif response == gtk.RESPONSE_NO:
+                elif response == Gtk.ResponseType.NO:
                     p._modified=False
             if p.imagecache._modified and config.data.preferences['imagecache-save-on-exit'] != 'never':
                 if config.data.preferences['imagecache-save-on-exit'] == 'ask':
                     media=self.controller.get_default_media(package=p)
                     response=dialog.yes_no_cancel_popup(title=_("%s snapshots") % media,
                                                              text=_("Do you want to save the snapshots for media %s?") % media)
-                    if response == gtk.RESPONSE_CANCEL:
+                    if response == Gtk.ResponseType.CANCEL:
                         return True
-                    elif response == gtk.RESPONSE_YES:
+                    elif response == Gtk.ResponseType.YES:
                         try:
                             p.imagecache.save (helper.mediafile2id (media))
-                        except OSError, e:
+                        except OSError as e:
                             self.log(_("Cannot save imagecache for %(media)s: %(e)s") % locals())
-                    elif response == gtk.RESPONSE_NO:
+                    elif response == Gtk.ResponseType.NO:
                         p.imagecache._modified=False
                         pass
                 elif config.data.preferences['imagecache-save-on-exit'] == 'always':
                     media=self.controller.get_default_media(package=p)
                     try:
                         p.imagecache.save (helper.mediafile2id (media))
-                    except OSError, e:
+                    except OSError as e:
                         self.log(_("Cannot save imagecache for %(media)s: %(e)s") % locals())
 
         if self.controller.on_exit():
             # Memorize application window size/position
             self.resize_cb(self.gui.win, None, 'main')
-            gtk.main_quit()
+            Gtk.main_quit()
             return False
         else:
             return True
@@ -3529,20 +3596,20 @@ class AdveneGUI(object):
         return True
 
     def display_textfile(self, path, title=None, viewname=None):
-        w=gtk.Window()
+        w=Gtk.Window()
         if title is not None:
             w.set_title(title + " - " + path)
-        w.set_icon_list(*self.get_icon_list())
+        w.set_icon_list(self.get_icon_list())
 
         def refresh(b, t):
             b=t.get_buffer()
             b.delete(*b.get_bounds ())
             try:
-                f=open(path, 'r')
+                f=open(path, 'r', encoding='utf-8')
                 b.set_text("".join(f.readlines()))
                 f.close()
-            except (IOError, OSError), e:
-                b.set_text("Cannot read %s:\n%s" % (path, unicode(e)))
+            except (IOError, OSError) as e:
+                b.set_text("Cannot read %s:\n%s" % (path, str(e)))
             t.scroll_mark_onscreen(b.get_mark('insert'))
             return True
 
@@ -3550,29 +3617,29 @@ class AdveneGUI(object):
             w.destroy()
             return True
 
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        t=gtk.TextView()
+        t=Gtk.TextView()
         t.set_editable (False)
-        t.set_wrap_mode (gtk.WRAP_CHAR)
+        t.set_wrap_mode (Gtk.WrapMode.CHAR)
 
-        scroll_win = gtk.ScrolledWindow ()
-        scroll_win.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        scroll_win = Gtk.ScrolledWindow ()
+        scroll_win.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         scroll_win.add(t)
 
         vbox.add(scroll_win)
 
-        hbox=gtk.HButtonBox()
+        hbox=Gtk.HButtonBox()
 
-        b=gtk.Button(stock=gtk.STOCK_CLOSE)
+        b=Gtk.Button(stock=Gtk.STOCK_CLOSE)
         b.connect('clicked', close, w)
-        hbox.pack_start(b, expand=False)
+        hbox.pack_start(b, False, True, 0)
 
-        b=gtk.Button(stock=gtk.STOCK_REFRESH)
+        b=Gtk.Button(stock=Gtk.STOCK_REFRESH)
         b.connect('clicked', refresh, t)
-        hbox.pack_start(b, expand=False)
+        hbox.pack_start(b, False, True, 0)
 
-        vbox.pack_start(hbox, expand=False)
+        vbox.pack_start(hbox, False, True, 0)
 
         w.add(vbox)
         refresh(None, t)
@@ -3587,7 +3654,7 @@ class AdveneGUI(object):
     # Callbacks function. Skeletons can be generated by glade2py
     def on_create_text_annotation(self, win=None, event=None):
         c = self.controller
-        if c.player.status in (c.player.PlayingStatus, c.player.PauseStatus):
+        if c.player.is_playing():
             # Find out the appropriate type
             at = self.controller.package.get_element_by_id('annotation')
             if not at:
@@ -3598,7 +3665,7 @@ class AdveneGUI(object):
                 at.date = self.controller.get_timestamp()
                 at.title = _("Text annotation")
                 at.mimetype = "text/plain"
-                at.setMetaData(config.data.namespace, 'color', self.controller.package._color_palette.next())
+                at.setMetaData(config.data.namespace, 'color', next(self.controller.package._color_palette))
                 at.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
                 at._fieldnames=set()
                 sc.annotationTypes.append(at)
@@ -3613,7 +3680,7 @@ class AdveneGUI(object):
     def on_create_svg_annotation(self, win=None, event=None):
         c = self.controller
         self.controller.update_snapshot(c.player.current_position_value)
-        if c.player.status in (c.player.PlayingStatus, c.player.PauseStatus):
+        if c.player.is_playing():
             # Find out the appropriate type
             at = self.controller.package.get_element_by_id('svgannotation')
             if not at:
@@ -3624,7 +3691,7 @@ class AdveneGUI(object):
                 at.date = self.controller.get_timestamp()
                 at.title = _("Graphical annotation")
                 at.mimetype = "image/svg+xml"
-                at.setMetaData(config.data.namespace, 'color', self.controller.package._color_palette.next())
+                at.setMetaData(config.data.namespace, 'color', next(self.controller.package._color_palette))
                 at.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
                 sc.annotationTypes.append(at)
                 self.controller.notify('AnnotationTypeCreate', annotationtype=at)
@@ -3643,27 +3710,27 @@ class AdveneGUI(object):
             return True
 
         # Control-shortcuts
-        if event.state & gtk.gdk.CONTROL_MASK:
+        if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             # The Control-key is held. Special actions :
-            if event.keyval == gtk.keysyms.e:
+            if event.keyval == Gdk.KEY_e:
                 # Popup the evaluator window
                 self.popup_evaluator()
                 return True
-            elif event.keyval == gtk.keysyms.k:
+            elif event.keyval == Gdk.KEY_k:
                 # Get the cursor in the quicksearch entry
                 self.quicksearch_entry.grab_focus()
                 self.quicksearch_entry.select_region(0, -1)
                 return True
-            elif event.keyval == gtk.keysyms.q:
+            elif event.keyval == Gdk.KEY_q:
                 self.on_exit()
                 return True
-            elif event.keyval == gtk.keysyms.s:
-                if event.state & gtk.gdk.SHIFT_MASK:
+            elif event.keyval == Gdk.KEY_s:
+                if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
                     self.on_save_as1_activate()
                 else:
                     self.on_save1_activate()
                 return True
-            elif event.keyval == gtk.keysyms.z:
+            elif event.keyval == Gdk.KEY_z:
                 self.undo()
                 return True
         return False
@@ -3685,13 +3752,13 @@ class AdveneGUI(object):
         if p._modified:
             response=dialog.yes_no_cancel_popup(title=_("Package modified"),
                                          text=_("The package that you want to close has been modified but not saved.\nSave it now?"))
-            if response == gtk.RESPONSE_CANCEL:
+            if response == Gtk.ResponseType.CANCEL:
                 return True
-            if response == gtk.RESPONSE_YES:
+            if response == Gtk.ResponseType.YES:
                 self.on_save1_activate()
                 self.controller.remove_package()
                 return True
-            if response == gtk.RESPONSE_NO:
+            if response == Gtk.ResponseType.NO:
                 self.controller.package._modified=False
                 self.controller.remove_package()
                 return True
@@ -3701,26 +3768,32 @@ class AdveneGUI(object):
         # Close all edit popups for this element
         for e in self.edit_popups:
             try:
-                if p == e.element.rootPackage and e.window:
-                    e.window.destroy()
+                if p == e.element.rootPackage and e.get_window():
+                    e.get_window().destroy()
             except KeyError:
                 pass
 
         return True
 
-    def on_open1_activate (self, button=None, data=None):
-        """Open a file selector to load a package."""
+    def on_open1_activate (self, button=None, data=None, filename=None):
+        """Open a file selector to load a package.
+"""
         if config.data.path['data']:
             d=config.data.path['data']
         else:
             d=None
 
-        filename, alias=dialog.get_filename(title=_("Load a package"),
-                                            action=gtk.FILE_CHOOSER_ACTION_OPEN,
-                                            button=gtk.STOCK_OPEN,
-                                            default_dir=d,
-                                            alias=True,
-                                            filter='advene')
+        if filename is None:
+            filename, alias=dialog.get_filename(title=_("Load a package"),
+                                                action=Gtk.FileChooserAction.OPEN,
+                                                button=Gtk.STOCK_OPEN,
+                                                default_dir=d,
+                                                alias=True,
+                                                filter='advene')
+        else:
+            name, ext = os.path.splitext(filename)
+            alias = re.sub('[^a-zA-Z0-9_]', '_', os.path.basename(name))
+
         if filename:
             name, ext = os.path.splitext(filename.lower())
             if ext in config.data.video_extensions:
@@ -3730,26 +3803,27 @@ class AdveneGUI(object):
             if not ext in ('.xml', '.azp', '.apl'):
                 # Does not look like a valid package
                 if not dialog.message_dialog(_("The file %s does not look like a valid Advene package. It should have a .azp or .xml extension. Try to open anyway?") % filename,
-                                      icon=gtk.MESSAGE_QUESTION):
+                                      icon=Gtk.MessageType.QUESTION):
                     return True
             if ext == '.apl':
                 modif=[ (a, p)
-                        for (a, p) in self.controller.packages.iteritems()
+                        for (a, p) in self.controller.packages.items()
                         if p._modified ]
                 if modif:
                     if not dialog.message_dialog(
                         _("You are trying to load a session file, but there are unsaved packages. Proceed anyway?"),
-                        icon=gtk.MESSAGE_QUESTION):
+                        icon=Gtk.MessageType.QUESTION):
                         return True
 
             try:
                 self.set_busy_cursor(True)
                 self.controller.load_package (uri=filename, alias=alias)
-            except (OSError, IOError), e:
-                self.set_busy_cursor(False)
+                Gtk.RecentManager.get_default().add_item(filename)
+            except (OSError, IOError) as e:
                 dialog.message_dialog(_("Cannot load package %(filename)s:\n%(error)s") % {
                         'filename': filename,
-                        'error': unicode(e)}, gtk.MESSAGE_ERROR)
+                        'error': str(e)}, Gtk.MessageType.ERROR)
+            self.set_busy_cursor(False)
         return True
 
     def on_save1_activate (self, button=None, package=None):
@@ -3767,8 +3841,8 @@ class AdveneGUI(object):
                 save=True
             elif config.data.preferences['save-default-workspace'] == 'ask':
                 save=dialog.message_dialog(_("Do you want to save the current workspace ?"),
-                                           icon=gtk.MESSAGE_QUESTION)
-            if save:
+                                           icon=Gtk.MessageType.QUESTION)
+            if save and package.title != "Export package":
                 self.workspace_save('_default_workspace')
                 default=self.controller.package.getMetaData (config.data.namespace, "default_adhoc")
                 if not default:
@@ -3780,9 +3854,9 @@ class AdveneGUI(object):
                     p.apply_cb()
             try:
                 self.controller.save_package (alias=alias)
-            except (OSError, IOError), e:
-                dialog.message_dialog(_("Could not save the package: %s") % unicode(e),
-                                               gtk.MESSAGE_ERROR)
+            except (OSError, IOError) as e:
+                dialog.message_dialog(_("Could not save the package: %s") % str(e),
+                                               Gtk.MessageType.ERROR)
         return True
 
     def on_save_as1_activate (self, button=None, package=None):
@@ -3795,8 +3869,8 @@ class AdveneGUI(object):
         else:
             d=None
         filename=dialog.get_filename(title=_("Save the package %s") % self.controller.get_title(package),
-                                              action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                              button=gtk.STOCK_SAVE,
+                                              action=Gtk.FileChooserAction.SAVE,
+                                              button=Gtk.STOCK_SAVE,
                                               default_dir=d,
                                               filter='advene')
         if filename:
@@ -3809,9 +3883,9 @@ class AdveneGUI(object):
                 and ext.lower() != '.azp'):
                 ret=dialog.yes_no_cancel_popup(title=_("Invalid file extension"),
                                                         text=_("Your package contains resources,\nthe filename (%s) should have a .azp extension.\nShould I put the correct extension?") % filename)
-                if ret == gtk.RESPONSE_YES:
+                if ret == Gtk.ResponseType.YES:
                     filename = p + '.azp'
-                elif ret == gtk.RESPONSE_NO:
+                elif ret == Gtk.ResponseType.NO:
                     dialog.message_dialog(_("OK, the resources will be lost."))
                 else:
                     self.log(_("Aborting package saving"))
@@ -3823,22 +3897,22 @@ class AdveneGUI(object):
                 save=True
             elif config.data.preferences['save-default-workspace'] == 'ask':
                 save=dialog.message_dialog(_("Do you want to save the current workspace ?"),
-                                           icon=gtk.MESSAGE_QUESTION)
-            if save:
+                                           icon=Gtk.MessageType.QUESTION)
+            if save and package.title != "Export package":
                 self.workspace_save('_default_workspace')
                 default=self.controller.package.getMetaData (config.data.namespace, "default_adhoc")
                 if not default:
                     self.controller.package.setMetaData (config.data.namespace, "default_adhoc", '_default_workspace')
             alias=self.controller.aliases[package]
-            modified = [ p for p in self.edit_popups if p.get_modified() ]
+            modified = [ pop for pop in self.edit_popups if pop.get_modified() ]
             if modified and config.data.preferences['apply-edited-elements-on-save']:
                 for p in modified:
                     p.apply_cb()
             try:
                 self.controller.save_package(name=filename, alias=alias)
-            except (OSError, IOError), e:
-                dialog.message_dialog(_("Could not save the package: %s") % unicode(e),
-                                               gtk.MESSAGE_ERROR)
+            except (OSError, IOError) as e:
+                dialog.message_dialog(_("Could not save the package: %s") % str(e),
+                                               Gtk.MessageType.ERROR)
         return True
 
     def on_save_session1_activate (self, button=None, data=None):
@@ -3849,8 +3923,8 @@ class AdveneGUI(object):
         else:
             d=None
         filename=dialog.get_filename(title=_("Save the session in..."),
-                                              action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                              button=gtk.STOCK_SAVE,
+                                              action=Gtk.FileChooserAction.SAVE,
+                                              button=Gtk.STOCK_SAVE,
                                               default_dir=d,
                                               filter='session')
         if filename:
@@ -3869,13 +3943,13 @@ class AdveneGUI(object):
             or 'dvd' in self.controller.get_default_media()):
             if not dialog.message_dialog(
                 _("Do you confirm the creation of annotations matching the DVD chapters?"),
-                icon=gtk.MESSAGE_QUESTION):
+                icon=Gtk.MessageType.QUESTION):
                 return True
             try:
                 i=advene.util.importer.get_importer('lsdvd', controller=self.controller)
             except Exception:
                 dialog.message_dialog(_("Cannot import DVD chapters. Did you install the lsdvd software?"),
-                                        icon=gtk.MESSAGE_ERROR)
+                                        icon=Gtk.MessageType.ERROR)
                 return True
             i.package=self.controller.package
             i.process_file('lsdvd')
@@ -3883,7 +3957,7 @@ class AdveneGUI(object):
             self.controller.notify('PackageLoad', package=self.controller.package)
         else:
             dialog.message_dialog(_("The associated media is not a DVD."),
-                                           icon=gtk.MESSAGE_ERROR)
+                                           icon=Gtk.MessageType.ERROR)
         return True
 
     def on_import_file1_activate (self, button=None, data=None):
@@ -3897,7 +3971,7 @@ class AdveneGUI(object):
                                  display_unlikely=False)
         else:
             dialog.message_dialog(_("No associated video file"),
-                                  icon=gtk.MESSAGE_ERROR)
+                                  icon=Gtk.MessageType.ERROR)
         return False
 
     def on_find1_activate (self, button=None, data=None):
@@ -3905,29 +3979,29 @@ class AdveneGUI(object):
         return True
 
     def on_cut1_activate (self, button=None, data=None):
-        print "Cut: Not implemented yet."
+        logger.error("Cut: Not implemented yet.")
         return False
 
     def on_copy1_activate (self, button=None, data=None):
-        print "Copy: Not implemented yet."
+        logger.error("Copy: Not implemented yet.")
         return False
 
     def on_paste1_activate (self, button=None, data=None):
-        print "Paste: Not implemented yet."
+        logger.error("Paste: Not implemented yet.")
         return False
 
     def on_delete1_activate (self, button=None, data=None):
-        print "Delete: Not implemented yet (cf popup menu)."
+        logger.error("Delete: Not implemented yet (cf popup menu).")
         return False
 
     def on_edit_ruleset1_activate (self, button=None, data=None):
         """Default ruleset editing."""
-        w=gtk.Window(gtk.WINDOW_TOPLEVEL)
+        w=Gtk.Window(Gtk.WindowType.TOPLEVEL)
         w.set_title(_("Standard RuleSet"))
         w.connect('destroy', lambda e: w.destroy())
-        w.set_icon_list(*self.get_icon_list())
+        w.set_icon_list(self.get_icon_list())
 
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
         vbox.set_homogeneous (False)
         w.add(vbox)
 
@@ -3951,26 +4025,26 @@ class AdveneGUI(object):
             # edit.model has been edited
             self.controller.event_handler.set_ruleset(edit.model, type_=type_)
             # FIXME: implement ruleset save
-            print "Not implemented yet"
+            logger.error("Not implemented yet")
             return True
 
-        hb=gtk.HButtonBox()
+        hb=Gtk.HButtonBox()
 
-        b=gtk.Button(stock=gtk.STOCK_SAVE)
+        b=Gtk.Button(stock=Gtk.STOCK_SAVE)
         b.connect('clicked', save_ruleset, 'default')
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
-        b=gtk.Button(stock=gtk.STOCK_OK)
+        b=Gtk.Button(stock=Gtk.STOCK_OK)
         b.connect('clicked', validate_ruleset, 'default')
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
-        b=gtk.Button(stock=gtk.STOCK_CANCEL)
+        b=Gtk.Button(stock=Gtk.STOCK_CANCEL)
         b.connect('clicked', lambda e: w.destroy())
-        hb.pack_end(b, expand=False)
+        hb.pack_end(b, False, True, 0)
 
         hb.show_all()
 
-        vbox.pack_start(hb, expand=False)
+        vbox.pack_start(hb, False, True, 0)
 
         vbox.show()
 
@@ -4024,38 +4098,45 @@ class AdveneGUI(object):
         return True
 
     def on_view_mediainformation_activate (self, button=None, data=None):
-        """View mediainformation."""
+        """View mediainformation.
+        """
         self.controller.position_update ()
-        p=self.controller.player
-        if p.is_active() and p.playlist_get_list():
-            self.controller.log("%(status)s %(filename)s %(position)s / %(duration)s (cached %(cached)s) - %(positionms)dms / %(durationms)dms (cached %(cachedms)dms)" % {
-                    'filename': unicode(p.playlist_get_list ()[0]),
-                    'status': self.statustext.get(p.status, _("Unknown")),
-                    'position': helper.format_time(p.current_position_value),
-                    'positionms': p.current_position_value,
-                    'duration': helper.format_time_reference(p.stream_duration),
-                    'durationms': p.stream_duration,
-                    'cached': helper.format_time_reference(self.controller.cached_duration),
-                    'cachedms': self.controller.cached_duration
-                    })
-        else:
-            self.controller.log(_("Player not active - cached duration   : %(duration)s (%(durationms)d ms)") % {
-                    'duration': helper.format_time_reference(self.controller.cached_duration),
-                    'durationms': self.controller.cached_duration })
+        p = self.controller.player
+        ic = self.controller.package.imagecache
+        info = ic.video_info
+        info['duration_formatted'] = helper.format_time_reference(info['duration'])
+        info['position_formatted'] = helper.format_time_reference(p.current_position_value)
+        info['cached_duration_formatted'] = helper.format_time_reference(self.controller.cached_duration)
+        info['position'] =  p.current_position_value
+        info['imagecache'] = ic.stats_repr()
+        msg = _("""Media information
+
+URI: %(uri)s
+Framerate: %(framerate_denom)d / %(framerate_num)d (%(framerate).02f )
+Duration: %(duration_formatted)s (%(duration)d ms) (cached: %(cached_duration_formatted)s)
+Current position: %(position_formatted)s (%(position)d ms)
+
+Original image size: %(width)d x %(height)d
+
+Image cache information: %(imagecache)s
+""") % info
+        self.popupwidget.display_message(msg, timeout=30000, title=_("Information"))
+        logger.info(msg)
         return True
 
     def on_about1_activate (self, button=None, data=None):
         """Activate the About window."""
-        gtk.about_dialog_set_url_hook(lambda dialog, link: self.controller.open_url(link))
-        d=gtk.AboutDialog()
+        d=Gtk.AboutDialog()
+        d.set_transient_for(self.gui.win)
+        d.set_activate_link = lambda dialog, link: self.controller.open_url(link)
         d.set_name('Advene')
         d.set_version(config.data.version_string.replace('Advene ', ''))
-        d.set_copyright("Copyright 2002-2012 Olivier Aubert, Pierre-Antoine Champin")
-        d.set_license(_('GNU General Public License v. 2\nSee http://www.gnu.org/copyleft/gpl.html for more details'))
+        d.set_copyright("Copyright 2002-2017 Olivier Aubert, Pierre-Antoine Champin")
+        d.set_license_type(Gtk.License.GPL_3_0)
         d.set_website('http://www.advene.org/')
         d.set_website_label(_('Visit the Advene web site for examples and documentation.'))
         d.set_authors( [ 'Olivier Aubert', 'Pierre-Antoine Champin', 'Yannick Prie', 'Bertrand Richard', 'Frank Wagner' ] )
-        d.set_logo(gtk.gdk.pixbuf_new_from_file(config.data.advenefile( ( 'pixmaps', 'logo_advene.png') )))
+        d.set_logo(GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile( ( 'pixmaps', 'logo_advene.png') )))
         d.connect('response', lambda w, r: w.destroy())
         d.run()
 
@@ -4063,7 +4144,7 @@ class AdveneGUI(object):
 
     def on_b_play_clicked (self, button=None, data=None):
         p = self.controller.player
-        if not p.playlist_get_list() and not 'record' in p.player_capabilities:
+        if not p.get_uri() and not 'record' in p.player_capabilities:
             # No movie file is defined yet. Propose to choose one.
             self.on_b_addfile_clicked()
             return True
@@ -4087,8 +4168,8 @@ class AdveneGUI(object):
         else:
             default=None
         filename=dialog.get_filename(title=_("Select a movie file"),
-                                     action=gtk.FILE_CHOOSER_ACTION_OPEN,
-                                     button=gtk.STOCK_OPEN,
+                                     action=Gtk.FileChooserAction.OPEN,
+                                     button=Gtk.STOCK_OPEN,
                                      default_dir=default,
                                      filter='video')
         if filename:
@@ -4097,18 +4178,18 @@ class AdveneGUI(object):
 
     def on_b_selectdvd_clicked (self, button=None, data=None):
         """Play a DVD."""
-        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+        window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
         window.set_title(_("Title/Chapter selection"))
 
         window.connect('destroy', lambda e: window.destroy())
 
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
         sel=DVDSelect(controller=self.controller,
                       current=self.controller.get_default_media())
         vbox.add(sel.get_widget())
 
-        hbox=gtk.HButtonBox()
+        hbox=Gtk.HButtonBox()
 
         def validate(button=None, sel=None, window=None):
             self.controller.update_status("stop")
@@ -4125,11 +4206,11 @@ class AdveneGUI(object):
             window.destroy()
             return True
 
-        b=gtk.Button(stock=gtk.STOCK_OK)
+        b=Gtk.Button(stock=Gtk.STOCK_OK)
         b.connect('clicked', validate, sel, window)
         hbox.add(b)
 
-        b=gtk.Button(stock=gtk.STOCK_CANCEL)
+        b=Gtk.Button(stock=Gtk.STOCK_CANCEL)
         b.connect('clicked', cancel, window)
         hbox.add(b)
 
@@ -4165,7 +4246,7 @@ class AdveneGUI(object):
             'title': self.controller.package.title or ""
             }
         def reset_duration(b, entry):
-            v=long(self.controller.player.stream_duration)
+            v=int(self.controller.player.stream_duration)
             entry.set_text(str(v))
             return True
 
@@ -4186,12 +4267,12 @@ class AdveneGUI(object):
             self.update_window_title()
             self.controller.set_default_media(cache['media'])
             try:
-                d=long(cache['duration'])
+                d=int(cache['duration'])
                 if d != self.controller.package.cached_duration:
                     self.controller.package.cached_duration = d
                     self.controller.notify('DurationUpdate', duration=d)
-            except ValueError, e:
-                print "Cannot convert duration", str(e)
+            except ValueError:
+                logger.error("Cannot convert duration", exc_info=True)
                 pass
         return True
 
@@ -4210,10 +4291,14 @@ class AdveneGUI(object):
                         'tts-language', 'tts-encoding', 'tts-engine',
                         'record-actions', 'popup-destination',
                         'timestamp-format', 'default-fps',
-                        'abbreviation-mode', 'text-abbreviations', 'completion-mode',
-                        'prefer-wysiwyg', 'player-shortcuts-in-edit-windows', 'apply-edited-elements-on-save' )
+                        'abbreviation-mode', 'text-abbreviations', 'completion-mode', 'completion-predefined-only',
+                        'prefer-wysiwyg',
+                        'player-shortcuts-in-edit-windows', 'player-shortcuts-modifier',
+                        'apply-edited-elements-on-save',
+                        'frameselector-count', 'frameselector-width',
+        )
         # Direct options needing a restart to be taken into account.
-        restart_needed_options = ('tts-engine', 'language')
+        restart_needed_options = ('tts-engine', 'language', 'timestamp-format', 'expert-mode')
 
         path_options=('data', 'plugins', 'advene', 'imagecache', 'moviepath', 'shotdetect')
         cache={
@@ -4223,7 +4308,7 @@ class AdveneGUI(object):
             }
 
         cache['player-level'] = config.data.player['verbose'] or -1
-        for (k, v) in config.data.player.iteritems():
+        for (k, v) in config.data.player.items():
             cache['player-' + k] = config.data.player[k]
 
         for k in path_options:
@@ -4243,7 +4328,7 @@ class AdveneGUI(object):
         ew.add_file_selector(_("Shotdetect"), "shotdetect", _("Shotdetect application"))
 
         ew.add_title(_("GUI"))
-        ew.add_option(_("Interface language (after restart)"), 'language', _("Language used for the interface (necessitates to restart the application)"), odict((
+        ew.add_option(_("Interface language (after restart)"), 'language', _("Language used for the interface (necessitates to restart the application)"), OrderedDict((
                 (_("System default"), ''),
                 ("English", 'C'),
                 ("Esperanto", 'eo'),
@@ -4252,10 +4337,10 @@ class AdveneGUI(object):
         ew.add_checkbox(_("Record activity trace"), "record-actions", _("Record activity trace"))
         ew.add_checkbox(_("Expert mode"), "expert-mode", _("Offer advanced possibilities"))
         ew.add_checkbox(_("Prefer WYSIWYG"), "prefer-wysiwyg", _("Use WYSIWYG editors when possible (HTML, SVG)"))
+        ew.add_accelerator(_("Player control modifier"), 'player-shortcuts-modifier', _("Generic player control modifier: key used in combination with arrows/space/tab to control the player. Click the button and press key+space to choose the modifier."))
         ew.add_checkbox(_("Player control in edit popups"), 'player-shortcuts-in-edit-windows', _("Enable generic player controls in edit windows. This may be undesirable since it overloads some standard text-edition behaviours (esp. control-left/right)."))
-
         ew.add_option(_("Open popups"), 'popup-destination',
-                      _("Where should we open adhoc views?"), odict((
+                      _("Where should we open adhoc views?"), OrderedDict((
                 (_("as a popup window"), 'popup'),
                 (_("embedded east of the video"), 'east'),
                 (_("embedded west of the video"), 'west'),
@@ -4269,16 +4354,20 @@ class AdveneGUI(object):
         ew.add_spin(_("Bookmark snapshot width"), 'bookmark-snapshot-width', _("Width of the snapshots representing bookmarks"), 50, 400)
         ew.add_spin(_("Bookmark snapshot precision"), 'bookmark-snapshot-precision', _("Precision (in ms) of the displayed bookmark snapshots."), 25, 500)
 
+        ew.add_label(_("Frame selector (shotvalidation...)"))
+        ew.add_spin(_("Frameselector snapshot width"), 'frameselector-width', _("Width of the snapshots in frameselector"), 50, 600)
+        ew.add_spin(_("Frameselector count"), 'frameselector-count', _("Number of frames displayed in frameselector."), 3, 25)
+
         ew.add_title(_("General"))
         ew.add_checkbox(_("Weekly update check"), 'update-check', _("Weekly check for updates on the Advene website"))
         ew.add_option(_("On exit,"), 'imagecache-save-on-exit',
-                      _("How to handle screenshots on exit"), odict((
+                      _("How to handle screenshots on exit"), OrderedDict((
                 (_("never save screenshots"), 'never'),
                 (_("always save screenshots"), 'always'),
                 (_("ask before saving screenshots"), 'ask'),
                 )))
         ew.add_option(_("Auto-save"), 'package-auto-save',
-                      _("Data auto-save functionality"), odict((
+                      _("Data auto-save functionality"), OrderedDict((
                 (_("is desactivated"), 'never'),
                 (_("is done automatically"), 'always'),
                 (_("is done after confirmation"), 'ask'),
@@ -4288,7 +4377,7 @@ class AdveneGUI(object):
         ew.add_title(_("Workspace"))
 
         ew.add_option(_("On package saving,"), 'save-default-workspace',
-                      _("Do you wish to save the default workspace with the package?"), odict((
+                      _("Do you wish to save the default workspace with the package?"), OrderedDict((
                 (_("never save the current workspace"), 'never'),
                 (_("always save the current workspace"), 'always'),
                 (_("ask before saving the current workspace"), 'ask'),
@@ -4296,7 +4385,7 @@ class AdveneGUI(object):
         ew.add_checkbox(_("Auto-validation of edited elements"), 'apply-edited-elements-on-save', _("Automatically validate modified elements when saving the package."))
 
         ew.add_option(_("On package load,"), 'restore-default-workspace',
-                      _("Do you wish to load the workspace saved with the package?"), odict((
+                      _("Do you wish to load the workspace saved with the package?"), OrderedDict((
                 (_("never load the saved workspace"), 'never'),
                 (_("always load the saved workspace"), 'always'),
                 (_("ask before loading the saved workspace"), 'ask'),
@@ -4339,7 +4428,7 @@ class AdveneGUI(object):
             ew.add_checkbox(_("Caption"), 'display-caption', _("Embed the caption view below the video"))
 
         ew.add_title(_("Time-related"))
-        ew.add_option(_("Time format"), 'timestamp-format', _("Format used to display timecodes"), odict( (
+        ew.add_option(_("Time format"), 'timestamp-format', _("Format used to display timecodes"), OrderedDict( (
                     ('HH:MM:SS.sss', '%H:%M:%.S'),
                     ('HH:MM:SSfNN (frame number)', '%H:%M:%fS'),
                     ('HH:MM:SS', '%H:%M:%S'),
@@ -4354,7 +4443,7 @@ class AdveneGUI(object):
             fps.append(d)
             fps.sort()
         ew.add_option(_("Default FPS"), 'default-fps',
-                      _("Default FPS (frame-per-second) value, when entering or displaying timestamps with frame numbers."), odict( (str(f), f) for f in fps))
+                      _("Default FPS (frame-per-second) value, when the information cannot be read from the media."), OrderedDict( (str(f), f) for f in fps))
         ew.add_spin(_("Time increment"), "time-increment", _("Skip duration, when using control-left/right or forward/rewind buttons (in ms)."), 1, 300000)
         ew.add_spin(_("Second time increment"), "second-time-increment", _("Skip duration, when using control-shift-left/right (in ms)."), 1, 300000)
         ew.add_spin(_("Third time increment"), "third-time-increment", _("Skip duration, when using control-shift-up/down (in ms)."), 1, 300000)
@@ -4371,12 +4460,13 @@ class AdveneGUI(object):
 
         ew.add_title(_("Text content"))
         ew.add_checkbox(_("Completion mode"), 'completion-mode', _("Enable dynamic completion mode"))
+        ew.add_checkbox(_("Predefined terms only"), 'completion-predefined-only', _("If completion is enabled, complete only with predefined terms."))
         ew.add_checkbox(_("Abbreviation mode"), 'abbreviation-mode', _("Enable abbreviation mode"))
         ew.add_text(_("Abbreviations"), 'text-abbreviations', _("Text abbreviations. 1 entry per line. Each line consists of the abbreviation followed by its replacement."))
 
         ew.add_title(_("Text-To-Speech"))
         ew.add_option(_("TTS language"), 'tts-language',
-                      _("What language settings should be used for text-to-speech"), odict((
+                      _("What language settings should be used for text-to-speech"), OrderedDict((
                 (_("English"), 'en'),
                 (_("French"), 'fr'),
                 (_("Spanish"), 'es'),
@@ -4384,7 +4474,7 @@ class AdveneGUI(object):
         ew.add_entry(_("TTS Encoding"), 'tts-encoding',
                       _("What encoding should be used to communicate with the TTS engine"), entries = [ 'utf8', 'utf16', 'latin1', 'cp1252' ] )
         ew.add_option(_("TTS Engine"), 'tts-engine',
-                      _("Which TTS engine should be used (modification requires restarting Advene to take into account)"), odict((
+                      _("Which TTS engine should be used (modification requires restarting Advene to take into account)"), OrderedDict((
                 (_("Automatic"), 'auto'),
                 (_("eSpeak"), 'espeak'),
                 (_("Custom script with standard input"), 'custom'),
@@ -4419,7 +4509,9 @@ class AdveneGUI(object):
                     if k == 'plugins':
                         player_need_restart = True
 
-            for n in config.data.player.keys():
+            self.update_player_control_modifier()
+
+            for n in list(config.data.player.keys()):
                 if config.data.player[n] != cache['player-' + n]:
                     config.data.player[n] = cache['player-' + n]
                     player_need_restart = True
@@ -4445,7 +4537,7 @@ class AdveneGUI(object):
         try:
             d=self.controller.package.imagecache.save (id_)
             self.log(_("Imagecache saved to %s") % d)
-        except OSError, e:
+        except OSError as e:
             self.log(_("Cannot save imagecache for %(media)s: %(e)s") % locals())
         return True
 
@@ -4453,7 +4545,7 @@ class AdveneGUI(object):
         valid = self.controller.package.imagecache.valid_snapshots()
         self.controller.package.imagecache.reset()
         for t in valid:
-            self.controller.notify('SnapshotUpdate', position=t)
+            self.controller.notify('SnapshotUpdate', position=t, media=self.controller.package.media)
         return True
 
     def on_restart_player1_activate (self, button=None, data=None):
@@ -4463,40 +4555,42 @@ class AdveneGUI(object):
 
     def on_slider_button_press_event (self, button=None, event=None):
         self.slider_move = True
-        if event.button == 1:
-            event.button = 2
-        return False
+        return
 
     def on_slider_button_release_event (self, button=None, event=None):
-        if self.controller.player.playlist_get_list():
-            p = self.controller.create_position (value = long(self.gui.slider.get_value ()))
-            self.controller.update_status('set', p)
+        self.controller.update_status('seek', int(self.gui.slider.get_value ()))
         self.slider_move = False
-        if event.button == 1:
-            event.button = 2
-        return False
+        return
 
     def on_slider_scroll_event (self, widget=None, event=None):
-        if event.direction == gtk.gdk.SCROLL_DOWN or event.direction == gtk.gdk.SCROLL_RIGHT:
+        incr = 0
+        if event.direction == Gdk.ScrollDirection.DOWN or event.direction == Gdk.ScrollDirection.RIGHT:
             incr=+1
-        if event.direction == gtk.gdk.SCROLL_UP or event.direction == gtk.gdk.SCROLL_LEFT:
+        if event.direction == Gdk.ScrollDirection.UP or event.direction == Gdk.ScrollDirection.LEFT:
             incr=-1
-        self.controller.move_frame(incr)
-        return False
+        if event.direction == Gdk.ScrollDirection.SMOOTH:
+            deltax = event.get_scroll_deltas()[1]
+            if deltax > 0:
+                incr = +1
+            else:
+                incr = -1
+        if incr:
+            self.controller.move_frame(incr)
+        return
 
     def on_video_button_press_event (self, button=None, event=None):
-        if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+        if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
             self.controller.player.fullscreen(self.connect_fullscreen_handlers)
         elif event.button == 3:
             self.player_create_bookmark(event)
         return False
 
     def on_help1_activate (self, button=None, data=None):
-        self.controller.open_url ('http://liris.cnrs.fr/advene/wiki/index.php/AdveneUserGuide')
+        self.controller.open_url ('http://www.advene.org/wiki/index.php/AdveneUserGuide')
         return True
 
     def on_support1_activate (self, button=None, data=None):
-        self.controller.open_url ('http://liris.cnrs.fr/advene/forum/')
+        self.controller.open_url ('http://github.com/oaubert/advene/')
         return True
 
     def on_helpshortcuts_activate (self, button=None, data=None):
@@ -4504,13 +4598,11 @@ class AdveneGUI(object):
         if os.access(helpfile, os.R_OK):
             self.controller.open_url ('file:///' + helpfile)
         else:
-            self.controller.open_url ('http://liris.cnrs.fr/advene/wiki/index.php/AdveneShortcuts')
+            self.controller.open_url ('http://www.advene.org/wiki/index.php/AdveneShortcuts')
         return True
 
     def on_advene_log_display(self, button=None, data=None):
-        self.display_textfile(config.data.advenefile('advene.log', 'settings'),
-                              title=_("Advene log"),
-                              viewname='advenelogview')
+        self.open_adhoc_view('logmessages', destination='south')
         return True
 
     def on_advene_log_folder_display(self, button=None, data=None):
@@ -4579,18 +4671,18 @@ class AdveneGUI(object):
         else:
             d=None
         filename=dialog.get_filename(title=_("Select the package to merge"),
-                                              action=gtk.FILE_CHOOSER_ACTION_OPEN,
-                                              button=gtk.STOCK_OPEN,
+                                              action=Gtk.FileChooserAction.OPEN,
+                                              button=Gtk.STOCK_OPEN,
                                               default_dir=d,
                                               filter='advene')
         if not filename:
             return True
         try:
             source=Package(uri=filename)
-        except Exception, e:
-            msg = "Cannot load %s file: %s" % (filename, unicode(e))
+        except Exception as e:
+            msg = "Cannot load %s file: %s" % (filename, str(e))
             self.log(msg)
-            dialog.message_dialog(msg, icon=gtk.MESSAGE_ERROR)
+            dialog.message_dialog(msg, icon=Gtk.MessageType.ERROR)
             return True
         m=Merger(self.controller, sourcepackage=source, destpackage=self.controller.package)
         m.popup()
@@ -4603,9 +4695,9 @@ class AdveneGUI(object):
                                    element_title=name,
                                    element_id=name,
                                    text=_("Enter a view name to save the workspace"))
-        d.default=gtk.CheckButton(_("Default workspace"))
+        d.default=Gtk.CheckButton(_("Default workspace"))
         d.default.set_tooltip_text(_("Open this workspace when opening the package"))
-        d.vbox.pack_start(d.default)
+        d.vbox.pack_start(d.default, True, True, 0)
         d.show_all()
         dialog.center_on_mouse(d)
 
@@ -4614,10 +4706,10 @@ class AdveneGUI(object):
         default=False
 
         res=d.run()
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             try:
-                title=unicode(d.title_entry.get_text())
-                ident=unicode(d.id_entry.get_text())
+                title=d.title_entry.get_text()
+                ident=d.id_entry.get_text()
                 default=d.default.get_active()
             except ValueError:
                 pass
@@ -4627,7 +4719,7 @@ class AdveneGUI(object):
             return True
 
         if not re.match(r'^[a-zA-Z0-9_]+$', ident):
-            dialog.message_dialog(_("Error: the identifier %s contains invalid characters.") % ident, icon=gtk.MESSAGE_ERROR)
+            dialog.message_dialog(_("Error: the identifier %s contains invalid characters.") % ident, icon=Gtk.MessageType.ERROR)
             return True
 
         v=helper.get_id(self.controller.package.views, ident)
@@ -4638,7 +4730,7 @@ class AdveneGUI(object):
         else:
             # Existing view. Check that it is already an workspace-view
             if v.content.mimetype != 'application/x-advene-workspace-view':
-                dialog.message_dialog(_("Error: the view %s exists and is not a workspace view.") % ident, icon=gtk.MESSAGE_ERROR)
+                dialog.message_dialog(_("Error: the view %s exists and is not a workspace view.") % ident, icon=Gtk.MessageType.ERROR)
                 return True
             create=False
         v.title=title
@@ -4646,9 +4738,9 @@ class AdveneGUI(object):
         v.date=self.controller.get_timestamp()
 
         workspace=self.workspace_serialize()
-        stream=StringIO.StringIO()
+        stream=io.StringIO()
         helper.indent(workspace)
-        ET.ElementTree(workspace).write(stream, encoding='utf-8')
+        ET.ElementTree(workspace).write(stream, encoding='unicode')
         v.content.setData(stream.getvalue())
         stream.close()
 
@@ -4668,55 +4760,55 @@ class AdveneGUI(object):
             # Create it
             try:
                 helper.recursive_mkdir(d)
-            except OSError, e:
-                self.controller.log(_("Cannot save default workspace: %s") % unicode(e))
+            except OSError as e:
+                self.controller.log(_("Cannot save default workspace: %s") % str(e))
                 return True
         defaults=config.data.advenefile( ('defaults', 'workspace.xml'), 'settings')
 
         # Do not save package-specific arguments.
         root=self.workspace_serialize(with_arguments=False)
-        stream=open(defaults, 'w')
+        stream=open(defaults, 'w', encoding='utf-8')
         helper.indent(root)
-        ET.ElementTree(root).write(stream, encoding='utf-8')
+        ET.ElementTree(root).write(stream, encoding='unicode')
         stream.close()
         self.controller.log(_("Standard workspace has been saved"))
         return True
 
     def on_website_export_activate(self, button=None, data=None):
-        w=gtk.Window()
+        w=Gtk.Window()
 
-        v=gtk.VBox()
+        v=Gtk.VBox()
         w.set_title(_("Website export"))
-        v.add(gtk.Label(_("Exporting views to a website")))
+        v.add(Gtk.Label(label=_("Exporting views to a website")))
 
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Output directory")), expand=False)
-        dirname_entry=gtk.Entry()
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Output directory")), False, False, 0)
+        dirname_entry=Gtk.Entry()
         d=self.controller.package.getMetaData(config.data.namespace, 'website-export-directory')
         if d is not None:
             dirname_entry.set_text(d)
         hb.add(dirname_entry)
 
-        d=gtk.Button(stock=gtk.STOCK_OPEN)
+        d=Gtk.Button(stock=Gtk.STOCK_OPEN)
         def select_dir(*p):
             d=dialog.get_dirname(_("Specify the output directory"))
             if d is not None:
                 dirname_entry.set_text(d)
             return True
         d.connect('clicked', select_dir)
-        hb.pack_start(d, expand=False)
-        v.pack_start(hb, expand=False)
-
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Maximum recursion depth")), expand=False)
-        adj=gtk.Adjustment(3, 1, 9, 1)
-        max_depth=gtk.SpinButton(adj)
-        hb.pack_start(max_depth, expand=False)
-        v.pack_start(hb, expand=False)
-
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Video URL")), expand=False)
-        video_entry=gtk.Entry()
+        hb.pack_start(d, False, True, 0)
+        v.pack_start(hb, False, True, 0)
+
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Maximum recursion depth")), False, False, 0)
+        adj=Gtk.Adjustment.new(3, 1, 9, 1, 1, 1)
+        max_depth=Gtk.SpinButton.new(adj, 1, 0)
+        hb.pack_start(max_depth, False, True, 0)
+        v.pack_start(hb, False, True, 0)
+
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Video URL")), False, False, 0)
+        video_entry=Gtk.Entry()
         video_entry.set_tooltip_text(_("URL for the video, if it is available on a sharing website (Only Youtube for the moment).\n It can also be a h264/ogg file, which will in this case be handled by the HTML5 video player."))
         u=self.controller.package.getMetaData(config.data.namespace, 'website-export-video-url')
         if u is None:
@@ -4727,10 +4819,10 @@ class AdveneGUI(object):
             video_entry.set_text(u)
 
         hb.add(video_entry)
-        v.pack_start(hb, expand=False)
+        v.pack_start(hb, False, True, 0)
 
-        pb=gtk.ProgressBar()
-        v.pack_start(pb, expand=False)
+        pb=Gtk.ProgressBar()
+        v.pack_start(pb, False, True, 0)
 
         w.should_continue = False
 
@@ -4740,16 +4832,16 @@ class AdveneGUI(object):
             if len(msg) > 80:
                 msg = msg[:36] + "(...)" + msg[-36:]
             pb.set_text(msg)
-            while gtk.events_pending():
-                gtk.main_iteration()
+            while Gtk.events_pending():
+                Gtk.main_iteration()
             return w.should_continue
 
         def do_conversion(b):
-            d=unicode(dirname_entry.get_text())
+            d=dirname_entry.get_text()
             if not d:
                 return False
 
-            video=unicode(video_entry.get_text())
+            video=video_entry.get_text()
 
             if (self.controller.package.getMetaData(config.data.namespace, 'website-export-directory') != d
                 or self.controller.package.getMetaData(config.data.namespace, 'website-export-video-url') != video):
@@ -4766,8 +4858,8 @@ class AdveneGUI(object):
                                                max_depth=max_depth.get_value_as_int(),
                                                progress_callback=cb,
                                                video_url=video)
-            except OSError, e:
-                dialog.message_dialog(_("Could not export data: ") + unicode(e), icon=gtk.MESSAGE_ERROR)
+            except OSError as e:
+                dialog.message_dialog(_("Could not export data: ") + str(e), icon=Gtk.MessageType.ERROR)
                 b.set_sensitive(True)
             self.log(_("Website export to %s completed") % d)
             w.destroy()
@@ -4782,14 +4874,14 @@ class AdveneGUI(object):
                 w.destroy()
             return True
 
-        hb=gtk.HButtonBox()
-        b=gtk.Button(stock=gtk.STOCK_CONVERT)
+        hb=Gtk.HButtonBox()
+        b=Gtk.Button(stock=Gtk.STOCK_CONVERT)
         b.connect('clicked', do_conversion)
         hb.add(b)
-        b=gtk.Button(stock=gtk.STOCK_CLOSE)
+        b=Gtk.Button(stock=Gtk.STOCK_CLOSE)
         b.connect('clicked', do_cancel)
         hb.add(b)
-        v.pack_start(hb, expand=False)
+        v.pack_start(hb, False, True, 0)
 
         w.add(v)
 
@@ -4803,414 +4895,47 @@ class AdveneGUI(object):
         return True
 
     def update_annotation_screenshots(self, *p):
-        """Update screenshot for annotations bounds.
+        """Update screenshot for annotations
 
         This requires that the player has the async-snapshot capability.
         """
         if not 'async-snapshot' in self.controller.player.player_capabilities:
             dialog.message_dialog(_("This video player is not able to grab specific screenshots"))
             return True
-        missing = set()
-        ic=self.controller.package.imagecache
-        for a in self.controller.package.annotations:
-            if not ic.is_initialized(a.fragment.begin):
-                missing.add(a.fragment.begin)
-            if not ic.is_initialized(a.fragment.end):
-                missing.add(a.fragment.end)
+        missing = set(a.fragment.begin
+                      for a in self.controller.package.annotations
+                      if self.controller.get_snapshot(a).is_default)
         if missing:
             dialog.message_dialog(_("Updating %d snapshots") % len(missing), modal=False)
-            print "Updating %d missing snapshots: " % len(missing), ", ".join(helper.format_time_reference(t) for t in sorted(missing))
+            logger.info("Updating %d missing snapshots: %s" % (len(missing), ", ".join(helper.format_time_reference(t) for t in sorted(missing))))
             for t in sorted(missing):
                 self.controller.player.async_snapshot(t)
         else:
             dialog.message_dialog(_("No snapshot to update"), modal=False)
         return True
 
-    def generate_screenshots(self, *p):
-        """Generate screenshots.
-        """
-        movie=self.controller.get_default_media()
-        if not movie:
-            # No defined movie.
-            dialog.message_dialog(_("You first must load a movie into Advene" ), icon=gtk.MESSAGE_ERROR)
-            return True
-        if not os.path.exists(movie):
-            dialog.message_dialog(_("The movie %s does not seem to exist.") % movie, icon=gtk.MESSAGE_ERROR)
-            return True
-
-        c=self.controller
-        p=c.player
-
-        def do_cancel(b, pb):
-            if pb.event_source_generate is not None:
-                gobject.source_remove(pb.event_source_generate)
-            c.package.imagecache.autosync=pb.old_autosync
-
-            # Restore standard update display methods
-            self.event_source_update_display=gobject.timeout_add (100, self.update_display)
-            self.event_source_slow_update_display=gobject.timeout_add (1000, self.slow_update_display)
-            pb._window.destroy()
-            return True
-
-        def take_screenshot(pb):
-            """Method called every second.
-            """
-            try:
-                p.position_update()
-                i = p.snapshot (p.relative_position)
-            except p.InternalException, e:
-                print "Exception in snapshot: %s" % e
-                return True
-            if i is not None and i.height != 0:
-                self.controller.package.imagecache[p.current_position_value] = helper.snapshot2png (i)
-                prg=1.0 * p.current_position_value / p.stream_duration
-                pb.set_fraction(prg)
-                pb.set_text(helper.format_time_reference(p.current_position_value))
-                if prg > .999:
-                    do_cancel(None, pb)
-            return True
-
-        def do_generate(b, pb):
-            b.set_sensitive(False)
-            # Deactivate the GUI update method
-            gobject.source_remove(self.event_source_update_display)
-            gobject.source_remove(self.event_source_slow_update_display)
-
-            # Make the imagecache directly store data on disk
-            pb.old_autosync=c.package.imagecache.autosync
-            c.package.imagecache.autosync=True
-            if c.package.imagecache.name is None:
-                c.package.imagecache.name=helper.mediafile2id(c.get_default_media())
-
-            if p.status == p.PauseStatus:
-                # If we were paused, resume from this position
-                c.update_status('resume', position=p.relative_position)
-            elif p.status != p.PlayingStatus:
-                # If we were not already playing, capture from the start
-                c.update_status('start', position=0)
-            pb.event_source_generate=gobject.timeout_add(400, take_screenshot, pb)
-            return True
-
-        w=gtk.Window()
-        w.set_title(_("Generating screenshots"))
-        v=gtk.VBox()
-        w.add(v)
-
-        l=gtk.Label()
-        l.set_markup(_("<b>Screenshot generation</b>\n\nScreenshots will be captured approximately every 500ms.\n\nIf the movie was paused or playing, the capture will begin at the current position. Else, it will begin at the beginning of the movie.\nNote that the main interface will not be refreshed as long as this window is open."))
-        l.set_line_wrap(True)
-        v.pack_start(l, expand=False)
-
-        progressbar=gtk.ProgressBar()
-        progressbar.event_source_generate=None
-        v.pack_start(progressbar, expand=False)
-
-        progressbar._window=w
-        progressbar.old_autosync=c.package.imagecache.autosync
-        hb=gtk.HBox()
-
-        b=gtk.Button(stock=gtk.STOCK_MEDIA_RECORD)
-        b.connect('clicked', do_generate, progressbar)
-        hb.pack_start(b, expand=False)
-
-        b=gtk.Button(stock=gtk.STOCK_CANCEL)
-        b.connect('clicked', do_cancel, progressbar)
-        hb.pack_start(b, expand=False)
-
-        v.pack_start(hb, expand=False)
-        w.show_all()
-        w.set_modal(True)
-
     def on_simplify_interface_activate(self, *p):
         if self.viewbook['east'].widget.get_visible():
             # Full state -> go into simplified state
-            for v in self.viewbook.values():
+            for v in list(self.viewbook.values()):
                 v.widget.hide()
             self.gui.toolbar_container.hide()
             self.gui.stbv_combo.get_parent().hide()
         else:
             # Simplified state -> go into full state
-            for v in self.viewbook.values():
+            for v in list(self.viewbook.values()):
                 v.widget.show()
             self.gui.toolbar_container.show()
             self.gui.stbv_combo.get_parent().show()
         return True
 
-    def on_shotdetect_activate(self, *p):
-        if not os.path.exists(config.data.path['shotdetect']):
-            dialog.message_dialog(_("The <b>shotdetect</b> application does not seem to be installed. Please check that it is present and that its path is correctly specified in preferences." ), icon=gtk.MESSAGE_ERROR)
-            return True
-        p=self.controller.player
-        movie=self.controller.get_default_media()
-        if not movie:
-            # No defined movie.
-            dialog.message_dialog(_("You first must load a movie into Advene" ), icon=gtk.MESSAGE_ERROR)
-            return True
-        if not os.path.exists(movie):
-            dialog.message_dialog(_("The movie %s does not seem to exist.") % movie, icon=gtk.MESSAGE_ERROR)
-            return True
-
-        def do_gui_operation(function, *args, **kw):
-            """Execute a method in the main loop.
-
-            Ensure that we execute all Gtk operations in the mainloop.
-            """
-            def idle_func():
-                gtk.gdk.threads_enter()
-                try:
-                    function(*args, **kw)
-                    return False
-                finally:
-                    gtk.gdk.threads_leave()
-            gobject.idle_add(idle_func)
-
-        def import_data(progressbar, filename):
-            """Import data from filename.
-
-            filename is either result.xml (shotdetect output) or a
-            .txt file (generated from the intermediary data in case of
-            cancellation).
-            """
-            if filename.endswith('result.xml'):
-                iname='shotdetect'
-            else:
-                iname=filename
-            try:
-                i=advene.util.importer.get_importer(iname, controller=self.controller)
-            except Exception:
-                dialog.message_dialog(_("Cannot import shotdetect output. Did you install the shotdetect software?"),
-                                        icon=gtk.MESSAGE_ERROR,
-                                      modal=False)
-                return True
-            def progress_callback(value=None, label=''):
-                progressbar.set_label_value(label or '', value)
-                while gtk.events_pending():
-                    gtk.main_iteration()
-                return True
-            i.package=self.controller.package
-            i.callback=progress_callback
-            i.process_file(filename)
-            if filename.endswith('.txt'):
-                # Intermediary import. Fix some details.
-                at=i.defaulttype
-                at.mimetype='application/x-advene-structured'
-                at.setMetaData(config.data.namespace, "representation", 'here/content/parsed/num')
-                at.title=_("Incomplete shots")
-            self.controller.package._modified = True
-            self.controller.notify('PackageLoad', package=self.controller.package)
-            msg=_("Detected %s shots") % i.statistics['annotation']
-            dialog.message_dialog(msg, modal=False)
-            self.log(msg)
-            return True
-
-        def do_cancel(b, pb, forced=False):
-            """Cancel action.
-
-            Close dialog and do various cleanups
-            """
-            s=getattr(pb, '_source', None)
-            if s:
-                gobject.source_remove(s)
-
-            # Terminate the process if necessary
-            shots=getattr(pb, '_shots', None)
-            if shots:
-                if config.data.os == 'win32':
-                    import ctypes
-                    ctypes.windll.kernel32.TerminateProcess(int(shots._handle), -1)
-                else:
-                    try:
-                        # Python 2.6 only
-                        shots.terminate()
-                    except AttributeError:
-                        try:
-                            os.kill(shots.pid, 9)
-                            os.waitpid(shots.pid, os.WNOHANG)
-                        except OSError, e:
-                            print "Cannot kill shotdetect", unicode(e)
-
-            # Cleanup temp. dir.
-            td=getattr(pb, '_tempdir', None)
-            if td and os.path.isdir(td):
-                # Remove temp dir.
-                shutil.rmtree(td, ignore_errors=True)
-
-            # Process intermediary data if present.
-            if forced and pb._datapoints:
-                # Shot detection was cancelled, but we got
-                # intermediary data points. Convert them anyway.
-                (fd, datafile)=tempfile.mkstemp('.txt', text=True)
-                pb._datapoints.insert(0, 0)
-                pb._datapoints.append(self.controller.cached_duration or (pb._datapoints[-1] + 5000))
-                for (i, t) in enumerate(zip( pb._datapoints[:-1], pb._datapoints[1:] )):
-                    os.write(fd, '%d %d num=%d\n' % (t[0], t[1], i + 1))
-                os.close(fd)
-                import_data( pb, datafile )
-                os.unlink(datafile)
-            pb._window.destroy()
-            return True
-
-        def on_shotdetect_end(progressbar):
-            # Detection is over. Import resulting file.
-
-            # First disconnect the automatic pulse (win32 only)
-            s=getattr(progressbar, '_source', None)
-            if s:
-                gobject.source_remove(s)
-                progressbar._source=None
-
-            filename=os.path.join( progressbar._tempdir, 'result.xml' )
-            if os.path.exists(filename):
-                # If the file does not exist, it should mean that
-                # the process was killed, so cancel was already
-                # invoked.
-                import_data(progressbar, filename)
-                progressbar._datapoints=[]
-                do_cancel(None, progressbar)
-            return False
-
-        def execute_shotdetect(pb):
-            """Execute shotdetect.
-
-            This method is meant to be run in its own thread.
-            """
-            def subprocess_setup():
-                # Python installs a SIGPIPE handler by default. This is usually not what
-                # non-Python subprocesses expect.
-                signal.signal(signal.SIGPIPE, signal.SIG_DFL)
-
-            shot_re=re.compile('Shot log\s+::\s+(.+)')
-            exp_re = re.compile('(\d*\.\d*)e\+(\d+)')
-
-            argv=[ config.data.path['shotdetect'],
-                   '-i', gobject.filename_from_utf8(movie.encode('utf8')),
-                   '-o', gobject.filename_from_utf8(pb._tempdir.encode('utf8')),
-                   '-s', str(pb._sensitivity.get_value_as_int()) ]
-
-            if config.data.os == 'win32':
-                kw = { 'creationflags': win32process.CREATE_NO_WINDOW }
-            else:
-                kw = { 'preexec_fn': subprocess_setup }
-            try:
-                pb._shots=subprocess.Popen( argv,
-                                            bufsize=0,
-                                            shell=False,
-                                            stdout=subprocess.PIPE,
-                                            stderr=subprocess.PIPE,
-                                            **kw )
-            except OSError, e:
-                do_cancel(None, pb)
-                dialog.message_dialog(_("Could not run shotdetect: %s") % unicode(e), modal=False)
-                return True
-
-            do_gui_operation(pb.set_label_value,
-                             _("Detecting shots from %s") % gobject.filename_display_name(movie),
-                             0.01)
-            while True:
-                l=pb._shots.stderr.readline()
-                if not l:
-                    break
-                ms=shot_re.findall(l)
-                if ms:
-                    ts=0
-                    try:
-                        ts=long(ms[0])
-                    except ValueError:
-                        m=exp_re.match(ms[0])
-                        if m:
-                            ts=long(float(m.group(1)) * 10 ** int(m.group(2)))
-
-                    pb._datapoints.append(ts)
-                    d=self.controller.cached_duration
-                    if d > 0:
-                        prg=1.0 * ts / d
-                    else:
-                        prg=None
-                    do_gui_operation(pb.set_label_value,
-                                     _("Detected shot #%(num)d at %(pos)s ") % {
-                            'num': len(pb._datapoints),
-                            'pos': helper.format_time_reference(ts)
-                            },
-                                     prg)
-
-            # Detection is over. Import result
-            do_gui_operation(on_shotdetect_end, pb)
-            return False
-
-        def do_detect(b, pb):
-            b.set_sensitive(False)
-
-            pb._tempdir=unicode(tempfile.mkdtemp('', 'shotdetect'), sys.getfilesystemencoding())
-            #~ if config.data.os == 'win32' or self.controller.cached_duration <= 0:
-                #~ # Async. reading from a pipe is a mess on win32. A
-                #~ # proper fix should be found, but in the meantime,
-                #~ # give a feedback to the user.  Do it also when the
-                #~ # movie length is unknown, so that the user can know
-                #~ # there is activity even if no shot is detected.
-                #~ def progress():
-                    #~ pb.pulse()
-                    #~ return True
-                #~ pb._source=gobject.timeout_add(500, progress)
-
-            t=threading.Thread(target=execute_shotdetect, args= [ pb ])
-            t.start()
-            return True
-
-        w=gtk.Window()
-        w.set_title(_("Shot detection"))
-
-        v=gtk.VBox()
-        w.add(v)
-
-        l=gtk.Label()
-        l.set_markup(_("<b>Shot detection</b>\n\nAdvene will try to detect shots from the currently loaded movie. The threshold parameter is used to specify the sensitivity of the algorithm, and should typically be between 50 and 80. If too many shots are detected, try to augment its value."))
-        l.set_line_wrap(True)
-        v.pack_start(l, expand=False)
-
-        progressbar=gtk.ProgressBar()
-
-        def set_label_value(s, label='', value=None):
-            s.set_text(label)
-            if value is None:
-                progressbar.pulse()
-            else:
-                progressbar.set_fraction(value)
-            return False
-        progressbar.set_label_value=set_label_value.__get__(progressbar)
-
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Sensitivity")), expand=False)
-        progressbar._sensitivity=gtk.SpinButton(gtk.Adjustment(60, 5, 95, 1, 5))
-        hb.pack_start(progressbar._sensitivity)
-        v.pack_start(hb, expand=False)
-        v.pack_start(progressbar, expand=False)
-
-        progressbar._window=w
-        progressbar._datapoints=[]
-
-        hb=gtk.HBox()
-
-        b=gtk.Button(stock=gtk.STOCK_EXECUTE)
-        b.connect('clicked', do_detect, progressbar)
-        hb.pack_start(b, expand=False)
-
-        b=gtk.Button(stock=gtk.STOCK_CANCEL)
-        b.connect('clicked', do_cancel, progressbar, True)
-        hb.pack_start(b, expand=False)
-
-        v.pack_start(hb, expand=False)
-        w.show_all()
-        return True
-
 if __name__ == '__main__':
     v = AdveneGUI ()
     try:
         v.main (config.data.args)
-    except Exception, e:
+    except Exception as e:
         e, v, tb = sys.exc_info()
-        print config.data.version_string
-        print "Got exception %s. Stopping services..." % str(e)
+        logger.error(config.data.version_string)
+        logger.error("Got exception %s. Stopping services..." % str(e))
         v.on_exit ()
-        print "*** Exception ***"
-        import code
-        code.traceback.print_exception (e, v, tb)
+        logger.error("*** Exception ***", exc_info=True)
diff --git a/lib/advene/gui/plugins/__init__.py b/lib/advene/gui/plugins/__init__.py
index 3142f9a..f7feb75 100644
--- a/lib/advene/gui/plugins/__init__.py
+++ b/lib/advene/gui/plugins/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/gui/plugins/actions.py b/lib/advene/gui/plugins/actions.py
index 796ea54..3fb81cf 100644
--- a/lib/advene/gui/plugins/actions.py
+++ b/lib/advene/gui/plugins/actions.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@ from advene.rules.elements import RegisteredAction
 import advene.model.tal.context
 import advene.util.helper as helper
 import textwrap
-import gtk
+from gi.repository import Gtk
 
 name="Default GUI actions"
 
@@ -114,7 +114,7 @@ def register(controller=None):
                     ('string:'+_('See the annotation'), _('See the annotation')),
                     ),
                         'url': (
-                    ('string:http://liris.cnrs.fr', _("The Advene website")),
+                    ('string:http://advene.org/', _("The Advene website")),
                     ('annotation/absolute_url', _("The annotation URL")),
                         ),
                         'duration': (
@@ -227,14 +227,14 @@ class DefaultGUIActions:
         if name in parameters:
             try:
                 result=context.evaluateValue(parameters[name])
-            except advene.model.tal.context.AdveneTalesException, e:
+            except advene.model.tal.context.AdveneTalesException as e:
                 try:
                     rulename=context.evaluateValue('rule')
                 except advene.model.tal.context.AdveneTalesException:
                     rulename=_("Unknown rule")
                 self.controller.log(_("Rule %(rulename)s: Error in the evaluation of the parameter %(parametername)s:") % {'rulename': rulename,
                                                                                                                           'parametername': name})
-                self.controller.log(unicode(e)[:160])
+                self.controller.log(str(e)[:160])
                 result=default_value
         else:
             result=default_value
@@ -280,7 +280,7 @@ class DefaultGUIActions:
         d={
             'guiview': [
                 ( 'string:' + ident, view.view_name)
-                for (ident, view) in controller.gui.registered_adhoc_views.iteritems()
+                for (ident, view) in controller.gui.registered_adhoc_views.items()
                 ],
             'destination': (
                 ('string:popup', _("...in its own window")),
@@ -338,7 +338,7 @@ class DefaultGUIActions:
         Displays a popup with an informational message.
         """
         message=self.parse_parameter(context, parameters, 'message', _("No message..."))
-        message=unicode(message).replace('\\n', '\n')
+        message=str(message).replace('\\n', '\n')
         message=textwrap.fill(message, config.data.preferences['gui']['popup-textwidth'])
 
         duration=self.parse_parameter(context, parameters, 'duration', None)
@@ -356,7 +356,7 @@ class DefaultGUIActions:
         Displays a popup to ask for a text string.
         """
         message=self.parse_parameter(context, parameters, 'message', _("No message..."))
-        message=unicode(message).replace('\\n', '\n')
+        message=str(message).replace('\\n', '\n')
         message=textwrap.fill(message, config.data.preferences['gui']['popup-textwidth'])
 
         destination=self.parse_parameter(context, parameters, 'destination', None)
@@ -373,19 +373,19 @@ class DefaultGUIActions:
 
         def handle_response(button, widget, entry, dest):
             # Update the destination
-            dest.content.data = unicode(entry.get_text())
+            dest.content.data = entry.get_text()
             # FIXME: notify element modification
             self.gui.popupwidget.undisplay(widget)
             return True
 
-        v=gtk.VBox()
+        v=Gtk.VBox()
 
         w=self.gui.get_illustrated_text(message)
         v.add(w)
-        e=gtk.Entry()
+        e=Gtk.Entry()
         e.set_text(destination.content.data)
         v.add(e)
-        b=gtk.Button(stock=gtk.STOCK_OK)
+        b=Gtk.Button(stock=Gtk.STOCK_OK)
         b.connect('clicked', handle_response, v, e, destination)
         v.add(b)
 
@@ -421,20 +421,20 @@ class DefaultGUIActions:
         description=textwrap.fill(description, config.data.preferences['gui']['popup-textwidth'])
 
         message=self.parse_parameter(context, parameters, 'message', _("Click to open the URL"))
-        message=unicode(message).replace('\\n', '\n')
+        message=str(message).replace('\\n', '\n')
         message=textwrap.fill(message, config.data.preferences['gui']['popup-textwidth'])
 
-        url=self.parse_parameter(context, parameters, 'url', 'string:http://liris.cnrs.fr/advene/')
+        url=self.parse_parameter(context, parameters, 'url', 'string:http://advene.org/')
         duration=self.parse_parameter(context, parameters, 'duration', None)
         if duration == "" or duration == 0:
             duration = None
 
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        vbox.pack_start(self.gui.get_illustrated_text(description), expand=False)
+        vbox.pack_start(self.gui.get_illustrated_text(description), False, False, 0)
 
-        b=gtk.Button(message)
-        vbox.pack_start(b, expand=False)
+        b=Gtk.Button(message)
+        vbox.pack_start(b, False, True, 0)
 
         b.connect('clicked', handle_response, url, vbox)
 
@@ -447,7 +447,7 @@ class DefaultGUIActions:
         Displays a popup with a message and a new possible position.
         """
         def handle_response(button, position, widget):
-            self.controller.update_status("set", position)
+            self.controller.update_status("seek", position)
             self.gui.popupwidget.undisplay(widget)
             return True
 
@@ -456,7 +456,7 @@ class DefaultGUIActions:
         description=textwrap.fill(description, config.data.preferences['gui']['popup-textwidth'])
 
         message=self.parse_parameter(context, parameters, 'message', _("Click to go to another position"))
-        message=unicode(message).replace('\\n', '\n')
+        message=str(message).replace('\\n', '\n')
         message=textwrap.fill(message, config.data.preferences['gui']['popup-textwidth'])
 
         position=self.parse_parameter(context, parameters, 'position', 0)
@@ -464,13 +464,13 @@ class DefaultGUIActions:
         if duration == "" or duration == 0:
             duration = None
 
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        vbox.pack_start(self.gui.get_illustrated_text(description), expand=False)
+        vbox.pack_start(self.gui.get_illustrated_text(description), False, False, 0)
 
-        b=gtk.Button()
+        b=Gtk.Button()
         b.add(self.gui.get_illustrated_text(message, position))
-        vbox.pack_start(b, expand=False)
+        vbox.pack_start(b, False, True, 0)
 
         b.connect('clicked', handle_response, position, vbox)
 
@@ -481,11 +481,11 @@ class DefaultGUIActions:
         def generate (context, parameters):
             """Display a popup with 'size' choices."""
             def handle_response(button, position, widget):
-                self.controller.update_status("set", long(position))
+                self.controller.update_status("seek", int(position))
                 self.gui.popupwidget.undisplay(widget)
                 return True
 
-            vbox=gtk.VBox()
+            vbox=Gtk.VBox()
 
             description=self.parse_parameter(context,
                                              parameters, 'description', _("Make a choice"))
@@ -503,7 +503,7 @@ class DefaultGUIActions:
 
                 position=self.parse_parameter(context, parameters, 'position%d' % i, 0)
 
-                b=gtk.Button()
+                b=Gtk.Button()
                 b.add(self.gui.get_illustrated_text(message, position))
                 b.connect('clicked', handle_response, position, vbox)
                 vbox.add(b)
@@ -545,7 +545,7 @@ class DefaultGUIActions:
         Displays a popup proposing to navigate to related outgoing annotations.
         """
         def handle_response(button, position, widget):
-            self.controller.update_status("set", position)
+            self.controller.update_status("seek", position)
             self.gui.popupwidget.undisplay(widget)
             return True
 
@@ -560,13 +560,13 @@ class DefaultGUIActions:
         message=message.replace('\\n', '\n')
         message=textwrap.fill(message, config.data.preferences['gui']['popup-textwidth'])
 
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        vbox.pack_start(self.gui.get_illustrated_text(message), expand=False)
+        vbox.pack_start(self.gui.get_illustrated_text(message), False, False, 0)
 
         for r in relations:
             a=r.members[-1]
-            b=gtk.Button()
+            b=Gtk.Button()
             t=''
             if r.content.data:
                 t=' (%s)' % r.content.data
@@ -575,7 +575,7 @@ class DefaultGUIActions:
                 'relation_content': t,
                 'annotation_content': self.controller.get_title(a) }
             b.add(self.gui.get_illustrated_text(c, a.fragment.begin))
-            vbox.pack_start(b, expand=False)
+            vbox.pack_start(b, False, True, 0)
             b.connect('clicked', handle_response, a.fragment.begin, vbox)
 
         self.gui.popupwidget.display(widget=vbox, timeout=annotation.fragment.duration, title=_("Relation navigation"))
diff --git a/lib/advene/gui/plugins/contenthandlers.py b/lib/advene/gui/plugins/contenthandlers.py
index a6ce149..97ee2ca 100644
--- a/lib/advene/gui/plugins/contenthandlers.py
+++ b/lib/advene/gui/plugins/contenthandlers.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,18 +16,21 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+import logging
+logger = logging.getLogger(__name__)
 
 from gettext import gettext as _
 
 import os
-import gtk
+from gi.repository import Gdk
+from gi.repository import Gtk
 import xml.parsers.expat
-import StringIO
+import io
 
 import advene.core.config as config
 import advene.util.helper as helper
 from advene.gui.edit.elements import ContentHandler, TextContentHandler
-from advene.gui.edit.shapewidget import ShapeDrawer, Rectangle, ShapeEditor
+from advene.gui.edit.shapewidget import ShapeDrawer, ShapeEditor
 from advene.gui.util import image_from_position, dialog, decode_drop_parameters, get_pixmap_toolbutton
 
 from advene.gui.edit.rules import EditRuleSet, EditQuery
@@ -78,7 +81,7 @@ class ZoneContentHandler (ContentHandler):
             return True
 
         shape=self.shape
-        shape.name=unicode(self.nameentry.get_text())
+        shape.name=self.nameentry.get_text()
         text="""shape=rect\nname=%s\nx=%02f\ny=%02f\nwidth=%02f\nheight=%02f""" % (
             shape.name,
             shape.x * 100.0 / self.view.canvaswidth,
@@ -91,12 +94,14 @@ class ZoneContentHandler (ContentHandler):
 
     def get_view (self, compact=False):
         """Generate a view widget for editing zone attributes."""
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
         if self.parent is not None and hasattr(self.parent, 'fragment'):
             # We are editing the content of an annotation. Use its snapshot as background.
-            i=image_from_position(self.controller, self.parent.fragment.begin, height=160,
-                                  epsilon=1000/config.data.preferences['default-fps'])
+            i = image_from_position(self.controller,
+                                    position=self.parent.fragment.begin,
+                                    media=self.parent.media,
+                                    height=160)
             self.view = ShapeDrawer(callback=self.callback, background=i.get_pixbuf())
         else:
             self.view = ShapeDrawer(callback=self.callback)
@@ -118,14 +123,14 @@ class ZoneContentHandler (ContentHandler):
                     self.shape.name = self.element.data
 
         # Name edition
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Label")), expand=False)
-        self.nameentry=gtk.Entry()
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Label")), False, False, 0)
+        self.nameentry=Gtk.Entry()
         if self.shape is not None:
             self.nameentry.set_text(self.shape.name)
-        hb.pack_start(self.nameentry)
+        hb.pack_start(self.nameentry, True, True, 0)
 
-        vbox.pack_start(hb, expand=False)
+        vbox.pack_start(hb, False, True, 0)
 
         vbox.add(self.view.widget)
 
@@ -166,11 +171,11 @@ class SVGContentHandler (ContentHandler):
         if self.element.data:
             try:
                 root=ET.parse(self.element.stream).getroot()
-            except xml.parsers.expat.ExpatError, e:
+            except xml.parsers.expat.ExpatError as e:
                 root=None
                 dialog.message_dialog(
-                    _("Error while parsing SVG content:\n\n%s") % unicode(e),
-                    icon=gtk.MESSAGE_ERROR)
+                    _("Error while parsing SVG content:\n\n%s") % str(e),
+                    icon=Gtk.MessageType.ERROR)
             if root is not None:
                 self.view.drawer.clear_objects()
                 path=''
@@ -197,8 +202,8 @@ class SVGContentHandler (ContentHandler):
 
         tree=ET.ElementTree(self.view.drawer.get_svg(relative=False))
         #ET.dump(tree)
-        s=StringIO.StringIO()
-        tree.write(s, encoding='utf-8')
+        s=io.StringIO()
+        tree.write(s, encoding='unicode')
         self.element.data = s.getvalue()
         s.close()
         # Update the XML source representation
@@ -211,12 +216,12 @@ class SVGContentHandler (ContentHandler):
         url=None
         title=''
         if targetType == config.data.target_type['annotation']:
-            here=self.controller.package.annotations.get(unicode(selection.data, 'utf8').split('\n')[0])
+            here=self.controller.package.annotations.get(str(selection.get_data(), 'utf8').split('\n')[0])
         elif targetType == config.data.target_type['view']:
-            data=decode_drop_parameters(selection.data)
+            data=decode_drop_parameters(selection.get_data())
             v=self.controller.package.get_element_by_id(data['id'])
             if v is None:
-                print "Cannot find view", data['id']
+                logger.error("Cannot find view %s", data['id'])
                 return True
             here=v
             title=self.controller.get_title(v)
@@ -225,7 +230,7 @@ class SVGContentHandler (ContentHandler):
             url='%s/action/OpenView?id=%s' % (root, v.id)
         elif targetType == config.data.target_type['uri-list']:
             here=None
-            url=unicode(selection.data.splitlines()[0], 'utf8')
+            url=str(selection.get_data().splitlines()[0], 'utf8')
             title=url
         else:
             # Invalid drop target
@@ -237,7 +242,7 @@ class SVGContentHandler (ContentHandler):
             url=ctx.evaluateValue('here/absolute_url')
 
         if url is None:
-            print "Cannot guess url"
+            logger.error("Cannot guess url after DND")
             return True
 
         s=self.view.drawer.clicked_shape( (x, y) )
@@ -254,25 +259,36 @@ class SVGContentHandler (ContentHandler):
         return False
 
     def set_begin(self, t):
-        self.view.set_background(image_from_position(self.controller, t,
-                                                     epsilon=1000/config.data.preferences['default-fps']))
+        try:
+            media = self.parent.media
+        except AttributeError:
+            media = None
+
+        self.view.set_background(image_from_position(self.controller,
+                                                     position=t,
+                                                     media=media))
         return True
 
     def get_view (self, compact=False):
         """Generate a view widget for editing SVG."""
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
         if self.parent is not None and hasattr(self.parent, 'fragment'):
-            i = image_from_position(self.controller, self.parent.fragment.begin,
-                                    epsilon=1000/config.data.preferences['default-fps'])
-            self.view = ShapeEditor(background=i, pixmap_dir=config.data.advenefile('pixmaps'))
+            i = image_from_position(self.controller,
+                                    position=self.parent.fragment.begin,
+                                    media=self.parent.media)
+            self.view = ShapeEditor(background=i, icon_dir=config.data.advenefile('pixmaps'))
 
             def snapshot_update_cb(context, target):
+                if context.globals['media'] != self.parent.media:
+                    return True
                 frag = self.parent.fragment
-                pos = frag.begin + long(self.view.background_adj.get_value() * frag.duration)
-                if abs(context.globals['position'] - pos) <= 1000/config.data.preferences['default-fps']:
+                pos = self.controller.round_timestamp(frag.begin + int(self.view.background_adj.get_value() * frag.duration))
+                if context.globals['position'] == pos:
                     # Refresh image
-                    i=image_from_position(self.controller, pos, epsilon=1000/config.data.preferences['default-fps'])
+                    i = image_from_position(self.controller,
+                                            position=pos,
+                                            media=self.parent.media)
                     self.view.set_background(i)
                 return True
             self.rules.append(self.controller.event_handler.internal_rule (event='SnapshotUpdate',
@@ -285,18 +301,16 @@ class SVGContentHandler (ContentHandler):
                                                                            method=annotation_update_cb))
 
         else:
-            self.view = ShapeEditor(pixmap_dir=config.data.advenefile('pixmaps'))
+            self.view = ShapeEditor(icon_dir=config.data.advenefile('pixmaps'))
 
         self.parse_svg()
 
         self.view.drawer.widget.connect('drag-data-received', self.drawer_drag_received)
-        self.view.drawer.widget.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                              gtk.DEST_DEFAULT_HIGHLIGHT |
-                                              gtk.DEST_DEFAULT_ALL,
-                                              config.data.drag_type['view']
-                                              + config.data.drag_type['annotation']
-                                              + config.data.drag_type['uri-list'],
-                                              gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK)
+        self.view.drawer.widget.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                              Gtk.DestDefaults.HIGHLIGHT |
+                                              Gtk.DestDefaults.ALL,
+                                              config.data.get_target_types('view', 'annotation', 'uri-list'),
+                                              Gdk.DragAction.COPY | Gdk.DragAction.LINK)
 
         def edit_svg(b=None):
             vbox.foreach(vbox.remove)
@@ -328,18 +342,18 @@ class SVGContentHandler (ContentHandler):
 
         def update_background(adj):
             frag = self.parent.fragment
-            pos = frag.begin + long(adj.get_value() * frag.duration)
+            pos = self.controller.round_timestamp(frag.begin + int(adj.get_value() * frag.duration))
             self.controller.update_snapshot(pos)
             i = image_from_position(self.controller,
-                                    pos,
-                                    epsilon=1000/config.data.preferences['default-fps'])
+                                    position=pos,
+                                    media=self.parent.media)
             self.view.set_background(i)
             return True
 
-        self.view.background_adj = gtk.Adjustment(value=0, lower=0, upper=1.0, step_incr=0.1, page_incr=0.2)
-        slider = gtk.HScale(self.view.background_adj)
-        slider.connect("format-value", lambda s, v: helper.format_time(self.parent.fragment.begin + long(v * self.parent.fragment.duration)))
-        ti = gtk.ToolItem()
+        self.view.background_adj = Gtk.Adjustment.new(value=0, lower=0, upper=1.0, step_increment=0.1, page_increment=0.2, page_size=0.2)
+        slider = Gtk.HScale.new(self.view.background_adj)
+        slider.connect("format-value", lambda s, v: helper.format_time(self.parent.fragment.begin + int(v * self.parent.fragment.duration)))
+        ti = Gtk.ToolItem()
         ti.add(slider)
         ti.set_expand(True)
         self.view.toolbar.insert(ti, -1)
@@ -377,7 +391,7 @@ class RuleSetContentHandler (ContentHandler):
             dialog.message_dialog(
                 _("The following items seem to be\ninvalid TALES expressions:\n\n%s") %
                 "\n".join(iv),
-                icon=gtk.MESSAGE_ERROR)
+                icon=Gtk.MessageType.ERROR)
             return False
         else:
             return True
@@ -404,8 +418,8 @@ class RuleSetContentHandler (ContentHandler):
                               controller=self.controller)
         self.view = self.edit.get_packed_widget()
 
-        scroll_win = gtk.ScrolledWindow ()
-        scroll_win.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        scroll_win = Gtk.ScrolledWindow ()
+        scroll_win.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         scroll_win.add_with_viewport(self.view)
 
         return scroll_win
@@ -433,7 +447,7 @@ class SimpleQueryContentHandler (ContentHandler):
             dialog.message_dialog(
                 _("The following items seem to be\ninvalid TALES expressions:\n\n%s") %
                 "\n".join(iv),
-                icon=gtk.MESSAGE_ERROR)
+                icon=Gtk.MessageType.ERROR)
             return False
         else:
             return True
@@ -462,8 +476,8 @@ class SimpleQueryContentHandler (ContentHandler):
                             editable=self.editable)
         self.view = self.edit.get_widget()
 
-        scroll_win = gtk.ScrolledWindow ()
-        scroll_win.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        scroll_win = Gtk.ScrolledWindow ()
+        scroll_win.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         scroll_win.add_with_viewport(self.view)
 
         return scroll_win
diff --git a/lib/advene/gui/plugins/eventaccumulator.py b/lib/advene/gui/plugins/eventaccumulator.py
index 2b082ab..19c55f3 100644
--- a/lib/advene/gui/plugins/eventaccumulator.py
+++ b/lib/advene/gui/plugins/eventaccumulator.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -22,14 +22,15 @@
 This widget allows to stack compact event history.
 """
 
-import gtk
+from gi.repository import Gdk
+from gi.repository import Gtk
 import time
 
 from gettext import gettext as _
 
 from advene.gui.views import AdhocView
 import advene.util.helper as helper
-import urllib
+import urllib.request, urllib.parse, urllib.error
 import advene.model.view
 from advene.gui.widget import TimestampRepresentation
 from advene.rules.elements import ECACatalog
@@ -108,19 +109,19 @@ class EventAccumulator(AdhocView):
         self.receive(self.tracer.trace)
 
     def build_widget(self):
-        mainbox = gtk.VBox()
-        btnbar=gtk.HBox()
+        mainbox = Gtk.VBox()
+        btnbar=Gtk.HBox()
 
         # choix details
-        if len(self.tracer.trace.levels.keys())<=0:
-            print "EventAccumulator error : no trace level"
+        if len(list(self.tracer.trace.levels.keys()))<=0:
+            print("EventAccumulator error : no trace level")
         else:
             def details_changed(w):
                 v=w.get_label()
-                i=self.tracer.trace.levels.keys().index(v)+1
-                if i>=len(self.tracer.trace.levels.keys()):
+                i=list(self.tracer.trace.levels.keys()).index(v)+1
+                if i>=len(list(self.tracer.trace.levels.keys())):
                     i=0
-                v=self.tracer.trace.levels.keys()[i]
+                v=list(self.tracer.trace.levels.keys())[i]
                 w.set_label(v)
                 #updating options
                 self.options['detail']=v
@@ -128,27 +129,27 @@ class EventAccumulator(AdhocView):
                 self.receive(self.tracer.trace)
                 return
             bdetLabel = self.options['detail']
-            bdet = gtk.Button(bdetLabel)
+            bdet = Gtk.Button(bdetLabel)
             self.DetB = bdet
             bdet.set_size_request(60, 20)
-            btnbar.pack_start(gtk.Label(_(' Trace : ')), expand=False)
-            btnbar.pack_start(bdet, expand=False)
+            btnbar.pack_start(Gtk.Label(_(' Trace : ')), False, False, 0)
+            btnbar.pack_start(bdet, False, True, 0)
             bdet.connect('clicked', details_changed)
 
-        self.btn_filter = gtk.Button(_(' Filters'))
+        self.btn_filter = Gtk.Button(_(' Filters'))
         self.btn_filter.connect('clicked', self.modify_filters)
-        btnbar.pack_start(self.btn_filter, expand=False)
+        btnbar.pack_start(self.btn_filter, False, True, 0)
 
-        self.init_btn_filter = gtk.Button(_('Reset'))
+        self.init_btn_filter = Gtk.Button(_('Reset'))
         self.init_btn_filter.connect('clicked', self.init_obj_filter)
         self.init_btn_filter.set_sensitive(False)
-        btnbar.pack_start(self.init_btn_filter, expand=False)
+        btnbar.pack_start(self.init_btn_filter, False, True, 0)
         self.filter_active(False)
-        btnbar.pack_start(gtk.VSeparator())
+        btnbar.pack_start(Gtk.VSeparator(), True, True, 0)
 
         # choix temps
         if not self.times:
-            print "EventAccumulator error : no times defined"
+            print("EventAccumulator error : no times defined")
         else:
             def time_changed(w):
                 v=w.get_label()
@@ -162,93 +163,93 @@ class EventAccumulator(AdhocView):
                 return
 
             btimeLabel = self.options['time']
-            btime = gtk.Button(btimeLabel)
+            btime = Gtk.Button(btimeLabel)
             btime.set_size_request(60, 20)
-            btnbar.pack_start(gtk.Label(_(' Time : ')), expand=False)
-            btnbar.pack_start(btime, expand=False)
+            btnbar.pack_start(Gtk.Label(_(' Time : ')), False, False, 0)
+            btnbar.pack_start(btime, False, True, 0)
             btime.connect('clicked', time_changed)
-            btnbar.pack_start(gtk.VSeparator())
+            btnbar.pack_start(Gtk.VSeparator(), True, True, 0)
 
         # choix max
         def max_changed(w):
             self.options['max_size']=int(w.get_value())
             self.receive(self.tracer.trace)
             return
-        btnbar.pack_start(gtk.Label(_(' Max. : ')), expand=False)
-        self.sc = gtk.HScale(gtk.Adjustment ( value=20, lower=5, upper=5000, step_incr=1, page_incr=5, page_size=5))
+        btnbar.pack_start(Gtk.Label(_(' Max. : ')), False, False, 0)
+        self.sc = Gtk.HScale.new(Gtk.Adjustment.new(value=20, lower=5, upper=5000, step_incr=1, page_incr=5, page_size=5))
         self.sc.set_size_request(100, 10)
         self.sc.set_digits(0)
-        self.sc.set_value_pos(gtk.POS_LEFT)
+        self.sc.set_value_pos(Gtk.PositionType.LEFT)
         self.sc.connect('value_changed', max_changed)
-        btnbar.pack_start(self.sc, expand=False)
-        btnbar.pack_start(gtk.VSeparator())
+        btnbar.pack_start(self.sc, False, True, 0)
+        btnbar.pack_start(Gtk.VSeparator(), True, True, 0)
 
-        exp_b = gtk.Button(_('Export'))
+        exp_b = Gtk.Button(_('Export'))
         exp_b.connect('clicked', self.export)
-        btnbar.pack_start(exp_b, expand=False)
+        btnbar.pack_start(exp_b, False, True, 0)
 
-        mainbox.pack_start(btnbar, expand=False)
-        mainbox.pack_start(gtk.HSeparator(), expand=False)
-        self.accuBox=gtk.VBox()
-        self.sw = gtk.ScrolledWindow()
-        self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        mainbox.pack_start(btnbar, False, True, 0)
+        mainbox.pack_start(Gtk.HSeparator(), False, False, 0)
+        self.accuBox=Gtk.VBox()
+        self.sw = Gtk.ScrolledWindow()
+        self.sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         self.sw.add_with_viewport(self.accuBox)
-        self.sw.set_vadjustment(gtk.Adjustment(value = 208, lower = 0, upper=208, step_incr=52, page_incr=208, page_size=208))
-        mainbox.pack_start(self.sw)
+        self.sw.set_vadjustment(Gtk.Adjustment.new(value = 208, lower = 0, upper=208, step_incr=52, page_incr=208, page_size=208))
+        mainbox.pack_start(self.sw, True, True, 0)
         return mainbox
 
     def export(self, w):
         fname = self.tracer.export()
-        d = gtk.Dialog(title=_("Exporting traces"),
-                       parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_OK, gtk.RESPONSE_OK
+        d = Gtk.Dialog(title=_("Exporting traces"),
+                       parent=self.controller.gui.gui.win,
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_OK, Gtk.ResponseType.OK
                                  ))
-        l=gtk.Label(_("Export done to\n%s") % fname)
+        l=Gtk.Label(label=_("Export done to\n%s") % fname)
         l.set_selectable(True)
         l.set_line_wrap(True)
         l.show()
-        d.vbox.pack_start(l, expand=False)
+        d.vbox.pack_start(l, False, True, 0)
         d.vbox.show_all()
         d.show()
-        res=d.run()
+        d.run()
         d.destroy()
         return
 
     def modify_filters(self, w):
-        w=gtk.Window(gtk.WINDOW_TOPLEVEL)
+        w=Gtk.Window(Gtk.WindowType.TOPLEVEL)
         def level_changed(w, options):
             v=w.get_label()
-            i=self.tracer.trace.levels.keys().index(v)+1
-            if i>=len(self.tracer.trace.levels.keys()):
+            i=list(self.tracer.trace.levels.keys()).index(v)+1
+            if i>=len(list(self.tracer.trace.levels.keys())):
                 i=0
-            v=self.tracer.trace.levels.keys()[i]
+            v=list(self.tracer.trace.levels.keys())[i]
             w.set_label(v)
             self.show_options(options, v)
             options.show_all()
             return
-        vb = gtk.VBox()
+        vb = Gtk.VBox()
         levelslab = self.options['detail']
-        levels = gtk.Button(levelslab)
-        vb.pack_start(levels, expand=False)
+        levels = Gtk.Button(levelslab)
+        vb.pack_start(levels, False, True, 0)
         #levels.set_size_request(60, 20)
-        vb.pack_start(gtk.HSeparator(), expand=False)
-        options = gtk.VBox()
+        vb.pack_start(Gtk.HSeparator(), False, False, 0)
+        options = Gtk.VBox()
         self.show_options(options, levelslab)
-        sw = gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        sw = Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         sw.set_size_request(600, 480)
         sw.add_with_viewport(options)
-        vb.pack_start(sw, expand=False)
-        vb.pack_start(gtk.HSeparator(), expand=False)
+        vb.pack_start(sw, False, True, 0)
+        vb.pack_start(Gtk.HSeparator(), False, False, 0)
         def options_quit(w, window):
             window.destroy()
             return
-        hbb = gtk.HBox()
-        btn_q = gtk.Button(stock=gtk.STOCK_CLOSE)
-        hbb.pack_end(btn_q, expand=False)
+        hbb = Gtk.HBox()
+        btn_q = Gtk.Button(stock=Gtk.STOCK_CLOSE)
+        hbb.pack_end(btn_q, False, True, 0)
         btn_q.connect('clicked', options_quit, w)
-        vb.pack_end(hbb, expand=False)
+        vb.pack_end(hbb, False, True, 0)
         levels.connect('clicked', level_changed, options)
         w.set_name(_('Defining Filters'))
         w.add(vb)
@@ -268,8 +269,8 @@ class EventAccumulator(AdhocView):
             return
         if levelslab == 'events':
             for i in self.events_names:
-                option = gtk.CheckButton( ECACatalog.event_names[i])
-                options.pack_start(option, expand=False)
+                option = Gtk.CheckButton( ECACatalog.event_names[i])
+                options.pack_start(option, False, True, 0)
                 if i in self.filters[levelslab]:
                     option.set_active(False)
                 else:
@@ -277,16 +278,16 @@ class EventAccumulator(AdhocView):
                 option.connect('toggled', option_clicked, i, levelslab)
         if levelslab == 'events' or levelslab == 'operations':
             for i in self.operations_names:
-                option = gtk.CheckButton( ECACatalog.event_names[i])
-                options.pack_start(option, expand=False)
+                option = Gtk.CheckButton( ECACatalog.event_names[i])
+                options.pack_start(option, False, True, 0)
                 if i in self.filters[levelslab]:
                     option.set_active(False)
                 else:
                     option.set_active(True)
                 option.connect('toggled', option_clicked, i, levelslab)
-            for i in self.incomplete_operations_names.keys():
-                option = gtk.CheckButton(self.incomplete_operations_names[i])
-                options.pack_start(option, expand=False)
+            for i in list(self.incomplete_operations_names.keys()):
+                option = Gtk.CheckButton(self.incomplete_operations_names[i])
+                options.pack_start(option, False, True, 0)
                 if i in self.filters[levelslab]:
                     option.set_active(False)
                 else:
@@ -294,8 +295,8 @@ class EventAccumulator(AdhocView):
                 option.connect('toggled', option_clicked, i, levelslab)
         if levelslab == 'actions':
             for i in self.tracer.action_types:
-                option = gtk.CheckButton(i)
-                options.pack_start(option, expand=False)
+                option = Gtk.CheckButton(i)
+                options.pack_start(option, False, True, 0)
                 if i in self.filters[levelslab]:
                     option.set_active(False)
                 else:
@@ -321,7 +322,7 @@ class EventAccumulator(AdhocView):
         return
 
     def filter_active(self, activate):
-        #i=gtk.Image()
+        #i=Gtk.Image()
         #if activate:
             #i.set_from_file(config.data.advenefile( ( 'pixmaps', 'filters_off.png') ))
         #else:
@@ -333,7 +334,7 @@ class EventAccumulator(AdhocView):
 
     def scroll_win(self):
         a = self.sw.get_vadjustment()
-        a.value=a.upper
+        a.set_value(a.get_upper())
         return
 
     def receive(self, trace, event=None, operation=None, action=None):
@@ -445,7 +446,7 @@ class EventAccumulator(AdhocView):
                 t_temp = t_temp -1
             for i in tracelevel[trace_min:trace_max]:
                 if i.name == "Undefined":
-                    print "Undefined action for object %s" % i
+                    print("Undefined action for object %s" % i)
                     pass
                 if i.name not in self.filters['actions']:
                     #print "%s %s" % (self.size, i.name)
@@ -454,7 +455,7 @@ class EventAccumulator(AdhocView):
             return
         #adjust the current display to the modified trace
         if action.name == "Undefined":
-            print "Undefined action for object %s" % action
+            print("Undefined action for object %s" % action)
             return
         if action == self.latest['actions']:
             # same action as before, we just need to refresh it
@@ -469,37 +470,37 @@ class EventAccumulator(AdhocView):
         return
 
     def packAction(self, obj_evt):
-        vb=gtk.VBox()
+        vb=Gtk.VBox()
         if obj_evt.name == 'Navigation':
             self.latest['nav_action'] = obj_evt
             self.latest['nav_actionBox'] = self.build_action_box(obj_evt)
         self.latest['actions'] = obj_evt
         self.latest['actionsBox'] = self.build_action_box(obj_evt)
         vb.add(self.latest['actionsBox'])
-        vb.add(gtk.HSeparator())
-        self.accuBox.pack_start(vb, expand=False)
+        vb.add(Gtk.HSeparator())
+        self.accuBox.pack_start(vb, False, True, 0)
         self.accuBox.show_all()
         self.size = self.size + 1
 
     def packOperation(self, obj_evt):
         if obj_evt is not None:
             self.latest['operations']=obj_evt
-            vb=gtk.VBox()
+            vb=Gtk.VBox()
             self.latest['operationsBox'] = self.build_operation_box(obj_evt)
             vb.add(self.latest['operationsBox'])
-            vb.add(gtk.HSeparator())
-            self.accuBox.pack_start(vb, expand=False)
+            vb.add(Gtk.HSeparator())
+            self.accuBox.pack_start(vb, False, True, 0)
             self.accuBox.show_all()
             self.size = self.size + 1
 
     def packEvent(self, obj_evt):
         if obj_evt is not None:
             self.latest['events']=obj_evt
-            vb=gtk.VBox()
+            vb=Gtk.VBox()
             self.latest['eventsBox'] = self.build_event_box(obj_evt)
             vb.add(self.latest['eventsBox'])
-            vb.add(gtk.HSeparator())
-            self.accuBox.pack_start(vb, expand=False)
+            vb.add(Gtk.HSeparator())
+            self.accuBox.pack_start(vb, False, True, 0)
             self.accuBox.show_all()
             self.size = self.size + 1
 
@@ -507,16 +508,16 @@ class EventAccumulator(AdhocView):
         if self.accuBox.get_children():
             self.accuBox.remove(self.accuBox.get_children()[0])
         else:
-            print "no event to unpack ? %s" % self.size
+            print("no event to unpack ? %s" % self.size)
         if self.size>0:
             self.size = self.size-1
 
 
     def update_last_action_box(self, obj_evt, nav=False):
         if nav:
-            tup = gtk.tooltips_data_get(self.latest['nav_actionBox'])
+            tup = Gtk.tooltips_data_get(self.latest['nav_actionBox'])
         else:
-            tup = gtk.tooltips_data_get(self.latest['actionsBox'])
+            tup = Gtk.tooltips_data_get(self.latest['actionsBox'])
         if tup is None:
             return
         corpsstr = ""
@@ -525,9 +526,9 @@ class EventAccumulator(AdhocView):
             if self.options['time'] == 'activity':
                 op_time = helper.format_time_reference(op.activity_time)
             if op.concerned_object['name'] is None:
-                corpsstr += urllib.unquote( op_time + " : " + op.name + "\n")
+                corpsstr += urllib.parse.unquote( op_time + " : " + op.name + "\n")
             else:
-                corpsstr += urllib.unquote( op_time + " : " + op.name + " ( " + op.concerned_object['name'] + " : " + op.concerned_object['id'] + " )\n")
+                corpsstr += urllib.parse.unquote( op_time + " : " + op.name + " ( " + op.concerned_object['name'] + " : " + op.concerned_object['id'] + " )\n")
         tup[1].set_tooltip_text(corpsstr)
         self.receive(self.tracer.trace)
         # workaround to solve tooltip refresh problem
@@ -540,7 +541,7 @@ class EventAccumulator(AdhocView):
         corpsstr = ''
         entetestr = ''
         if obj_evt.content is not None:
-            corpsstr = urllib.unquote(obj_evt.content.encode('utf-8'))
+            corpsstr = urllib.parse.unquote(obj_evt.content.encode('utf-8'))
         ev_time = time.strftime("%H:%M:%S", time.localtime(obj_evt.time))
         if self.options['time'] == 'activity':
             ev_time = helper.format_time_reference(obj_evt.activity_time)
@@ -551,7 +552,7 @@ class EventAccumulator(AdhocView):
                 entetestr = "%s : %s" % (ev_time, "Event not described")
             if obj_evt.concerned_object['id']:
                 entetestr = entetestr + ' (%s)' % obj_evt.concerned_object['id']
-        elif obj_evt.name in self.incomplete_operations_names.keys():
+        elif obj_evt.name in list(self.incomplete_operations_names.keys()):
             comp = ''
             ob = self.controller.package.get_element_by_id(obj_evt.concerned_object['id'])
             #print "%s %s %s" % (self.controller.package, obj_evt.concerned_object['id'], ob)
@@ -574,15 +575,15 @@ class EventAccumulator(AdhocView):
                 #print "%s" % ob
             entetestr = "%s : %s %s" % (ev_time, self.incomplete_operations_names[obj_evt.name], comp)
         else:
-            print "unlabelled event : %s" % obj_evt.name
+            print("unlabelled event : %s" % obj_evt.name)
             entetestr = "%s : %s" % (ev_time, obj_evt.name)
-        entete = gtk.Label(entetestr.encode("UTF-8"))
-        hb = gtk.HBox()
-        tr = TimestampRepresentation(obj_evt.movietime, self.controller, 50, 0, None , False)
+        entete = Gtk.Label(label=entetestr.encode("UTF-8"))
+        hb = Gtk.HBox()
+        tr = TimestampRepresentation(obj_evt.movietime, None, self.controller, 50, 0, None , False)
         if tr is not None:
-            hb.pack_start(tr, expand=False)
-            hb.pack_start(gtk.VSeparator(), expand=False)
-        hb.pack_start(entete, expand=False)
+            hb.pack_start(tr, False, True, 0)
+            hb.pack_start(Gtk.VSeparator(), False, False, 0)
+        hb.pack_start(entete, False, True, 0)
         if corpsstr != "":
             hb.set_tooltip_text(corpsstr)
         return hb
@@ -594,7 +595,7 @@ class EventAccumulator(AdhocView):
         # label with the time of the event
         corpsstr = ''
         if obj_evt.content is not None:
-            corpsstr = urllib.unquote(obj_evt.content.encode('utf-8'))
+            corpsstr = urllib.parse.unquote(obj_evt.content.encode('utf-8'))
         ev_time = time.strftime("%H:%M:%S", time.localtime(obj_evt.time))
         if self.options['time'] == 'activity':
             ev_time = helper.format_time_reference(obj_evt.activity_time)
@@ -605,7 +606,7 @@ class EventAccumulator(AdhocView):
                 entetestr = "%s : %s" % (ev_time, "Operation not described")
             if obj_evt.concerned_object['id']:
                 entetestr = entetestr + ' (%s)' % obj_evt.concerned_object['id']
-        elif obj_evt.name in self.incomplete_operations_names.keys():
+        elif obj_evt.name in list(self.incomplete_operations_names.keys()):
             comp = ''
             # store type of item in the trace
             ob = self.controller.package.get_element_by_id(obj_evt.concerned_object['id'])
@@ -628,20 +629,20 @@ class EventAccumulator(AdhocView):
                 comp = _('of an unknown item (%s)') % obj_evt.concerned_object['id']
             entetestr = "%s : %s %s" % (ev_time, self.incomplete_operations_names[obj_evt.name], comp)
         else:
-            print "unlabelled event : %s" % obj_evt.name
+            print("unlabelled event : %s" % obj_evt.name)
             entetestr = "%s : %s" % (ev_time, obj_evt.name)
-        entete = gtk.Label(entetestr.encode("UTF-8"))
-        hb = gtk.HBox()
-        box = gtk.EventBox()
-        tr = TimestampRepresentation(obj_evt.movietime, self.controller, 50, 0, None , False)
+        entete = Gtk.Label(label=entetestr.encode("UTF-8"))
+        hb = Gtk.HBox()
+        box = Gtk.EventBox()
+        tr = TimestampRepresentation(obj_evt.movietime, None, self.controller, 50, 0, None , False)
         if tr is not None:
-            hb.pack_start(tr, expand=False)
-            hb.pack_start(gtk.VSeparator(), expand=False)
+            hb.pack_start(tr, False, True, 0)
+            hb.pack_start(Gtk.VSeparator(), False, False, 0)
         if corpsstr != "":
             box.set_tooltip_text(corpsstr)
         def box_pressed(w, event, id):
             #print "%s %s" % (id, mtime)
-            if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+            if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
                 if id is not None:
                     obj = self.controller.package.get_element_by_id(id)
                     if obj is not None:
@@ -649,11 +650,11 @@ class EventAccumulator(AdhocView):
                         #print obj
                         self.controller.gui.edit_element(obj)
                     else:
-                        print "item %s no longuer exists" % id
+                        print("item %s no longuer exists" % id)
             return
         box.add(entete)
         box.connect('button-press-event', box_pressed, obj_evt.concerned_object['id'])
-        hb.pack_start(box, expand=False)
+        hb.pack_start(box, False, True, 0)
         return hb
 
     def build_action_box(self, obj_evt):
@@ -672,20 +673,20 @@ class EventAccumulator(AdhocView):
             if self.options['time'] == 'activity':
                 op_time = helper.format_time_reference(op.activity_time)
             if op.concerned_object['name'] is None:
-                corpsstr += urllib.unquote( op_time + " : " + op.name + "\n")
+                corpsstr += urllib.parse.unquote( op_time + " : " + op.name + "\n")
             else:
-                corpsstr += urllib.unquote( op_time + " : " + op.name + " ( " + op.concerned_object['name'] + " : " + op.concerned_object['id'] + " )\n")
-        entete = gtk.Label(entetestr.encode("UTF-8"))
-        hb = gtk.HBox()
-        box = gtk.EventBox()
-        tr = TimestampRepresentation(obj_evt.movietime, self.controller, 50, 0, None , False)
+                corpsstr += urllib.parse.unquote( op_time + " : " + op.name + " ( " + op.concerned_object['name'] + " : " + op.concerned_object['id'] + " )\n")
+        entete = Gtk.Label(label=entetestr.encode("UTF-8"))
+        hb = Gtk.HBox()
+        box = Gtk.EventBox()
+        tr = TimestampRepresentation(obj_evt.movietime, None, self.controller, 50, 0, None , False)
         if tr is not None:
-            hb.pack_start(tr, expand=False)
-            hb.pack_start(gtk.VSeparator(), expand=False)
+            hb.pack_start(tr, False, True, 0)
+            hb.pack_start(Gtk.VSeparator(), False, False, 0)
         if corpsstr != "":
             hb.set_tooltip_text(corpsstr)
         def box_pressed(w, event, ops):
-            if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+            if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
                 #FIXME : need to change details in another way
                 self.filters['objects']=[]
                 self.filters['objects'].extend(ops)
@@ -697,7 +698,7 @@ class EventAccumulator(AdhocView):
             return
         box.add(entete)
         box.connect('button-press-event', box_pressed, obj_evt.operations)
-        hb.pack_start(box, expand=False)
+        hb.pack_start(box, False, True, 0)
         return hb
 
     def destroy(self, source=None, event=None):
diff --git a/lib/advene/gui/plugins/htmlcontenhandler.py b/lib/advene/gui/plugins/htmlcontenhandler.py
index 4df4db4..f12aa15 100644
--- a/lib/advene/gui/plugins/htmlcontenhandler.py
+++ b/lib/advene/gui/plugins/htmlcontenhandler.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,16 +16,20 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+import logging
+logger = logging.getLogger(__name__)
 
 from gettext import gettext as _
 
-import gtk
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import Gtk
 import re
 import cairo
 
 import advene.core.config as config
 from advene.gui.edit.elements import ContentHandler, TextContentHandler
-from advene.gui.util import png_to_pixbuf, decode_drop_parameters, get_pixmap_toolbutton, overlay_svg_as_pixbuf
+from advene.gui.util import png_to_pixbuf, decode_drop_parameters, get_pixmap_toolbutton, overlay_svg_as_pixbuf, get_clipboard
 
 from advene.gui.edit.htmleditor import HTMLEditor, ContextDisplay
 import advene.util.helper as helper
@@ -71,7 +75,7 @@ class AnnotationPlaceholder:
             aid=attr['advene:annotation']
             self.annotation=self.controller.package.get_element_by_id(aid)
             if self.annotation is None:
-                print "Problem: non-existent annotation"
+                logger.warn("Problem: non-existent annotation %s", aid)
             self.refresh()
             return self.pixbuf, self.process_enclosed_tags
         return None, None
@@ -114,7 +118,9 @@ class AnnotationPlaceholder:
         return "".join(data)
 
     def snapshot_updated(self, context, target):
-        if self.annotation is not None and abs(context.globals['position'] - self.annotation.fragment.begin) <= 20:
+        if (self.annotation is not None
+            and context.globals['media'] == self.annotation.media
+            and abs(context.globals['position'] - self.annotation.fragment.begin) <= 20):
             # Update the representation
             self.refresh()
         return True
@@ -145,7 +151,7 @@ class AnnotationPlaceholder:
         new=self.build_pixbuf()
         if not self.update_pixbuf:
             new.composite(old, 0, 0, old.get_width(), old.get_height(),
-                          0, 0, 1.0, 1.0, gtk.gdk.INTERP_BILINEAR, 255)
+                          0, 0, 1.0, 1.0, GdkPixbuf.InterpType.BILINEAR, 255)
         else:
             self.update_pixbuf(old, new)
         self.pixbuf=new
@@ -174,9 +180,9 @@ class AnnotationPlaceholder:
         context.stroke_preserve()
         context.fill()
 
-        pixbuf = gtk.gdk.pixbuf_new_from_data(
+        pixbuf = GdkPixbuf.Pixbuf.new_from_data(
             surface.get_data(),
-            gtk.gdk.COLORSPACE_RGB, True, 8,
+            GdkPixbuf.Colorspace.RGB, True, 8,
             surface.get_width(), surface.get_height(),
             surface.get_stride())
         return pixbuf
@@ -258,7 +264,7 @@ class AnnotationTypePlaceholder:
             aid=attr['advene:annotationtype']
             self.annotationtype = self.controller.package.get_element_by_id(aid)
             if self.annotationtype is None:
-                print "Problem: non-existent annotation type"
+                logger.warn("Problem: non-existent annotation type %s", aid)
             self.refresh()
             return self.pixbuf, self.process_enclosed_tags
         return None, None
@@ -336,7 +342,7 @@ class AnnotationTypePlaceholder:
         new=self.build_pixbuf()
         if not self.update_pixbuf:
             new.composite(old, 0, 0, old.get_width(), old.get_height(),
-                          0, 0, 1.0, 1.0, gtk.gdk.INTERP_BILINEAR, 255)
+                          0, 0, 1.0, 1.0, GdkPixbuf.InterpType.BILINEAR, 255)
         else:
             self.update_pixbuf(old, new)
         self.pixbuf=new
@@ -365,9 +371,9 @@ class AnnotationTypePlaceholder:
         context.stroke_preserve()
         context.fill()
 
-        pixbuf = gtk.gdk.pixbuf_new_from_data(
+        pixbuf = GdkPixbuf.Pixbuf.new_from_data(
             surface.get_data(),
-            gtk.gdk.COLORSPACE_RGB, True, 8,
+            GdkPixbuf.Colorspace.RGB, True, 8,
             surface.get_width(), surface.get_height(),
             surface.get_stride())
         return pixbuf
@@ -401,7 +407,7 @@ class HTMLContentHandler (ContentHandler):
         self.last_dndtime=None
         self.last_x = None
         self.last_y = None
-        # HTMLEditor component (gtk.Textview subclass)
+        # HTMLEditor component (Gtk.Textview subclass)
         self.editor = None
 
         # Widgets holding editors (basic and html)
@@ -456,7 +462,7 @@ class HTMLContentHandler (ContentHandler):
             pos=re.findall('/media/play/(\d+)', link)
             if pos:
                 # A position was specified. Directly use it.
-                self.controller.update_status('set', long(pos[0]))
+                self.controller.update_status('seek', int(pos[0]))
             else:
                 self.controller.open_url(link)
         return True
@@ -506,17 +512,17 @@ class HTMLContentHandler (ContentHandler):
         self.last_x=x
         self.last_y=y
 
-        x, y = self.editor.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT,
+        x, y = self.editor.window_to_buffer_coords(Gtk.TextWindowType.TEXT,
                                                    *widget.get_pointer())
         it = self.editor.get_iter_at_location(x, y)
-        self.editor.get_buffer().place_cursor(it)
+        self.editor.get_buffer().place_cursor(it.iter)
 
         if targetType == config.data.target_type['annotation']:
-            for uri in unicode(selection.data, 'utf8').split('\n'):
+            for uri in str(selection.get_data(), 'utf8').split('\n'):
                 source=self.controller.package.annotations.get(uri)
                 if source is None:
                     return True
-                m=gtk.Menu()
+                m=Gtk.Menu()
                 for (title, choice) in (
                     (_("Snapshot only"), ['link', 'snapshot', ]),
                     (_("Overlayed snapshot only"), ['link', 'overlay', ]),
@@ -524,38 +530,38 @@ class HTMLContentHandler (ContentHandler):
                     (_("Snapshot+timestamp"), ['link', 'snapshot', 'timestamp']),
                     (_("Annotation content"), ['link', 'content']),
                     ):
-                    i=gtk.MenuItem(title)
+                    i=Gtk.MenuItem(title)
                     i.connect('activate', (lambda it, ann, data: self.insert_annotation_content(data, ann, focus=True)), source, choice)
                     m.append(i)
                 m.show_all()
-                m.popup(None, None, None, 0, gtk.get_current_event_time())
+                m.popup(None, None, None, 0, Gtk.get_current_event_time())
             return True
         elif targetType == config.data.target_type['annotation-type']:
-            for uri in unicode(selection.data, 'utf8').split('\n'):
+            for uri in str(selection.get_data(), 'utf8').split('\n'):
                 source = self.controller.package.annotationTypes.get(uri)
                 if source is None:
                     return True
-                m=gtk.Menu()
+                m=Gtk.Menu()
                 for (title, choice) in (
                     (_("as a list"), [ 'list' ]),
                     (_("as a grid"), [ 'grid' ]),
                     (_("as a table"), [ 'table' ]),
                     (_("as a transcription"), ['transcription' ]),
                     ):
-                    i=gtk.MenuItem(title)
+                    i=Gtk.MenuItem(title)
                     i.connect('activate', (lambda it, at, data: self.insert_annotationtype_content(data, at, focus=True)), source, choice)
                     m.append(i)
                 m.show_all()
-                m.popup(None, None, None, 0, gtk.get_current_event_time())
+                m.popup(None, None, None, 0, Gtk.get_current_event_time())
             return True
         elif targetType == config.data.target_type['timestamp']:
-            data=decode_drop_parameters(selection.data)
-            t=long(data['timestamp'])
+            data=decode_drop_parameters(selection.get_data())
+            t=int(data['timestamp'])
             # FIXME: propose various choices (insert timestamp, insert snapshot, etc)
             self.editor.get_buffer().insert_at_cursor(helper.format_time(t))
             return True
         else:
-            print "Unknown target type for drop: %d" % targetType
+            logger.warn("Unknown target type for drop: %d" % targetType)
         return False
 
     def class_parser(self, tag, attr):
@@ -603,7 +609,7 @@ class HTMLContentHandler (ContentHandler):
                 # There is a TALES expression
                 path='here/'+path
                 ctx=self.controller.build_context(here=a)
-                svg_data=unicode( ctx.evaluateValue(path) )
+                svg_data=str( ctx.evaluateValue(path) )
             elif 'svg' in a.content.mimetype:
                 # Overlay svg
                 svg_data=a.content.data
@@ -620,21 +626,21 @@ class HTMLContentHandler (ContentHandler):
             p=self.controller.packages.get(alias)
             if p is None:
                 return None
-            return str(p.imagecache[long(timestamp)])
+            return str(p.imagecache[int(timestamp)])
         return None
 
     def contextual_popup(self, ctx=None, menu=None):
         """Popup a contextual menu for the given context.
         """
         if menu is None:
-            menu=gtk.Menu()
+            menu=Gtk.Menu()
 
         def open_link(i, l):
             self.open_link(l)
             return True
 
         def goto_position(i, pos):
-            self.controller.update_status('set', pos)
+            self.controller.update_status('seek', pos)
             return True
 
         def select_presentation(i, ap, modes):
@@ -643,7 +649,7 @@ class HTMLContentHandler (ContentHandler):
             return True
 
         def new_menuitem(label, action, *params):
-            item=gtk.MenuItem(label)
+            item=Gtk.MenuItem(label)
             if action is not None:
                 item.connect('activate', action, *params)
             item.show()
@@ -684,20 +690,20 @@ class HTMLContentHandler (ContentHandler):
         return menu
 
     def button_press_cb(self, textview, event):
-        if not (event.button == 3 or (event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS)):
+        if not (event.button == 3 or (event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS)):
             return False
 
-        textwin=textview.get_window(gtk.TEXT_WINDOW_TEXT)
-        if event.window != textwin:
+        textwin=textview.get_window(Gtk.TextWindowType.TEXT)
+        if event.get_window() != textwin:
             return False
-        (x, y) = textview.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT,
+        (x, y) = textview.window_to_buffer_coords(Gtk.TextWindowType.TEXT,
                                                   int(event.x),
                                                   int(event.y))
         it=textview.get_iter_at_location(x, y)
         if it is None:
-            print "Error in get_iter_at_location"
+            logger.warn("Error in get_iter_at_location")
             return False
-        ctx=self.editor.get_current_context(it)
+        ctx=self.editor.get_current_context(it.iter)
         if not ctx:
             return False
 
@@ -706,7 +712,7 @@ class HTMLContentHandler (ContentHandler):
             if hasattr(ctx[-1], '_placeholder'):
                 # An annotation placeholder is here. Display popup menu.
                 menu=self.contextual_popup(ctx)
-                menu.popup(None, None, None, 0, event.time)
+                menu.popup_at_pointer(None)
             return True
         else:
             # Double click with left button
@@ -716,7 +722,7 @@ class HTMLContentHandler (ContentHandler):
                 if isinstance(p, AnnotationPlaceholder):
                     a=ctx[-1]._placeholder.annotation
                     if a is not None:
-                        self.controller.update_status('set', a.fragment.begin)
+                        self.controller.update_status('seek', a.fragment.begin)
                 return False
 
             l=[ m for m in ctx if m._tag == 'a' ]
@@ -728,38 +734,36 @@ class HTMLContentHandler (ContentHandler):
 
     def get_view (self, compact=False):
         """Generate a view widget for editing HTML."""
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
         self.editor=HTMLEditor()
         self.editor.custom_url_loader=self.custom_url_loader
         self.editor.register_class_parser(self.class_parser)
         try:
             self.editor.set_text(self.element.data)
-        except Exception, e:
-            self.controller.log(_("HTML editor: cannot parse content (%s)") % unicode(e))
+        except Exception as e:
+            self.controller.log(_("HTML editor: cannot parse content (%s)") % str(e))
 
         self.editor.connect('drag-data-received', self.editor_drag_received)
-        self.editor.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                  gtk.DEST_DEFAULT_HIGHLIGHT |
-                                  gtk.DEST_DEFAULT_ALL,
-                                  config.data.drag_type['annotation']
-                                  + config.data.drag_type['annotation-type']
-                                  + config.data.drag_type['timestamp'],
-                                  gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_ASK )
+        self.editor.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                  Gtk.DestDefaults.HIGHLIGHT |
+                                  Gtk.DestDefaults.ALL,
+                                  config.data.get_target_types('annotation', 'annotation-type', 'timestamp'),
+                                  Gdk.DragAction.COPY | Gdk.DragAction.LINK | Gdk.DragAction.ASK )
         self.editor.connect('button-press-event', self.button_press_cb)
 
-        self.view = gtk.VBox()
+        self.view = Gtk.VBox()
 
         def sel_copy(i):
-            self.editor.get_buffer().copy_clipboard(gtk.clipboard_get())
+            self.editor.get_buffer().copy_clipboard(get_clipboard())
             return True
 
         def sel_cut(i):
-            self.editor.get_buffer().cut_clipboard(gtk.clipboard_get())
+            self.editor.get_buffer().cut_clipboard(get_clipboard())
             return True
 
         def sel_paste(i):
-            self.editor.get_buffer().paste_clipboard(gtk.clipboard_get())
+            self.editor.get_buffer().paste_clipboard(get_clipboard())
             return True
 
         def refresh(i):
@@ -767,33 +771,33 @@ class HTMLContentHandler (ContentHandler):
             return True
 
         def display_header_menu(i):
-            m=gtk.Menu()
+            m=Gtk.Menu()
             for h in (1, 2, 3):
-                i=gtk.MenuItem(_("Heading %d") % h)
+                i=Gtk.MenuItem(_("Heading %d") % h)
                 i.connect('activate', lambda w, level: self.editor.apply_html_tag('h%d' % level), h)
                 m.append(i)
             m.show_all()
-            m.popup(None, i, None, 1, gtk.get_current_event_time())
+            m.popup(None, i, None, 1, Gtk.get_current_event_time())
             return True
 
-        tb=gtk.Toolbar()
+        tb=Gtk.Toolbar()
         vbox.toolbar=tb
-        tb.set_style(gtk.TOOLBAR_ICONS)
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
         for (icon, tooltip, action) in (
-            (gtk.STOCK_BOLD, _("Bold"), lambda i: self.editor.apply_html_tag('b')),
-            (gtk.STOCK_ITALIC, _("Italic"), lambda i: self.editor.apply_html_tag('i')),
+            (Gtk.STOCK_BOLD, _("Bold"), lambda i: self.editor.apply_html_tag('b')),
+            (Gtk.STOCK_ITALIC, _("Italic"), lambda i: self.editor.apply_html_tag('i')),
             ("title_icon.png", _("Header"), display_header_menu),
             (None, None, None),
-            (gtk.STOCK_COPY, _("Copy"), sel_copy),
-            (gtk.STOCK_CUT, _("Cut"), sel_cut),
-            (gtk.STOCK_PASTE, _("Paste"), sel_paste),
+            (Gtk.STOCK_COPY, _("Copy"), sel_copy),
+            (Gtk.STOCK_CUT, _("Cut"), sel_cut),
+            (Gtk.STOCK_PASTE, _("Paste"), sel_paste),
             (None, None, None),
-            (gtk.STOCK_REFRESH, _("Refresh"), refresh),
+            (Gtk.STOCK_REFRESH, _("Refresh"), refresh),
             ):
-            if not config.data.preferences['expert-mode'] and icon == gtk.STOCK_REFRESH:
+            if not config.data.preferences['expert-mode'] and icon == Gtk.STOCK_REFRESH:
                 continue
             if not icon:
-                b=gtk.SeparatorToolItem()
+                b=Gtk.SeparatorToolItem()
             else:
                 b=get_pixmap_toolbutton(icon, action)
                 b.set_tooltip_text(tooltip)
@@ -801,15 +805,15 @@ class HTMLContentHandler (ContentHandler):
             b.show()
 
         if self.editor.can_undo():
-            b=gtk.ToolButton(gtk.STOCK_UNDO)
+            b=Gtk.ToolButton(Gtk.STOCK_UNDO)
             b.connect('clicked', lambda i: self.editor.undo())
             b.set_tooltip_text(_("Undo"))
             tb.insert(b, -1)
             b.show()
 
-        self.view.pack_start(tb, expand=False)
-        sw=gtk.ScrolledWindow()
-        sw.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        self.view.pack_start(tb, False, True, 0)
+        sw=Gtk.ScrolledWindow()
+        sw.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         sw.add(self.editor)
 
         context_data=ContextDisplay()
@@ -818,11 +822,11 @@ class HTMLContentHandler (ContentHandler):
                 context_data.set_context(self.editor.get_current_context(it))
             return True
         self.editor.get_buffer().connect('mark-set', cursor_moved)
-        sw2=gtk.ScrolledWindow()
-        sw2.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        sw2=Gtk.ScrolledWindow()
+        sw2.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         sw2.add(context_data)
 
-        p=gtk.HPaned()
+        p=Gtk.HPaned()
         p.add1(sw2)
         p.add2(sw)
         # Hide by default
diff --git a/lib/advene/gui/plugins/kinect.py b/lib/advene/gui/plugins/kinect.py
new file mode 100644
index 0000000..ef2d020
--- /dev/null
+++ b/lib/advene/gui/plugins/kinect.py
@@ -0,0 +1,170 @@
+#
+# Advene: Annotate Digital Videos, Exchange on the NEt
+# Copyright (C) 2011-2017 Olivier Aubert <contact at olivieraubert.net>
+#
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# Advene is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Advene; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+
+import time
+from gettext import gettext as _
+from gi.repository import Gtk
+
+import advene.core.config as config
+from advene.gui.views import AdhocView
+
+name="Kinect view/control plugin"
+
+try:
+    import pytrack
+except ImportError:
+    pytrack = None
+
+def register(controller):
+    if pytrack is not None:
+        controller.register_viewclass(KinectController)
+
+class KinectController(AdhocView):
+    view_name = _("Kinect Controller")
+    view_id = 'kinect'
+    tooltip=_("Kinect control interface")
+
+    def __init__(self, controller=None, uri=None, parameters=None):
+        super(KinectController, self).__init__(controller=controller)
+        self.close_on_package_load = False
+        self.contextual_actions = []
+        self.controller = controller
+        self.registered_rules = []
+
+        self.mode = ''
+        # When was the last seek done ?
+        self.last_seek = 0
+        self.seek_threshold = .5
+
+        if pytrack.pytrack_init(config.data.advenefile('Sample-Tracking.xml')):
+            self.log("Problem when initializing Kinect controller")
+
+        @pytrack.callback_function
+        def callback(*p):
+            self.callback(*p)
+        self.callbacks = pytrack.CallbacksT()
+        for (n, t) in self.callbacks._fields_:
+            setattr(self.callbacks, n, callback)
+        pytrack.pytrack_set_callbacks(self.callbacks)
+
+        # Load options
+        opt, arg = self.load_parameters(parameters)
+        self.options.update(opt)
+        self.widget = self.build_widget()
+        pytrack.pytrack_start_loop()
+
+    def handle_rate_control(self, fx):
+        if fx > .9:
+            rate = 8.0
+        elif fx > .8:
+            rate = 4.0
+        elif fx > .7:
+            rate = 2.0
+        elif fx > .4:
+            rate = 1.0
+        elif fx > .3:
+            rate = .5
+        elif fx > .2:
+            rate = .1
+        else:
+            rate = 1 / config.data.preferences['default-fps']
+        if self.controller.player.get_rate() != rate:
+            self.action.set_text("Set rate %.2f" % rate)
+            self.controller.queue_action(self.controller.player.set_rate, rate)
+
+    def handle_seek_control(self, fx):
+        t = time.time()
+        if t - self.last_seek < self.seek_threshold:
+            return
+        self.last_seek = t
+        if fx > .8:
+            seek = config.data.preferences['second-time-increment']
+        elif fx > .6:
+            seek = config.data.preferences['time-increment']
+        elif fx < .2:
+             seek = -config.data.preferences['second-time-increment']
+        elif fx < .4:
+            seek = -config.data.preferences['time-increment']
+        else:
+            seek =0
+        if seek:
+            self.action.set_text("Seek %d" % seek)
+            self.controller.queue_action(self.controller.update_status, "seek_relative", seek)
+
+    def handle_mode_selection(self, fx):
+        if fx < .3:
+            mode = 'rate'
+        elif fx > .7:
+            mode = 'seek'
+        else:
+            mode = 'none'
+        if mode != self.mode:
+            self.set_mode(mode)
+
+    def set_mode(self, mode):
+        if mode != self.mode:
+            if self.mode in self.mode_buttons:
+                self.mode_buttons[self.mode].set_sensitive(False)
+            self.mode = mode
+            self.mode_buttons[self.mode].set_sensitive(True)
+            self.action.set_text("Mode: %s" % mode)
+
+    def callback(self, event, fx, fy, ix, iy, d):
+        #self.log("Kinect: %s (%f, %f) (%d, %d) %d"  % (event, fx, fy, ix, iy, d))
+        self.label.set_text("%s (%f, %f) (%d, %d) %d"  % (event, fx, fy, ix, iy, d))
+        if event == 'push' and d == 5:
+            # Any direction
+            self.action.set_text("Play/pause")
+            self.controller.update_status('pause')
+        elif event == 'move':
+            if .5 < fy < .9:
+                # Control zone
+                if self.mode == 'rate':
+                    self.handle_rate_control(fx)
+                elif self.mode == 'seek':
+                    self.handle_seek_control(fx)
+            elif fy < .3:
+                # Mode selection
+                self.handle_mode_selection(fx)
+
+    def build_widget(self):
+        vbox=Gtk.VBox()
+
+        vbox.add(Gtk.Label(label="Kinect control"))
+
+        hb = Gtk.HBox()
+        self.mode_buttons = {
+            'rate': Gtk.Button("Rate"),
+            'none': Gtk.Button("Disabled"),
+            'seek': Gtk.Button("Seek"),
+            }
+        for k in ('rate', 'none', 'seek'):
+            hb.add(self.mode_buttons[k])
+            self.mode_buttons[k].set_sensitive(False)
+        vbox.pack_start(hb, False, True, 0)
+
+        self.label = Gtk.Label(label="Perform a Wave to start.")
+        vbox.add(self.label)
+        self.action = Gtk.Label(label="No action")
+        vbox.add(self.action)
+        # FIXME
+        #self.slider = Gtk.
+
+        vbox.show_all()
+        self.set_mode('none')
+        return vbox
diff --git a/lib/advene/gui/plugins/logmessages.py b/lib/advene/gui/plugins/logmessages.py
index e0ba2e8..2e88a1b 100644
--- a/lib/advene/gui/plugins/logmessages.py
+++ b/lib/advene/gui/plugins/logmessages.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 """Log messages display.
 """
 
-import gtk
+from gi.repository import Gtk
 
 from gettext import gettext as _
 from advene.gui.views import AdhocView
@@ -41,7 +41,7 @@ class LogMessages(AdhocView):
 
     def autoscroll(self, *p):
         # Autoscroll
-        self.textview.scroll_mark_onscreen(self.controller.gui.logbuffer.get_mark("insert"))
+        self.textview.scroll_mark_onscreen(self.textview.get_buffer().get_insert())
         return True
 
     def reparent_done(self):
@@ -49,18 +49,18 @@ class LogMessages(AdhocView):
         return True
 
     def build_widget(self):
-        sw=gtk.ScrolledWindow()
-        self.textview=gtk.TextView(self.controller.gui.logbuffer)
-        self.textview.set_wrap_mode(gtk.WRAP_CHAR)
+        sw=Gtk.ScrolledWindow()
+        self.textview=Gtk.TextView.new_with_buffer(self.controller.gui.logbuffer)
+        self.textview.set_wrap_mode(Gtk.WrapMode.CHAR)
         self.textview.set_editable(False)
         sw.add(self.textview)
 
         self.safe_connect(self.controller.gui.logbuffer, "changed", self.autoscroll)
 
         # Scroll for initial display
-        def initial_display(t):
+        def initial_display(*p):
             self.autoscroll()
             return False
-        self.textview.connect('map', initial_display)
+        self.textview.connect('size-allocate', initial_display)
 
         return sw
diff --git a/lib/advene/gui/plugins/shotvalidation.py b/lib/advene/gui/plugins/shotvalidation.py
index 23c6ee5..6f78d1e 100644
--- a/lib/advene/gui/plugins/shotvalidation.py
+++ b/lib/advene/gui/plugins/shotvalidation.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,7 +16,12 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-import gtk
+import logging
+logger = logging.getLogger(__name__)
+
+from gi.repository import GObject
+from gi.repository import Gdk
+from gi.repository import Gtk
 
 from gettext import gettext as _
 
@@ -36,12 +41,11 @@ class ShotValidation(AdhocView):
     def __init__(self, controller=None, parameters=None, annotationtype=None):
         super(ShotValidation, self).__init__(controller=controller)
         self.close_on_package_load = True
-        self.contextual_actions = (
-            )
+        self.contextual_actions = ()
         self.controller=controller
         self._annotationtype=None
 
-        self.current_index = gtk.Adjustment(10, 1, 10, 1, 10)
+        self.current_index = Gtk.Adjustment.new(10, 1, 1000, 1, 1, 1)
         self.options={}
 
         # Load options
@@ -57,7 +61,7 @@ class ShotValidation(AdhocView):
             self.annotations = sorted(at.annotations, key=lambda a: a.fragment.begin)
         else:
             self.annotations = []
-        self.current_index.set_upper(len(self.annotations))
+        self.current_index.set_upper(len(self.annotations) + 2)
 
     def get_annotationtype(self):
         return self._annotationtype
@@ -119,12 +123,17 @@ class ShotValidation(AdhocView):
         self.current_index.emit('value-changed')
         return True
 
+    def handle_scroll_event(self, widget, event):
+        return self.selector.handle_scroll_event(widget, event)
+
     def handle_keypress(self, widget, event):
-        if event.keyval == gtk.keysyms.Page_Down:
+        if self.selector.handle_key_press(widget, event):
+            return True
+        elif event.keyval == Gdk.KEY_Page_Up or event.keyval == Gdk.KEY_Up:
             # Next annotation
             self.set_index(self.index + 1)
             return True
-        elif event.keyval == gtk.keysyms.Page_Up:
+        elif event.keyval == Gdk.KEY_Page_Down or event.keyval == Gdk.KEY_Down:
             # Previous annotation
             self.set_index(self.index - 1)
             return True
@@ -146,8 +155,8 @@ class ShotValidation(AdhocView):
         annotation = self.annotations[i]
         batch=object()
 
-        event = gtk.get_current_event()
-        if event.state & gtk.gdk.CONTROL_MASK:
+        event = Gtk.get_current_event()
+        if event.get_state().state & Gdk.ModifierType.CONTROL_MASK:
             # Control-key is held. Split the annotation.
             if new > annotation.fragment.begin and new < annotation.fragment.end:
                 self.controller.split_annotation(annotation, new)
@@ -185,12 +194,12 @@ class ShotValidation(AdhocView):
 
     def build_widget(self):
         if not self.annotations:
-            return gtk.Label((_("No annotations to adjust")))
+            return Gtk.Label(label=(_("No annotations to adjust")))
 
-        vbox = gtk.VBox()
+        vbox = Gtk.VBox()
 
-        self.title_widget = gtk.Label()
-        vbox.pack_start(self.title_widget)
+        self.title_widget = Gtk.Label()
+        vbox.pack_start(self.title_widget, True, True, 0)
 
         self.selector = FrameSelector(self.controller, self.annotations[0].fragment.begin, label=_("Click on the frame just after the cut to adjust the cut time.\nControl-click on a frame to indicate a missing cut."))
         self.selector.callback = self.validate_and_next
@@ -212,76 +221,74 @@ class ShotValidation(AdhocView):
         vbox.add(self.selector.widget)
 
         # Button bar
-        hb=gtk.HBox()
+        hb=Gtk.HBox()
 
-        self.prev_button = gtk.Button(_("< Previous cut"))
+        self.prev_button = Gtk.Button(_("< Previous cut"))
         self.prev_button.set_tooltip_text(_("Display previous cut"))
         self.prev_button.connect("clicked", lambda b: self.set_index(self.index - 1))
         hb.add(self.prev_button)
 
-        l = gtk.Label("#")
-        hb.pack_start(l, expand=False)
+        l = Gtk.Label(label="#")
+        hb.pack_start(l, False, True, 0)
 
-        self.next_button = gtk.Button(_("Next cut >"))
+        self.next_button = Gtk.Button(_("Next cut >"))
         self.next_button.set_tooltip_text(_("Display next cut"))
         self.next_button.connect("clicked", lambda b: self.set_index(self.index + 1))
 
-        s=gtk.SpinButton(self.current_index, 1, 0)
+        s=Gtk.SpinButton.new(self.current_index, 1, 0)
         s.set_increments(1, 10)
-        s.set_update_policy(gtk.UPDATE_IF_VALID)
+        #s.set_update_policy(Gtk.UPDATE_IF_VALID)
         s.set_numeric(True)
 
-        # For an unknown reason, the default behaviour of updating
-        # SpinButton through scroll does not work. Emulate it.
-        def handle_spin_scroll(widget, event):
-            if event.direction == gtk.gdk.SCROLL_UP:
-                offset=+1
-            elif event.direction == gtk.gdk.SCROLL_DOWN:
-                offset=-1
-            self.set_index(self.index + offset)
-            return True
-        s.connect('scroll-event', handle_spin_scroll)
         hb.add(s)
 
         hb.add(self.next_button)
 
-        vbox.pack_start(hb, expand=False)
+        vbox.pack_start(hb, False, True, 0)
 
-        hb = gtk.HButtonBox()
-        b=gtk.Button(_("Current time"))
+        hb = Gtk.HButtonBox()
+        b=Gtk.Button(_("Current time"))
         b.set_tooltip_text(_("Go to annotation containing current player time."))
         b.connect("clicked", self.goto_current)
         hb.add(b)
 
-        b=gtk.Button(_("Refresh snapshots"))
+        b=Gtk.Button(_("Refresh snapshots"))
         b.set_tooltip_text(_("Refresh missing snapshots"))
         b.connect("clicked", lambda b: self.selector.refresh_snapshots())
         hb.add(b)
 
-        b=gtk.Button(_("Undo"))
+        b=Gtk.Button(_("Undo"))
         b.set_tooltip_text(_("Undo last modification"))
         b.connect("clicked", self.undo)
         hb.add(b)
         b.set_sensitive(False)
         self.undo_button = b
 
-        b=gtk.Button(_("Merge with previous"))
+        b=Gtk.Button(_("Merge with previous"))
         b.set_tooltip_text(_("Merge with previous annotation, i.e. remove this bound."))
         b.connect("clicked", self.merge)
         hb.add(b)
 
-        b=gtk.Button(stock=gtk.STOCK_CLOSE)
+        b=Gtk.Button(stock=Gtk.STOCK_CLOSE)
         b.set_tooltip_text(_("Close view."))
         b.connect("clicked", self.close)
         hb.add(b)
 
-        vbox.pack_start(hb, expand=False)
+        vbox.pack_start(hb, False, True, 0)
 
-        self.statusbar = gtk.Statusbar()
-        vbox.pack_start(self.statusbar, expand=False)
+        self.statusbar = Gtk.Statusbar()
+        vbox.pack_start(self.statusbar, False, True, 0)
 
         self.set_index(0)
-        vbox.show_all()
         vbox.connect('key-press-event', self.handle_keypress)
+        vbox.connect('scroll-event', self.handle_scroll_event)
+
+        vbox.show_all()
+        # Hack: since the view if often launched from the timeline
+        # view, moving the mouse in timeline steals the focus from the
+        # window. Let's only grab focus after a small timeout, so that
+        # the user has time to get the mouse out of the timeline
+        # window
+        GObject.timeout_add(2000, lambda: self.next_button.grab_focus())
         return vbox
 
diff --git a/lib/advene/gui/plugins/tracepreview.py b/lib/advene/gui/plugins/tracepreview.py
index acd62f2..1ca5d6d 100644
--- a/lib/advene/gui/plugins/tracepreview.py
+++ b/lib/advene/gui/plugins/tracepreview.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -22,16 +22,16 @@
 This widget allows to stack compact operation history to preview the trace.
 """
 
-import gtk
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import Gtk
 import time
 
 from gettext import gettext as _
 
 from advene.gui.views import AdhocView
-import advene.util.helper as helper
-import urllib
+import urllib.request, urllib.parse, urllib.error
 import advene.model.view
-from advene.gui.widget import TimestampRepresentation
 from advene.rules.elements import ECACatalog
 import advene.core.config as config
 from advene.model.schema import Schema, AnnotationType, RelationType
@@ -94,32 +94,32 @@ class TracePreview(AdhocView):
         self.receive(self.tracer.trace)
 
     def build_widget(self):
-        mainbox = gtk.VBox()
-        btnbar=gtk.HBox()
-        btngt = gtk.Button(_('Full trace'))
+        mainbox = Gtk.VBox()
+        btnbar=Gtk.HBox()
+        btngt = Gtk.Button(_('Full trace'))
         btngt.set_tooltip_text(_('Open the trace timeline view fareast'))
         btngt.set_size_request(60, 20)
-        def open_trace(w):
+        def open_trace(widget):
             l=[ w for w in self.controller.gui.adhoc_views if w.view_id == 'tracetimeline' ]
             if not l:
-                a=self.controller.gui.open_adhoc_view(name='tracetimeline', destination='fareast')
-        btnbar.pack_start(btngt, expand=False)
+                self.controller.gui.open_adhoc_view(name='tracetimeline', destination='fareast')
+        btnbar.pack_start(btngt, False, True, 0)
         btngt.connect('clicked', open_trace)
-        mainbox.pack_start(btnbar, expand=False)
-        mainbox.pack_start(gtk.HSeparator(), expand=False)
-        self.accuBox = gtk.VBox()
-        self.sw = gtk.ScrolledWindow()
-        self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        mainbox.pack_start(btnbar, False, True, 0)
+        mainbox.pack_start(Gtk.HSeparator(), False, False, 0)
+        self.accuBox = Gtk.VBox()
+        self.sw = Gtk.ScrolledWindow()
+        self.sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         self.sw.add_with_viewport(self.accuBox)
-        self.sw.set_vadjustment(gtk.Adjustment(value = 208, lower = 0, upper=208, step_incr=52, page_incr=208, page_size=208))
-        mainbox.pack_start(self.sw)
+        self.sw.set_vadjustment(Gtk.Adjustment.new(value = 208, lower = 0, upper=208, step_incr=52, page_incr=208, page_size=208))
+        mainbox.pack_start(self.sw, True, True, 0)
         return mainbox
 
 
     def scroll_win(self):
         a = self.sw.get_vadjustment()
         if a:
-            a.value=a.upper
+            a.set_value(a.get_upper())
         return
 
     def receive(self, trace, event=None, operation=None, action=None):
@@ -156,10 +156,10 @@ class TracePreview(AdhocView):
 
     def packObs(self, obj_evt, level):
         if obj_evt is not None:
-            vb=gtk.VBox()
+            vb=Gtk.VBox()
             self.last_obs_box = self.buildBox(obj_evt, level)
-            def zoom_in_timeline(w, event, obj_evt):
-                if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+            def zoom_in_timeline(widget, event, obj_evt):
+                if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
                     l=[ w for w in self.controller.gui.adhoc_views if w.view_id == 'tracetimeline' ]
                     if l:
                         a=l[-1]
@@ -174,14 +174,14 @@ class TracePreview(AdhocView):
             self.last_obs_box.connect('button-press-event', zoom_in_timeline, obj_evt)
             self.last_obs = obj_evt
             vb.add(self.last_obs_box)
-            vb.add(gtk.HSeparator())
-            self.accuBox.pack_start(vb, expand=False)
+            vb.add(Gtk.HSeparator())
+            self.accuBox.pack_start(vb, False, True, 0)
             self.accuBox.show_all()
             self.size = self.size + 1
 
     def buildBox(self, obj_evt, level):
         if level<0:
-            print 'refresh trace'
+            print('refresh trace')
         else:
             ### FIXME : this code should be factorized with the
             ### similar one in tracetimeline (addOperation)
@@ -229,47 +229,47 @@ class TracePreview(AdhocView):
                     #print "%s" % ob
                 entetestr = "%s : %s %s" % (ev_time, self.incomplete_operations_names[obj_evt.name], comp)
             if obj_evt.content is not None:
-                corpsstr = urllib.unquote(obj_evt.content.encode('utf-8'))
-            entete = gtk.Label(ev_time.encode("UTF-8"))
-            hb = gtk.HBox()
-            hb.pack_start(entete, expand=False)
+                corpsstr = urllib.parse.unquote(obj_evt.content.encode('utf-8'))
+            entete = Gtk.Label(label=ev_time.encode("UTF-8"))
+            hb = Gtk.HBox()
+            hb.pack_start(entete, False, True, 0)
             objcanvas = goocanvas.Canvas()
             objcanvas.set_bounds (0,0,60,20)
-            hb.pack_end(objcanvas, expand=False)
+            hb.pack_end(objcanvas, False, True, 0)
             #BIG HACK to display icon
             te = obj_evt.name
             if te.find('Edit')>=0:
                 if te.find('Start')>=0:
-                    pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+                    pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                         (( 'pixmaps', 'traces', 'edition.png')))
                 elif te.find('End')>=0 or te.find('Destroy')>=0:
-                    pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+                    pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                         (( 'pixmaps', 'traces', 'finedition.png')))
             elif te.find('Creat')>=0:
-                pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+                pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                         (( 'pixmaps', 'traces', 'plus.png')))
             elif te.find('Delet')>=0:
-                pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+                pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                         (( 'pixmaps', 'traces', 'moins.png')))
             elif te.find('Set')>=0:
-                pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+                pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                         ( ('pixmaps', 'traces', 'allera.png')))
             elif te.find('Start')>=0 or te.find('Resume')>=0:
-                pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+                pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                         ( ('pixmaps', 'traces', 'lecture.png')))
             elif te.find('Pause')>=0:
-                pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+                pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                         ( ('pixmaps', 'traces', 'pause.png')))
             elif te.find('Stop')>=0:
-                pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+                pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                         ( ('pixmaps', 'traces', 'stop.png')))
             elif te.find('Activation')>=0:
-                pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+                pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     ( ('pixmaps', 'traces', 'web.png')), 20,20)
             else:
-                pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+                pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     ( ('pixmaps', 'traces', 'error.png')), 20,20)
-                print 'No icon for %s' % te
+                print('No icon for %s' % te)
             goocanvas.Image(parent=objcanvas.get_root_item(), width=20,height=20,x=0,y=0,pixbuf=pb)
             # object icon
             objg = Group(parent = objcanvas.get_root_item ())
@@ -277,7 +277,7 @@ class TracePreview(AdhocView):
                 ob = self.controller.package.get_element_by_id(obj_evt.concerned_object['id'])
                 temp_c = self.controller.get_element_color(ob)
                 if temp_c is not None:
-                    temp_c = gdk2intrgba(gtk.gdk.color_parse(temp_c))
+                    temp_c = gdk2intrgba(Gdk.color_parse(temp_c))
                 else:
                     temp_c = 0xFFFFFFFF
                 goocanvas.Ellipse(parent=objg,
@@ -314,7 +314,7 @@ class TracePreview(AdhocView):
                         x = 40,
                         y = 10,
                         width = -1,
-                        anchor = gtk.ANCHOR_CENTER,
+                        anchor = Gtk.ANCHOR_CENTER,
                         font = "Sans 5")
             else:
                 # no concerned object, we are in an action of navigation
@@ -335,12 +335,12 @@ class TracePreview(AdhocView):
                         x = 40,
                         y = 10,
                         width = -1,
-                        anchor = gtk.ANCHOR_CENTER,
+                        anchor = Gtk.ANCHOR_CENTER,
                         font = "Sans 7")
             cm = objcanvas.get_colormap()
             color = cm.alloc_color('#FFFFFF')
             if obj_evt.name in self.tracer.colormodel[level]:
-                color = gtk.gdk.color_parse(self.tracer.colormodel[level])
+                color = Gdk.color_parse(self.tracer.colormodel[level])
             elif self.tracer.modelmapping[level]:
                 for k in self.tracer.modelmapping[level]:
                     if obj_evt.name in self.tracer.modelmapping[level][k]:
@@ -348,7 +348,7 @@ class TracePreview(AdhocView):
                         if x >=0:
                             kn = self.tracer.tracemodel[k][x]
                             if kn in self.tracer.colormodel[k]:
-                                color = gtk.gdk.color_parse(self.tracer.colormodel[k][kn])
+                                color = Gdk.color_parse(self.tracer.colormodel[k][kn])
                                 break
                         else:
                             #BIG HACK, FIXME
@@ -367,9 +367,9 @@ class TracePreview(AdhocView):
                                     if x >=0:
                                         kn = self.tracer.tracemodel[k][x]
                                         if kn in self.tracer.colormodel[k]:
-                                            color = gtk.gdk.color_parse(self.tracer.colormodel[k][kn])
+                                            color = Gdk.color_parse(self.tracer.colormodel[k][kn])
                                             break
-            objcanvas.modify_base (gtk.STATE_NORMAL, color)
+            objcanvas.modify_base (Gtk.StateType.NORMAL, color)
             objcanvas.set_size_request(60,20)
             if corpsstr != "":
                 objcanvas.set_tooltip_text(corpsstr)
@@ -381,7 +381,7 @@ class TracePreview(AdhocView):
         if self.accuBox.get_children():
             self.accuBox.remove(self.accuBox.get_children()[0])
         else:
-            print "Trace Preview: no event to unpack ? %s" % self.size
+            print("Trace Preview: no event to unpack ? %s" % self.size)
         if self.size>0:
             self.size = self.size-1
 
diff --git a/lib/advene/gui/plugins/tracetimeline.py b/lib/advene/gui/plugins/tracetimeline.py
index b41779c..8332389 100644
--- a/lib/advene/gui/plugins/tracetimeline.py
+++ b/lib/advene/gui/plugins/tracetimeline.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -22,35 +22,40 @@
 This widget allows to present event history in a timeline view.
 """
 
-import urllib
-import gtk
 import time
-from gobject import timeout_add, source_remove
+import urllib.request, urllib.parse, urllib.error
+
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import GObject
+from gi.repository import Gtk
+
 from gettext import gettext as _
+
 from advene.model.fragment import MillisecondFragment
 from advene.model.schema import Schema, AnnotationType, RelationType
 from advene.model.annotation import Annotation, Relation
 from advene.model.view import View
-from math import floor
 from advene.gui.views import AdhocView
-#import advene.util.helper as helper
+import advene.util.helper as helper
 from advene.rules.elements import ECACatalog
 import advene.core.config as config
-from advene.gui.widget import TimestampRepresentation
 from advene.gui.util import dialog, get_small_stock_button, gdk2intrgba
 from advene.model.util.defaultdict import DefaultDict
 
 try:
-    import goocanvas
-    from goocanvas import Group
+    import gi
+    gi.require_version('GooCanvas', '2.0')
+    from gi.repository import GooCanvas
+    from gi.repository.GooCanvas import CanvasGroup
 except ImportError:
     # Goocanvas is not available. Define some globals in order not to
     # fail the module loading, and use them as a guard in register()
-    goocanvas=None
-    Group=object
+    GooCanvas=None
+    CanvasGroup=object
 
 def register(controller):
-    if goocanvas is None:
+    if GooCanvas is None:
         controller.log("Cannot register TraceTimeline: the goocanvas python module does not seem to be available.")
     else:
         controller.register_viewclass(TraceTimeline)
@@ -145,7 +150,7 @@ class TraceTimeline(AdhocView):
         self.context_t_max = time.time()
         for i, act in enumerate(self.tracer.tracemodel['actions']):
             self.cols[act] = (None, None)
-            c=gdk2intrgba(gtk.gdk.color_parse(self.tracer.colormodel['actions'][act]))
+            c=gdk2intrgba(Gdk.color_parse(self.tracer.colormodel['actions'][act]))
             self.context_cols[act]=(i, c, None)
         self.col_width = 80
         self.colspacing = 5
@@ -172,7 +177,7 @@ class TraceTimeline(AdhocView):
         @param trace: the trace to display
 
         """
-        if isinstance(trace, (int, long)):
+        if isinstance(trace, int):
             # Interpret it as an index into the self.tracers.traces
             # list
             trace=self.tracer.traces[trace]
@@ -183,7 +188,7 @@ class TraceTimeline(AdhocView):
         # save zoom values
         h = self.canvas.get_allocation().height
         va=self.sw.get_vadjustment()
-        vc = (va.value + h/2.0) * self.timefactor
+        vc = (va.get_value() + h/2.0) * self.timefactor
         self.display_values[self.active_trace.name] = (self.canvasY, self.timefactor, self.obj_l, vc)
         self.active_trace = trace
         self.start_time=self.active_trace.start
@@ -198,12 +203,12 @@ class TraceTimeline(AdhocView):
             self.refresh()
 
     def build_widget(self):
-        mainbox = gtk.VBox()
+        mainbox = Gtk.VBox()
         # trace selector
         def trace_changed(w):
             self.select_trace(w.get_active())
             return True
-        self.selector_box = gtk.HBox()
+        self.selector_box = Gtk.HBox()
         self.trace_selector = dialog.list_selector_widget(
             members= [( n, _("%(name)s (%(index)d)") % {
                         'name': t.name,
@@ -212,8 +217,8 @@ class TraceTimeline(AdhocView):
             preselect=0,
             callback=trace_changed)
         #self.trace_selector.set_size_request(70,-1)
-        self.selector_box.pack_start(self.trace_selector, expand=True)
-        self.remove_trace_button = get_small_stock_button(gtk.STOCK_CANCEL)
+        self.selector_box.pack_start(self.trace_selector, True, True, 0)
+        self.remove_trace_button = get_small_stock_button(Gtk.STOCK_CANCEL)
         def remove_trace(button, event):
             """Remove a trace from the selector list
             """
@@ -227,12 +232,12 @@ class TraceTimeline(AdhocView):
                 #self.select_trace(tr-1)
 
         self.remove_trace_button.connect('button-press-event', remove_trace)
-        self.selector_box.pack_start(self.remove_trace_button, expand=False)
-        mainbox.pack_start(self.selector_box, expand=False)
+        self.selector_box.pack_start(self.remove_trace_button, False, True, 0)
+        mainbox.pack_start(self.selector_box, False, True, 0)
 
         quicksearch_options = [False, ['oname','oid','ocontent']] # exact search, where to search
-        self.quicksearch_button=get_small_stock_button(gtk.STOCK_FIND)
-        self.quicksearch_entry=gtk.Entry()
+        self.quicksearch_button=get_small_stock_button(Gtk.STOCK_FIND)
+        self.quicksearch_entry=Gtk.Entry()
         self.quicksearch_entry.set_text(_('Search'))
         def do_search(button, options):
             """Execute a search query in the active trace.
@@ -242,7 +247,7 @@ class TraceTimeline(AdhocView):
             @type options: list
             @param options: a list containing the different options for the search query (see tracebuilder for more infos)
             """
-            tr=self.tracer.search(self.active_trace, unicode(self.quicksearch_entry.get_text(), 'utf-8'), options[0], options[1])
+            tr=self.tracer.search(self.active_trace, self.quicksearch_entry.get_text(), options[0], options[1])
             mod= self.trace_selector.get_model()
             if len(self.tracer.traces)>len(mod):
                 n = len(self.tracer.traces)-1
@@ -266,34 +271,34 @@ class TraceTimeline(AdhocView):
             """Execute search query if <Enter> is pressed in search entry
             """
             #if return is hit, activate quicksearch_button
-            if event.keyval == gtk.keysyms.Return:
+            if event.keyval == Gdk.KEY_Return:
                 self.quicksearch_button.activate()
         self.quicksearch_entry.connect('button-press-event', is_focus)
         self.quicksearch_entry.connect('key-press-event', is_typing)
-        self.search_box = gtk.HBox()
-        self.search_box.pack_start(self.quicksearch_entry, expand=False)
-        self.search_box.pack_start(self.quicksearch_button, expand=False)
-        #mainbox.pack_start(self.search_box, expand=False)
+        self.search_box = Gtk.HBox()
+        self.search_box.pack_start(self.quicksearch_entry, False, True, 0)
+        self.search_box.pack_start(self.quicksearch_button, False, True, 0)
+        #mainbox.pack_start(self.search_box, False, True, 0)
 
-        toolbox = gtk.Toolbar()
-        toolbox.set_orientation(gtk.ORIENTATION_HORIZONTAL)
-        toolbox.set_style(gtk.TOOLBAR_ICONS)
-        #toolbox.set_icon_size(gtk.ICON_SIZE_MENU)
-        #mainbox.pack_start(toolbox, expand=False)
+        toolbox = Gtk.Toolbar()
+        toolbox.set_orientation(Gtk.Orientation.HORIZONTAL)
+        toolbox.set_style(Gtk.ToolbarStyle.ICONS)
+        #toolbox.set_icon_size(Gtk.IconSize.MENU)
+        #mainbox.pack_start(toolbox, False, True, 0)
 
 
-        htb = gtk.HBox()
-        htb.pack_start(toolbox, expand=True)
-        htb.pack_start(self.search_box, expand=False)
+        htb = Gtk.HBox()
+        htb.pack_start(toolbox, True, True, 0)
+        htb.pack_start(self.search_box, False, True, 0)
 
-        mainbox.pack_start(htb, expand=False)
+        mainbox.pack_start(htb, False, True, 0)
 
         c = len(self.cols)
         self.context_canvasX = c*(self.context_col_width+self.context_colspacing) + 5 # 1+4 for select square
 
-        bx = gtk.HPaned()
-        hbt = gtk.HBox()
-        self.context_canvas = goocanvas.Canvas()
+        bx = Gtk.HPaned()
+        hbt = Gtk.HBox()
+        self.context_canvas = GooCanvas.Canvas()
         self.context_canvas.set_bounds (0, 0, self.context_canvasX, self.context_canvasY)
         self.context_canvas.set_size_request(self.context_canvasX, -1)
 
@@ -307,34 +312,34 @@ class TraceTimeline(AdhocView):
                 self.context_update_time()
         self.context_canvas.connect('size-allocate', context_resize)
 
-        hbt.pack_start(self.context_canvas, expand=False)
-        hbt.pack_start(gtk.VSeparator(), expand=False)
-        hbt.pack_start(bx, expand=True)
-        mainbox.pack_start(hbt, expand=True)
+        hbt.pack_start(self.context_canvas, False, True, 0)
+        hbt.pack_start(Gtk.VSeparator(), False, False, 0)
+        hbt.pack_start(bx, True, True, 0)
+        mainbox.pack_start(hbt, True, True, 0)
 
-        timeline_box=gtk.VBox()
+        timeline_box=Gtk.VBox()
         bx.pack1(timeline_box, resize=False, shrink=False)
 
-        scrolled_win = gtk.ScrolledWindow ()
+        scrolled_win = Gtk.ScrolledWindow ()
         self.sw = scrolled_win
-        self.sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_ALWAYS)
+        self.sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.ALWAYS)
         def sw_scrolled(a):
             """Move context selection frame when scrolling the timeline
             """
             self.context_update_sel_frame()
         self.sw.get_vadjustment().connect('value-changed', sw_scrolled)
-        self.head_canvas = goocanvas.Canvas()
+        self.head_canvas = GooCanvas.Canvas()
 
         self.canvasX = c*(self.col_width+self.colspacing)
         self.head_canvas.set_bounds (0,0,self.canvasX,self.head_canvasY)
         self.head_canvas.set_size_request(-1, self.head_canvasY)
-        timeline_box.pack_start(self.head_canvas, expand=False, fill=False)
+        timeline_box.pack_start(self.head_canvas, False, False, 0)
 
-        self.canvas = goocanvas.Canvas()
+        self.canvas = GooCanvas.Canvas()
         self.canvas.set_bounds (0, 0,self.canvasX, self.canvasY)
         self.canvas.set_size_request(200, 25) # important to force a minimum size (else we could have problem with radius of objects < 0)
 
-        self.doc_canvas = goocanvas.Canvas()
+        self.doc_canvas = GooCanvas.Canvas()
         self.doc_canvas.set_bounds(0,0, self.doc_canvas_X, self.doc_canvas_Y)
         self.doc_canvas.set_size_request(-1, self.doc_canvas_Y)
         self.docgroup = DocGroup(controller=self.controller, canvas=self.doc_canvas, name="Nom du film", x = 15, y=10, w=self.doc_canvas_X-30, h=self.doc_canvas_Y-25, fontsize=8, color_c=0x00000050)
@@ -347,7 +352,7 @@ class TraceTimeline(AdhocView):
             if abs(self.canvasX-(alloc.width-20)) < 5:
                 # resize every 5 pixels
                 return
-            ratio = (alloc.width-20.0) / self.canvasX
+            ratio = (alloc.width - 20.0) / self.canvasX
             self.canvasX = alloc.width-20.0
             self.col_width = float(self.canvasX)/len(self.cols)-self.colspacing
             #redraw head_canvas
@@ -398,7 +403,7 @@ class TraceTimeline(AdhocView):
         def show_tooltip(w, x, y, km, tooltip):
             """Show a tooltip according to the item under the cursor
             """
-            under_cursor = self.canvas.get_items_at(x, y+w.get_vadjustment().value, False)
+            under_cursor = self.canvas.get_items_at(x, y+w.get_vadjustment().get_value(), False)
             if not under_cursor:
                 return False
             for item in under_cursor:
@@ -410,36 +415,36 @@ class TraceTimeline(AdhocView):
         scrolled_win.connect("query-tooltip", show_tooltip)
 
 
-        timeline_box.pack_start(gtk.HSeparator(), expand=False, fill=False)
+        timeline_box.pack_start(Gtk.HSeparator(), False, False, 0)
         timeline_box.add(scrolled_win)
 
-        mainbox.pack_start(gtk.HSeparator(), expand=False, fill=False)
+        mainbox.pack_start(Gtk.HSeparator(), False, False, 0)
 
-        mainbox.pack_start(self.doc_canvas, expand=False, fill=True)
+        mainbox.pack_start(self.doc_canvas, False, True, 0)
 
-        btnm = gtk.ToolButton(stock_id=gtk.STOCK_ZOOM_OUT)
+        btnm = Gtk.ToolButton(stock_id=Gtk.STOCK_ZOOM_OUT)
         btnm.set_tooltip_text(_('Zoom out'))
         btnm.set_label('')
         toolbox.insert(btnm, -1)
 
-        btnp = gtk.ToolButton(stock_id=gtk.STOCK_ZOOM_IN)
+        btnp = Gtk.ToolButton(stock_id=Gtk.STOCK_ZOOM_IN)
         btnp.set_tooltip_text(_('Zoom in'))
         btnp.set_label('')
         toolbox.insert(btnp, -1)
 
-        btnc = gtk.ToolButton(stock_id=gtk.STOCK_ZOOM_100)
+        btnc = Gtk.ToolButton(stock_id=Gtk.STOCK_ZOOM_100)
         btnc.set_tooltip_text(_('Zoom 100%'))
         btnc.set_label('')
         toolbox.insert(btnc, -1)
-        self.btnl = gtk.ToolButton()
+        self.btnl = Gtk.ToolButton()
         self.btnl.set_tooltip_text(_('Toggle links lock'))
-        img = gtk.Image()
+        img = Gtk.Image()
         img.set_from_file(config.data.advenefile( ( 'pixmaps', 'unlocked.png') ))
         self.btnl.set_icon_widget(img)
         toolbox.insert(self.btnl, -1)
         self.btnl.connect('clicked', self.toggle_lock)
         #btn to change link mode
-        b = gtk.ToolButton(label='L')
+        b = Gtk.ToolButton(label='L')
         b.set_tooltip_text(_('Toggle link mode'))
         toolbox.insert(b, -1)
         b.connect('clicked', self.toggle_link_mode)
@@ -448,8 +453,8 @@ class TraceTimeline(AdhocView):
             """Open a trace file, add it to the trace selector and make it active
             """
             fname=dialog.get_filename(title=_("Open a trace file"),
-                                   action=gtk.FILE_CHOOSER_ACTION_OPEN,
-                                   button=gtk.STOCK_OPEN,
+                                   action=Gtk.FileChooserAction.OPEN,
+                                   button=Gtk.STOCK_OPEN,
                                    default_dir=config.data.path['settings'],
                                    filter='any')
             if not fname:
@@ -461,29 +466,29 @@ class TraceTimeline(AdhocView):
             self.trace_selector.set_active(len(self.tracer.traces) - 1)
             return True
 
-        btnar = gtk.ToggleToolButton(stock_id=gtk.STOCK_REFRESH)
+        btnar = Gtk.ToggleToolButton(stock_id=Gtk.STOCK_REFRESH)
         btnar.set_tooltip_text(_('Toggle auto refresh'))
         btnar.set_label('')
         btnar.connect('clicked', self.toggle_auto_refresh)
         toolbox.insert(btnar, -1)
 
 
-        s=gtk.SeparatorToolItem()
+        s=Gtk.SeparatorToolItem()
         s.set_draw(True)
         toolbox.insert(s, -1)
 
-        b=gtk.ToolButton(stock_id=gtk.STOCK_OPEN)
+        b=Gtk.ToolButton(stock_id=Gtk.STOCK_OPEN)
         b.set_tooltip_text(_('Open an existing trace'))
         toolbox.insert(b, -1)
         b.connect('clicked', open_trace)
 
         # Export trace
-        btne = gtk.ToolButton(stock_id=gtk.STOCK_SAVE)
+        btne = Gtk.ToolButton(stock_id=Gtk.STOCK_SAVE)
         btne.set_tooltip_text(_('Save trace'))
         toolbox.insert(btne, -1)
         btne.connect('clicked', self.export)
 
-        btnopt = gtk.ToolButton(stock_id=gtk.STOCK_PREFERENCES)
+        btnopt = Gtk.ToolButton(stock_id=Gtk.STOCK_PREFERENCES)
         btnopt.set_tooltip_text(_('Configuration'))
         btnopt.set_label('')
         #btnopt.connect('clicked', open_options)
@@ -502,40 +507,32 @@ class TraceTimeline(AdhocView):
             Horizontal scrolling if <shift> is pressed.
             Vertical scrolling if nothing special.
             """
-            zoom=event.state & gtk.gdk.CONTROL_MASK
+            zoom=event.get_state() & Gdk.ModifierType.CONTROL_MASK
             a = None
             if zoom:
                 center = event.y * self.timefactor
-                if event.direction == gtk.gdk.SCROLL_DOWN:
+                if event.direction == Gdk.ScrollDirection.DOWN:
                     zoom_out(widget, center)
-                elif  event.direction == gtk.gdk.SCROLL_UP:
+                elif  event.direction == Gdk.ScrollDirection.UP:
                     self.zoom_at_ratio(widget, 1.25, center)
                 return
-            elif event.state & gtk.gdk.SHIFT_MASK:
+            elif event.get_state() & Gdk.ModifierType.SHIFT_MASK:
                 # Horizontal scroll
                 a = scrolled_win.get_hadjustment()
-                incr = a.step_increment
+                incr = a.get_step_increment()
             else:
                 # Vertical scroll
                 a = scrolled_win.get_vadjustment()
-                incr = a.step_increment
-
-            if event.direction == gtk.gdk.SCROLL_DOWN:
-                val = a.value + incr
-                if val > a.upper - a.page_size:
-                    val = a.upper - a.page_size
-                elif val < a.lower:
-                    val = a.lower
-                if val != a.value:
-                    a.value = val
-            elif event.direction == gtk.gdk.SCROLL_UP:
-                val = a.value - incr
-                if val < a.lower:
-                    val = a.lower
-                elif val > a.upper - a.page_size:
-                    val = a.upper - a.page_size
-                if val != a.value:
-                    a.value = val
+                incr = a.get_step_increment()
+
+            if event.direction == Gdk.ScrollDirection.DOWN:
+                a.set_value(helper.clamp(a.get_value() + incr,
+                            a.get_lower(),
+                            a.get_upper() - a.get_page_size()))
+            elif event.direction == Gdk.ScrollDirection.UP:
+                a.set_value(helper.clamp(a.get_value() - incr,
+                            a.get_lower(),
+                            a.get_upper() - a.get_page_size()))
             return True
         self.canvas.connect('scroll-event', on_background_scroll)
 
@@ -545,19 +542,19 @@ class TraceTimeline(AdhocView):
             if <shift> is pressed, draw a selection frame
             if nothing is pressed, drag the canvas
             """
-            if not event.state & gtk.gdk.BUTTON1_MASK:
+            if not event.get_state() & Gdk.ModifierType.BUTTON1_MASK:
                 return False
-            if event.state & gtk.gdk.SHIFT_MASK:
+            if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
                 # redraw selection frame
-                #self.widget.get_parent_window().set_cursor(gtk.gdk.Cursor(gtk.gdk.PLUS))
+                #self.widget.get_parent_window().set_cursor(Gdk.Cursor.new(Gdk.PLUS))
                 if self.selection[0]==0 and self.selection[1]==0:
                     self.selection[0]=event.x
                     self.selection[1]=event.y
-                p = goocanvas.Points([(self.selection[0],self.selection[1]),(self.selection[0],event.y),(event.x,event.y),(event.x,self.selection[1])])
+                p = GooCanvas.Points([(self.selection[0],self.selection[1]),(self.selection[0],event.y),(event.x,event.y),(event.x,self.selection[1])])
                 if self.sel_frame is not None:
                     self.sel_frame.props.points = p
                 else:
-                    self.sel_frame=goocanvas.Polyline (parent = self.canvas.get_root_item(),
+                    self.sel_frame=GooCanvas.Polyline (parent = self.canvas.get_root_item(),
                                         close_path = True,
                                         points = p,
                                         stroke_color = 0xFFFFFFFF,
@@ -572,19 +569,19 @@ class TraceTimeline(AdhocView):
 
             if not self.drag_coordinates:
                 self.drag_coordinates=(event.x_root, event.y_root)
-                self.widget.get_parent_window().set_cursor(gtk.gdk.Cursor(gtk.gdk.DIAMOND_CROSS))
+                self.widget.get_parent_window().set_cursor(Gdk.Cursor.new(Gdk.DIAMOND_CROSS))
                 #curseur grab
                 return False
             x, y = self.drag_coordinates
             wa=widget.get_allocation()
             a=scrolled_win.get_hadjustment()
-            v=a.value + x - event.x_root
-            if v > a.lower and v+wa.width < a.upper:
-                a.value=v
+            a.set_value(helper.clamp(a.get_value() + x - event.x_root,
+                                     a.get_lower(),
+                                     a.get_upper() - wa.get_width()))
             a=scrolled_win.get_vadjustment()
-            v=a.value + y - event.y_root
-            if v > a.lower and v+wa.height < a.upper:
-                a.value=v
+            a.set_value(helper.clamp(a.get_value() + y - event.y_root,
+                        a.get_lower(),
+                                     a.get_upper() - wa.get_width()))
 
             self.drag_coordinates= (event.x_root, event.y_root)
             return False
@@ -636,7 +633,7 @@ class TraceTimeline(AdhocView):
         self.draw_marks()
         if self.autoscroll:
             a = self.sw.get_vadjustment()
-            a.value=a.upper-a.page_size
+            a.set_value(a.get_upper() - a.get_page_size())
         if self.auto_refresh_keep_100:
             self.zoom_100()
         self.context_update_time()
@@ -648,13 +645,13 @@ class TraceTimeline(AdhocView):
         #function to launch / stop autorefresh
         self.auto_refresh = not self.auto_refresh
         if self.auto_refresh:
-            self.ar_tag = timeout_add(self.auto_refresh_delay, self.refresh_time)
+            self.ar_tag = GObject.timeout_add(self.auto_refresh_delay, self.refresh_time)
             #should change an icon button
-            print "auto_refresh started"
+            print("auto_refresh started")
         else:
             #should change an icon button
-            source_remove(self.ar_tag)
-            print "auto_refresh stopped"
+            GObject.source_remove(self.ar_tag)
+            print("auto_refresh stopped")
 
     def show_inspector(self):
         """Expand inspector zone to show it
@@ -665,16 +662,16 @@ class TraceTimeline(AdhocView):
         """Export current trace to a predefined location
         """
         fname = self.tracer.export()
-        d = gtk.Dialog(title=_("Exporting traces"),
-                       parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_OK, gtk.RESPONSE_OK
+        d = Gtk.Dialog(title=_("Exporting traces"),
+                       parent=self.controller.gui.gui.win,
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_OK, Gtk.ResponseType.OK
                                  ))
-        l=gtk.Label(_("Export done to\n%s") % fname)
+        l=Gtk.Label(label=_("Export done to\n%s") % fname)
         l.set_selectable(True)
         l.set_line_wrap(True)
         l.show()
-        d.vbox.pack_start(l, expand=False)
+        d.vbox.pack_start(l, False, True, 0)
         d.vbox.show_all()
         d.show()
         res=d.run()
@@ -708,12 +705,12 @@ class TraceTimeline(AdhocView):
         h = self.canvas.get_allocation().height
         #print float(h*self.timefactor)/ratio<1, h, self.timefactor
         if float(h*self.timefactor)/ratio<1:
-            print "TraceTimeline: minimal zoom is 1s"
+            print("TraceTimeline: minimal zoom is 1s")
             return
         va=self.sw.get_vadjustment()
 
         if center_v is None:
-            vc = (va.value + h/2.0) * self.timefactor
+            vc = (va.get_value() + h/2.0) * self.timefactor
         else:
             vc = center_v
         self.canvasY *= ratio
@@ -746,11 +743,9 @@ class TraceTimeline(AdhocView):
                 self.timemarks=[]
                 self.draw_marks()
         self.update_lines()
-        va.value = vc/self.timefactor-va.page_size/2.0
-        if va.value<va.lower:
-            va.value=va.lower
-        elif va.value>va.upper-va.page_size:
-            va.value=va.upper-va.page_size
+        va.set_value(helper.clamp(vc/self.timefactor-va.get_page_size()/2.0,
+                                  va.get_lower(),
+                                  va.get_upper() - va.get_page_size()))
 
     def zoom_on(self, w=None, canvas_item=None):
         """Zoom on an item (ObjGroup or EventGroup) in the canvas
@@ -795,7 +790,7 @@ class TraceTimeline(AdhocView):
         # 20.0 to keep a little space between border and object
         va=self.sw.get_vadjustment()
         rapp = h / (20.0 + max_y - min_y)
-        vc = self.timefactor * ((min_y + max_y) / 2.0) * (va.upper / self.canvasY)
+        vc = self.timefactor * ((min_y + max_y) / 2.0) * (va.get_upper() / self.canvasY)
         self.zoom_at_ratio(None, rapp, vc)
 
 
@@ -814,14 +809,14 @@ class TraceTimeline(AdhocView):
             b=d=0
             t = self.controller.package.get_element_by_id(obj_group.cobj['cid'])
             if t is None or not isinstance(t, AnnotationType):
-                print "No corresponding type, creation aborted"
+                print("No corresponding type, creation aborted")
                 return
             a = int(c.find("begin=")+6)
             aa = int(c.find("\n", a))
-            b = long(c[a:aa])
+            b = int(c[a:aa])
             a = int(c.find("end=")+4)
             aa = int(c.find("\n", a))
-            e = long(c[a:aa])
+            e = int(c[a:aa])
             d = e-b
             a = int(c.find("content=")+9)
             aa = len(c)-1
@@ -833,14 +828,14 @@ class TraceTimeline(AdhocView):
                 date=self.controller.get_timestamp(),
                 fragment=MillisecondFragment(begin=b,
                                              duration=d))
-            an.content.data = urllib.unquote(cont.encode('utf-8'))
+            an.content.data = urllib.parse.unquote(cont.encode('utf-8'))
             self.controller.package.annotations.append(an)
             self.controller.notify("AnnotationCreate", annotation=an, comment="Recreated from Trace")
         elif obj_group.cobj['type'] == Relation:
             t=None
             t = self.controller.package.get_element_by_id(obj_group.cobj['cid'])
             if t is None or not isinstance(t, RelationType):
-                print "No corresponding type, creation aborted"
+                print("No corresponding type, creation aborted")
                 return
             a = int(c.find("source=")+7)
             aa = int(c.find("\n", a))
@@ -854,16 +849,16 @@ class TraceTimeline(AdhocView):
             aa = len(c)-1
             cont = c[a:aa]
             if source is None or dest is None or not isinstance(source, Annotation) or not isinstance(dest, Annotation):
-                print "Source or Destination missing, creation aborted"
+                print("Source or Destination missing, creation aborted")
                 return
             r = self.controller.package.createRelation(ident=obj_group.cobj['id'],
                                  members=(source, dest),
                                  type=t)
-            r.content.data = urllib.unquote(cont.encode('utf-8'))
+            r.content.data = urllib.parse.unquote(cont.encode('utf-8'))
             self.controller.package.relations.append(r)
             self.controller.notify("RelationCreate", relation=r)
         else:
-            print 'TODO'
+            print('TODO')
 
         return
 
@@ -879,12 +874,7 @@ class TraceTimeline(AdhocView):
         @type time: number
         @param time: the timestamp we want to reach
         """
-        c=self.controller
-        pos = c.create_position (value=time,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-        c.update_status (status="set", position=pos)
-        return
+        self.controller.update_status("seek", time)
 
     def canvas_release(self, w, ev):
         """Manage the release of mouse buttons on the canvas
@@ -894,7 +884,7 @@ class TraceTimeline(AdhocView):
         if self.sel_frame:
             self.sel_frame.remove()
             self.sel_frame=None
-        if ev.state & gtk.gdk.SHIFT_MASK:
+        if ev.state & Gdk.ModifierType.SHIFT_MASK:
             if self.selection[0]==0 and self.selection[1]==0:
                 #not a simple click + maj + release
                 return
@@ -910,7 +900,7 @@ class TraceTimeline(AdhocView):
                 self.selection = [ 0, 0, 0, 0]
                 return
             rapp = h / float(max_y - min_y)
-            vc = self.timefactor * ((min_y + max_y) / 2.0) * (va.upper / self.canvasY)
+            vc = self.timefactor * ((min_y + max_y) / 2.0) * (va.get_upper() / self.canvasY)
             self.zoom_at_ratio(None, rapp, vc)
             self.selection = [ 0, 0, 0, 0]
             return
@@ -924,12 +914,12 @@ class TraceTimeline(AdhocView):
         Draw a selection frame if <shift> pressed and left click
         Display contextual menu according to under the cursor items if right click
         """
-        if ev.state & gtk.gdk.SHIFT_MASK:
+        if ev.state & Gdk.ModifierType.SHIFT_MASK:
             self.selection = [ ev.x, ev.y, 0, 0]
             if self.sel_frame:
                 self.sel_frame.remove()
                 self.sel_frame=None
-            self.widget.get_parent_window().set_cursor(gtk.gdk.Cursor(gtk.gdk.PLUS))
+            self.widget.get_parent_window().set_cursor(Gdk.Cursor.new(Gdk.PLUS))
             return
         obj_gp = None
         evt_gp = None
@@ -945,10 +935,10 @@ class TraceTimeline(AdhocView):
             return
         if ev.button == 3:
             #clic droit sur un item
-            menu=gtk.Menu()
+            menu=Gtk.Menu()
             if obj_gp is not None:
                 if obj_gp.rep is not None:
-                    i=gtk.MenuItem(_("Zoom and center on linked items"))
+                    i=Gtk.MenuItem(_("Zoom and center on linked items"))
                     i.connect("activate", self.zoom_on, obj_gp)
                     menu.append(i)
                 obj = objt = None
@@ -957,14 +947,14 @@ class TraceTimeline(AdhocView):
                 if obj_gp.cobj['cid'] is not None:
                     objt = self.controller.package.get_element_by_id(obj_gp.cobj['cid'])
                 if obj is not None:
-                    i=gtk.MenuItem(_("Edit item"))
+                    i=Gtk.MenuItem(_("Edit item"))
                     i.connect("activate", self.edit_item, obj)
                     menu.append(i)
                 elif objt is not None:
-                    i=gtk.MenuItem(_("Recreate item"))
+                    i=Gtk.MenuItem(_("Recreate item"))
                     i.connect("activate", self.recreate_item, obj_gp)
                     menu.append(i)
-                m = gtk.Menu()
+                m = Gtk.Menu()
                 mt= []
 
                 if obj_gp.operation.movietime not in mt:
@@ -974,18 +964,18 @@ class TraceTimeline(AdhocView):
                     else:
                         n = ECACatalog.event_names[obj_gp.operation.name]
                     mt.append(obj_gp.operation.movietime)
-                    i = gtk.MenuItem("%s (%s)" % (time.strftime("%H:%M:%S", time.gmtime(obj_gp.operation.movietime/1000)), n))
+                    i = Gtk.MenuItem("%s (%s)" % (time.strftime("%H:%M:%S", time.gmtime(obj_gp.operation.movietime/1000)), n))
                     i.connect("activate", self.goto, obj_gp.operation.movietime)
                     m.append(i)
-                i=gtk.MenuItem(_("Go to..."))
+                i=Gtk.MenuItem(_("Go to..."))
                 i.set_submenu(m)
                 menu.append(i)
             if evt_gp is not None:
-                i=gtk.MenuItem(_("Zoom on action"))
+                i=Gtk.MenuItem(_("Zoom on action"))
                 i.connect("activate", self.zoom_on, evt_gp)
                 menu.append(i)
                 if obj_gp is None:
-                    m = gtk.Menu()
+                    m = Gtk.Menu()
                     mt= []
                     for op in evt_gp.event.operations:
                         if op.movietime not in mt:
@@ -995,14 +985,14 @@ class TraceTimeline(AdhocView):
                             else:
                                 n = ECACatalog.event_names[op.name]
                             mt.append(op.movietime)
-                            i = gtk.MenuItem("%s (%s)" % (time.strftime("%H:%M:%S", time.gmtime(op.movietime/1000)), n))
+                            i = Gtk.MenuItem("%s (%s)" % (time.strftime("%H:%M:%S", time.gmtime(op.movietime/1000)), n))
                             i.connect("activate", self.goto, op.movietime)
                             m.append(i)
-                    i=gtk.MenuItem(_("Go to..."))
+                    i=Gtk.MenuItem(_("Go to..."))
                     i.set_submenu(m)
                     menu.append(i)
             menu.show_all()
-            menu.popup(None, None, None, ev.button, ev.time)
+            menu.popup_at_pointer(None)
         elif ev.button == 1:
             if obj_gp is not None:
                 self.toggle_lock(w=obj_gp)
@@ -1068,12 +1058,12 @@ class TraceTimeline(AdhocView):
             else:
                tinc=self.timemarks[0].get_child(0).get_bounds().y1
             t=self.timemarks[-1].get_child(0).get_bounds().y1+tinc
-        ld = goocanvas.LineDash([5.0, 20.0])
+        ld = GooCanvas.LineDash([5.0, 20.0])
         while t < self.canvasY:
             #print self.start_time, t, t*self.timefactor
             txt = time.strftime("%H:%M:%S",time.localtime(self.start_time+t*self.timefactor))
-            mgroup = goocanvas.Group(parent=self.canvas.get_root_item())
-            a=goocanvas.polyline_new_line(mgroup,
+            mgroup = GooCanvas.Group(parent=self.canvas.get_root_item())
+            a=GooCanvas.polyline_new_line(mgroup,
                                         0,
                                         t,
                                         self.canvasX,
@@ -1081,22 +1071,22 @@ class TraceTimeline(AdhocView):
                                         line_dash=ld,
                                         line_width = 0.2)
             a.props.tooltip=txt
-            a=goocanvas.Text(parent = mgroup,
+            a=GooCanvas.Text(parent = mgroup,
                         text = txt,
                         x = 0,
                         y = t-5,
                         width = -1,
-                        anchor = gtk.ANCHOR_W,
+                        anchor = Gtk.ANCHOR_W,
                         fill_color_rgba=0x121212FF,
                         font = "Sans 7")
             a.props.tooltip=txt
-            a=goocanvas.Text(parent = mgroup,
+            a=GooCanvas.Text(parent = mgroup,
                         text = txt,
                         x = self.canvasX-4,
                         y = t-5,
                         width = -1,
                         fill_color_rgba=0x121212FF,
-                        anchor = gtk.ANCHOR_E,
+                        anchor = Gtk.ANCHOR_E,
                         font = "Sans 7")
             a.props.tooltip=txt
             self.timemarks.append(mgroup)
@@ -1118,7 +1108,7 @@ class TraceTimeline(AdhocView):
         """
         offset = 0
         for c in self.tracer.tracemodel['actions']:
-            etgroup = HeadGroup(self.controller, self.head_canvas, c, (self.colspacing+self.col_width)*offset, 0, self.col_width, 8, gdk2intrgba(gtk.gdk.color_parse(self.tracer.colormodel['actions'][c])))
+            etgroup = HeadGroup(self.controller, self.head_canvas, c, (self.colspacing+self.col_width)*offset, 0, self.col_width, 8, gdk2intrgba(Gdk.color_parse(self.tracer.colormodel['actions'][c])))
             (og, oa) = self.cols[c]
             self.cols[c]=(etgroup, oa)
             offset += 1
@@ -1162,7 +1152,7 @@ class TraceTimeline(AdhocView):
         if self.links_locked:
             self.toggle_lock()
             self.inspector.clean()
-        self.widget.get_parent_window().set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
+        self.widget.get_parent_window().set_cursor(Gdk.Cursor.new(Gdk.CursorType.WATCH))
         root=self.canvas.get_root_item()
         while root.get_n_children()>0:
             c = root.get_child(0)
@@ -1172,7 +1162,7 @@ class TraceTimeline(AdhocView):
         for c in self.cols:
             h,l = self.cols[c]
             self.cols[c]=(h,None)
-        self.now_line = goocanvas.polyline_new_line(root,
+        self.now_line = GooCanvas.polyline_new_line(root,
                                         0,
                                         self.canvasY-1,
                                         self.canvasX,
@@ -1190,11 +1180,11 @@ class TraceTimeline(AdhocView):
         self.draw_marks()
         if center:
             va=self.sw.get_vadjustment()
-            va.value = center/self.timefactor-va.page_size/2.0
+            va.value = center/self.timefactor-va.get_page_size()/2.0
             if va.value<va.lower:
                 va.value=va.lower
-            elif va.value>va.upper-va.page_size:
-                va.value=va.upper-va.page_size
+            elif va.value>va.get_upper()-va.get_page_size():
+                va.value=va.get_upper()-va.get_page_size()
         self.context_update_time()
         self.widget.get_parent_window().set_cursor(None)
         #print "----------------REFRESH END-----------------"
@@ -1259,7 +1249,7 @@ class TraceTimeline(AdhocView):
         h,l = self.cols[action.name]
         #print "INIT %s" % l
         if (l and not l.get_canvas()):
-            print "Tracetimeline : Synchronization between tracer and view lost - droping event"
+            print("Tracetimeline : Synchronization between tracer and view lost - droping event")
             #to avoid crashing when tracebuilder is calling receive of a tracetimeline being closed
             return
         color = h.color_c
@@ -1270,7 +1260,6 @@ class TraceTimeline(AdhocView):
             oldlength = b.y2-b.y1
             #calculating new length
             newlength = float(action.time[1]-action.time[0])/self.timefactor
-            ratio = newlength/oldlength
             if b.y1+newlength >= self.canvasY-1:
                 #need to expand canvas
                 self.canvasY = b.y1+newlength+1
@@ -1301,7 +1290,7 @@ class TraceTimeline(AdhocView):
         self.canvas.show()
         if self.autoscroll:
             a = self.sw.get_vadjustment()
-            a.value=a.upper-a.page_size
+            a.set_value(a.get_upper()-a.get_page_size())
         if l and l.event == action:
             self.context_update_line(action)
         else:
@@ -1373,7 +1362,7 @@ class TraceTimeline(AdhocView):
             while n < root.get_n_children():
                 l=root.get_child(n)
                 n+=1
-                if isinstance(l,goocanvas.Polyline):
+                if isinstance(l,GooCanvas.Polyline):
                     l.props.y *= ratio
                     l.props.height *= ratio
         self.context_update_sel_frame()
@@ -1389,7 +1378,7 @@ class TraceTimeline(AdhocView):
         y2 = float(action.time[1]-self.active_trace.start)*self.context_canvasY/(self.context_t_max-self.active_trace.start)
         (i,color,line)=self.context_cols[action.name]
         x = 3+2*i
-        l = goocanvas.polyline_new_line(self.context_canvas.get_root_item(),
+        l = GooCanvas.polyline_new_line(self.context_canvas.get_root_item(),
                                         x,
                                         y1,
                                         x,
@@ -1416,7 +1405,7 @@ class TraceTimeline(AdhocView):
         """Draw the selection frame on context canvas, corresponding to what is displayed in the trace timeline
         """
         #refresh canvas bounds
-        self.context_frame = goocanvas.Rect (parent = self.context_canvas.get_root_item(),
+        self.context_frame = GooCanvas.Rect (parent = self.context_canvas.get_root_item(),
                                     x = 0,
                                     y = 0,
                                     width = self.context_canvasX,
@@ -1444,11 +1433,11 @@ class TraceTimeline(AdhocView):
         return
 
 
-class HeadGroup (Group):
+class HeadGroup (CanvasGroup):
     """Group containing a rectangle and a name used to display headers.
     """
     def __init__(self, controller=None, canvas=None, name="N/A", x = 5, y=0, w=90, fontsize=14, color_c=0x00ffff50):
-        Group.__init__(self, parent = canvas.get_root_item ())
+        CanvasGroup.__init__(self, parent = canvas.get_root_item ())
         self.controller=controller
         #self.name=name[0:2]
         self.name=name[0:5]
@@ -1456,7 +1445,7 @@ class HeadGroup (Group):
         self.color_s = "black"
         self.color_c = color_c
         self.fontsize=fontsize
-        self.rect = goocanvas.Rect (parent = self,
+        self.rect = GooCanvas.Rect (parent = self,
                                     x = x,
                                     y = y,
                                     width = self.w,
@@ -1464,12 +1453,12 @@ class HeadGroup (Group):
                                     fill_color_rgba = 0xFFFFFF00,
                                     stroke_color = 0xFFFFFF00,
                                     line_width = 0)
-        self.text = goocanvas.Text (parent = self,
+        self.text = GooCanvas.Text (parent = self,
                                         text = self.name,
                                         x = x+w/2,
                                         y = y+15,
                                         width = -1,
-                                        anchor = gtk.ANCHOR_CENTER,
+                                        anchor = Gtk.ANCHOR_CENTER,
                                         font = "Sans Bold %s" % str(self.fontsize))
 
         def change_name(self, name):
@@ -1491,11 +1480,11 @@ class HeadGroup (Group):
             self.text.props.font="%s %s" % (font, str(self.fontsize))
             return
 
-class EventGroup (Group):
+class EventGroup (CanvasGroup):
     """Group containing a rectangle, commentmarks and ObjGroups used to display an action
     """
     def __init__(self, link_mode=0, controller=None, inspector=None, canvas=None, dg=None, type=None, event=None, x =0, y=0, l=1, w=90, ol=5, fontsize=6, color_c=0x00ffffff, blocked=False):
-        Group.__init__(self, parent = canvas.get_root_item ())
+        CanvasGroup.__init__(self, parent = canvas.get_root_item ())
         self.canvas = canvas
         self.controller=controller
         self.inspector = inspector
@@ -1541,10 +1530,10 @@ class EventGroup (Group):
         @type color_c: number
         @param color_c: fill color rgba
 
-        @rtype: goocanvas.Rect
+        @rtype: GooCanvas.Rect
         @return: the new rect
         """
-        return goocanvas.Rect (parent = self,
+        return GooCanvas.Rect (parent = self,
                                     x = self.x,
                                     y = self.y,
                                     width = self.w,
@@ -1600,7 +1589,6 @@ class EventGroup (Group):
         """
         w = self.rect.props.width
         l = self.rect.props.height
-        c_sel = None
         if l < 10:
             #not enough space
             for c in self.objs:
@@ -1696,9 +1684,9 @@ class EventGroup (Group):
         """Add comment mark to this group if it has a comment
         """
         if not self.commentMark:
-            pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                         ( ('pixmaps', 'traces', 'msg.png')), 16, 16)
-            self.commentMark = goocanvas.Image(parent=self,
+            self.commentMark = GooCanvas.Image(parent=self,
                                                 width=16,
                                                 height=16,
                                                 x=self.x,
@@ -1707,11 +1695,11 @@ class EventGroup (Group):
         self.commentMark.props.tooltip=self.event.comment
 
 
-class ObjGroup (Group):
+class ObjGroup (CanvasGroup):
     """Group used to display informations on an operation
     """
     def __init__(self, link_mode=0, controller=None, inspector=None, canvas=None, dg=None, x=0, y=0, r=4, fontsize=5, op=None, blocked=False):
-        Group.__init__(self, parent = canvas.get_root_item ())
+        CanvasGroup.__init__(self, parent = canvas.get_root_item ())
         self.controller=controller
         self.rep = None
         self.text = None
@@ -1737,7 +1725,7 @@ class ObjGroup (Group):
             temp_it = self.controller.package.get_element_by_id(self.cobj['id'])
             temp_c = self.controller.get_element_color(temp_it)
             if temp_c is not None:
-                self.color_f = gdk2intrgba(gtk.gdk.color_parse(temp_c))
+                self.color_f = gdk2intrgba(Gdk.color_parse(temp_c))
             self.rep = self.newRep()
             self.text = self.newText()
         self.oprep = self.newOpRep()
@@ -1763,7 +1751,7 @@ class ObjGroup (Group):
             self.rep.props.center_x = self.x +3* self.r + 3
             self.rep.props.radius_x = self.r
             self.rep.props.radius_y = self.r
-        #move icon, cannot modify directly goocanvas.Image pixbuf property ... stretching ?
+        #move icon, cannot modify directly GooCanvas.Image pixbuf property ... stretching ?
         if self.oprep:
             #~ self.oprep.props.y = self.y +3
             #~ self.oprep.props.x = self.x
@@ -1870,8 +1858,8 @@ class ObjGroup (Group):
                     #this is an eventgroup
                     x1=g.rect.props.x+g.rect.props.width/2.0
                     y1=g.rect.props.y+g.rect.props.height
-                p = goocanvas.Points ([(x0, y0), (x1,y1)])
-                self.lines.append(goocanvas.Polyline (parent = self,
+                p = GooCanvas.Points ([(x0, y0), (x1,y1)])
+                self.lines.append(GooCanvas.Polyline (parent = self,
                                   close_path = False,
                                   points = p,
                                   stroke_color = 0xFFFFFFFF,
@@ -1893,10 +1881,10 @@ class ObjGroup (Group):
                                 dic[op.time]=(x,y)
                 else:
                     dic[g.operation.time]=(g.rep.props.center_x, g.rep.props.center_y)
-            ks = dic.keys()
+            ks = list(dic.keys())
             ks.sort()
-            p=goocanvas.Points([dic[k] for k in ks])
-            self.lines.append(goocanvas.Polyline (parent = self,
+            p=GooCanvas.Points([dic[k] for k in ks])
+            self.lines.append(GooCanvas.Polyline (parent = self,
                                 close_path = False,
                                 points = p,
                                 stroke_color = 0xFFFFFFFF,
@@ -1941,53 +1929,53 @@ class ObjGroup (Group):
     def newOpRep(self):
         """Change icon representing operation.
 
-        @rtype: goocanvas.Image
+        @rtype: GooCanvas.Image
         @return: the newly created image
         """
         #BIG HACK to display icon
         te = self.operation.name
         if te.find('Edit')>=0:
             if te.find('Start')>=0:
-                pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+                pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     (( 'pixmaps', 'traces', 'edition.png')), int(2*self.r), int(2*self.r))
             elif te.find('End')>=0 or te.find('Destroy')>=0:
-                pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+                pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     (( 'pixmaps', 'traces', 'finedition.png')), int(2*self.r), int(2*self.r))
         elif te.find('Creat')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     (( 'pixmaps', 'traces', 'plus.png')), int(2*self.r), int(2*self.r))
         elif te.find('Delet')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     (( 'pixmaps', 'traces', 'moins.png')), int(2*self.r), int(2*self.r))
         elif te.find('Set')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     ( ('pixmaps', 'traces', 'allera.png')), int(2*self.r), int(2*self.r))
         elif te.find('Start')>=0 or te.find('Resume')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     ( ('pixmaps', 'traces', 'lecture.png')), int(2*self.r), int(2*self.r))
         elif te.find('Pause')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     ( ('pixmaps', 'traces', 'pause.png')), int(2*self.r), int(2*self.r))
         elif te.find('Stop')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     ( ('pixmaps', 'traces', 'stop.png')), int(2*self.r), int(2*self.r))
         elif te.find('Activation')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     ( ('pixmaps', 'traces', 'web.png')), int(2*self.r), int(2*self.r))
         else:
-            pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     ( ('pixmaps', 'traces', 'error.png')), int(2*self.r), int(2*self.r))
-            print 'No icon for %s' % te
-        return goocanvas.Image(parent=self, width=int(2*self.r),height=int(2*self.r),x=self.x,y=self.y+3,pixbuf=pb)
+            print('No icon for %s' % te)
+        return GooCanvas.Image(parent=self, width=int(2*self.r),height=int(2*self.r),x=self.x,y=self.y+3,pixbuf=pb)
 
 
     def newRep(self):
         """Create an advene object representation (ellipse).
 
-        @rtype: goocanvas.Ellipse
+        @rtype: GooCanvas.Ellipse
         @return: the newly created ellipse
         """
-        return goocanvas.Ellipse(parent=self,
+        return GooCanvas.Ellipse(parent=self,
                         center_x=self.x + 3*self.r + 3,
                         center_y=self.y+self.r + 3,
                         radius_x=self.r,
@@ -1999,7 +1987,7 @@ class ObjGroup (Group):
     def newText(self):
         """ Create a new text representation of the advene object
 
-        @rtype: goocanvas.Text
+        @rtype: GooCanvas.Text
         @return: the newly created text
         """
         txt = 'U'
@@ -2009,66 +1997,67 @@ class ObjGroup (Group):
             self.cobj['type']=type(o)
             #print self.type
         txt = TYPE_ABREVIATION[self.cobj['type']]
-        return goocanvas.Text (parent = self,
+        return GooCanvas.Text (parent = self,
                         text = txt,
                         x = self.x + 3 * self.r + 3,
                         y = self.y + self.r + 3,
                         width = -1,
-                        anchor = gtk.ANCHOR_CENTER,
+                        anchor = Gtk.ANCHOR_CENTER,
                         font = "Sans %s" % str(self.fontsize))
 
 
-class Inspector (gtk.VBox):
+class Inspector (Gtk.VBox):
     """Inspector component to display informations concerning items and actions in the timeline
     """
     def __init__ (self, controller=None):
-        gtk.VBox.__init__(self)
+        GObject.GObject.__init__(self)
         self.action=None
         self.item=None
         self.controller=controller
         self.tracer = self.controller.tracers[0]
-        self.pack_start(gtk.Label(_('Inspector')), expand=False)
-        self.pack_start(gtk.HSeparator(), expand=False)
-        self.inspector_id = gtk.Label('')
-        self.pack_start(self.inspector_id, expand=False)
+        self.pack_start(Gtk.Label(_('Inspector')), False, False, 0)
+        self.pack_start(Gtk.HSeparator(), False, False, 0)
+        self.inspector_id = Gtk.Label(label='')
+        self.pack_start(self.inspector_id, False, True, 0)
         self.inspector_id.set_alignment(0, 0.5)
         self.inspector_id.set_tooltip_text(_('Item Id'))
-        self.inspector_type = gtk.Label('')
-        self.pack_start(self.inspector_type, expand=False)
+        self.inspector_type = Gtk.Label(label='')
+        self.pack_start(self.inspector_type, False, True, 0)
         self.inspector_type.set_tooltip_text(_('Item name or class'))
         self.inspector_type.set_alignment(0, 0.5)
-        self.inspector_name = gtk.Label('')
-        self.pack_start(self.inspector_name, expand=False)
+        self.inspector_name = Gtk.Label(label='')
+        self.pack_start(self.inspector_name, False, True, 0)
         self.inspector_name.set_tooltip_text(_('Type or schema'))
         self.inspector_name.set_alignment(0, 0.5)
-        self.pack_start(gtk.HSeparator(), expand=False)
-        self.pack_start(gtk.Label(_('Operations')), expand=False)
-        self.pack_start(gtk.HSeparator(), expand=False)
-        opscwin = gtk.ScrolledWindow ()
-        opscwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        self.pack_start(Gtk.HSeparator(), False, False, 0)
+        self.pack_start(Gtk.Label(_('Operations')), False, False, 0)
+        self.pack_start(Gtk.HSeparator(), False, False, 0)
+        opscwin = Gtk.ScrolledWindow ()
+        opscwin.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         opscwin.set_border_width(0)
-        self.inspector_opes= gtk.VBox()
+        self.inspector_opes= Gtk.VBox()
         opscwin.add_with_viewport(self.inspector_opes)
-        self.pack_start(opscwin, expand=True)
-        self.commentBox = gtk.VBox()
-        self.comment=gtk.Entry()
-        save_btn=gtk.Button()
-        img = gtk.Image()
+        self.pack_start(opscwin, True, True, 0)
+        self.commentBox = Gtk.VBox()
+        self.comment=Gtk.Entry()
+        save_btn=Gtk.Button()
+        img = Gtk.Image()
         img.set_from_file(config.data.advenefile( ( 'pixmaps', 'traces', 'msg_add.png') ))
         save_btn.add(img)
         def save_clicked(w):
             """Save comment in the trace
             """
             if self.action:
-                self.action.event.change_comment(unicode(self.comment.get_text()))
-                if unicode(self.comment.get_text()) != '':
+                comment = self.comment.get_text()
+                self.action.event.change_comment(comment)
+                if comment != '':
                     self.action.addCommentMark()
                 else:
                     self.action.removeCommentMark()
 
         save_btn.connect('clicked', save_clicked)
-        clear_btn=gtk.Button()
-        img = gtk.Image()
+        clear_btn=Gtk.Button()
+        img = Gtk.Image()
         img.set_from_file(config.data.advenefile( ( 'pixmaps', 'traces', 'msg_del.png') ))
         clear_btn.add(img)
         def clear_clicked(w):
@@ -2078,15 +2067,15 @@ class Inspector (gtk.VBox):
             save_clicked(w)
 
         clear_btn.connect('clicked', clear_clicked)
-        btns = gtk.HBox()
-        btns.pack_start(save_btn, expand=False)
-        btns.pack_start(clear_btn, expand=False)
-        self.commentBox.pack_end(btns, expand=False)
-        self.commentBox.pack_end(self.comment, expand=False)
-        self.commentBox.pack_end(gtk.HSeparator(), expand=False)
-        self.commentBox.pack_end(gtk.Label(_('Comment')), expand=False)
-        self.commentBox.pack_end(gtk.HSeparator(), expand=False)
-        self.pack_end(self.commentBox, expand=False)
+        btns = Gtk.HBox()
+        btns.pack_start(save_btn, False, True, 0)
+        btns.pack_start(clear_btn, False, True, 0)
+        self.commentBox.pack_end(btns, False, True, 0)
+        self.commentBox.pack_end(self.comment, False, True, 0)
+        self.commentBox.pack_end(Gtk.HSeparator(), False, False, 0)
+        self.commentBox.pack_end(Gtk.Label(_('Comment')), False, False, 0)
+        self.commentBox.pack_end(Gtk.HSeparator(), False, False, 0)
+        self.pack_end(self.commentBox, False, True, 0)
         self.clean()
 
     def fillWithItem(self, item):
@@ -2119,7 +2108,7 @@ class Inspector (gtk.VBox):
         self.inspector_id.set_text(_('Action'))
         self.inspector_name.set_text('')
         self.inspector_type.set_text(action.event.name)
-        self.pack_end(self.commentBox, expand=False)
+        self.pack_end(self.commentBox, False, True, 0)
         self.comment.set_text(action.event.comment)
         self.addOperations(action.event.operations, op)
         self.show_all()
@@ -2146,7 +2135,7 @@ class Inspector (gtk.VBox):
         for o in op_list:
             l = self.addOperation(o, o==op_sel)
             l.set_size_request(-1, 20)
-            self.inspector_opes.pack_start(l, expand=False)
+            self.inspector_opes.pack_start(l, False, True, 0)
 
     def addOperation(self, obj_evt=None, sel=False):
         """Build a box to display an operation
@@ -2158,7 +2147,7 @@ class Inspector (gtk.VBox):
         """
         corpsstr = ''
         if obj_evt.content is not None and obj_evt.content != 'None':
-            corpsstr = urllib.unquote(obj_evt.content.encode("UTF-8"))
+            corpsstr = urllib.parse.unquote(obj_evt.content.encode("UTF-8"))
         elif obj_evt.name.startswith('Player'):
             #we should display the movietime instead of the content.
             corpsstr = time.strftime("%H:%M:%S", time.gmtime(obj_evt.movietime/1000))
@@ -2178,51 +2167,51 @@ class Inspector (gtk.VBox):
                 entetestr = entetestr + ' %s' % poss[1]
             else:
                 entetestr = entetestr + ' %s' % poss[0]
-        entete = gtk.Label(ev_time.encode("UTF-8"))
-        hb = gtk.HBox()
+        entete = Gtk.Label(label=ev_time.encode("UTF-8"))
+        hb = Gtk.HBox()
 
-        #hb.pack_start(entete, expand=False)
-        objcanvas = goocanvas.Canvas()
+        #hb.pack_start(entete, False, True, 0)
+        objcanvas = GooCanvas.Canvas()
         objcanvas.set_bounds (0,0,60,20)
         #BIG HACK to display icon
         te = obj_evt.name
         if te.find('Edit')>=0:
             if te.find('Start')>=0:
-                pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+                pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                     (( 'pixmaps', 'traces', 'edition.png')))
             elif te.find('End')>=0 or te.find('Destroy')>=0:
-                pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+                pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                     (( 'pixmaps', 'traces', 'finedition.png')))
         elif te.find('Creat')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                     (( 'pixmaps', 'traces', 'plus.png')))
         elif te.find('Delet')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                     (( 'pixmaps', 'traces', 'moins.png')))
         elif te.find('Set')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                     ( ('pixmaps', 'traces', 'allera.png')))
         elif te.find('Start')>=0 or te.find('Resume')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                     ( ('pixmaps', 'traces', 'lecture.png')))
         elif te.find('Pause')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                     ( ('pixmaps', 'traces', 'pause.png')))
         elif te.find('Stop')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile
                     ( ('pixmaps', 'traces', 'stop.png')))
         elif te.find('Activation')>=0:
-            pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     ( ('pixmaps', 'traces', 'web.png')), 20,20)
         else:
-            pb = gtk.gdk.pixbuf_new_from_file_at_size(config.data.advenefile
+            pb = GdkPixbuf.Pixbuf.new_from_file_at_size(config.data.advenefile
                     ( ('pixmaps', 'traces', 'error.png')), 20,20)
-            print 'No icon for %s' % te
-        goocanvas.Image(parent=objcanvas.get_root_item(), width=20,height=20,x=0,y=0,pixbuf=pb)
+            print('No icon for %s' % te)
+        GooCanvas.Image(parent=objcanvas.get_root_item(), width=20,height=20,x=0,y=0,pixbuf=pb)
         # object icon
-        objg = goocanvas.Group(parent = objcanvas.get_root_item ())
+        objg = CanvasGroup(parent = objcanvas.get_root_item ())
         if sel:
-            goocanvas.Rect(parent=objg,
+            GooCanvas.Rect(parent=objg,
                             x=0,
                             y=0,
                             width=60,
@@ -2234,10 +2223,10 @@ class Inspector (gtk.VBox):
             ob = self.controller.package.get_element_by_id(obj_evt.concerned_object['id'])
             temp_c = self.controller.get_element_color(ob)
             if temp_c is not None:
-                temp_c = gdk2intrgba(gtk.gdk.color_parse(temp_c))
+                temp_c = gdk2intrgba(Gdk.color_parse(temp_c))
             else:
                 temp_c = 0xFFFFFFFF
-            goocanvas.Ellipse(parent=objg,
+            GooCanvas.Ellipse(parent=objg,
                     center_x=40,
                     center_y=10,
                     radius_x=9,
@@ -2246,12 +2235,12 @@ class Inspector (gtk.VBox):
                     fill_color_rgba=temp_c,
                     line_width=1.0)
             txt = TYPE_ABREVIATION[obj_evt.concerned_object['type']]
-            goocanvas.Text (parent = objg,
+            GooCanvas.Text (parent = objg,
                     text = txt,
                     x = 40,
                     y = 10,
                     width = -1,
-                    anchor = gtk.ANCHOR_CENTER,
+                    anchor = Gtk.ANCHOR_CENTER,
                     font = "Sans 5")
         else:
             # no concerned object, we are in an action of navigation
@@ -2266,17 +2255,17 @@ class Inspector (gtk.VBox):
                     txt=poss[0]
             else:
                 txt = time.strftime("%H:%M:%S", time.gmtime(obj_evt.movietime/1000))
-            goocanvas.Text (parent = objg,
+            GooCanvas.Text (parent = objg,
                     text = txt,
                     x = 40,
                     y = 10,
                     width = -1,
-                    anchor = gtk.ANCHOR_CENTER,
+                    anchor = Gtk.ANCHOR_CENTER,
                     font = "Sans 7")
         cm = objcanvas.get_colormap()
         color = cm.alloc_color('#FFFFFF')
         if obj_evt.name in self.tracer.colormodel['operations']:
-            color = gtk.gdk.color_parse(self.tracer.colormodel['operations'][obj_evt.name])
+            color = Gdk.color_parse(self.tracer.colormodel['operations'][obj_evt.name])
         elif self.tracer.modelmapping['operations']:
             for k in self.tracer.modelmapping['operations']:
                 if obj_evt.name in self.tracer.modelmapping['operations'][k]:
@@ -2284,7 +2273,7 @@ class Inspector (gtk.VBox):
                     if x >=0:
                         kn = self.tracer.tracemodel[k][x]
                         if kn in self.tracer.colormodel[k]:
-                            color = gtk.gdk.color_parse(self.tracer.colormodel[k][kn])
+                            color = Gdk.color_parse(self.tracer.colormodel[k][kn])
                             break
                     else:
                         #BIG HACK, FIXME
@@ -2303,35 +2292,35 @@ class Inspector (gtk.VBox):
                                 if x >=0:
                                     kn = self.tracer.tracemodel[k][x]
                                     if kn in self.tracer.colormodel[k]:
-                                        color = gtk.gdk.color_parse(self.tracer.colormodel[k][kn])
+                                        color = Gdk.color_parse(self.tracer.colormodel[k][kn])
                                         break
-        objcanvas.modify_base (gtk.STATE_NORMAL, color)
+        objcanvas.modify_base (Gtk.StateType.NORMAL, color)
         objcanvas.set_size_request(60,20)
         if corpsstr != "":
             objcanvas.set_tooltip_text(corpsstr)
         if entetestr != "":
             entete.set_tooltip_text(entetestr)
 
-        box = gtk.EventBox()
+        box = Gtk.EventBox()
         def box_pressed(w, event, id):
             """Edit the element if double clicked
 
             @type id: advene id
             @param id: the id of the package element to edit
             """
-            if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+            if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
                 if id is not None:
                     obj = self.controller.package.get_element_by_id(id)
                     if obj is not None:
                         self.controller.gui.edit_element(obj)
                     else:
-                        print "item %s no longuer exists" % id
+                        print("item %s no longuer exists" % id)
             return
         box.add(entete)
         box.connect('button-press-event', box_pressed, obj_evt.concerned_object['id'])
         objcanvas.connect('button-press-event', box_pressed, obj_evt.concerned_object['id'])
-        hb.pack_start(box, expand=False)
-        hb.pack_end(objcanvas, expand=False)
+        hb.pack_start(box, False, True, 0)
+        hb.pack_end(objcanvas, False, True, 0)
         return hb
 
     def clean(self):
@@ -2348,11 +2337,11 @@ class Inspector (gtk.VBox):
         self.comment.set_text('')
         self.show_all()
 
-class DocGroup (Group):
+class DocGroup (CanvasGroup):
     """Group used to display a representation of the movie
     """
     def __init__(self, controller=None, canvas=None, name="N/A", x =10, y=10, w=80, h=20, fontsize=14, color_c=0x00000050):
-        Group.__init__(self, parent = canvas.get_root_item ())
+        CanvasGroup.__init__(self, parent = canvas.get_root_item ())
         self.controller=controller
         self.canvas=canvas
         self.name=name
@@ -2378,10 +2367,10 @@ class DocGroup (Group):
     def newRect(self):
         """Create a new rectangle to represent the movie.
 
-        @rtype: goocanvas.Rect
+        @rtype: GooCanvas.Rect
         @return: a new rectangle
         """
-        return goocanvas.Rect (parent = self,
+        return GooCanvas.Rect (parent = self,
                                     x = self.x,
                                     y = self.y,
                                     width = self.w,
@@ -2393,20 +2382,20 @@ class DocGroup (Group):
     def drawtimemarks(self):
         """Add begin and end time marks and 1-3 other
         """
-        nbmax = self.w / 10
+        nbmax = int(self.w / 10)
         if nbmax > 3:
             nbmax = 3
         #timestamp 0
-        self.timemarks.append(goocanvas.Text (parent = self,
+        self.timemarks.append(GooCanvas.Text (parent = self,
                                 text = time.strftime("%H:%M:%S", time.gmtime(0)),
                                 x = self.x,
                                 y = self.y+self.h+7,
                                 fill_color = self.color_c,
                                 width = -1,
-                                anchor = gtk.ANCHOR_CENTER,
+                                anchor = Gtk.ANCHOR_CENTER,
                                 font = "Sans 6"))
-        p = goocanvas.Points ([(self.x, self.y+self.h), (self.x, self.y+self.h+2)])
-        self.timemarks.append(goocanvas.Polyline (parent = self,
+        p = GooCanvas.Points ([(self.x, self.y+self.h), (self.x, self.y+self.h+2)])
+        self.timemarks.append(GooCanvas.Polyline (parent = self,
                                         close_path = False,
                                         points = p,
                                         stroke_color_rgba = self.color_c,
@@ -2415,16 +2404,16 @@ class DocGroup (Group):
                                         end_arrow = False
                                         ))
         #timestamp fin
-        self.timemarks.append(goocanvas.Text (parent = self,
+        self.timemarks.append(GooCanvas.Text (parent = self,
                                 text = time.strftime("%H:%M:%S", time.gmtime(self.movielength/1000)),
                                 x = self.x+self.w,
                                 y = self.y+self.h+7,
                                 fill_color = self.color_c,
                                 width = -1,
-                                anchor = gtk.ANCHOR_CENTER,
+                                anchor = Gtk.ANCHOR_CENTER,
                                 font = "Sans 6"))
-        p = goocanvas.Points ([(self.x+self.w, self.y+self.h), (self.x+self.w, self.y+self.h+2)])
-        self.timemarks.append(goocanvas.Polyline (parent = self,
+        p = GooCanvas.Points ([(self.x+self.w, self.y+self.h), (self.x+self.w, self.y+self.h+2)])
+        self.timemarks.append(GooCanvas.Polyline (parent = self,
                                         close_path = False,
                                         points = p,
                                         stroke_color_rgba = self.color_c,
@@ -2434,22 +2423,22 @@ class DocGroup (Group):
                                         ))
         if nbmax <=0:
             return
-        sec = self.movielength / 1000
+        sec = int(self.movielength / 1000)
         if sec < nbmax:
             return
         #1-3 timestamps intermediaires
         for i in range(0, nbmax+1):
             rap = 1.0 * i / (nbmax+1)
-            self.timemarks.append(goocanvas.Text (parent = self,
+            self.timemarks.append(GooCanvas.Text (parent = self,
                                 text = time.strftime("%H:%M:%S", time.gmtime(sec * rap)),
                                 x = self.x + self.w * rap,
                                 y = self.y+self.h+7,
                                 fill_color = self.color_c,
                                 width = -1,
-                                anchor = gtk.ANCHOR_CENTER,
+                                anchor = Gtk.ANCHOR_CENTER,
                                 font = "Sans 6"))
-            p = goocanvas.Points ([(self.x + self.w * rap, self.y+self.h), (self.x + self.w * rap, self.y+self.h+2)])
-            self.timemarks.append(goocanvas.Polyline (parent = self,
+            p = GooCanvas.Points ([(self.x + self.w * rap, self.y+self.h), (self.x + self.w * rap, self.y+self.h+2)])
+            self.timemarks.append(GooCanvas.Polyline (parent = self,
                                         close_path = False,
                                         points = p,
                                         stroke_color_rgba = self.color_c,
@@ -2501,7 +2490,7 @@ class DocGroup (Group):
             #print "%s %s %s" % (action.name, ACTIONS.index(action.name), color)
             for op in action.operations:
                 self.addMark(op.movietime,
-                             gdk2intrgba(gtk.gdk.color_parse(self.tracer.colormodel['actions'][action.name])))
+                             gdk2intrgba(Gdk.color_parse(self.tracer.colormodel['actions'][action.name])))
         elif obj is not None:
             self.addMark(obj.operation.movietime, 0xD9D919FF)
 
@@ -2514,13 +2503,13 @@ class DocGroup (Group):
         @param color: the rgba color of the mark
         """
         offset = 3
-        x=self.rect.get_bounds().x1 + self.w * time / self.movielength
+        x=self.rect.get_bounds().x1 + int(self.w * time / self.movielength)
         x1 = x-offset
         x2 = x+offset
         y2=self.rect.get_bounds().y1
         y1=y2-offset
-        p = goocanvas.Points ([(x1, y1), (x, y2), (x2, y1)])
-        l = goocanvas.Polyline (parent = self,
+        p = GooCanvas.Points ([(x1, y1), (x, y2), (x2, y1)])
+        l = GooCanvas.Polyline (parent = self,
                                         close_path = False,
                                         points = p,
                                         stroke_color_rgba = color,
@@ -2555,12 +2544,12 @@ class DocGroup (Group):
         @type offset: number
         @param offset: an offset to expand y bounds
         """
-        x=self.rect.get_bounds().x1 + self.w * time / self.movielength
+        x=self.rect.get_bounds().x1 + int(self.w * time / self.movielength)
         y1=self.rect.get_bounds().y1 - offset
         y2=self.rect.get_bounds().y2 + offset
-        p = goocanvas.Points ([(x, y1), (x, y2)])
-        #ld = goocanvas.LineDash([3.0, 3.0])
-        l = goocanvas.Polyline (parent = self,
+        p = GooCanvas.Points ([(x, y1), (x, y2)])
+        #ld = GooCanvas.LineDash([3.0, 3.0])
+        l = GooCanvas.Polyline (parent = self,
                                         close_path = False,
                                         points = p,
                                         stroke_color_rgba = color,
@@ -2575,9 +2564,5 @@ class DocGroup (Group):
         """Move in the movie if docgroup clicked
         """
         if ev.button == 1:
-            c=self.controller
-            pos = c.create_position (value=self.movielength * (ev.x-self.x)/self.w,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-            c.update_status (status="set", position=pos)
+            self.controller.update_status ("seek", self.movielength * (ev.x-self.x)/self.w)
 
diff --git a/lib/advene/gui/plugins/videoplayer.py b/lib/advene/gui/plugins/videoplayer.py
index d558032..7dedb01 100644
--- a/lib/advene/gui/plugins/videoplayer.py
+++ b/lib/advene/gui/plugins/videoplayer.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,8 +18,9 @@
 #
 
 from gettext import gettext as _
-import gtk
-import pango
+from gi.repository import Gdk
+from gi.repository import Gtk
+from gi.repository import Pango
 import os
 
 import advene.core.config as config
@@ -59,7 +60,7 @@ class VideoPlayer(AdhocView):
         if uri is None and 'uri' in a:
             self.uri=a['uri']
         if 'offset' in a:
-            self.offset=long(a['offset'])
+            self.offset=int(a['offset'])
 
         self.widget = self.build_widget()
         if self.uri is None:
@@ -92,7 +93,7 @@ class VideoPlayer(AdhocView):
         """
         if self.player is None:
             return True
-        s=self.player.get_stream_information()
+        s = self.player.get_stream_information()
         ps=self.controller.player.status
         if s.status != ps:
             # Update status
@@ -106,8 +107,8 @@ class VideoPlayer(AdhocView):
         # Synchronize time
         if ( (ps == self.player.PauseStatus or ps == self.player.PlayingStatus)
              and self.controller.player.current_position_value > 0
-             and abs( long(s.position) + self.offset - self.controller.player.current_position_value ) > 80 ):
-            self.player.update_status("set", self.controller.player.current_position_value + self.offset)
+             and abs( int(s.position) + self.offset - self.controller.player.current_position_value ) > 80 ):
+            self.player.update_status("seek", self.controller.player.current_position_value + self.offset)
         return True
 
     def get_save_arguments(self):
@@ -118,7 +119,7 @@ class VideoPlayer(AdhocView):
             arguments = [ ('offset', self.offset) ]
         return self.options, arguments
 
-    def select_file(self, button=None, *p):
+    def select_file(self, *p):
         mp=[ d for d in config.data.path['moviepath'].split(os.path.pathsep) if d != '_' ]
         if mp:
             default=mp[0]
@@ -138,8 +139,7 @@ class VideoPlayer(AdhocView):
         if self.player is None:
             return True
         self.uri = self.controller.locate_mediafile(fname)
-        self.player.playlist_clear()
-        self.player.playlist_add_item(self.uri)
+        self.player.set_uri(self.uri)
         self.label.set_text(os.path.basename(self.uri))
 
     def reparent_prepare(self):
@@ -174,24 +174,21 @@ class VideoPlayer(AdhocView):
     def update_status(self, status, position=None):
         """Wrapper for update_status to handle offsets.
         """
-        if self.player is None:
+        if self.player is None or position is None:
             return
-        if hasattr(position, 'value'):
-            position.value = position.value + self.offset
-        elif position is not None:
-            position = position + self.offset
+        position = position + self.offset
         self.player.update_status(status, position)
 
     def drag_received_cb(self, widget, context, x, y, selection, targetType, time):
         refTime = None
         if targetType == config.data.target_type['annotation']:
-            sources = [ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+            sources = [ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
             if sources:
                 # use first annotation as reference
                 refTime = sources[0].fragment.begin
         elif targetType == config.data.target_type['timestamp']:
-            data = decode_drop_parameters(selection.data)
-            refTime = long(data['timestamp'])
+            data = decode_drop_parameters(selection.get_data())
+            refTime = int(data['timestamp'])
         if refTime is not None:
             self.set_offset(refTime - self.controller.player.current_position_value)
         return True
@@ -201,37 +198,40 @@ class VideoPlayer(AdhocView):
         """
         if self.player is None:
             return None
-        w=gtk.Window()
-        d=gtk.Socket()
+        w=Gtk.Window()
+        d=Gtk.Socket()
         w.add(d)
         w.show_all()
-        self.player.set_visual(d.get_id())
+        try:
+            self.player.set_widget(d)
+        except AttributeError:
+            self.player.set_visual(d.get_id())
         return w
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
         self.player = self.controller.playerfactory.get_player()
 
         self.player.sound_mute()
 
-        self.drawable=gtk.Socket()
+        self.drawable=Gtk.Socket()
         def handle_remove(socket):
             # Do not kill the widget if the application exits
             return True
         self.drawable.connect('plug-removed', handle_remove)
 
-        black=gtk.gdk.Color(0, 0, 0)
-        for state in (gtk.STATE_ACTIVE, gtk.STATE_NORMAL,
-                      gtk.STATE_SELECTED, gtk.STATE_INSENSITIVE,
-                      gtk.STATE_PRELIGHT):
+        black=Gdk.Color(0, 0, 0)
+        for state in (Gtk.StateType.ACTIVE, Gtk.StateType.NORMAL,
+                      Gtk.StateType.SELECTED, Gtk.StateType.INSENSITIVE,
+                      Gtk.StateType.PRELIGHT):
             self.drawable.modify_bg (state, black)
 
         self.drawable.set_size_request(320, 200)
 
 
-        self.toolbar=gtk.Toolbar()
-        self.toolbar.set_style(gtk.TOOLBAR_ICONS)
+        self.toolbar=Gtk.Toolbar()
+        self.toolbar.set_style(Gtk.ToolbarStyle.ICONS)
 
         # Append the volume control to the toolbar
         def volume_change(scale, value):
@@ -239,70 +239,71 @@ class VideoPlayer(AdhocView):
                 self.player.sound_set_volume(int(value * 100))
             return True
 
-        self.audio_volume = gtk.VolumeButton()
+        self.audio_volume = Gtk.VolumeButton()
         self.audio_volume.set_value(self.player.sound_get_volume() / 100.0)
-        ti = gtk.ToolItem()
+        ti = Gtk.ToolItem()
         ti.add(self.audio_volume)
         self.audio_volume.connect('value-changed', volume_change)
         self.toolbar.insert(ti, -1)
 
-        sync_button=gtk.ToolButton(gtk.STOCK_CONNECT)
+        sync_button=Gtk.ToolButton(Gtk.STOCK_CONNECT)
         sync_button.set_tooltip_text(_("Synchronize"))
         sync_button.connect('clicked', self.synchronize)
         self.toolbar.insert(sync_button, -1)
 
         def offset_changed(spin):
-            self.offset = long(spin.get_value())
+            self.offset = int(spin.get_value())
             return True
 
-        ti = gtk.ToolItem()
-        self.offset_spin = gtk.SpinButton(gtk.Adjustment(value = self.offset,
-                                                         lower = - 24 * 60 * 60 * 1000,
-                                                         upper =   24 * 60 * 60 * 1000,
-                                                         step_incr = 1000 / config.data.preferences['default-fps'],
-                                                         page_incr = 1000))
+        ti = Gtk.ToolItem()
+        self.offset_spin = Gtk.SpinButton.new(Gtk.Adjustment.new(self.offset,
+                                                                 - 24 * 60 * 60 * 1000,
+                                                                 24 * 60 * 60 * 1000,
+                                                                 self.controller.frame2time(1),
+                                                                 1000,
+                                                                 500),
+                                              1000, 0)
         self.offset_spin.get_adjustment().connect('value-changed', offset_changed)
         ti.add(self.offset_spin)
         self.offset_spin.set_tooltip_text(_("Offset in ms"))
         self.toolbar.insert(ti, -1)
 
-        self.label = gtk.Label()
+        self.label = Gtk.Label()
         self.label.set_alignment(0, 0)
-        self.label.modify_font(pango.FontDescription("sans 10"))
+        self.label.modify_font(Pango.FontDescription("sans 10"))
 
         timestamp_button = get_pixmap_button('set-to-now.png')
         timestamp_button.set_tooltip_text(_("Drag and drop to get player time"))
-        enable_drag_source(timestamp_button, lambda: long(self.player.get_stream_information().position), self.controller)
-        # Cannot use a gtk.ToolButton since it cannot be drag_source
-        ti = gtk.ToolItem()
+        enable_drag_source(timestamp_button, lambda: int(self.player.get_stream_information().position), self.controller)
+        # Cannot use a Gtk.ToolButton since it cannot be drag_source
+        ti = Gtk.ToolItem()
         ti.add(timestamp_button)
         self.toolbar.insert(ti, -1)
 
-        black=gtk.gdk.color_parse('black')
-        white=gtk.gdk.color_parse('white')
-        eb=gtk.EventBox()
+        black=Gdk.color_parse('black')
+        white=Gdk.color_parse('white')
+        eb=Gtk.EventBox()
         eb.add(self.label)
-        for state in (gtk.STATE_ACTIVE, gtk.STATE_NORMAL,
-                      gtk.STATE_SELECTED, gtk.STATE_INSENSITIVE,
-                      gtk.STATE_PRELIGHT):
+        for state in (Gtk.StateType.ACTIVE, Gtk.StateType.NORMAL,
+                      Gtk.StateType.SELECTED, Gtk.StateType.INSENSITIVE,
+                      Gtk.StateType.PRELIGHT):
             self.label.modify_bg(state, black)
             eb.modify_bg(state, black)
             self.label.modify_fg(state, white)
 
         vbox.add(self.drawable)
-        vbox.pack_start(eb, expand=False)
-        vbox.pack_start(self.toolbar, expand=False)
+        vbox.pack_start(eb, False, True, 0)
+        vbox.pack_start(self.toolbar, False, True, 0)
 
         self.drawable.connect_after('realize', self.register_drawable)
 
         # Accept annotation/timestamp drop, to adjust time offset
         vbox.connect('drag-data-received', self.drag_received_cb)
-        vbox.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                           gtk.DEST_DEFAULT_HIGHLIGHT |
-                           gtk.DEST_DEFAULT_ALL,
-                           config.data.drag_type['annotation'] +
-                           config.data.drag_type['timestamp'],
-                           gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_MOVE)
+        vbox.drag_dest_set(Gtk.DestDefaults.MOTION |
+                           Gtk.DestDefaults.HIGHLIGHT |
+                           Gtk.DestDefaults.ALL,
+                           config.data.get_target_types('annotation', 'timestamp'),
+                           Gdk.DragAction.COPY | Gdk.DragAction.LINK | Gdk.DragAction.MOVE)
 
         vbox.show_all()
         return vbox
diff --git a/lib/advene/gui/popup.py b/lib/advene/gui/popup.py
index 2b673a5..f58a60c 100644
--- a/lib/advene/gui/popup.py
+++ b/lib/advene/gui/popup.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
 Generic popup menu used by the various Advene views.
 """
 
-import gtk
+from gi.repository import Gtk
 import re
 import os
 
@@ -38,7 +38,7 @@ from advene.model.query import Query
 
 from advene.rules.elements import RuleSet, Rule, Event, Condition, Action
 
-from advene.gui.util import image_from_position, dialog
+from advene.gui.util import image_from_position, dialog, get_clipboard
 import advene.util.helper as helper
 import advene.util.importer
 
@@ -50,7 +50,7 @@ class Menu:
         self.menu=self.make_base_menu(element)
 
     def popup(self):
-        self.menu.popup(None, None, None, 0, gtk.get_current_event_time())
+        self.menu.popup_at_pointer(None)
         return True
 
     def get_title (self, element):
@@ -58,11 +58,8 @@ class Menu:
         return self.controller.get_title(element, max_size=40)
 
     def goto_annotation (self, widget, ann):
-        c=self.controller
-        pos = c.create_position (value=ann.fragment.begin,
-                                 key=c.player.MediaTime,
-                                 origin=c.player.AbsolutePosition)
-        c.update_status (status="set", position=pos)
+        c = self.controller
+        c.update_status(status="seek", position=ann.fragment.begin)
         c.gui.set_current_annotation(ann)
         return True
 
@@ -170,18 +167,15 @@ class Menu:
         self.controller.gui.edit_element(el)
         return True
 
-    def nerd_service(self, widget, annotationtype):
-        # Relatively ugly hack becase the Importer GUI API does not
-        # allow to specify default parameters easily.
-        config.data.preferences['nerd-annotation-type'] = annotationtype.id
-        v = self.controller.gui.open_adhoc_view('importerview', filename='http://nerd.eurecom.fr/', message=_("Named-Entity extraction using NERD"), display_unlikely=False)
+    def filter_service(self, widget, importer, annotationtype):
+        self.controller.gui.open_adhoc_view('importerview', message=_("Apply %s") % importer.name, display_unlikely=False, importerclass=importer, source_type=annotationtype)
 
     def popup_get_offset(self):
         offset=dialog.entry_dialog(title='Enter an offset',
                                    text=_("Give the offset to use\non specified element.\nIt is in ms and can be\neither positive or negative."),
                                    default="0")
         if offset is not None:
-            return long(offset)
+            return int(offset)
         else:
             return offset
 
@@ -233,8 +227,8 @@ class Menu:
         return True
 
     def copy_id (self, widget, el):
-        clip=gtk.clipboard_get()
-        clip.set_text(el.id)
+        clip = get_clipboard()
+        clip.set_text(el.id, -1)
         return True
 
     def browse_element (self, widget, el):
@@ -290,9 +284,9 @@ class Menu:
 
     def add_menuitem(self, menu=None, item=None, action=None, *param, **kw):
         if item is None or item == "":
-            i = gtk.SeparatorMenuItem()
+            i = Gtk.SeparatorMenuItem()
         else:
-            i = gtk.MenuItem(item, use_underline=False)
+            i = Gtk.MenuItem(item, use_underline=False)
         if action is not None:
             i.connect('activate', action, *param, **kw)
         menu.append(i)
@@ -305,9 +299,9 @@ class Menu:
         @type element: an Advene element
 
         @return: the built menu
-        @rtype: gtk.Menu
+        @rtype: Gtk.Menu
         """
-        menu = gtk.Menu()
+        menu = Gtk.Menu()
 
         def add_item(*p, **kw):
             return self.add_menuitem(menu, *p, **kw)
@@ -343,7 +337,7 @@ class Menu:
             ResourceData: self.make_resourcedata_menu,
             }
 
-        for t, method in specific_builder.iteritems():
+        for t, method in specific_builder.items():
             if isinstance(element, t):
                 method(element, menu)
 
@@ -361,34 +355,34 @@ class Menu:
     def renumber_annotations(self, m, at):
         """Renumber all annotations of a given type.
         """
-        d = gtk.Dialog(title=_("Renumbering annotations of type %s") % self.get_title(at),
-                       parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                                 gtk.STOCK_OK, gtk.RESPONSE_OK,
+        d = Gtk.Dialog(title=_("Renumbering annotations of type %s") % self.get_title(at),
+                       parent=self.controller.gui.gui.win,
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+                                 Gtk.STOCK_OK, Gtk.ResponseType.OK,
                                  ))
-        l=gtk.Label()
+        l=Gtk.Label()
         l.set_markup(_("<b>Renumber all annotations according to their order.</b>\n\n<i>Note that this action cannot be undone.</i>\nReplace the first numeric value of the annotation content with the new annotation number.\nIf no numeric value is found and the annotation is structured, it will insert the number.\nIf no numeric value is found and the annotation is of type text/plain, it will overwrite the annotation content.\nThe offset parameter allows you to renumber from a given annotation."))
         l.set_line_wrap(True)
         l.show()
         d.vbox.add(l)
 
-        hb=gtk.HBox()
-        l=gtk.Label(_("Offset"))
-        hb.pack_start(l, expand=False)
-        s=gtk.SpinButton()
-        s.set_range(1, len(at.annotations))
+        hb=Gtk.HBox()
+        l=Gtk.Label(label=_("Offset"))
+        hb.pack_start(l, False, True, 0)
+        s=Gtk.SpinButton()
+        s.set_range(-5, len(at.annotations))
         s.set_value(1)
         s.set_increments(1, 5)
         hb.add(s)
-        d.vbox.pack_start(hb, expand=False)
+        d.vbox.pack_start(hb, False, True, 0)
 
         d.connect('key-press-event', dialog.dialog_keypressed_cb)
         d.show_all()
         dialog.center_on_mouse(d)
 
         res=d.run()
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             re_number=re.compile('(\d+)')
             re_struct=re.compile('^num=(\d+)$', re.MULTILINE)
             offset=s.get_value_as_int() - 1
@@ -396,19 +390,19 @@ class Menu:
             l.sort(key=lambda a: a.fragment.begin)
             l=l[offset:]
             size=float(len(l))
-            dial=gtk.Dialog(_("Renumbering %d annotations") % size,
-                           None,
-                           gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-                           (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
-            prg=gtk.ProgressBar()
-            dial.vbox.pack_start(prg, expand=False)
+            dial=Gtk.Dialog(_("Renumbering %d annotations") % size,
+                           self.controller.gui.gui.win,
+                           Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                           (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL))
+            prg=Gtk.ProgressBar()
+            dial.vbox.pack_start(prg, False, True, 0)
             dial.show_all()
 
             for i, a in enumerate(l[offset:]):
                 prg.set_text(_("Annotation #%d") % i)
                 prg.set_fraction( i / size )
-                while gtk.events_pending():
-                    gtk.main_iteration()
+                while Gtk.events_pending():
+                    Gtk.main_iteration()
 
                 if a.type.mimetype == 'application/x-advene-structured':
                     if re_struct.search(a.content.data):
@@ -433,6 +427,41 @@ class Menu:
         d.destroy()
         return True
 
+    def split_package_by_type(self, element):
+        title = self.controller.get_title(element)
+        count = len(element.annotations)
+        dial=Gtk.Dialog(_("Splitting package according to %s") % title,
+                        self.controller.gui.gui.win,
+                        Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT)
+        label = Gtk.Label(_("For each of the %(count)d annotations in %(atype)s, create a package named after the source package and the annotation content, copying only annotations contained in the reference annotation.") % { 'count': count,
+                                                                                                                                                                                                                                   'atype': title })
+        label.set_max_width_chars(50)
+        dial.vbox.pack_start(label, False, True, 0)
+        progress_bar=Gtk.ProgressBar()
+        progress_bar.set_text("")
+        progress_bar.set_show_text(True)
+        dial.vbox.pack_start(progress_bar, False, True, 0)
+
+        should_continue = True
+        def do_cancel(b):
+            nonlocal should_continue
+            should_continue = False
+            return True
+        cancel_button = dial.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
+        cancel_button.connect("clicked", do_cancel)
+        dial.show_all()
+
+        def progress_callback(name, filename, n, index):
+            nonlocal should_continue
+            progress_bar.set_text(_("Created %(name)s - %(n) annotations") % locals())
+            progress_bar.set_fraction( index / count )
+            while Gtk.events_pending():
+                Gtk.main_iteration()
+            return should_continue
+
+        self.controller.split_package_by_type(element, callback=progress_callback)
+        dial.destroy()
+
     def extract_fragment(self, m, ann):
         """Extract the fragment corresponding to an annotation.
         """
@@ -448,7 +477,7 @@ class Menu:
     def common_submenu(self, element):
         """Build the common submenu for all elements.
         """
-        submenu=gtk.Menu()
+        submenu=Gtk.Menu()
         def add_item(*p, **kw):
             self.add_menuitem(submenu, *p, **kw)
 
@@ -489,7 +518,7 @@ class Menu:
 
     def activate_submenu(self, element):
         """Build an "activate" submenu for the given annotation"""
-        submenu=gtk.Menu()
+        submenu=Gtk.Menu()
         def add_item(*p, **kw):
             self.add_menuitem(submenu, *p, **kw)
 
@@ -513,7 +542,7 @@ class Menu:
         add_item(_("Go to..."), self.goto_annotation, element)
         add_item(_("Loop"), loop_on_annotation, element)
         add_item(_("Duplicate"), self.duplicate_annotation, element)
-        item = gtk.MenuItem(_("Highlight"), use_underline=False)
+        item = Gtk.MenuItem(_("Highlight"), use_underline=False)
         item.set_submenu(self.activate_submenu(element))
         menu.append(item)
         add_item(_("Save snapshot..."), save_snapshot, element)
@@ -534,7 +563,7 @@ class Menu:
                     submenu.append(c)
             else:
                 for i in items:
-                    item=gtk.MenuItem(self.get_title(i), use_underline=False)
+                    item=Gtk.MenuItem(self.get_title(i), use_underline=False)
                     m=Menu(element=i, controller=self.controller)
                     item.set_submenu(m.menu)
                     submenu.append(item)
@@ -548,30 +577,30 @@ class Menu:
                 # The submenu was already populated.
                 return False
             if el.incomingRelations:
-                i=gtk.MenuItem(_("Incoming"))
+                i=Gtk.MenuItem(_("Incoming"))
                 submenu.append(i)
-                i=gtk.SeparatorMenuItem()
+                i=Gtk.SeparatorMenuItem()
                 submenu.append(i)
-                for t, l in el.typedRelatedIn.iteritems():
+                for t, l in el.typedRelatedIn.items():
                     at=self.controller.package.get_element_by_id(t)
-                    m=gtk.MenuItem(self.get_title(at), use_underline=False)
-                    amenu=gtk.Menu()
+                    m=Gtk.MenuItem(self.get_title(at), use_underline=False)
+                    amenu=Gtk.Menu()
                     m.set_submenu(amenu)
                     amenu.connect('map', build_submenu, at, l)
                     submenu.append(m)
             if submenu.get_children():
                 # There were incoming annotations. Use a separator
-                i=gtk.SeparatorMenuItem()
+                i=Gtk.SeparatorMenuItem()
                 submenu.append(i)
             if el.outgoingRelations:
-                i=gtk.MenuItem(_("Outgoing"))
+                i=Gtk.MenuItem(_("Outgoing"))
                 submenu.append(i)
-                i=gtk.SeparatorMenuItem()
+                i=Gtk.SeparatorMenuItem()
                 submenu.append(i)
-                for t, l in el.typedRelatedOut.iteritems():
+                for t, l in el.typedRelatedOut.items():
                     at=self.controller.package.get_element_by_id(t)
-                    m=gtk.MenuItem(self.get_title(at), use_underline=False)
-                    amenu=gtk.Menu()
+                    m=Gtk.MenuItem(self.get_title(at), use_underline=False)
+                    amenu=Gtk.Menu()
                     m.set_submenu(amenu)
                     amenu.connect('map', build_submenu, at, l)
                     submenu.append(m)
@@ -579,31 +608,32 @@ class Menu:
             return False
 
         if element.relations:
-            i=gtk.MenuItem(_("Related annotations"), use_underline=False)
-            submenu=gtk.Menu()
+            i=Gtk.MenuItem(_("Related annotations"), use_underline=False)
+            submenu=Gtk.Menu()
             i.set_submenu(submenu)
             submenu.connect('map', build_related, element)
             menu.append(i)
 
             if element.incomingRelations:
-                i=gtk.MenuItem(_("Incoming relations"), use_underline=False)
-                submenu=gtk.Menu()
+                i=Gtk.MenuItem(_("Incoming relations"), use_underline=False)
+                submenu=Gtk.Menu()
                 i.set_submenu(submenu)
                 submenu.connect('map', build_submenu, element, element.incomingRelations)
                 menu.append(i)
 
             if element.outgoingRelations:
-                i=gtk.MenuItem(_("Outgoing relations"), use_underline=False)
-                submenu=gtk.Menu()
+                i=Gtk.MenuItem(_("Outgoing relations"), use_underline=False)
+                submenu=Gtk.Menu()
                 i.set_submenu(submenu)
                 submenu.connect('map', build_submenu, element, element.outgoingRelations)
                 menu.append(i)
 
         add_item("")
 
-        item = gtk.MenuItem()
+        item = Gtk.MenuItem()
         item.add(image_from_position(self.controller,
                                      position=element.fragment.begin,
+                                     media=element.media,
                                      height=60))
         item.connect('activate', self.goto_annotation, element)
         menu.append(item)
@@ -621,7 +651,7 @@ class Menu:
         add_item(element.content.data)
         add_item(_('Members:'))
         for a in element.members:
-            item=gtk.MenuItem(self.get_title(a), use_underline=False)
+            item=Gtk.MenuItem(self.get_title(a), use_underline=False)
             m=Menu(element=a, controller=self.controller)
             item.set_submenu(m.menu)
             menu.append(item)
@@ -656,7 +686,7 @@ class Menu:
 
         if element.resourcepath == '':
             # Resources root
-            if not element.has_key('soundclips'):
+            if 'soundclips' not in element:
                 # Create the soundclips folder
                 element['soundclips'] = element.DIRECTORY_TYPE
                 self.controller.notify('ResourceCreate', resource=element['soundclips'])
@@ -740,10 +770,11 @@ class Menu:
         add_item(_('Create a comment view'), lambda i: create_static(element))
         add_item(_('Generate a caption dynamic view...'), lambda i: self.create_dynamic_view(element))
         add_item(_('Display as transcription'), lambda i: self.controller.gui.open_adhoc_view('transcription', source='here/annotationTypes/%s/annotations/sorted' % element.id))
-        add_item(_('Display annotations in table'), lambda i: self.controller.gui.open_adhoc_view('table', elements=element.annotations))
+        add_item(_('Display annotations in table'), lambda i: self.controller.gui.open_adhoc_view('table', elements=element.annotations, source='here/annotationTypes/%s/annotations' % element.id))
         add_item(_('Export to another format...'), lambda i: self.controller.gui.export_element(element))
-        if [ i for i in advene.util.importer.IMPORTERS if 'NERD' in i.name ]:
-            add_item(_('Extract Named Entities...'), self.nerd_service, element)
+        add_item(_('Split according to annotations'), lambda i: self.split_package_by_type(element))
+        for imp in ( i for i in advene.util.importer.IMPORTERS if i.annotation_filter ):
+            add_item(_("Apply %s..." % imp.name), self.filter_service, imp, element)
         if self.readonly:
             return
         add_item(None)
@@ -817,20 +848,20 @@ class Menu:
                                                     query=element,
                                                     result=res,
                                                     destination='east')
-            except Exception, e:
-                self.controller.log(_('Exception in query: %s') % unicode(e))
+            except Exception as e:
+                self.controller.log(_('Exception in query: %s') % str(e))
             return True
 
-        m=gtk.MenuItem(_('Apply query on...'))
+        m=Gtk.MenuItem(_('Apply query on...'))
         menu.append(m)
-        sm=gtk.Menu()
+        sm=Gtk.Menu()
         m.set_submenu(sm)
         for (expr, label) in (
              ('package', _('the package')),
              ('package/annotations', _('all annotations of the package')),
              ('package/annotations/first', _('the first annotation of the package')),
             ):
-            i=gtk.MenuItem(label)
+            i=Gtk.MenuItem(label)
             i.connect('activate', try_query, expr)
             sm.append(i)
         return
diff --git a/lib/advene/gui/util/__init__.py b/lib/advene/gui/util/__init__.py
index b01be20..2946d55 100644
--- a/lib/advene/gui/util/__init__.py
+++ b/lib/advene/gui/util/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,14 +18,19 @@
 #
 """GUI helper methods.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 from gettext import gettext as _
 
-import gtk
-import gobject
-import urlparse
-import urllib
-import StringIO
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import Gtk
+from gi.repository import GObject
+
+import urllib.parse
+import urllib.request, urllib.parse, urllib.error
+import io
 
 import advene.core.config as config
 from advene.model.schema import Schema, AnnotationType, RelationType
@@ -43,49 +48,51 @@ predefined_content_mimetypes=[
     ('image/svg+xml', _("SVG graphics content")),
     ]
 
-if hasattr(gtk, 'image_new_from_pixbuf'):
-    image_new_from_pixbuf=gtk.image_new_from_pixbuf
-else:
-    def my_image_new_from_pixbuf(pb, width=None):
-        i=gtk.Image()
-        if width:
-            height = width * pb.get_height() / pb.get_width()
-            p=pb.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR)
-        else:
-            p=pb
-        i.set_from_pixbuf(p)
-        return i
-    image_new_from_pixbuf=my_image_new_from_pixbuf
+if not hasattr(Gtk.Menu, 'popup_at_pointer'):
+    # Monkey patch Gtk.Menu (popup_at_pointer is available only in Gtk >= 3.22)
+    def popup_at_pointer(widget, event):
+        widget.popup(None, None, None, None, 0, Gtk.get_current_event_time())
+    Gtk.Menu.popup_at_pointer = popup_at_pointer
+
+def image_new_from_pixbuf(pb, width=None):
+    i=Gtk.Image()
+    if width:
+        height = int(width * pb.get_height() / pb.get_width())
+        p=pb.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR)
+    else:
+        p=pb
+    i.set_from_pixbuf(p)
+    return i
 
 def png_to_pixbuf (png_data, width=None, height=None):
     """Load PNG data into a pixbuf
     """
-    loader = gtk.gdk.PixbufLoader ('png')
-    if not isinstance(png_data, str):
-        png_data=str(png_data)
+    loader = GdkPixbuf.PixbufLoader.new_with_type('png')
+    if not isinstance(png_data, bytes):
+        png_data=bytes(png_data)
     try:
-        loader.write (png_data, len (png_data))
+        loader.write(png_data)
         pixbuf = loader.get_pixbuf ()
         loader.close ()
-    except gobject.GError:
+    except GObject.GError:
         # The PNG data was invalid.
-        pixbuf=gtk.gdk.pixbuf_new_from_file(config.data.advenefile( ( 'pixmaps', 'notavailable.png' ) ))
+        pixbuf=GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile( ( 'pixmaps', 'notavailable.png' ) ))
 
     if width and not height:
-        height = width * pixbuf.get_height() / pixbuf.get_width()
+        height = int(width * pixbuf.get_height() / pixbuf.get_width())
     if height and not width:
-        width = height * pixbuf.get_width() / pixbuf.get_height()
+        width = int(height * pixbuf.get_width() / pixbuf.get_height())
     if width and height:
-        p=pixbuf.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR)
+        p=pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.BILINEAR)
         return p
     else:
         return pixbuf
 
-def image_from_position(controller, position=None, width=None, height=None, epsilon=None):
-    i=gtk.Image()
+def image_from_position(controller, position=None, media=None, width=None, height=None, precision=None):
+    i=Gtk.Image()
     if position is None:
-        position=controller.player.current_position_value
-    pb=png_to_pixbuf (controller.package.imagecache.get(position, epsilon), width=width, height=height)
+        position = controller.player.current_position_value
+    pb = png_to_pixbuf(controller.get_snapshot(position=position, media=media, precision=precision), width=width, height=height)
     i.set_from_pixbuf(pb)
     return i
 
@@ -103,38 +110,38 @@ def overlay_svg_as_pixbuf(png_data, svg_data, width=None, height=None):
 """ % svg_data
 
     try:
-        loader = gtk.gdk.PixbufLoader('svg')
-    except Exception, e:
-        print "Unable to load the SVG pixbuf loader: ", str(e)
+        loader = GdkPixbuf.PixbufLoader.new_with_type('svg')
+    except:
+        logger.error("Unable to load the SVG pixbuf loader", exc_info=True)
         loader=None
     if loader is not None:
         try:
-            loader.write(svg_data)
+            loader.write(svg_data.encode('utf-8'))
             loader.close ()
             p = loader.get_pixbuf ()
             w = p.get_width()
             h = p.get_height()
-            pixbuf=png_to_pixbuf (png_data).scale_simple(w, h, gtk.gdk.INTERP_BILINEAR)
-            p.composite(pixbuf, 0, 0, w, h, 0, 0, 1.0, 1.0, gtk.gdk.INTERP_BILINEAR, 255)
-        except gobject.GError, e:
+            pixbuf=png_to_pixbuf (png_data).scale_simple(w, h, GdkPixbuf.InterpType.BILINEAR)
+            p.composite(pixbuf, 0, 0, w, h, 0, 0, 1.0, 1.0, GdkPixbuf.InterpType.BILINEAR, 255)
+        except GObject.GError:
             # The PNG data was invalid.
-            print "Invalid image data", e
-            pixbuf=gtk.gdk.pixbuf_new_from_file(config.data.advenefile( ( 'pixmaps', 'notavailable.png' ) ))
+            logger.error("Invalid image data", exc_info=True)
+            pixbuf=GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile( ( 'pixmaps', 'notavailable.png' ) ))
     else:
-        pixbuf=gtk.gdk.pixbuf_new_from_file(config.data.advenefile( ( 'pixmaps', 'notavailable.png' ) ))
+        pixbuf=GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile( ( 'pixmaps', 'notavailable.png' ) ))
 
     if width and not height:
         height = 1.0 * width * pixbuf.get_height() / pixbuf.get_width()
     if height and not width:
         width = 1.0 * height * pixbuf.get_width() / pixbuf.get_height()
     if width and height:
-        p=pixbuf.scale_simple(int(width), int(height), gtk.gdk.INTERP_BILINEAR)
+        p=pixbuf.scale_simple(int(width), int(height), GdkPixbuf.InterpType.BILINEAR)
         return p
     return pixbuf
 
 def overlay_svg_as_png(png_data, svg_data):
     pixbuf=overlay_svg_as_pixbuf(png_data, svg_data)
-    s=StringIO.StringIO()
+    s=io.StringIO()
     def pixbuf_save_func(buf):
         s.write(buf)
         return True
@@ -142,15 +149,15 @@ def overlay_svg_as_png(png_data, svg_data):
     return s.getvalue()
 
 def get_small_stock_button(sid, callback=None, *p):
-    b=gtk.Button()
-    b.add(gtk.image_new_from_stock(sid, gtk.ICON_SIZE_SMALL_TOOLBAR))
+    b=Gtk.Button()
+    b.add(Gtk.Image.new_from_stock(sid, Gtk.IconSize.SMALL_TOOLBAR))
     if callback:
         b.connect('clicked', callback, *p)
     return b
 
 def get_pixmap_button(pixmap, callback=None, *p):
-    b=gtk.Button()
-    i=gtk.Image()
+    b=Gtk.Button()
+    i=Gtk.Image()
     i.set_from_file(config.data.advenefile( ( 'pixmaps', pixmap) ))
     b.add(i)
     i.show()
@@ -161,11 +168,11 @@ def get_pixmap_button(pixmap, callback=None, *p):
 def get_pixmap_toolbutton(pixmap, callback=None, *p):
     if pixmap.startswith('gtk-'):
         # Stock-id
-        b=gtk.ToolButton(pixmap)
+        b=Gtk.ToolButton(pixmap)
     else:
-        i=gtk.Image()
+        i=Gtk.Image()
         i.set_from_file(config.data.advenefile( ( 'pixmaps', pixmap) ))
-        b=gtk.ToolButton(icon_widget=i)
+        b=Gtk.ToolButton(icon_widget=i)
         i.show()
     if callback:
         b.connect('clicked', callback, *p)
@@ -176,7 +183,7 @@ color_cache={}
 def name2color(color):
     """Return the gtk color for the given color name or code.
     """
-    if isinstance(color, gtk.gdk.Color):
+    if isinstance(color, Gdk.Color):
         gtk_color = color
     elif color:
         # Found a color. Cache it.
@@ -184,150 +191,77 @@ def name2color(color):
             gtk_color=color_cache[color]
         except KeyError:
             try:
-                color_cache[color]=gtk.gdk.color_parse(color)
+                color_cache[color]=Gdk.color_parse(color)
             except (TypeError, ValueError):
-                print "Unable to parse ", color
+                logger.error("Unable to parse color %s", color)
                 color_cache[color]=None
             gtk_color=color_cache[color]
     else:
         gtk_color=None
     return gtk_color
 
-def get_color_style(w, background=None, foreground=None):
-    """Return a style for a widget with given colors.
-    """
-    if background is None:
-        background='white'
-    if foreground is None:
-        foreground='black'
-    b=name2color(background)
-    f=name2color(foreground)
-
-    style=w.get_style().copy()
-    for state in (gtk.STATE_ACTIVE, gtk.STATE_NORMAL,
-                  gtk.STATE_SELECTED, gtk.STATE_INSENSITIVE,
-                  gtk.STATE_PRELIGHT):
-        style.bg[state]=b
-        style.fg[state]=f
-        style.text[state]=f
-        #style.base[state]=white
-    return style
-
-arrow_up_xpm="""13 16 2 1
-       c None
-.      c #FF0000
-      .
-     ...
-    .....
-   .......
-  .........
- ...........
-.............
-     ...
-     ...
-     ...
-     ...
-     ...
-     ...
-     ...
-     ...
-     ...
-""".splitlines()
-
-arrow_right_xpm="""16 13 2 1
-. c None
-# c #ff0000
-................
-..........#.....
-..........##....
-..........###...
-..........####..
-###############.
-################
-###############.
-..........####..
-..........###...
-..........##....
-..........#.....
-................""".splitlines()
-
-
-def shaped_window_from_xpm(xpm):
-    # Code adapted from evolution/widgets/table/e-table-header-item.c
-    pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(xpm)
-    pixmap, bitmap = pixbuf.render_pixmap_and_mask()
-
-    gtk.widget_push_colormap(gtk.gdk.rgb_get_colormap())
-    win = gtk.Window(gtk.WINDOW_POPUP)
-    pix = gtk.Image()
-    pix.set_from_pixmap(pixmap, bitmap)
-    win.realize()
-    win.add(pix)
-    win.shape_combine_mask(bitmap, 0, 0)
-    gtk.widget_pop_colormap()
-    return win
-
 def encode_drop_parameters(**kw):
     """Encode the given parameters as drop parameters.
 
     @return: a string
     """
     for k in kw:
-        if isinstance(kw[k], unicode):
-            kw[k]=kw[k].encode('utf8')
-        if not isinstance(kw[k], basestring):
+        if not isinstance(kw[k], str):
             kw[k]=str(kw[k])
-    return urllib.urlencode(kw).encode('utf8')
+    return urllib.parse.urlencode(kw).encode('utf8')
 
 def decode_drop_parameters(data):
     """Decode the drop parameters.
 
     @return: a dict.
     """
-    return dict( (k, unicode(v, 'utf8'))
-                 for (k, v) in urlparse.parse_qsl(unicode(data, 'utf8').encode('utf8')) )
+    if isinstance(data, bytes):
+        data = data.decode('utf-8')
+    return dict( (k, v)
+                 for (k, v) in urllib.parse.parse_qsl(data) )
 
 def get_target_types(el):
     """Return DND target types for element.
     """
     targets = []
     if isinstance(el, Annotation):
-        targets.extend(config.data.drag_type['annotation']
-                       + config.data.drag_type['timestamp']
-                       + config.data.drag_type['tag'])
+        targets.extend(config.data.get_target_types('annotation', 'timestamp', 'tag'))
     elif isinstance(el, Relation):
-        targets.extend(config.data.drag_type['relation'])
+        targets.extend(config.data.get_target_types('relation'))
     elif isinstance(el, View):
         if helper.get_view_type(el) == 'adhoc':
-            targets.extend(config.data.drag_type['adhoc-view'])
+            targets.extend(config.data.get_target_types('adhoc-view'))
         else:
-            targets.extend(config.data.drag_type['view'])
+            targets.extend(config.data.get_target_types('view'))
     elif isinstance(el, AnnotationType):
-        targets.extend(config.data.drag_type['annotation-type'])
+        targets.extend(config.data.get_target_types('annotation-type'))
     elif isinstance(el, RelationType):
-        targets.extend(config.data.drag_type['relation-type'])
+        targets.extend(config.data.get_target_types('relation-type'))
     elif isinstance(el, Query):
-        targets.extend(config.data.drag_type['query'])
+        targets.extend(config.data.get_target_types('query'))
     elif isinstance(el, Schema):
-        targets.extend(config.data.drag_type['schema'])
-    elif isinstance(el, (int, long)):
-        targets.extend(config.data.drag_type['timestamp'])
+        targets.extend(config.data.get_target_types('schema'))
+    elif isinstance(el, int):
+        targets.extend(config.data.get_target_types('timestamp'))
     # FIXME: Resource
 
-    targets.extend(config.data.drag_type['uri-list']
-                   + config.data.drag_type['text-plain']
-                   + config.data.drag_type['TEXT']
-                   + config.data.drag_type['STRING'])
+    targets.extend(config.data.get_target_types('uri-list',
+                                                'text-plain',
+                                                'TEXT',
+                                                'STRING'))
     return targets
 
 def drag_data_get_cb(widget, context, selection, targetType, timestamp, controller):
     """Generic drag-data-get handler.
 
+    It is used by the origin widget of a drag action, when the
+    destination widget queries for the DND data.
+
     Usage information:
     this method must be connected passing the controller as user data:
       widget.connect('drag-data-get', drag_data_get_cb, controller)
 
-    and the context must has a _element attribute (defined in a
+    and the context must have a _element attribute (defined in a
     'drag-begin' handler for instance).
     """
     typ=config.data.target_type
@@ -338,10 +272,10 @@ def drag_data_get_cb(widget, context, selection, targetType, timestamp, controll
         widgets = widget.container.get_selected_annotation_widgets()
         if not widget in widgets:
             widgets = None
-    except AttributeError:
+    except (AttributeError, RuntimeError):
+        logger.error("Cannot get_selected_annotation_widgets", exc_info=True)
         widgets=None
 
-
     d={ typ['annotation']: Annotation,
         typ['annotation-type']: AnnotationType,
         typ['relation']: Relation,
@@ -354,38 +288,38 @@ def drag_data_get_cb(widget, context, selection, targetType, timestamp, controll
         if not isinstance(el, d[targetType]):
             return False
         if widgets:
-            selection.set(selection.target, 8, "\n".join( w.annotation.uri for w in widgets ).encode('utf8'))
+            selection.set(selection.get_target(), 8, "\n".join( w.annotation.uri for w in widgets ).encode('utf8'))
         else:
-            selection.set(selection.target, 8, el.uri.encode('utf8'))
+            selection.set(selection.get_target(), 8, el.uri.encode('utf8'))
         return True
     elif targetType == typ['adhoc-view']:
         if helper.get_view_type(el) != 'adhoc':
             return False
-        selection.set(selection.target, 8, encode_drop_parameters(id=el.id))
+        selection.set(selection.get_target(), 8, encode_drop_parameters(id=el.id))
         return True
     elif targetType == typ['uri-list']:
 
         if widgets:
-            selection.set(selection.target, 8, "\n".join( controller.build_context(here=w.annotation.uri).evaluateValue('here/absolute_url') for w in widgets ).encode('utf8'))
+            selection.set(selection.get_target(), 8, "\n".join( controller.build_context(here=w.annotation).evaluateValue('here/absolute_url') for w in widgets ).encode('utf8'))
         else:
             try:
                 uri=controller.build_context(here=el).evaluateValue('here/absolute_url')
             except:
-                uri="No URI for " + unicode(el)
-            selection.set(selection.target, 8, uri.encode('utf8'))
+                uri="No URI for " + str(el)
+            selection.set(selection.get_target(), 8, uri.encode('utf8'))
     elif targetType == typ['timestamp']:
-        if isinstance(el, (int, long)):
-            selection.set(selection.target, 8, encode_drop_parameters(timestamp=el))
+        if isinstance(el, int):
+            selection.set(selection.get_target(), 8, encode_drop_parameters(timestamp=el))
         elif isinstance(el, Annotation):
-            selection.set(selection.target, 8, encode_drop_parameters(timestamp=el.fragment.begin,
+            selection.set(selection.get_target(), 8, encode_drop_parameters(timestamp=el.fragment.begin,
                                                                       comment=controller.get_title(el)))
         else:
-            print "Inconsistent DND target"
+            logger.error("Inconsistent DND target %s", targetType)
         return True
     elif targetType in (typ['text-plain'], typ['STRING']):
-        selection.set(selection.target, 8, controller.get_title(el).encode('utf8'))
+        selection.set(selection.get_target(), 8, controller.get_title(el).encode('utf8'))
     else:
-        print "Unknown target type for drag: %d" % targetType
+        logger.warn("Unknown target type for drag: %d" % targetType)
     return True
 
 def contextual_drag_begin(widget, context, element, controller):
@@ -398,85 +332,79 @@ def contextual_drag_begin(widget, context, element, controller):
             return False
 
     # set_icon_widget does not work on native Gtk on MacOS X
-    if config.data.os == 'darwin' and not os.environ.get('DISPLAY'):
-        return False
+    #if config.data.os == 'darwin' and not os.environ.get('DISPLAY'):
+    #    return False
     # set_icon_widget is broken ATM in recent gtk on win32.
-    elif config.data.os == 'win32':
-        return False
+    #elif config.data.os == 'win32':
+    #    return False
 
-    w=gtk.Window(gtk.WINDOW_POPUP)
+    w=Gtk.Window(Gtk.WindowType.POPUP)
     w.set_decorated(False)
+    w.get_style_context().add_class('advene_drag_icon')
 
-    bw_style=get_color_style(w, 'black', 'white')
-    w.set_style(bw_style)
-
-    v=gtk.VBox()
-    v.set_style(bw_style)
+    v=Gtk.VBox()
+    v.get_style_context().add_class('advene_drag_icon')
 
     def get_coloured_label(t, color=None):
-        l=gtk.Label()
-        #l.set_ellipsize(pango.ELLIPSIZE_END)
+        l=Gtk.Label()
+        #l.set_ellipsize(Pango.EllipsizeMode.END)
         if color is None:
             color='white'
         l.set_markup("""<span background="%s" foreground="black">%s</span>""" % (color, t.replace('<', '<')))
         return l
 
-    cache=controller.package.imagecache
+    if isinstance(element, int):
+        begin = image_new_from_pixbuf(png_to_pixbuf(controller.get_snapshot(position=element, precision=config.data.preferences['bookmark-snapshot-precision']), width=config.data.preferences['drag-snapshot-width']))
+        begin.get_style_context().add_class('advene_drag_icon')
 
-    if isinstance(element, (long, int)):
-        begin=image_new_from_pixbuf(png_to_pixbuf (cache.get(element, epsilon=config.data.preferences['bookmark-snapshot-precision']), width=config.data.preferences['drag-snapshot-width']))
-        begin.set_style(bw_style)
-
-        l=gtk.Label()
-        l.set_style(bw_style)
+        l=Gtk.Label()
         l.set_text(helper.format_time(element))
-        l.set_style(bw_style)
+        l.get_style_context().add_class('advene_drag_icon')
 
-        v.pack_start(begin, expand=False)
-        v.pack_start(l, expand=False)
-        w.set_style(bw_style)
-        w.set_size_request(long(1.5 * config.data.preferences['drag-snapshot-width']), -1)
+        v.pack_start(begin, False, True, 0)
+        v.pack_start(l, False, True, 0)
+        w.set_size_request(int(1.5 * config.data.preferences['drag-snapshot-width']), -1)
     elif isinstance(element, Annotation):
         # Pictures HBox
-        h=gtk.HBox()
-        h.set_style(bw_style)
-        begin=image_new_from_pixbuf(png_to_pixbuf (cache.get(element.fragment.begin), width=config.data.preferences['drag-snapshot-width']))
-        begin.set_style(bw_style)
-        h.pack_start(begin, expand=False)
+        h=Gtk.HBox()
+        h.get_style_context().add_class('advene_drag_icon')
+        begin = image_new_from_pixbuf(png_to_pixbuf(controller.get_snapshot(annotation=element), width=config.data.preferences['drag-snapshot-width']))
+        begin.get_style_context().add_class('advene_drag_icon')
+        h.pack_start(begin, False, True, 0)
         # Padding
-        h.pack_start(gtk.HBox(), expand=True)
-        end=image_new_from_pixbuf(png_to_pixbuf (cache.get(element.fragment.end), width=config.data.preferences['drag-snapshot-width']))
-        end.set_style(bw_style)
-        h.pack_start(end, expand=False)
-        v.pack_start(h, expand=False)
+        h.pack_start(Gtk.HBox(), True, True, 0)
+        end = image_new_from_pixbuf(png_to_pixbuf(controller.get_snapshot(annotation=element, position=element.fragment.end), width=config.data.preferences['drag-snapshot-width']))
+        end.get_style_context().add_class('advene_drag_icon')
+        h.pack_start(end, False, True, 0)
+        v.pack_start(h, False, True, 0)
 
         l=get_coloured_label(controller.get_title(element), controller.get_element_color(element))
-        l.set_style(bw_style)
-        v.pack_start(l, expand=False)
-        w.set_style(bw_style)
-        w.set_size_request(long(2.5 * config.data.preferences['drag-snapshot-width']), -1)
+        l.get_style_context().add_class('advene_drag_icon')
+        v.pack_start(l, False, True, 0)
+        w.get_style_context().add_class('advene_drag_icon')
+        w.set_size_request(int(2.5 * config.data.preferences['drag-snapshot-width']), -1)
     elif isinstance(element, AnnotationType):
         l=get_coloured_label(_("Annotation Type %(title)s:\n%(count)s") % {
                 'title': controller.get_title(element),
                 'count': helper.format_element_name('annotation', len(element.annotations)),
                 }, controller.get_element_color(element))
-        v.pack_start(l, expand=False)
+        v.pack_start(l, False, True, 0)
     elif isinstance(element, RelationType):
         l=get_coloured_label(_("Relation Type %(title)s:\n%(count)s") % {
                 'title': controller.get_title(element),
                 'count': helper.format_element_name('relation', len(element.relations)),
                 }, controller.get_element_color(element))
-        v.pack_start(l, expand=False)
+        v.pack_start(l, False, True, 0)
     else:
         l=get_coloured_label("%s %s" % (helper.get_type(element),
                                         controller.get_title(element)),
                              controller.get_element_color(element))
-        v.pack_start(l, expand=False)
+        v.pack_start(l, False, True, 0)
 
     w.add(v)
     w.show_all()
     widget._icon=w
-    context.set_icon_widget(w, 0, 0)
+    Gtk.drag_set_icon_widget(context, w, 0, 0)
     return True
 
 def contextual_drag_end(widget, context):
@@ -498,15 +426,15 @@ def enable_drag_source(widget, element, controller):
     else:
         el=element
     # Generic support
-    widget.drag_source_set(gtk.gdk.BUTTON1_MASK,
+    widget.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
                            get_target_types(el),
-                           gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE )
+                           Gdk.DragAction.LINK | Gdk.DragAction.COPY | Gdk.DragAction.MOVE )
     widget.connect('drag-begin', contextual_drag_begin, element, controller)
     widget.connect('drag-end', contextual_drag_end)
     widget.connect('drag-data-get', drag_data_get_cb, controller)
 
 def gdk2intrgba(color, alpha=0xff):
-    """Convert a gdk.Color to int RGBA.
+    """Convert a Gdk.Color to int RGBA.
     """
     return ( (color.red >> 8) << 24) \
          | ( (color.green >> 8) << 16) \
@@ -514,8 +442,11 @@ def gdk2intrgba(color, alpha=0xff):
          | alpha
 
 def gdk2intrgb(color):
-    """Convert a gdk.Color to int RGB.
+    """Convert a Gdk.Color to int RGB.
     """
     return ( (color.red >> 8) << 16) \
          | ( (color.green >> 8) << 8) \
          | (color.blue >> 8)
+
+def get_clipboard():
+    return Gtk.Clipboard.get(Gdk.Atom.intern("CLIPBOARD", True))
diff --git a/lib/advene/gui/util/completer.py b/lib/advene/gui/util/completer.py
index 527f99e..f2a6178 100644
--- a/lib/advene/gui/util/completer.py
+++ b/lib/advene/gui/util/completer.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,13 +16,16 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-"""Autocomplete feature for gtk.TextView
+"""Autocomplete feature for Gtk.TextView
 
 This code is inspired and adapted from the Scribes project
 (http://scribes.sf.net/) - GPLv2
 """
+import logging
+logger = logging.getLogger(__name__)
 
-import gtk
+from gi.repository import Gtk
+from gi.repository import Gdk
 import re
 
 import advene.core.config as config
@@ -36,6 +39,8 @@ class Completer:
     def __init__(self, textview=None, controller=None, element=None, indexer=None):
         self.textview=textview
         self.controller=controller
+        if indexer is None:
+            indexer = Indexer()
         self.indexer=indexer
         # If defined, element is the element being edited, which
         # allows to do a more precise completion search
@@ -81,11 +86,12 @@ class Completer:
         return False
 
     def hide_completion_window(self, *p):
-        self.widget.hide_all()
+        self.widget.hide()
         self.is_visible=False
 
     def show_completion_window(self, *p):
-        width, height = self.treeview.size_request()
+        req = self.treeview.size_request()
+        width, height = req.width, req.height
         width += 24
         height += 24
         self.widget.resize(width, height)
@@ -108,7 +114,7 @@ class Completer:
     def get_cursor_textview_coordinates(self):
         rectangle=self.get_cursor_rectangle()
         # Get the cursor's window coordinates.
-        position = self.textview.buffer_to_window_coords(gtk.TEXT_WINDOW_TEXT, rectangle.x, rectangle.y)
+        position = self.textview.buffer_to_window_coords(Gtk.TextWindowType.TEXT, rectangle.x, rectangle.y)
         cursor_x = position[0]
         cursor_y = position[1]
         return cursor_x, cursor_y
@@ -132,18 +138,18 @@ class Completer:
         cursor_x, cursor_y = self.get_cursor_textview_coordinates()
         cursor_height = self.get_cursor_size()[1]
         # Get the text editor's textview coordinate and size.
-        window = self.textview.get_window(gtk.TEXT_WINDOW_TEXT)
-        rectangle = self.textview.get_visible_rect()
-        window_x, window_y = window.get_origin()
-        window_width, window_height = rectangle.width, rectangle.height
+        window = self.textview.get_window(Gtk.TextWindowType.TEXT)
+        origin = window.get_origin()
+        # Note: do not use origin.x/origin.y since it does not work on win32
+        window_x, window_y = origin[1], origin[2]
 
         # Determine where to position the completion window.
         position_x = window_x + cursor_x
         position_y = window_y + cursor_y + cursor_height
 
-        if position_x + width > gtk.gdk.screen_width():
+        if position_x + width > Gdk.Screen.width():
             position_x = window_x + cursor_x - width
-        if position_y + height > gtk.gdk.screen_height():
+        if position_y + height > Gdk.Screen.height():
             position_y = window_y + cursor_y - height
 
         #if not_(self.__signals_are_blocked):
@@ -175,17 +181,17 @@ class Completer:
         cursor_position=b.get_iter_at_mark(b.get_insert())
         word_start=cursor_position.copy()
         word_start.backward_word_start()
-        return unicode(word_start.get_text(cursor_position)), word_start, cursor_position
+        return word_start.get_text(cursor_position), word_start, cursor_position
 
     def insert_word_completion(self, path):
         """Insert item selected in the completion window into the text editor's
         buffer.
 
         @param path: The selected row in the completion window.
-        @type path: A gtk.TreeRow object.
+        @type path: A Gtk.TreeRow object.
         """
         # Get the selected completion string.
-        completion_string = self.model[path[0]][0].decode("utf8")
+        completion_string = self.model[path[0]][0]
 
         word, begin, end=self.get_word_before_cursor()
         complete=completion_string.replace(word.encode('utf8'), '')
@@ -221,11 +227,11 @@ class Completer:
         if not self.is_visible:
             return False
 
-        if event.keyval in (gtk.keysyms.Tab, gtk.keysyms.Right, gtk.keysyms.Left,
-                            gtk.keysyms.Home, gtk.keysyms.End, gtk.keysyms.Insert,
-                            gtk.keysyms.Delete,
-                            gtk.keysyms.Page_Up, gtk.keysyms.Page_Down,
-                            gtk.keysyms.Escape):
+        if event.keyval in (Gdk.KEY_Tab, Gdk.KEY_Right, Gdk.KEY_Left,
+                            Gdk.KEY_Home, Gdk.KEY_End, Gdk.KEY_Insert,
+                            Gdk.KEY_Delete,
+                            Gdk.KEY_Page_Up, Gdk.KEY_Page_Down,
+                            Gdk.KEY_Escape):
             self.hide_completion_window()
             return True
 
@@ -239,11 +245,11 @@ class Completer:
             selection.select_path((0,))
             model, iterator = selection.get_selected()
         path = model.get_path(iterator)
-        if event.keyval == gtk.keysyms.Return:
+        if event.keyval == Gdk.KEY_Return:
             # Insert the selected item into the editor's buffer when the enter key
             # event is detected.
             self.treeview.row_activated(path, self.treeview.get_column(0))
-        elif event.keyval == gtk.keysyms.Up:
+        elif event.keyval == Gdk.KEY_Up:
             # If the up key is pressed check to see if the first row is selected.
             # If it is, select the last row. Otherwise, get the path to the row
             # above and select it.
@@ -254,7 +260,7 @@ class Completer:
             else:
                 selection.select_path((path[0] - 1, ))
                 self.treeview.scroll_to_cell((path[0] - 1, ))
-        elif event.keyval == gtk.keysyms.Down:
+        elif event.keyval == Gdk.KEY_Down:
             # Get the iterator of the next row.
             next_iterator = model.iter_next(iterator)
             # If the next row exists, select it, if not select the first row.
@@ -270,16 +276,16 @@ class Completer:
         return True
 
     def build_widget(self):
-        w=gtk.Window(gtk.WINDOW_POPUP)
+        w=Gtk.Window(Gtk.WindowType.POPUP)
 
-        w.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_MENU)
+        w.set_type_hint(Gdk.WindowTypeHint.MENU)
         #w.set_size_request(200, 200)
 
-        self.treeview=gtk.TreeView()
+        self.treeview=Gtk.TreeView()
 
-        self.model = gtk.ListStore(str)
-        renderer = gtk.CellRendererText()
-        col=gtk.TreeViewColumn("", renderer, text=0)
+        self.model = Gtk.ListStore(str)
+        renderer = Gtk.CellRendererText()
+        col=Gtk.TreeViewColumn("", renderer, text=0)
         col.set_expand(False)
 
         self.treeview.append_column(col)
@@ -296,13 +302,9 @@ class Completer:
             return True
         self.treeview.connect('row-activated', treeview_row_activated_cb)
 
-        style = self.textview.get_style()
-        color = style.base[gtk.STATE_SELECTED]
-        self.treeview.modify_base(gtk.STATE_ACTIVE, color)
-
-        scroll=gtk.ScrolledWindow()
+        scroll=Gtk.ScrolledWindow()
         scroll.add(self.treeview)
-        scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         scroll.set_border_width(2)
         w.add(scroll)
 
@@ -325,12 +327,17 @@ class Indexer:
             'views': set(),
             }
         self.regexp=re.compile(r'[^\w\d_]+', re.UNICODE)
-        self.size_limit=4
+        self.alt_regexp = re.compile(r'\s*,\s*', re.UNICODE)
+        self.size_limit = 4
 
     def get_words(self, s):
         """Return the list of indexable words from the given string.
         """
-        return [ w for w in self.regexp.split(s) if len(w) >= self.size_limit ]
+        if ',' in s:
+            regexp = self.alt_regexp
+        else:
+            regexp = self.regexp
+        return [ w for w in regexp.split(s) if len(w) >= self.size_limit ]
 
     def initialize(self):
         """Initialize the indexer on package load.
@@ -387,17 +394,25 @@ class Indexer:
         in the annotation of the same type. If it is a view,
         completions will be searched for in other views.
 
-        If element is a gtk.TextBuffer, completions will be searched
+        If element is a Gtk.TextBuffer, completions will be searched
         in its content.
         """
         if isinstance(context, View):
             s=self.index['views']
             # FIXME: maybe add ids (annotation-types, relations-types, views)
         elif isinstance(context, Annotation):
-            s=self.index.get(context.type.id, [])
-        elif isinstance(context, gtk.TextBuffer):
+            s = []
+            if config.data.preferences['completion-predefined-only']:
+                terms = context.type.getMetaData(config.data.namespace, "completions")
+                if terms:
+                    s = self.get_words(terms)
+            if not s:
+                # No predefined completion anyway
+                s = self.index.get(context.type.id, [])
+        elif isinstance(context, Gtk.TextBuffer):
             # The replace clause transforms the timestamp placeholders into spaces.
-            s=set(self.get_words(unicode(context.get_slice(*context.get_bounds()).replace('\xef\xbf\xbc', ' '))))
+            args = context.get_bounds() + (False, )
+            s=set(self.get_words(str(context.get_slice(*args).replace('\xef\xbf\xbc', ' '))))
             s.update(self.index['views'])
         else:
             s=self.index['views']
@@ -406,27 +421,28 @@ class Indexer:
         return res
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.INFO)
     import sys
-    window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+    window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
     window.set_default_size (600, 400)
 
     def key_pressed_cb (win, event):
-        if event.state & gtk.gdk.CONTROL_MASK:
+        if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             # The Control-key is held. Special actions :
-            if event.keyval == gtk.keysyms.q:
-                gtk.main_quit ()
+            if event.keyval == Gdk.KEY_q:
+                Gtk.main_quit ()
                 return True
 
     window.connect('key_press_event', key_pressed_cb)
-    window.connect('destroy', lambda e: gtk.main_quit())
+    window.connect('destroy', lambda e: Gtk.main_quit())
     window.set_title ('test')
 
-    import gtksourceview2
-    t=gtksourceview2.View(gtksourceview2.Buffer())
-    #t=gtk.TextView()
+    from gi.repository import GtkSource
+    t=GtkSource.View(GtkSource.Buffer())
+    #t=Gtk.TextView()
     if sys.argv[1:]:
-        print "loading ", sys.argv[1]
-        t.get_buffer().set_text(open(sys.argv[1]).read())
+        logger.info("loading %s", sys.argv[1])
+        t.get_buffer().set_text(open(sys.argv[1], encoding='utf-8').read())
 
     i=Indexer()
     compl=Completer(textview=t,
@@ -436,4 +452,4 @@ if __name__ == "__main__":
 
     window.add (t)
     window.show_all()
-    gtk.main ()
+    Gtk.main ()
diff --git a/lib/advene/gui/util/dialog.py b/lib/advene/gui/util/dialog.py
index bf38f87..1a16f2b 100644
--- a/lib/advene/gui/util/dialog.py
+++ b/lib/advene/gui/util/dialog.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,10 +18,13 @@
 #
 """Dialog building facilities.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 from gettext import gettext as _
 
-import gtk
+from gi.repository import Gdk
+from gi.repository import Gtk
 import re
 import os
 import sys
@@ -37,14 +40,22 @@ _fs_encoding = sys.getfilesystemencoding()
 if _fs_encoding in ('ascii', 'ANSI_X3.4-1968', None):
     _fs_encoding='utf8'
 
+# Default transient toplevel window
+DEFAULT_PARENT = None
+
+def set_default_transient_parent(w):
+    global DEFAULT_PARENT
+    DEFAULT_PARENT = w
+    return w
+
 def dialog_keypressed_cb(widget=None, event=None):
     """Generic dialog keypress handler.
     """
-    if event.keyval == gtk.keysyms.Return:
-        widget.response(gtk.RESPONSE_OK)
+    if event.keyval == Gdk.KEY_Return:
+        widget.response(Gtk.ResponseType.OK)
         return True
-    elif event.keyval == gtk.keysyms.Escape:
-        widget.response(gtk.RESPONSE_CANCEL)
+    elif event.keyval == Gdk.KEY_Escape:
+        widget.response(Gtk.ResponseType.CANCEL)
         return True
     return False
 
@@ -58,7 +69,7 @@ def generate_list_model(elements, active_element=None):
     @param elements: a list of couples (element, label) or tuples (element, label, color)
     @param active_element: the element that should be preselected
     """
-    store=gtk.ListStore(str, object, str)
+    store=Gtk.ListStore(str, object, str)
     active_iter=None
     if elements:
         if len(elements[0]) == 3:
@@ -93,11 +104,12 @@ def list_selector_widget(members=None,
                                  active_element=preselect)
 
     if entry:
-        combobox=gtk.ComboBoxEntry(store, column=0)
+        combobox=Gtk.ComboBoxText.new_with_entry()
+        combobox.set_model(store)
     else:
-        combobox=gtk.ComboBox(store)
-        cell = gtk.CellRendererText()
-        combobox.pack_start(cell, expand=True)
+        combobox=Gtk.ComboBox.new_with_model(store)
+        cell = Gtk.CellRendererText()
+        combobox.pack_start(cell, True)
         combobox.add_attribute(cell, 'text', 0)
         combobox.add_attribute(cell, 'background', 2)
 
@@ -112,9 +124,9 @@ def list_selector_widget(members=None,
             try:
                 return combo.get_model().get_value(combo.get_active_iter(), 1)
             except (TypeError, AttributeError):
-                return unicode(combo.child.get_text())
+                return combo.get_child().get_text()
         def set_current_element(combo, t):
-            combo.child.set_text(t)
+            combo.get_child().set_text(t)
     else:
         def get_current_element(combo):
             if combo.get_active_iter() is not None:
@@ -128,7 +140,7 @@ def list_selector_widget(members=None,
                 # The element is present.
                 combo.set_active(l[0])
             else:
-                combo.set_active_iter(combo.get_model().append( (unicode(el), el, None) ))
+                combo.set_active_iter(combo.get_model().append( (str(el), el, None) ))
 
     # Bind the method to the combobox object
     combobox.get_current_element = get_current_element.__get__(combobox)
@@ -155,14 +167,14 @@ def list_selector(title=None,
                                     preselect=preselect,
                                     entry=entry)
 
-    d = gtk.Dialog(title=title,
-                   parent=None,
-                   flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                   buttons=( gtk.STOCK_OK, gtk.RESPONSE_OK,
-                             gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL ))
+    d = Gtk.Dialog(title=title,
+                   parent=DEFAULT_PARENT,
+                   flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                   buttons=( Gtk.STOCK_OK, Gtk.ResponseType.OK,
+                             Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL ))
 
     if text is not None:
-        l=gtk.Label(text)
+        l=Gtk.Label(label=text)
         l.show()
         d.vbox.add(l)
 
@@ -175,37 +187,40 @@ def list_selector(title=None,
     center_on_mouse(d)
     res=d.run()
     retval=None
-    if res == gtk.RESPONSE_OK:
+    if res == Gtk.ResponseType.OK:
         retval=combobox.get_current_element()
     d.destroy()
     return retval
 
-def message_dialog(label="", icon=gtk.MESSAGE_INFO, modal=True, callback=None):
+def message_dialog(label="", icon=Gtk.MessageType.INFO, modal=True, callback=None):
     """Message dialog.
 
     If callback is not None, then the dialog will not be modal and
     the callback function will be called upon validation.
     """
-    if icon == gtk.MESSAGE_QUESTION:
-        button=gtk.BUTTONS_YES_NO
+    if icon == Gtk.MessageType.QUESTION:
+        button=Gtk.ButtonsType.YES_NO
     else:
-        button=gtk.BUTTONS_OK
+        button=Gtk.ButtonsType.OK
+    if icon == Gtk.MessageType.ERROR:
+        # Log error message in main log with full traceback
+        logger.error(label, exc_info=True)
     if callback is not None:
         # Force non-modal behaviour when there is a callback
         modal=False
     if modal:
-        flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT
+        flags=Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT
     else:
-        flags=gtk.DIALOG_DESTROY_WITH_PARENT
+        flags=Gtk.DialogFlags.DESTROY_WITH_PARENT
 
-    dialog = gtk.MessageDialog(None, flags,
-                               icon, button)
+    dialog = Gtk.MessageDialog(DEFAULT_PARENT, flags, icon, button)
     dialog.set_markup(label)
-    if not dialog.label.get_text():
+    label_widget = dialog.get_message_area().get_children()[0]
+    if not label_widget.get_text():
         # Hackish way of determining if there was an error while
         # parsing the markup. In this case, fallback to simple text
-        dialog.label.set_text(label)
-    dialog.set_position(gtk.WIN_POS_CENTER_ALWAYS)
+        label_widget.set_text(label)
+    dialog.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
     dialog.connect('key-press-event', dialog_keypressed_cb)
 
     dialog.show()
@@ -214,8 +229,8 @@ def message_dialog(label="", icon=gtk.MESSAGE_INFO, modal=True, callback=None):
     if modal:
         res=dialog.run()
         dialog.destroy()
-        if icon == gtk.MESSAGE_QUESTION:
-            return (res == gtk.RESPONSE_YES)
+        if icon == Gtk.MessageType.QUESTION:
+            return (res == Gtk.ResponseType.YES or res == Gtk.ResponseType.OK)
         else:
             return True
     else:
@@ -223,7 +238,7 @@ def message_dialog(label="", icon=gtk.MESSAGE_INFO, modal=True, callback=None):
         # Connect the signal handler.
         def handle_response(d, res):
             d.destroy()
-            if res == gtk.RESPONSE_YES and callback is not None:
+            if res == Gtk.ResponseType.YES and callback is not None:
                 callback()
             return True
         dialog.connect('response', handle_response)
@@ -233,25 +248,25 @@ def yes_no_cancel_popup(title=None,
                         text=None):
     """Build a Yes-No-Cancel popup window.
 
-    Return codes are in (gtk.RESPONSE_YES, gtk.RESPONSE_NO, gtk.RESPONSE_CANCEL)
+    Return codes are in (Gtk.ResponseType.YES, Gtk.ResponseType.NO, Gtk.ResponseType.CANCEL)
     """
-    d = gtk.Dialog(title=title,
-                   parent=None,
-                   flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
-                   buttons=( gtk.STOCK_YES, gtk.RESPONSE_YES,
-                             gtk.STOCK_NO, gtk.RESPONSE_NO,
-                             gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL ))
-    hb=gtk.HBox()
+    d = Gtk.Dialog(title=title,
+                   parent=DEFAULT_PARENT,
+                   flags=Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                   buttons=( Gtk.STOCK_YES, Gtk.ResponseType.YES,
+                             Gtk.STOCK_NO, Gtk.ResponseType.NO,
+                             Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL ))
+    hb=Gtk.HBox()
     hb.show()
     d.vbox.add(hb)
 
-    i=gtk.Image()
-    i.set_from_stock(gtk.STOCK_DIALOG_QUESTION, gtk.ICON_SIZE_DIALOG)
+    i=Gtk.Image()
+    i.set_from_stock(Gtk.STOCK_DIALOG_QUESTION, Gtk.IconSize.DIALOG)
     i.show()
-    hb.pack_start(i, expand=False)
+    hb.pack_start(i, False, True, 0)
 
     if text is not None:
-        l=gtk.Label(text)
+        l=Gtk.Label(label=text)
         l.show()
         hb.add(l)
     d.connect('key-press-event', dialog_keypressed_cb)
@@ -279,26 +294,26 @@ def entry_dialog(title=None,
     @return: the entry value or None if the dialog was cancelled
     @rtype: string
     """
-    d = gtk.Dialog(title=title,
-                   parent=None,
-                   flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                   buttons=( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                             gtk.STOCK_OK, gtk.RESPONSE_OK,
+    d = Gtk.Dialog(title=title,
+                   parent=DEFAULT_PARENT,
+                   flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                   buttons=( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+                             Gtk.STOCK_OK, Gtk.ResponseType.OK,
                              ))
     if text:
-        l=gtk.Label(text)
+        l=Gtk.Label(label=text)
         l.show()
         d.vbox.add(l)
 
-    e=gtk.Entry()
+    e=Gtk.Entry()
     e.show()
     if default:
         e.set_text(default)
 
     if completions:
-        completion = gtk.EntryCompletion()
+        completion = Gtk.EntryCompletion()
         e.set_completion(completion)
-        liststore = gtk.ListStore(str)
+        liststore = Gtk.ListStore(str)
         completion.set_text_column(0)
         completion.set_model(liststore)
         for s in completions:
@@ -313,9 +328,9 @@ def entry_dialog(title=None,
 
     res=d.run()
     ret=None
-    if res == gtk.RESPONSE_OK:
+    if res == Gtk.ResponseType.OK:
         try:
-            ret=unicode(e.get_text())
+            ret=e.get_text()
         except ValueError:
             ret=None
     else:
@@ -344,15 +359,15 @@ def build_optionmenu(elements, current, on_change_element, editable=True):
         on_change_element(element)
         return True
 
-    store=gtk.ListStore(str, object)
+    store=Gtk.ListStore(str, object)
     active_iter=None
-    for k, v in elements.iteritems():
+    for k, v in elements.items():
         i=store.append( (v, k) )
         if k == current:
             active_iter=i
 
-    optionmenu = gtk.ComboBox(model=store)
-    cell = gtk.CellRendererText()
+    optionmenu = Gtk.ComboBox.new_with_model(store)
+    cell = Gtk.CellRendererText()
     optionmenu.pack_start(cell, True)
     optionmenu.add_attribute(cell, 'text', 0)
     optionmenu.set_active_iter(active_iter)
@@ -371,28 +386,28 @@ def title_id_widget(element_title=None,
     @type element_id: string
     @return: the widget
     """
-    v=gtk.Table(rows=2, columns=2)
+    v=Gtk.Table(rows=2, columns=2)
 
-    l=gtk.Label(_("Title"))
+    l=Gtk.Label(label=_("Title"))
     v.attach(l, 0, 1, 0, 1)
 
-    title_entry=gtk.Entry()
+    title_entry=Gtk.Entry()
     title_entry.show()
     if element_title:
         title_entry.set_text(element_title)
     v.attach(title_entry, 1, 2, 0, 1)
 
-    l=gtk.Label(_("Id"))
+    l=Gtk.Label(label=_("Id"))
     v.attach(l, 0, 1, 1, 2)
 
-    id_entry=gtk.Entry()
+    id_entry=Gtk.Entry()
     id_entry.show()
     if element_id:
         id_entry.set_text(element_id)
     v.attach(id_entry, 1, 2, 1, 2)
 
     def update_id(entry):
-        id_entry.set_text(helper.title2id(unicode(entry.get_text())))
+        id_entry.set_text(helper.title2id(entry.get_text()))
         return True
 
     title_entry.connect('changed', update_id)
@@ -416,25 +431,25 @@ def title_id_dialog(title=_("Name the element"),
     @type element_title: string
     @param element_id: default id
     @type element_id: string
-    @param flags: optional gtk.Dialog flags (such as gtk.DIALOG_MODAL)
+    @param flags: optional Gtk.Dialog flags (such as Gtk.DialogFlags.MODAL)
 
     @return: the dialog widget
     """
     if flags is None:
-        flags=gtk.DIALOG_DESTROY_WITH_PARENT
-    d = gtk.Dialog(title=title,
-                   parent=None,
+        flags=Gtk.DialogFlags.DESTROY_WITH_PARENT
+    d = Gtk.Dialog(title=title,
+                   parent=DEFAULT_PARENT,
                    flags=flags,
-                   buttons=( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                             gtk.STOCK_OK, gtk.RESPONSE_OK,
+                   buttons=( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+                             Gtk.STOCK_OK, Gtk.ResponseType.OK,
                              ))
     if text:
-        l=gtk.Label(text)
+        l=Gtk.Label(label=text)
         l.show()
         d.vbox.add(l)
 
     v=title_id_widget(element_title, element_id)
-    d.vbox.pack_start(v, expand=False)
+    d.vbox.pack_start(v, False, True, 0)
     d.connect('key-press-event', dialog_keypressed_cb)
     d.id_entry=v.id_entry
     d.title_entry=v.title_entry
@@ -464,10 +479,10 @@ def get_title_id(title=_("Name the element"),
     center_on_mouse(d)
 
     res=d.run()
-    if res == gtk.RESPONSE_OK:
+    if res == Gtk.ResponseType.OK:
         try:
-            t=unicode(d.title_entry.get_text())
-            i=unicode(d.id_entry.get_text())
+            t=d.title_entry.get_text()
+            i=d.id_entry.get_text()
         except ValueError:
             t=None
             i=None
@@ -480,8 +495,8 @@ def get_title_id(title=_("Name the element"),
     return t, i
 
 def get_filename(title=_("Open a file"),
-                 action=gtk.FILE_CHOOSER_ACTION_OPEN,
-                 button=gtk.STOCK_OPEN,
+                 action=Gtk.FileChooserAction.OPEN,
+                 button=Gtk.STOCK_OPEN,
                  default_dir=None,
                  default_file=None,
                  alias=False,
@@ -490,8 +505,8 @@ def get_filename(title=_("Open a file"),
 
     @param title: the dialog title
     @type title: string
-    @param action: the dialog action: gtk.FILE_CHOOSER_ACTION_OPEN (default) or gtk.FILE_CHOOSER_ACTION_SAVE
-    @param button: the validation button id: gtk.STOCK_OPEN (default) or gtk.STOCK_SAVE
+    @param action: the dialog action: Gtk.FileChooserAction.OPEN (default) or Gtk.FileChooserAction.SAVE
+    @param button: the validation button id: Gtk.STOCK_OPEN (default) or Gtk.STOCK_SAVE
     @param default_dir: the default directory
     @type default_dir: string
     @param default_file: the default file
@@ -502,16 +517,16 @@ def get_filename(title=_("Open a file"),
     @type filter: string
     @return: if alias, a tuple (filename, alias), else the filename
     """
-    preview_box = gtk.VBox()
+    preview_box = Gtk.VBox()
 
-    preview = gtk.Button(_("N/C"))
+    preview = Gtk.Button(_("N/C"))
     preview_box.add(preview)
 
     if alias:
-        h=gtk.HBox()
-        l=gtk.Label(_("Alias"))
+        h=Gtk.HBox()
+        l=Gtk.Label(label=_("Alias"))
         h.add(l)
-        alias_entry = gtk.Entry()
+        alias_entry = Gtk.Entry()
         h.add(alias_entry)
         preview_box.add(h)
     preview_box.show_all()
@@ -523,10 +538,8 @@ def get_filename(title=_("Open a file"),
 
     def update_preview(chooser):
         filename=chooser.get_preview_filename()
-        if filename is not None:
-            # The returned filename is a utf8-encoded string. Convert
-            # it to unicode.
-            filename=unicode(filename, 'utf-8')
+        if filename is None:
+            return True
         setattr(preview, '_filename', filename)
         if filename and (filename.endswith('.xml') or filename.endswith('.azp')):
             preview.set_label(_("Press to\ndisplay\ninformation"))
@@ -536,7 +549,11 @@ def get_filename(title=_("Open a file"),
             if config.data.os == 'win32':
                 # Force resize for win32
                 oldmode=chooser.get_resize_mode()
-                chooser.set_resize_mode(gtk.RESIZE_IMMEDIATE)
+                try:
+                    chooser.set_resize_mode(Gtk.RESIZE_IMMEDIATE)
+                except AttributeError:
+                    # May be missing in some old gtk libs
+                    pass
                 chooser.resize_children()
                 chooser.set_resize_mode(oldmode)
         else:
@@ -551,21 +568,21 @@ def get_filename(title=_("Open a file"),
             button.set_label(_("Wait..."))
             try:
                 st=helper.get_statistics(button._filename)
-            except AdveneException, e:
-                st=_("Error: %s") % unicode(e)
+            except AdveneException as e:
+                st=_("Error: %s") % str(e)
             button.set_label(st)
             button._filename=None
         return True
 
     preview.connect('clicked', do_preview)
 
-    fs=gtk.FileChooserDialog(title=title,
-                             parent=None,
+    fs=Gtk.FileChooserDialog(title=title,
+                             parent=DEFAULT_PARENT,
                              action=action,
                              buttons=( button,
-                                       gtk.RESPONSE_OK,
-                                       gtk.STOCK_CANCEL,
-                                       gtk.RESPONSE_CANCEL ))
+                                       Gtk.ResponseType.OK,
+                                       Gtk.STOCK_CANCEL,
+                                       Gtk.ResponseType.CANCEL ))
     fs.set_preview_widget(preview_box)
 
     # filter may be: 'any', 'advene', 'session', 'video'
@@ -580,7 +597,7 @@ def get_filename(title=_("Open a file"),
         ('audio', _("Audio files"), ('*.wav', '*.mp3', '*.ogg')),
         ('video', _("Video files"), [ "*%s" % e for e in config.data.video_extensions ])
         ):
-        filters[name]=gtk.FileFilter()
+        filters[name]=Gtk.FileFilter()
         filters[name].set_name(descr)
         for e in exts:
             filters[name].add_pattern(e)
@@ -601,10 +618,10 @@ def get_filename(title=_("Open a file"),
     res=fs.run()
     filename=None
     al=None
-    if res == gtk.RESPONSE_OK:
+    if res == Gtk.ResponseType.OK:
         filename=fs.get_filename()
         if alias:
-            al=unicode(alias_entry.get_text())
+            al=alias_entry.get_text()
             if not al:
                 # It may not have been updated, if the user typed the
                 # filename in the entry box.
@@ -612,39 +629,33 @@ def get_filename(title=_("Open a file"),
             al = re.sub('[^a-zA-Z0-9_]', '_', al)
     fs.destroy()
 
-    if filename is not None and not isinstance(filename, unicode):
-        # Strangely, specifying _fs_encoding crashes with accented
-        # characters on win32.
-        # filename=unicode(filename, _fs_encoding)
-        filename=unicode(filename)
-
     if alias:
         return filename, al
     else:
         return filename
 
 def get_dirname(title=_("Choose a directory"),
-                 action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
-                 button=gtk.STOCK_OK,
+                 action=Gtk.FileChooserAction.SELECT_FOLDER,
+                 button=Gtk.STOCK_OK,
                  default_dir=None):
     """Get a directory name.
 
     @param title: the dialog title
     @type title: string
-    @param action: the dialog action: gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER (default)
-    @param button: the validation button id: gtk.STOCK_OK (default)
+    @param action: the dialog action: Gtk.FileChooserAction.SELECT_FOLDER (default)
+    @param button: the validation button id: Gtk.STOCK_OK (default)
     @param default_dir: the default directory
     @type default_dir: string
     @return: the directory name
     """
 
-    fs=gtk.FileChooserDialog(title=title,
-                             parent=None,
+    fs=Gtk.FileChooserDialog(title=title,
+                             parent=DEFAULT_PARENT,
                              action=action,
                              buttons=( button,
-                                       gtk.RESPONSE_OK,
-                                       gtk.STOCK_CANCEL,
-                                       gtk.RESPONSE_CANCEL ))
+                                       Gtk.ResponseType.OK,
+                                       Gtk.STOCK_CANCEL,
+                                       Gtk.ResponseType.CANCEL ))
     if default_dir:
         fs.set_current_folder(default_dir)
 
@@ -652,7 +663,7 @@ def get_dirname(title=_("Choose a directory"),
     center_on_mouse(fs)
     res=fs.run()
     dirname=None
-    if res == gtk.RESPONSE_OK:
+    if res == Gtk.ResponseType.OK:
         dirname=fs.get_filename()
     fs.destroy()
 
@@ -691,26 +702,26 @@ class CategorizedSelector:
         self.button=None
 
     def popup_menu(self, *p):
-        m=gtk.Menu()
+        m=Gtk.Menu()
 
-        i=gtk.MenuItem(self.title, use_underline=False)
+        i=Gtk.MenuItem(self.title, use_underline=False)
         i.set_sensitive(False)
         m.append(i)
-        i=gtk.SeparatorMenuItem()
+        i=Gtk.SeparatorMenuItem()
         m.append(i)
 
         submenu={}
         for c in self.categories:
-            i=gtk.MenuItem(self.description_getter(c), use_underline=False)
+            i=Gtk.MenuItem(self.description_getter(c), use_underline=False)
             m.append(i)
-            submenu[c]=gtk.Menu()
+            submenu[c]=Gtk.Menu()
             i.set_submenu(submenu[c])
         for e in self.elements:
-            i=gtk.MenuItem(self.description_getter(e), use_underline=False)
+            i=Gtk.MenuItem(self.description_getter(e), use_underline=False)
             submenu[self.category_getter(e)].append(i)
             i.connect('activate', lambda menuitem, element: self.update_element(element), e)
         m.show_all()
-        m.popup(None, None, None, 0, gtk.get_current_event_time())
+        m.popup(None, None, None, 0, Gtk.get_current_event_time())
         return m
 
     def get_button(self):
@@ -718,7 +729,7 @@ class CategorizedSelector:
         """
         if self.button is not None:
             return self.button
-        b=gtk.Button(self.description_getter(self.current))
+        b=Gtk.Button(self.description_getter(self.current))
         if self.editable:
             b.connect('clicked', lambda w: self.popup_menu())
         b.show()
@@ -734,7 +745,7 @@ class CategorizedSelector:
         return True
 
 def center_on_mouse(w):
-    """Center the given gtk.Window on the mouse position.
+    """Center the given Gtk.Window on the mouse position.
     """
     root=w.get_toplevel().get_root_window()
     (screen, x, y, mod) = root.get_display().get_pointer()
@@ -743,11 +754,11 @@ def center_on_mouse(w):
     # Let's try to center the window on the mouse as much as possible.
     width, height = w.get_size()
 
-    posx = max(r.x, x - width / 2)
+    posx = max(r.x, x - int(width / 2))
     if posx + width > r.x + r.width:
         posx = r.x + r.width - width
 
-    posy = max(r.y, y - height / 2)
+    posy = max(r.y, y - int(height / 2))
     if posy + height > r.y + r.height:
         posy = r.y + r.height - height
 
diff --git a/lib/advene/gui/util/initialconfig.py b/lib/advene/gui/util/initialconfig.py
index c7c994a..c695261 100644
--- a/lib/advene/gui/util/initialconfig.py
+++ b/lib/advene/gui/util/initialconfig.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -29,15 +29,15 @@ APP='advene'
 try:
     locale.setlocale(locale.LC_ALL, '')
 except locale.Error:
-    print "Error in locale initialization. Interface translation may be incorrect."
+    print("Error in locale initialization. Interface translation may be incorrect.")
     pass
 gettext.bindtextdomain(APP, config.data.path['locale'])
 gettext.textdomain(APP)
-gettext.install(APP, localedir=config.data.path['locale'], unicode=True)
+gettext.install(APP, localedir=config.data.path['locale'])
 from gettext import gettext as _
 
-import gtk
-import gobject
+from gi.repository import Gtk
+from gi.repository import GObject
 import os
 
 from advene.gui.edit.properties import EditWidget
@@ -61,8 +61,8 @@ class Config:
 
     def main(self):
         self.widget.show_all()
-        gobject.timeout_add (10, self.run_config)
-        gtk.main()
+        GObject.timeout_add (10, self.run_config)
+        Gtk.main()
 
     def run_config(self):
         res=self.widget.popup()
@@ -74,7 +74,7 @@ class Config:
             for k in ('data', 'imagecache', 'moviepath'):
                 config.data.path[k]=self.options[k]
             config.data.save_preferences()
-        gtk.main_quit()
+        Gtk.main_quit()
         return
 
     def build_widget(self):
diff --git a/lib/advene/gui/util/playpausebutton.py b/lib/advene/gui/util/playpausebutton.py
index 890060e..4370b63 100644
--- a/lib/advene/gui/util/playpausebutton.py
+++ b/lib/advene/gui/util/playpausebutton.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,15 +19,15 @@
 """PlayPause button.
 """
 
-import gtk
+from gi.repository import Gtk
 
 import advene.core.config as config
 
-class PlayPauseButton(gtk.ToolButton):
+class PlayPauseButton(Gtk.ToolButton):
     def __init__(self, *p, **kw):
         super(PlayPauseButton, self).__init__(*p, **kw)
-        self.active_id = gtk.STOCK_MEDIA_PLAY
-        self.inactive_id = gtk.STOCK_MEDIA_PAUSE
+        self.active_id = Gtk.STOCK_MEDIA_PLAY
+        self.inactive_id = Gtk.STOCK_MEDIA_PAUSE
         self.is_active = True
 
     def set_stock_ids(self, active_id, inactive_id):
diff --git a/lib/advene/gui/views/__init__.py b/lib/advene/gui/views/__init__.py
index bc3909c..7443fd1 100644
--- a/lib/advene/gui/views/__init__.py
+++ b/lib/advene/gui/views/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,14 +16,18 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+import logging
+logger = logging.getLogger(__name__)
+
 import advene.core.config as config
 
 import re
-import gtk
-import gobject
-import StringIO
+from gi.repository import Gdk
+from gi.repository import Gtk
+from gi.repository import GObject
+import io
 import os
-import urllib
+import urllib.request, urllib.parse, urllib.error
 
 from gettext import gettext as _
 
@@ -61,7 +65,7 @@ class AdhocView(object):
         # If self.buttonbox exists, then the widget has already
         # defined its own buttonbox, and the generic popup method
         # can but the "Close" button in it:
-        # self.buttonbox = gtk.HButtonBox()
+        # self.buttonbox = Gtk.HButtonBox()
 
         self._label=self.view_name
 
@@ -89,7 +93,7 @@ class AdhocView(object):
             pass
 
     def safe_connect(self, obj, *p):
-        """Connect a signal handler to a gobject.
+        """Connect a signal handler to a GObject.
 
         It memorizes the handler id so that it is properly
         disconnected upon view closing.
@@ -121,30 +125,30 @@ class AdhocView(object):
             def undisplay():
                 self.statusbar.pop(context_id)
                 return False
-            gobject.timeout_add(1500, undisplay)
+            GObject.timeout_add(1500, undisplay)
 
     def log(self, msg, level=None):
         m=": ".join( (self.view_name, msg) )
         if self.controller:
             self.controller.log(m, level)
         else:
-            print m
+            logger.warn(m)
 
     def set_label(self, label):
         self._label=label
         p=self.widget.get_parent()
-        if isinstance(p, gtk.Notebook):
+        if isinstance(p, Gtk.Notebook):
             # We are in a notebook.
             l=p.get_tab_label(self.widget)
             if l is not None:
-                if isinstance(l, gtk.Label):
+                if isinstance(l, Gtk.Label):
                     l.set_text(label)
-                elif isinstance(l, gtk.HBox):
+                elif isinstance(l, Gtk.HBox):
                     # It may be a HBox with multiple elements. Find the label.
                     # Normally (cf gui.viewbook), the label is in an EventBox
                     l=l.get_children()[1].get_children()[0]
                     l.set_text(label)
-        elif isinstance(p, gtk.VBox):
+        elif isinstance(p, Gtk.VBox):
             # It is a popup window. Set its title.
             p.get_toplevel().set_title(label)
 
@@ -166,7 +170,7 @@ class AdhocView(object):
             # Load default options
             n=config.data.advenefile( ('defaults', self.view_id + '.xml'), 'settings')
             if os.path.exists(n):
-                stream=open(n)
+                stream=open(n, encoding='utf-8')
                 p=AdhocViewParametersParser(stream)
                 stream.close()
             else:
@@ -194,7 +198,7 @@ class AdhocView(object):
             return False
 
         # Post-processing of options
-        for name, value in p.options.iteritems():
+        for name, value in p.options.items():
             # If there is a self.options dictionary, try to guess
             # value types from its content.
             try:
@@ -205,8 +209,8 @@ class AdhocView(object):
                     value=True
                 elif value == 'False':
                     value=False
-                elif isinstance(op, int) or isinstance(op, long):
-                    value=long(value)
+                elif isinstance(op, int) or isinstance(op, int):
+                    value=int(value)
                 elif isinstance(op, float):
                     value=float(value)
             except (KeyError, AttributeError):
@@ -220,11 +224,11 @@ class AdhocView(object):
         root=ET.Element(ET.QName(config.data.namespace, 'adhoc'), id=self.view_id)
 
         if options:
-            for n, v in options.iteritems():
-                ET.SubElement(root, ET.QName(config.data.namespace, 'option'), name=n, value=urllib.quote(unicode(v).encode('utf8')))
+            for n, v in options.items():
+                ET.SubElement(root, ET.QName(config.data.namespace, 'option'), name=n, value=urllib.parse.quote(str(v)))
         if arguments:
             for n, v in arguments:
-                ET.SubElement(root, ET.QName(config.data.namespace, 'argument'), name=n, value=urllib.quote(unicode(v).encode('utf8')))
+                ET.SubElement(root, ET.QName(config.data.namespace, 'argument'), name=n, value=urllib.parse.quote(str(v)))
         return root
 
     def save_default_options(self, *p):
@@ -235,17 +239,17 @@ class AdhocView(object):
             # Create it
             try:
                 helper.recursive_mkdir(d)
-            except OSError, e:
-                self.controller.log(_("Cannot save default options: %s") % unicode(e))
+            except OSError as e:
+                self.controller.log(_("Cannot save default options: %s") % str(e))
                 return True
         defaults=config.data.advenefile( ('defaults', self.view_id + '.xml'), 'settings')
 
         options, args=self.get_save_arguments()
         # Do not save package-specific arguments.
         root=self.parameters_to_element(options, [])
-        stream=open(defaults, 'w')
+        stream=open(defaults, 'w', encoding='utf-8')
         helper.indent(root)
-        ET.ElementTree(root).write(stream, encoding='utf-8')
+        ET.ElementTree(root).write(stream, encoding='unicode')
         stream.close()
         self.controller.log(_("Default options saved for view %s") % self.view_name)
         return True
@@ -259,13 +263,26 @@ class AdhocView(object):
         content.mimetype='application/x-advene-adhoc-view'
 
         root=self.parameters_to_element(options, arguments)
-        stream=StringIO.StringIO()
+        stream=io.StringIO()
         helper.indent(root)
-        ET.ElementTree(root).write(stream, encoding='utf-8')
+        ET.ElementTree(root).write(stream, encoding='unicode')
         content.setData(stream.getvalue())
         stream.close()
         return True
 
+    def get_elements_from_source(self, source):
+        if source == 'global_annotations':
+            elements = self.controller.global_package.annotations
+        else:
+            c = self.controller.build_context()
+            try:
+                elements = c.evaluateValue(source)
+                self.source = source
+            except:
+                logger.error(_("Error in source evaluation %s") % source, exc_info=True)
+                elements = []
+        return elements
+
     def get_save_arguments(self):
         """Method called when saving a parametered view.
 
@@ -345,7 +362,7 @@ class AdhocView(object):
         v.content.data=self.as_html()
         self.controller.package.views.append(v)
         self.controller.notify('ViewCreate', view=v)
-        d=dialog.message_dialog(_("View successfully exported as %s.\nOpen it in the web browser ?") % v.title, icon=gtk.MESSAGE_QUESTION)
+        d=dialog.message_dialog(_("View successfully exported as %s.\nOpen it in the web browser ?") % v.title, icon=Gtk.MessageType.QUESTION)
         if d:
             c=self.controller.build_context(here=v)
             self.controller.open_url(c.evaluateValue('package/view/%s/absolute_url' % ident))
@@ -356,7 +373,7 @@ class AdhocView(object):
         return self.widget
 
     def build_widget(self):
-        return gtk.Label(self.view_name)
+        return Gtk.Label(label=self.view_name)
 
     def attach_view(self, menuitem, window):
         def relocate_view(item, v, d):
@@ -376,24 +393,24 @@ class AdhocView(object):
                 v.reparent_done()
             return True
 
-        menu=gtk.Menu()
+        menu=Gtk.Menu()
         for (label, destination) in (
             (_("...embedded east of the video"), 'east'),
             (_("...embedded west of the video"), 'west'),
             (_("...embedded south of the video"), 'south'),
             (_("...embedded at the right of the window"), 'fareast')):
-            item = gtk.MenuItem(label, use_underline=False)
+            item = Gtk.MenuItem(label, use_underline=False)
             item.connect('activate', relocate_view, self, destination)
             menu.append(item)
 
         menu.show_all()
-        menu.popup(None, None, None, 0, gtk.get_current_event_time())
+        menu.popup_at_pointer(None)
         return True
 
     def popup(self, label=None):
         if label is None:
             label=self.view_name
-        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+        window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
         window.set_title (label)
 
         def close_popup(*p):
@@ -415,30 +432,30 @@ class AdhocView(object):
             window.add(self.widget)
             window.buttonbox = self.widget.buttonbox
         else:
-            vbox = gtk.VBox()
+            vbox = Gtk.VBox()
             window.add(vbox)
-            window.buttonbox = gtk.HBox()
-            vbox.pack_start(window.buttonbox, expand=False)
+            window.buttonbox = Gtk.HBox()
+            vbox.pack_start(window.buttonbox, False, True, 0)
             vbox.add (self.widget)
 
         # Insert contextual_actions in buttonbox
         if hasattr(self, 'contextual_actions') and self.contextual_actions:
-            menubar=gtk.MenuBar()
-            root=gtk.MenuItem(_("Actions"))
+            menubar=Gtk.MenuBar()
+            root=Gtk.MenuItem(_("Actions"))
             menubar.append(root)
-            menu=gtk.Menu()
+            menu=Gtk.Menu()
             root.set_submenu(menu)
             for label, action in self.contextual_actions:
-                b=gtk.MenuItem(label, use_underline=False)
-                b.connect('activate', action)
+                b=Gtk.MenuItem(label, use_underline=False)
+                b.connect('activate', lambda w: action())
                 menu.append(b)
-            window.buttonbox.pack_start(menubar, expand=False)
+            window.buttonbox.pack_start(menubar, False, True, 0)
             window.own_buttons.append(menubar)
 
         def drag_sent(widget_, context, selection, targetType, eventTime ):
             if targetType == config.data.target_type['adhoc-view-instance']:
                 # This is not very robust, but allows to transmit a view instance reference
-                selection.set(selection.target, 8, repr(self).encode('utf8'))
+                selection.set(selection.get_target(), 8, repr(self).encode('utf8'))
                 if hasattr(self, 'reparent_prepare'):
                     self.reparent_prepare()
                 self.widget.get_parent().remove(self.widget)
@@ -452,12 +469,12 @@ class AdhocView(object):
         b.set_tooltip_text(_("Click or drag-and-drop to reattach view"))
         b.connect('drag-data-get', drag_sent)
         # The widget can generate drags
-        b.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                          config.data.drag_type['adhoc-view-instance'],
-                          gtk.gdk.ACTION_LINK)
+        b.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                          config.data.get_target_types('adhoc-view-instance'),
+                          Gdk.DragAction.LINK)
 
         window.own_buttons.append(b)
-        window.buttonbox.pack_start(b, expand=False)
+        window.buttonbox.pack_start(b, False, True, 0)
 
         b=get_pixmap_button('small_close.png')
         if self.controller and self.controller.gui:
@@ -465,7 +482,7 @@ class AdhocView(object):
         else:
             b.connect('clicked', lambda w: window.destroy())
         window.own_buttons.append(b)
-        window.buttonbox.pack_start (b, expand=False)
+        window.buttonbox.pack_start(b, False, False, 0)
 
         def remove_own_buttons(w):
             for b in window.own_buttons:
@@ -484,12 +501,12 @@ class AdhocView(object):
             self.controller.gui.register_view (self)
             window.cleanup_id=window.connect('destroy', self.controller.gui.close_view_cb, window, self)
             self.controller.gui.init_window_size(window, self.view_id)
-            window.set_icon_list(*self.controller.gui.get_icon_list())
+            window.set_icon_list(self.controller.gui.get_icon_list())
 
         if config.data.os == 'win32':
             # Force resize for win32
             oldmode=window.get_resize_mode()
-            window.set_resize_mode(gtk.RESIZE_IMMEDIATE)
+            window.set_resize_mode(Gtk.RESIZE_IMMEDIATE)
             window.resize_children()
             window.set_resize_mode(oldmode)
         return window
@@ -511,7 +528,7 @@ class AdhocViewParametersParser:
             # File-like object
             self.parse_file(source)
         else:
-            print "Do not know what to do with ", source
+            logger.warn("Do not know what to do with %s", source)
 
     def parse_file(self, fd):
         tree=ET.parse(fd)
@@ -527,11 +544,11 @@ class AdhocViewParametersParser:
         for e in root:
             if e.tag == ET.QName(config.data.namespace, 'option'):
                 name=e.attrib['name']
-                value=unicode(urllib.unquote(e.attrib['value']), 'utf8')
+                value=urllib.parse.unquote(e.attrib['value'])
                 self.options[name]=value
             elif e.tag == ET.QName(config.data.namespace, 'argument'):
                 name=e.attrib['name']
-                value=unicode(urllib.unquote(e.attrib['value']), 'utf8')
+                value=urllib.parse.unquote(e.attrib['value'])
                 self.arguments.append( (name, value) )
             else:
-                print "Unknown tag %s in AdhocViewParametersParser" % e.tag
+                logger.warn("Unknown tag %s in AdhocViewParametersParser %s", e.tag)
diff --git a/lib/advene/gui/views/accumulatorpopup.py b/lib/advene/gui/views/accumulatorpopup.py
index 8e680f3..707e137 100644
--- a/lib/advene/gui/views/accumulatorpopup.py
+++ b/lib/advene/gui/views/accumulatorpopup.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,11 +18,13 @@
 #
 """Accumulator popup.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import time
 import operator
 
-import gtk
+from gi.repository import Gtk
 
 from gettext import gettext as _
 
@@ -64,8 +66,6 @@ class AccumulatorPopup(AdhocView):
         self.scrollable=scrollable
 
         self.new_color = name2color('tomato')
-        self.old_color = gtk.Button().get_style().bg[0]
-
         # List of tuples (widget, hidetime, frame)
         self.widgets=[]
         # Lock on self.widgets
@@ -81,11 +81,11 @@ class AccumulatorPopup(AdhocView):
     def display_message(self, message='', timeout=None, title=None):
         """Convenience method.
         """
-        t=gtk.TextView()
+        t=Gtk.TextView()
         t.set_editable(False)
         t.set_cursor_visible(False)
-        t.set_wrap_mode(gtk.WRAP_WORD)
-        t.set_justification(gtk.JUSTIFY_LEFT)
+        t.set_wrap_mode(Gtk.WrapMode.WORD)
+        t.set_justification(Gtk.Justification.LEFT)
         t.get_buffer().set_text(message)
         self.display(t, timeout, title)
 
@@ -101,65 +101,57 @@ class AccumulatorPopup(AdhocView):
             # Remove the last one
             self.undisplay(self.widgets[0][0])
         if timeout is not None and timeout != 0:
-            hidetime=time.time() * 1000 + long(timeout)
+            hidetime=time.time() * 1000 + int(timeout)
         else:
             hidetime=None
 
         # Build a titled frame around the widget
-        f=gtk.Frame()
-        if isinstance(title, basestring):
-            hb=gtk.HBox()
+        f=Gtk.Frame()
+        if isinstance(title, str):
+            hb=Gtk.HBox()
 
-            l=gtk.Label(title)
-            hb.pack_start(l, expand=False)
+            l=Gtk.Label(label=title)
+            hb.pack_start(l, False, True, 0)
 
             b=get_pixmap_button('small_close.png')
-            b.set_relief(gtk.RELIEF_NONE)
+            b.set_relief(Gtk.ReliefStyle.NONE)
             b.connect('clicked', self.undisplay_cb, widget)
-            hb.pack_start(b, expand=False, fill=False)
+            hb.pack_start(b, False, False, 0)
 
             f.set_label_widget(hb)
         else:
             # Hopefully it is a gtk widget
             f.set_label_widget(title)
         f.set_label_align(0.1, 0.5)
-        f.set_shadow_type(gtk.SHADOW_ETCHED_OUT)
+        f.set_shadow_type(Gtk.ShadowType.ETCHED_OUT)
         f.add(widget)
 
         self.lock.acquire()
-        for t in self.widgets:
-            self.set_color(t[2].get_label_widget(), self.old_color)
         self.widgets.append( (widget, hidetime, f) )
         if hidetime:
             self.controller.register_usertime_action( hidetime,
                                                       lambda c, time: self.undisplay(widget))
         self.widgets.sort(key=operator.itemgetter(1))
         self.lock.release()
-        self.contentbox.pack_start(f, expand=False, padding=2)
+        self.contentbox.pack_start(f, False, False, 2)
 
         f.show_all()
         self.show()
         nb=self.widget.get_parent()
-        if isinstance(nb, gtk.Notebook):
+        if isinstance(nb, Gtk.Notebook):
             # Ensure that the view is visible
             nb.set_current_page(nb.page_num(self.widget))
 
         self.controller.notify('PopupDisplay', view=self)
         return True
 
-    def set_color(self, button, color):
-        for style in (gtk.STATE_ACTIVE, gtk.STATE_NORMAL,
-                      gtk.STATE_SELECTED, gtk.STATE_INSENSITIVE,
-                      gtk.STATE_PRELIGHT):
-            button.modify_bg (style, color)
-
     def get_popup_width(self):
         """Return the requested popup width
 
         According to the hbox size and the max number of popups.
         """
         if self.size:
-            return self.contentbox.get_allocation().width / self.size
+            return int(self.contentbox.get_allocation().width / self.size)
         else:
             return 120
 
@@ -171,7 +163,7 @@ class AccumulatorPopup(AdhocView):
         if not frames:
             return True
         if len(frames) > 1:
-            print "Inconsistency in accumulatorpopup"
+            logger.error("Inconsistency in accumulatorpopup")
         t=frames[0]
         self.widgets.remove(t)
         self.lock.release()
@@ -203,21 +195,21 @@ class AccumulatorPopup(AdhocView):
         return True
 
     def build_widget(self):
-        mainbox=gtk.VBox()
+        mainbox=Gtk.VBox()
 
         if self.vertical:
-            self.contentbox = gtk.VBox()
+            self.contentbox = Gtk.VBox()
             mainbox.add(self.contentbox)
         else:
-            self.contentbox = gtk.HBox()
+            self.contentbox = Gtk.HBox()
             mainbox.add(self.contentbox)
 
         if self.controller.gui:
             self.controller.gui.register_view (self)
 
         if self.scrollable:
-            sw=gtk.ScrolledWindow()
-            sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+            sw=Gtk.ScrolledWindow()
+            sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
             sw.add_with_viewport(mainbox)
             return sw
         else:
diff --git a/lib/advene/gui/views/activebookmarks.py b/lib/advene/gui/views/activebookmarks.py
index 498f004..6d598f1 100644
--- a/lib/advene/gui/views/activebookmarks.py
+++ b/lib/advene/gui/views/activebookmarks.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -17,18 +17,21 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 """Module displaying active time bookmarks."""
+import logging
+logger = logging.getLogger(__name__)
 
 import os
 from gettext import gettext as _
-import gtk
-import gobject
-import pango
-import urllib
+from gi.repository import Gdk
+from gi.repository import Gtk
+from gi.repository import GObject
+from gi.repository import Pango
+import urllib.request, urllib.parse, urllib.error
 
 # Advene part
 import advene.core.config as config
-from advene.gui.util import dialog, get_small_stock_button, get_pixmap_button, name2color, png_to_pixbuf, get_pixmap_toolbutton, get_color_style
-from advene.gui.util import encode_drop_parameters, decode_drop_parameters, shaped_window_from_xpm, arrow_right_xpm
+from advene.gui.util import dialog, get_small_stock_button, get_pixmap_button, name2color, png_to_pixbuf, get_pixmap_toolbutton
+from advene.gui.util import encode_drop_parameters, decode_drop_parameters, get_clipboard
 from advene.gui.views import AdhocView
 from advene.gui.views.bookmarks import BookmarkWidget
 from advene.model.annotation import Annotation
@@ -84,18 +87,15 @@ class ActiveBookmarks(AdhocView):
                 b.widget.show_all()
                 self.bookmarks.append(b)
 
-        self.mainbox=gtk.VBox()
+        self.mainbox=Gtk.VBox()
         self.widget=self.build_widget()
         if typ is None:
             typ=self.controller.package.annotationTypes[0]
         self.type = typ
-        self.arrow_mark=None
         self.refresh()
 
     def debug (self, widget, *p):
-        print "Debug event."
-        if p:
-            print "Data: %s" % str(p)
+        logger.debug("Debug event %s", str(p or "No data"))
         return True
 
     def get_type(self):
@@ -110,10 +110,10 @@ class ActiveBookmarks(AdhocView):
     type=property(get_type, set_type)
 
     def register_callback (self, controller=None):
-        self.loop_id=gobject.timeout_add(1000, self.check_contents)
+        self.loop_id=GObject.timeout_add(1000, self.check_contents)
 
     def unregister_callback(self, controller=None):
-        gobject.source_remove(self.loop_id)
+        GObject.source_remove(self.loop_id)
 
     def get_save_arguments(self):
         # Serialisation format: annotationid:begin:end:content where
@@ -124,7 +124,7 @@ class ActiveBookmarks(AdhocView):
     def refresh(self, *p):
         self.mainbox.foreach(self.mainbox.remove)
         for w in self.bookmarks:
-            self.mainbox.pack_start(w.widget, expand=False)
+            self.mainbox.pack_start(w.widget, False, True, 0)
         self.mainbox.show_all()
         self.generate_focus_chain()
         return True
@@ -217,7 +217,7 @@ class ActiveBookmarks(AdhocView):
                 index=self.bookmarks.index(cur) + 1
         if index is None:
             self.bookmarks.append(b)
-            self.mainbox.pack_start(b.widget, expand=False)
+            self.mainbox.pack_start(b.widget, False, True, 0)
             self.generate_focus_chain()
         else:
             self.bookmarks.insert(index, b)
@@ -287,7 +287,7 @@ class ActiveBookmarks(AdhocView):
     def get_matching_bookmark(self, wid):
         """Return the bookmark whose begin or end image is wid.
 
-        Usually used in DND callbacks, with wid=context.get_source_widget()
+        Usually used in DND callbacks, with wid=Gtk.drag_get_source_widget(context)
         """
         l=[ b
             for b in self.bookmarks
@@ -301,7 +301,7 @@ class ActiveBookmarks(AdhocView):
         """Scroll to the bottom of the view.
         """
         adj=self.mainbox.get_parent().get_vadjustment()
-        adj.value = adj.upper
+        adj.set_value(adj.get_upper())
         return True
 
     def scroll_to_bookmark(self, b=None):
@@ -310,15 +310,15 @@ class ActiveBookmarks(AdhocView):
         if not self.bookmarks:
             return
         b=b or self.get_current_bookmark() or self.bookmarks[0]
-        if b.widget.window is None:
+        if b.widget.get_window() is None:
             return True
-        x, y, w, h, depth=b.widget.window.get_geometry()
+        x, y, w, h = b.widget.get_window().get_geometry()
         parent=self.mainbox.get_parent()
         adj=parent.get_vadjustment()
-        pos=adj.value
-        height=parent.window.get_geometry()[3]
+        pos=adj.get_value()
+        height=parent.get_window().get_geometry().height
         if y < pos or y + h > pos + height:
-            adj.value = min(y, adj.upper - adj.page_size)
+            adj.set_value(helper.clamp(y, adj.get_lower(), adj.get_upper() - adj.get_page_size()))
         return True
 
     def delete_origin_timestamp(self, wid):
@@ -355,15 +355,15 @@ class ActiveBookmarks(AdhocView):
             return
         dt=config.data.drag_type
         b=ActiveBookmark(container=self, from_serialisation=data)
-        if selection.target in ( dt['STRING'][0][0], dt['text-plain'][0][0]):
+        if selection.get_target() in ( dt['STRING'][0][0], dt['text-plain'][0][0]):
             selection.set_text('%s : %s' % (helper.format_time(b.begin), b.content))
-        elif selection.target == dt['timestamp'][0][0]:
-            selection.set(selection.target, 8, encode_drop_parameters(begin=b.begin, comment=b.content))
-        elif selection.target == dt['bookmark'][0][0]:
-            selection.set(selection.target, 8, data)
-        elif selection.target == dt['annotation'][0][0]:
+        elif selection.get_target() == dt['timestamp'][0][0]:
+            selection.set(selection.get_target(), 8, encode_drop_parameters(begin=b.begin, comment=b.content))
+        elif selection.get_target() == dt['bookmark'][0][0]:
+            selection.set(selection.get_target(), 8, data)
+        elif selection.get_target() == dt['annotation'][0][0]:
             if b.annotation is not None:
-                selection.set(selection.target, 8, b.annotation.uri.encode('utf8'))
+                selection.set(selection.get_target(), 8, b.annotation.uri.encode('utf8'))
         else:
             del b
             return False
@@ -377,7 +377,7 @@ class ActiveBookmarks(AdhocView):
     def copy_current_bookmark(self):
         """Copy the current bookmark into the clipboard.
         """
-        c=gtk.clipboard_get()
+        c = get_clipboard()
         cur=self.get_current_bookmark()
         if cur is None:
             return None
@@ -390,26 +390,23 @@ class ActiveBookmarks(AdhocView):
         return cur
 
     def build_widget(self):
-        v=gtk.VBox()
-        hb=gtk.HBox()
+        v=Gtk.VBox()
+        hb=Gtk.HBox()
         hb.set_homogeneous(False)
 
         def bookmark_current_time(b):
-            p=self.controller.player
-            if p.status in (p.PlayingStatus, p.PauseStatus):
-                v=p.current_position_value
-                # Make a snapshot
-                self.controller.update_snapshot(v)
-                self.append(v)
-                return True
+            p = self.controller.player
+            if p.is_playing():
+                self.append(p.current_position_value)
+            return True
 
-        tb=gtk.Toolbar()
-        tb.set_style(gtk.TOOLBAR_ICONS)
+        tb=Gtk.Toolbar()
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
 
         def remove_drag_received(widget, context, x, y, selection, targetType, time):
             if targetType == config.data.target_type['timestamp']:
                 # Check if we received the drag from one of our own widget.
-                wid=context.get_source_widget()
+                wid=Gtk.drag_get_source_widget(context)
                 b=self.get_matching_bookmark(wid)
                 if b is not None:
                     if b.end_widget == b.dropbox:
@@ -428,30 +425,9 @@ class ActiveBookmarks(AdhocView):
                 return True
             return False
 
-        def do_reorder(b, func):
-            self.bookmarks.sort(func)
-            self.refresh()
-            return True
-
-        def reorder(widget):
-            """Display a popup menu proposing various sort options.
-            """
-            m=gtk.Menu()
-            for t, func in (
-                (_("Chronological order"), lambda a, b: cmp(a.begin, b.begin)),
-                (_("Completeness and chronological order"), lambda a, b: cmp(a.end_widget == a.dropbox,
-                                                                             b.end_widget == b.dropbox) or cmp(a.begin, b.begin))
-                ):
-                i=gtk.MenuItem(t)
-                i.connect('activate', do_reorder, func)
-                m.append(i)
-            m.show_all()
-            m.popup(None, widget, None, 0, gtk.get_current_event_time())
-            return True
-
         def do_complete(b, func):
-            l=[ b for b in self.bookmarks if b.annotation is None ]
-            if isinstance(func, long) or isinstance(func, int):
+            l=[ bo for bo in self.bookmarks if bo.annotation is None ]
+            if isinstance(func, int):
                 for b in l:
                     b.end=b.begin+func
             elif func == 'user':
@@ -460,7 +436,7 @@ class ActiveBookmarks(AdhocView):
                                       default="2000")
                 if d is not None:
                     try:
-                        d=long(d)
+                        d=int(d)
                     except ValueError:
                         return
                     for b in l:
@@ -476,17 +452,17 @@ class ActiveBookmarks(AdhocView):
                         b.end=self.controller.cached_duration
 
         def complete(widget):
-            m=gtk.Menu()
+            m=Gtk.Menu()
             for t, func in (
                 (_("User-specified duration"), 'user'),
                 (_("2s duration"), 2000),
                 (_("Complete coverage"), 'coverage'),
                 ):
-                i=gtk.MenuItem(t)
+                i=Gtk.MenuItem(t)
                 i.connect('activate', do_complete, func)
                 m.append(i)
             m.show_all()
-            m.popup(None, widget, None, 0, gtk.get_current_event_time())
+            m.popup_at_pointer(None)
             return True
 
         def remove_current(widget):
@@ -497,22 +473,22 @@ class ActiveBookmarks(AdhocView):
                 self.remove(b)
             return True
 
-        b=get_small_stock_button(gtk.STOCK_DELETE)
+        b=get_small_stock_button(Gtk.STOCK_DELETE)
         b.set_tooltip_text(_("Drop a bookmark here to remove it from the list"))
         if config.data.os == 'win32':
             # DND on win32 is partially broken: it will not detect
             # ACTION_MOVE only. We have to add ACTION_COPY.
-            flags=gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE
+            flags=Gdk.DragAction.COPY | Gdk.DragAction.MOVE
         else:
-            flags=gtk.gdk.ACTION_MOVE
-        b.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                        gtk.DEST_DEFAULT_HIGHLIGHT |
-                        gtk.DEST_DEFAULT_ALL,
-                        config.data.drag_type['timestamp'],
+            flags=Gdk.DragAction.MOVE
+        b.drag_dest_set(Gtk.DestDefaults.MOTION |
+                        Gtk.DestDefaults.HIGHLIGHT |
+                        Gtk.DestDefaults.ALL,
+                        config.data.get_target_types('timestamp'),
                         flags )
         b.connect('drag-data-received', remove_drag_received)
         b.connect('clicked', remove_current)
-        i=gtk.ToolItem()
+        i=Gtk.ToolItem()
         i.add(b)
         tb.insert(i, -1)
 
@@ -520,7 +496,7 @@ class ActiveBookmarks(AdhocView):
         b.set_tooltip_text(_("Insert a bookmark for the current video time"))
         tb.insert(b, -1)
 
-        i=gtk.ToolItem()
+        i=Gtk.ToolItem()
         types=[ (at, self.controller.get_title(at), self.controller.get_element_color(at)) for at in self.controller.package.annotationTypes ]
         types.sort(key=lambda a: a[1])
 
@@ -540,108 +516,82 @@ class ActiveBookmarks(AdhocView):
                 self.set_image_size(s)
                 return True
 
-            m=gtk.Menu()
+            m=Gtk.Menu()
             s=config.data.preferences['bookmark-snapshot-width']
             for size, label in (
-                (long(.5 * s), _("Smallish")),
-                (long(.8 * s), _("Small")),
+                (int(.5 * s), _("Smallish")),
+                (int(.8 * s), _("Small")),
                 (s, _("Normal")),
-                (long(1.2 * s), _("Large")),
-                (long(1.5 * s), _("Larger")),
-                (long(2 * s), _("Huge")),
+                (int(1.2 * s), _("Large")),
+                (int(1.5 * s), _("Larger")),
+                (int(2 * s), _("Huge")),
                 ):
-                i=gtk.MenuItem(label)
+                i=Gtk.MenuItem(label)
                 i.connect('activate', set_scale, size)
                 m.append(i)
             m.show_all()
-            m.popup(None, None, None, 0, gtk.get_current_event_time())
+            m.popup(None, None, None, 0, Gtk.get_current_event_time())
             return True
 
         for (icon, tip, method) in (
-            (gtk.STOCK_REDO, _("Reorder active bookmarks"), reorder),
-            (gtk.STOCK_CONVERT, _("Complete bookmarks into annotations"), complete),
-            (gtk.STOCK_SAVE, _("Save the current state"), self.save_view),
-            (gtk.STOCK_FULLSCREEN, _("Set the size of snaphots"), scale_snaphots_menu),
+            (Gtk.STOCK_CONVERT, _("Complete bookmarks into annotations"), complete),
+            (Gtk.STOCK_SAVE, _("Save the current state"), self.save_view),
+            (Gtk.STOCK_FULLSCREEN, _("Set the size of snaphots"), scale_snaphots_menu),
             ):
             b=get_small_stock_button(icon)
             b.set_tooltip_text(tip)
             b.connect('clicked', method)
-            i=gtk.ToolItem()
+            i=Gtk.ToolItem()
             i.add(b)
             tb.insert(i, -1)
 
         hb.add(tb)
-        v.pack_start(hb, expand=False)
-        sw=gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        v.pack_start(hb, False, True, 0)
+        sw=Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         sw.add_with_viewport(self.mainbox)
         self.scrollwindow=sw
 
         def scroll_on_drag(widget, drag_context, x, y, timestamp):
             adj=widget.get_adjustment()
-            v=adj.value
-            if y > widget.get_allocation().height / 2:
+            v=adj.get_value()
+            if y > int(widget.get_allocation().height / 2):
                 # Try to scroll down
-                v += max(adj.step_increment, adj.page_increment / 3)
+                v += max(adj.step_increment, int(adj.page_increment / 3))
             else:
-                v -= max(adj.step_increment, adj.page_increment / 3)
-            if v < 0:
-                v = 0
-            elif v > adj.upper - adj.page_size:
-                v=adj.upper - adj.page_size
-            adj.value=v
+                v -= max(adj.step_increment, int(adj.page_increment / 3))
+            adj.set_value(helper.clamp(v, adj.get_lower(), adj.get_upper() - adj.get_page_size()))
             return True
 
         sb=sw.get_vscrollbar()
-        sb.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                         gtk.DEST_DEFAULT_HIGHLIGHT |
-                         gtk.DEST_DEFAULT_ALL,
-                         config.data.drag_type['annotation']
-                         + config.data.drag_type['timestamp']
-                         + config.data.drag_type['annotation-type']
-                         ,
-                         gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
+        sb.drag_dest_set(Gtk.DestDefaults.MOTION |
+                         Gtk.DestDefaults.HIGHLIGHT |
+                         Gtk.DestDefaults.ALL,
+                         config.data.get_target_types('annotation',
+                                                      'timestamp',
+                                                      'annotation-type'),
+                         Gdk.DragAction.COPY | Gdk.DragAction.MOVE)
         sb.connect('drag-motion', scroll_on_drag)
 
-        def hide_arrow_mark(*p):
-            if self.arrow_mark is not None:
-                self.arrow_mark.hide()
-            return True
-
         def mainbox_drag_motion(widget, drag_context, x, y, timestamp):
-            if self.arrow_mark is None:
-                self.arrow_mark=shaped_window_from_xpm(arrow_right_xpm)
             if not self.bookmarks:
                 return True
-            l=[ b
-                for b in self.bookmarks
-                if y < b.widget.get_allocation().y + b.widget.get_allocation().height  ]
-            if l:
-                y=l[0].widget.get_allocation().y - 10
-            else:
-                a=self.bookmarks[-1].widget.get_allocation()
-                y=a.y + a.height
-            rx, ry = widget.window.get_origin()
-            self.arrow_mark.move(long(rx), long(ry + y))
-            self.arrow_mark.show_all()
-            actions=drag_context.actions
-            is_in_view=drag_context.get_source_widget().is_ancestor(widget)
-            if (actions == gtk.gdk.ACTION_MOVE
-                or actions == gtk.gdk.ACTION_LINK):
+            actions=drag_context.get_actions()
+            is_in_view=Gtk.drag_get_source_widget(drag_context).is_ancestor(widget)
+            if (actions == Gdk.DragAction.MOVE
+                or actions == Gdk.DragAction.LINK):
                 # Only 1 possible action. Use it.
-                drag_context.drag_status(actions, timestamp)
-            elif actions == gtk.gdk.ACTION_COPY and is_in_view and config.data.drag_type['annotation'][0][0] in drag_context.targets:
+                Gdk.drag_status(drag_context, actions, timestamp)
+            elif actions == Gdk.DragAction.COPY and is_in_view and config.data.drag_type['annotation'][0][0] in drag_context.list_targets():
                 # We cannot just copy an annotation from our own view,
                 # it just can be moved
-                drag_context.drag_status(gtk.gdk.ACTION_MOVE, timestamp)
-            elif gtk.gdk.ACTION_MOVE & actions and is_in_view:
+                Gdk.drag_status(drag_context, Gdk.DragAction.MOVE, timestamp)
+            elif Gdk.DragAction.MOVE & actions and is_in_view:
                 # DND from the same view. Force default to move.
-                drag_context.drag_status(gtk.gdk.ACTION_MOVE, timestamp)
+                Gdk.drag_status(drag_context, Gdk.DragAction.MOVE, timestamp)
 
         def mainbox_drag_received(widget, context, x, y, selection, targetType, time):
             index=None
-            if self.arrow_mark is not None:
-                self.arrow_mark.hide()
             if widget == self.mainbox:
                 l=[ b
                     for b in self.bookmarks
@@ -649,25 +599,25 @@ class ActiveBookmarks(AdhocView):
                 if l:
                     index=self.bookmarks.index(l[0])
             if targetType == config.data.target_type['timestamp']:
-                data=decode_drop_parameters(selection.data)
-                position=long(data['timestamp'])
+                data=decode_drop_parameters(selection.get_data())
+                position=int(data['timestamp'])
                 b=self.append(position, index)
                 if 'comment' in data:
                     b.content=data['comment']
                 # If the drag originated from our own widgets, remove it.
-                if context.action == gtk.gdk.ACTION_MOVE:
-                    self.delete_origin_timestamp(context.get_source_widget())
+                if Gdk.DragAction.MOVE & context.get_actions():
+                    self.delete_origin_timestamp(Gtk.drag_get_source_widget(context))
                 return True
             elif targetType == config.data.target_type['annotation-type']:
                 # Populate the view with annotation begins
-                source=self.controller.package.annotationTypes.get(unicode(selection.data, 'utf8'))
+                source=self.controller.package.annotationTypes.get(str(selection.get_data(), 'utf8'))
                 if source is not None:
                     for a in source.annotations:
                         b=self.append(a.fragment.begin)
                         b.content=self.controller.get_title(a)
                 return True
             elif targetType == config.data.target_type['annotation']:
-                sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+                sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
                 for source in sources:
                     l=[ b for b in self.bookmarks if b.annotation == source ]
                     if l:
@@ -691,47 +641,42 @@ class ActiveBookmarks(AdhocView):
                 self.refresh()
                 return True
             else:
-                print "Unknown target type for drop: %d" % targetType
+                logger.warn("Unknown target type for drop: %d" % targetType)
                 return False
 
-        self.mainbox.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                   gtk.DEST_DEFAULT_HIGHLIGHT |
-                                   gtk.DEST_DEFAULT_ALL,
-                                   config.data.drag_type['annotation']
-                                   + config.data.drag_type['timestamp']
-                                   + config.data.drag_type['annotation-type']
-                                   ,
-                                   gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
+        self.mainbox.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                   Gtk.DestDefaults.HIGHLIGHT |
+                                   Gtk.DestDefaults.ALL,
+                                   config.data.get_target_types('annotation', 'timestamp', 'annotation-type'),
+                                   Gdk.DragAction.COPY | Gdk.DragAction.MOVE)
         self.mainbox.connect('drag-data-received', mainbox_drag_received)
         self.mainbox.connect('drag-motion', mainbox_drag_motion)
-        self.mainbox.connect('drag-end', hide_arrow_mark)
-        self.mainbox.connect('drag-leave', hide_arrow_mark)
         self.mainbox.set_spacing(8)
 
         # Shortcuts
         def mainbox_key_press(widget, event):
-            if event.keyval == gtk.keysyms.Delete or event.keyval == gtk.keysyms.BackSpace:
+            if event.keyval == Gdk.KEY_Delete or event.keyval == Gdk.KEY_BackSpace:
                 cur=self.get_current_bookmark()
                 if cur is not None:
                     self.remove(cur)
                 return True
-            elif event.keyval == gtk.keysyms.d and event.state & gtk.gdk.CONTROL_MASK:
+            elif event.keyval == Gdk.KEY_d and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
                 # Control-D: duplicate current bookmark
                 self.duplicate_bookmark()
                 return True
-            elif event.keyval == gtk.keysyms.c and event.state & gtk.gdk.CONTROL_MASK:
+            elif event.keyval == Gdk.KEY_c and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
                 # Copy.
                 self.copy_current_bookmark()
                 return True
-            elif event.keyval == gtk.keysyms.x and event.state & gtk.gdk.CONTROL_MASK:
+            elif event.keyval == Gdk.KEY_x and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
                 # Cut
                 cur = self.copy_current_bookmark()
                 if cur is not None:
                     self.remove(cur)
                 return True
-            elif event.keyval == gtk.keysyms.v and event.state & gtk.gdk.CONTROL_MASK:
+            elif event.keyval == Gdk.KEY_v and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
                 # Paste
-                c=gtk.clipboard_get()
+                c = get_clipboard()
                 def paste_bookmark(cl, sel, data):
                     b=ActiveBookmark(container=self, from_serialisation=sel.data)
                     self.append(b, after_current=True)
@@ -768,12 +713,12 @@ class ActiveBookmark(object):
                 annotation=helper.get_id(self.controller.package.annotations, ident)
             else:
                 annotation=None
-            begin=long(b)
+            begin=int(b)
             if e == 'None':
                 end=None
             else:
-                end=long(e)
-            content=urllib.unquote(c).decode('utf-8', 'ignore')
+                end=int(e)
+            content=urllib.parse.unquote(c)
 
         self.annotation=annotation
         if annotation is not None:
@@ -787,17 +732,16 @@ class ActiveBookmark(object):
 
         # begin_widget and end_widget are both instances of BookmarkWidget.
         # end_widget may be self.dropbox (if end is not initialized yet)
-        self.dropbox=gtk.EventBox()
+        self.dropbox=Gtk.EventBox()
         self.dropbox.image=None
         self.dropbox.set_size_request(config.data.preferences['bookmark-snapshot-width'], -1)
         self.dropbox.show()
         self.dropbox.set_no_show_all(True)
-        self.dropbox.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                            gtk.DEST_DEFAULT_HIGHLIGHT |
-                                            gtk.DEST_DEFAULT_ALL,
-                                            config.data.drag_type['timestamp']
-                                            + config.data.drag_type['annotation-type'],
-                                            gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
+        self.dropbox.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                            Gtk.DestDefaults.HIGHLIGHT |
+                                            Gtk.DestDefaults.ALL,
+                                            config.data.get_target_types('timestamp', 'annotation-type'),
+                                            Gdk.DragAction.COPY | Gdk.DragAction.MOVE)
         self.dropbox.connect('drag-data-received', self.begin_drag_received)
         self.dropbox.connect('drag-motion', self.bound_drag_motion)
 
@@ -838,15 +782,14 @@ class ActiveBookmark(object):
                                            width=self.container.options['snapshot-size'])
             self.end_widget.widget.set_property('can-focus', False)
             parent=self.begin_widget.widget.get_parent()
-            parent.pack_start(self.end_widget.widget, expand=False)
+            parent.pack_start(self.end_widget.widget, False, True, 0)
             self.end_widget.widget.show_all()
 
-            self.end_widget.image.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                                gtk.DEST_DEFAULT_HIGHLIGHT |
-                                                gtk.DEST_DEFAULT_ALL,
-                                                config.data.drag_type['timestamp']
-                                                + config.data.drag_type['annotation-type'],
-                                                gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
+            self.end_widget.image.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                                Gtk.DestDefaults.HIGHLIGHT |
+                                                Gtk.DestDefaults.ALL,
+                                                config.data.get_target_types('timestamp', 'annotation-type'),
+                                                Gdk.DragAction.COPY | Gdk.DragAction.MOVE)
             self.end_widget.image.connect('drag-data-received', self.end_drag_received)
             self.end_widget.image.connect('drag-motion', self.bound_drag_motion)
             self.end_widget.image.connect('scroll-event', self.handle_scroll_event, self.get_end, self.set_end, lambda v: v > self.begin)
@@ -862,7 +805,7 @@ class ActiveBookmark(object):
                 for (label, action) in (
                     (_("Remove end timestamp"), lambda i: self.set_end(None)),
                     ):
-                    i=gtk.MenuItem(label)
+                    i=Gtk.MenuItem(label)
                     i.connect('activate', action)
                     menu.append(i)
                 return
@@ -914,7 +857,7 @@ class ActiveBookmark(object):
         return ":".join( (ident,
                           str(self.begin),
                           str(self.end),
-                          urllib.quote(self.content.encode('utf-8')) ) )
+                          urllib.parse.quote(self.content.encode('utf-8')) ) )
 
     def as_html(self):
         if self.annotation is not None:
@@ -930,26 +873,26 @@ class ActiveBookmark(object):
 
     def bound_drag_motion(self, widget, drag_context, x, y, timestamp):
         # Force the correct default action.
-        actions=drag_context.actions
-        is_in_view=drag_context.get_source_widget().is_ancestor(self.container.mainbox)
-        if (actions == gtk.gdk.ACTION_MOVE
-            or actions == gtk.gdk.ACTION_LINK
-            or actions == gtk.gdk.ACTION_COPY):
+        actions=drag_context.get_actions()
+        is_in_view=Gtk.drag_get_source_widget(drag_context).is_ancestor(self.container.mainbox)
+        if (actions == Gdk.DragAction.MOVE
+            or actions == Gdk.DragAction.LINK
+            or actions == Gdk.DragAction.COPY):
             # Only 1 possible action. Use it.
-            drag_context.drag_status(actions, timestamp)
-        elif gtk.gdk.ACTION_MOVE & actions and is_in_view:
+            Gdk.drag_status(drag_context, actions, timestamp)
+        elif Gdk.DragAction.MOVE & actions and is_in_view:
             # DND from the same view. Force default to move.
-            drag_context.drag_status(gtk.gdk.ACTION_MOVE, timestamp)
+            Gdk.drag_status(drag_context, Gdk.DragAction.MOVE, timestamp)
 
     def begin_drag_received(self, widget, context, x, y, selection, targetType, time):
         if self.last_drag_time == time:
             return True
         self.last_drag_time=time
-        if self.is_widget_in_bookmark(context.get_source_widget()):
+        if self.is_widget_in_bookmark(Gtk.drag_get_source_widget(context)):
             return False
         if targetType == config.data.target_type['timestamp']:
-            data=decode_drop_parameters(selection.data)
-            e=long(data['timestamp'])
+            data=decode_drop_parameters(selection.get_data())
+            e=int(data['timestamp'])
             if self.end is None:
                 if e < self.begin:
                     # Invert begin and end.
@@ -970,25 +913,25 @@ class ActiveBookmark(object):
             # If the drag originated from our own widgets, remove it.
             # If the drop was done from within our view, then
             # delete the origin widget.
-            if context.action == gtk.gdk.ACTION_MOVE:
-                self.container.delete_origin_timestamp(context.get_source_widget())
+            if Gdk.DragAction.MOVE & context.get_actions():
+                self.container.delete_origin_timestamp(Gtk.drag_get_source_widget(context))
             # Set the current status
             self.container.set_current_bookmark(self)
             return True
         elif targetType == config.data.target_type['annotation-type']:
-            source=self.controller.package.annotationTypes.get(unicode(selection.data, 'utf8'))
+            source=self.controller.package.annotationTypes.get(str(selection.get_data(), 'utf8'))
             if source is not None:
                 self.transtype(source)
             return True
         return False
 
     def end_drag_received(self, widget, context, x, y, selection, targetType, time):
-        if self.is_widget_in_bookmark(context.get_source_widget()):
+        if self.is_widget_in_bookmark(Gtk.drag_get_source_widget(context)):
             return False
         self.container.set_current_bookmark(self)
         if targetType == config.data.target_type['timestamp']:
-            data=decode_drop_parameters(selection.data)
-            e=long(data['timestamp'])
+            data=decode_drop_parameters(selection.get_data())
+            e=int(data['timestamp'])
             if self.end is not None:
                 # Save a copy of the deleted timestamp next to the current bookmark
                 i=self.container.bookmarks.index(self)
@@ -1001,12 +944,12 @@ class ActiveBookmark(object):
             # If the drag originated from our own widgets, remove it.
             # If the drop was done from within our view, then
             # delete the origin widget.
-            if context.action == gtk.gdk.ACTION_MOVE:
-                self.container.delete_origin_timestamp(context.get_source_widget())
+            if Gdk.DragAction.MOVE & context.get_actions():
+                self.container.delete_origin_timestamp(Gtk.drag_get_source_widget(context))
             self.container.set_current_bookmark(self)
             return True
         elif targetType == config.data.target_type['annotation-type']:
-            source=self.controller.package.annotationTypes.get(unicode(selection.data, 'utf8'))
+            source=self.controller.package.annotationTypes.get(str(selection.get_data(), 'utf8'))
             if source is not None:
                 self.transtype(source)
             return True
@@ -1024,7 +967,7 @@ class ActiveBookmark(object):
             col=self.controller.get_element_color(self.annotation)
             if col is not None:
                 color=name2color(col)
-                self.begin_widget.comment_entry.modify_base(gtk.STATE_NORMAL, color)
+                self.begin_widget.comment_entry.modify_base(Gtk.StateType.NORMAL, color)
         return True
 
     def set_content(self, c):
@@ -1075,7 +1018,7 @@ class ActiveBookmark(object):
                         at.date=self.controller.get_timestamp()
                         at.title=_("Active bookmark")
                         at.mimetype='text/plain'
-                        at.setMetaData(config.data.namespace, 'color', self.controller.package._color_palette.next())
+                        at.setMetaData(config.data.namespace, 'color', next(self.controller.package._color_palette))
                         at.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
                         schema.annotationTypes.append(at)
                         self.controller.notify('AnnotationTypeCreate', annotationtype=at)
@@ -1086,8 +1029,8 @@ class ActiveBookmark(object):
                     type=at,
                     author=config.data.userid,
                     date=self.controller.get_timestamp(),
-                    fragment=MillisecondFragment(begin=long(self.begin),
-                                                 end=long(self.end)))
+                    fragment=MillisecondFragment(begin=int(self.begin),
+                                                 end=int(self.end)))
                 el.content.data=self.content
                 self.controller.package.annotations.append(el)
                 self.annotation=el
@@ -1110,7 +1053,7 @@ class ActiveBookmark(object):
                 self.container.remove(self)
                 return True
             b=get_pixmap_button('small_ok.png', handle_ok)
-            b.set_relief(gtk.RELIEF_NONE)
+            b.set_relief(Gtk.ReliefStyle.NONE)
             b.set_tooltip_text(_("Validate the annotation"))
             def set_current(widget, event):
                 self.container.set_current_bookmark(self)
@@ -1123,14 +1066,14 @@ class ActiveBookmark(object):
             col=self.controller.get_element_color(self.annotation)
             if col is not None:
                 color=name2color(col)
-                self.begin_widget.comment_entry.modify_base(gtk.STATE_NORMAL, color)
+                self.begin_widget.comment_entry.modify_base(Gtk.StateType.NORMAL, color)
         else:
             # Reset the color and the label widget
             l=self.frame.get_label_widget()
             if l is not None:
                 l.destroy()
             # Reset the textview color
-            self.begin_widget.comment_entry.modify_base(gtk.STATE_NORMAL, self.default_background_color)
+            #self.begin_widget.comment_entry.modify_base(Gtk.StateType.NORMAL, self.default_background_color)
 
     def grab_focus(self, *p):
         """Set the focus on the comment edition widget.
@@ -1140,16 +1083,16 @@ class ActiveBookmark(object):
 
     def handle_scroll_event(self, button, event, get_value, set_value, check_value):
         # Handle scroll actions
-        if not (event.state & gtk.gdk.CONTROL_MASK):
+        if not (event.get_state() & Gdk.ModifierType.CONTROL_MASK):
             return False
-        if event.state & gtk.gdk.SHIFT_MASK:
+        if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
             i='second-scroll-increment'
         else:
             i='scroll-increment'
 
-        if event.direction == gtk.gdk.SCROLL_DOWN:
+        if event.direction == Gdk.ScrollDirection.DOWN:
             incr=-config.data.preferences[i]
-        elif event.direction == gtk.gdk.SCROLL_UP:
+        elif event.direction == Gdk.ScrollDirection.UP:
             incr=config.data.preferences[i]
 
         v=get_value()
@@ -1171,40 +1114,40 @@ class ActiveBookmark(object):
         position is either 'begin' or 'end'.
         """
         if position == 'begin':
-            self.controller.notify('BookmarkUnhighlight', timestamp=self.begin, immediate=True)
+            self.controller.notify('BookmarkUnhighlight', timestamp=self.begin, media=self.controller.package.media, immediate=True)
             if self.end is None:
                 self.container.remove(self)
             else:
                 self.begin = self.end
                 self.end = None
         elif position == 'end':
-            self.controller.notify('BookmarkUnhighlight', timestamp=self.end, immediate=True)
+            self.controller.notify('BookmarkUnhighlight', timestamp=self.end, media=self.controller.package.media, immediate=True)
             self.end = None
 
     def timestamp_key_press(self, widget, event, source):
         def move_or_navigate(index, event):
-            if event.state & gtk.gdk.SHIFT_MASK:
+            if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
                 # Shift-up/down/home/end: move the bookmark
                 self.container.move_boomark(self, index)
             else:
                 # Set the current bookmark
                 self.container.select_bookmark(index)
 
-        if event.keyval == gtk.keysyms.Delete or event.keyval == gtk.keysyms.BackSpace:
+        if event.keyval == Gdk.KEY_Delete or event.keyval == Gdk.KEY_BackSpace:
             self.delete_timestamp(source)
             return True
-        elif event.keyval == gtk.keysyms.d and event.state & gtk.gdk.CONTROL_MASK:
+        elif event.keyval == Gdk.KEY_d and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             # Control-D: duplicate current bookmark
             self.container.duplicate_bookmark()
             return True
-        elif event.keyval == gtk.keysyms.Up or event.keyval == gtk.keysyms.Down:
+        elif event.keyval == Gdk.KEY_Up or event.keyval == Gdk.KEY_Down:
             # Up/Down navigation. It is normally handled by Gtk but
             # the default behaviour has a corner case which makes it
             # impractical in this case (going from a bookmark to an
             # annotation selects the annotation content, and prevents
             # further navigation). Hence we handle it manually.
             index=self.container.bookmarks.index(self)
-            if event.keyval == gtk.keysyms.Up:
+            if event.keyval == Gdk.KEY_Up:
                 if index == 0:
                     return True
                 index -= 1
@@ -1214,37 +1157,35 @@ class ActiveBookmark(object):
                     return True
             move_or_navigate(index, event)
             return True
-        elif event.keyval == gtk.keysyms.Home:
+        elif event.keyval == Gdk.KEY_Home:
             move_or_navigate(0, event)
-        elif event.keyval == gtk.keysyms.End:
+        elif event.keyval == Gdk.KEY_End:
             move_or_navigate(-1, event)
         return False
 
     def build_widget(self):
 
-        f=gtk.Frame()
+        f=Gtk.Frame()
 
-        box=gtk.HBox()
+        box=Gtk.HBox()
 
         self.begin_widget=BookmarkWidget(self.controller,
                                          display_comments=True,
                                          width=self.container.options['snapshot-size'])
-        self.begin_widget.image.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                              gtk.DEST_DEFAULT_HIGHLIGHT |
-                                              gtk.DEST_DEFAULT_ALL,
-                                              config.data.drag_type['timestamp']
-                                              + config.data.drag_type['annotation-type'],
-                                              gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE )
+        self.begin_widget.image.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                              Gtk.DestDefaults.HIGHLIGHT |
+                                              Gtk.DestDefaults.ALL,
+                                              config.data.get_target_types('timestamp', 'annotation-type'),
+                                              Gdk.DragAction.COPY | Gdk.DragAction.MOVE )
         self.begin_widget.image.connect('drag-data-received', self.begin_drag_received)
         self.begin_widget.image.connect('drag-motion', self.bound_drag_motion)
         self.begin_widget.image.connect('scroll-event', self.handle_scroll_event, self.get_begin, self.set_begin, lambda v: self.end is None or v < self.end)
 
-        self.begin_widget.comment_entry.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                              gtk.DEST_DEFAULT_HIGHLIGHT |
-                                              gtk.DEST_DEFAULT_ALL,
-                                              config.data.drag_type['timestamp']
-                                              + config.data.drag_type['annotation-type'],
-                                              gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE )
+        self.begin_widget.comment_entry.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                                      Gtk.DestDefaults.HIGHLIGHT |
+                                                      Gtk.DestDefaults.ALL,
+                                                      config.data.get_target_types('timestamp', 'annotation-type'),
+                                                      Gdk.DragAction.COPY | Gdk.DragAction.MOVE )
         self.begin_widget.comment_entry.connect('drag-data-received', self.begin_drag_received)
         self.begin_widget.comment_entry.connect('drag-motion', self.bound_drag_motion)
         self.begin_widget.image.connect('key-press-event', self.timestamp_key_press, 'begin')
@@ -1270,16 +1211,16 @@ class ActiveBookmark(object):
                     (_("Remove begin timestamp"), remove_begin)
                     )
             for (label, action) in l:
-                i=gtk.MenuItem(label)
+                i=Gtk.MenuItem(label)
                 i.connect('activate', action)
                 menu.append(i)
             if self.annotation is None:
-                i=gtk.MenuItem(_("Complete bookmark"))
+                i=Gtk.MenuItem(_("Complete bookmark"))
                 i.connect('activate', lambda i: self.set_end(self.begin + 2000))
                 menu.append(i)
             else:
-                i=gtk.MenuItem(_("Change type to"))
-                sm=gtk.Menu()
+                i=Gtk.MenuItem(_("Change type to"))
+                sm=Gtk.Menu()
                 i.set_submenu(sm)
                 menu.append(i)
                 l=[ (t, self.controller.get_title(t))
@@ -1287,7 +1228,7 @@ class ActiveBookmark(object):
                     if t != self.annotation.type ]
                 l.sort(key=lambda a: a[1])
                 for (typ, title) in l:
-                    i=gtk.MenuItem(title, use_underline=False)
+                    i=Gtk.MenuItem(title, use_underline=False)
                     i.connect('activate', (lambda i, t: self.transtype(t)), typ)
                     sm.append(i)
             return
@@ -1295,25 +1236,22 @@ class ActiveBookmark(object):
 
         self.begin_widget.comment_entry.set_accepts_tab(False)
 
-        box.pack_start(self.begin_widget.widget, expand=True)
-        box.pack_start(self.end_widget, expand=False)
+        box.pack_start(self.begin_widget.widget, True, True, 0)
+        box.pack_start(self.end_widget, False, True, 0)
         f.add(box)
         f.show_all()
 
         self.frame=f
 
-        # Memorize the default textview color.
-        self.default_background_color=self.begin_widget.comment_entry.get_style().base[gtk.STATE_NORMAL]
-
         #if self.annotation is not None:
         self.set_frame_attributes()
 
         # Add a padding widget so that the frame fits the displayed elements
-        #padding=gtk.HBox()
-        #padding.pack_start(f, expand=False)
+        #padding=Gtk.HBox()
+        #padding.pack_start(f, False, True, 0)
 
         # Use an Event box to be able to drag the frame representing an annotation
-        eb=gtk.EventBox()
+        eb=Gtk.EventBox()
         eb.add(f)
 
         def drag_sent(widget, context, selection, targetType, eventTime):
@@ -1323,81 +1261,84 @@ class ActiveBookmark(object):
                 if self.annotation is None:
                     return False
                 else:
-                    selection.set(selection.target, 8, self.annotation.uri.encode('utf8'))
+                    selection.set(selection.get_target(), 8, self.annotation.uri.encode('utf8'))
             elif targetType == config.data.target_type['uri-list']:
                 if self.annotation is None:
                     return False
                 c=self.controller.build_context(here=self.annotation)
                 uri=c.evaluateValue('here/absolute_url')
-                selection.set(selection.target, 8, uri.encode('utf8'))
+                selection.set(selection.get_target(), 8, uri.encode('utf8'))
             elif (targetType == config.data.target_type['text-plain']
                   or targetType == config.data.target_type['TEXT']
                   or targetType == config.data.target_type['STRING']):
                 # Put the timecode + content
-                selection.set(selection.target, 8, ("%s : %s" % (helper.format_time(self.begin),
+                selection.set(selection.get_target(), 8, ("%s : %s" % (helper.format_time(self.begin),
                                                                  self.content)).encode('utf8'))
             elif targetType == config.data.target_type['timestamp']:
-                selection.set(selection.target, 8, encode_drop_parameters(timestamp=self.begin,
+                selection.set(selection.get_target(), 8, encode_drop_parameters(timestamp=self.begin,
                                                                           comment=self.content))
             else:
                 return False
             return True
 
-        eb.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                           config.data.drag_type['annotation']
-                           + config.data.drag_type['uri-list']
-                           + config.data.drag_type['text-plain']
-                           + config.data.drag_type['TEXT']
-                           + config.data.drag_type['STRING']
-                           + config.data.drag_type['timestamp']
-                           + config.data.drag_type['tag']
-                           ,
-                           gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
+        eb.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                           config.data.get_target_types('annotation',
+                                                        'uri-list',
+                                                        'text-plain',
+                                                        'TEXT',
+                                                        'STRING',
+                                                        'timestamp',
+                                                        'tag'),
+                           Gdk.DragAction.LINK | Gdk.DragAction.COPY | Gdk.DragAction.MOVE)
         eb.connect('drag-data-get', drag_sent)
 
         def _drag_begin(widget, context):
-            w=gtk.Window(gtk.WINDOW_POPUP)
+            w=Gtk.Window(Gtk.WindowType.POPUP)
             w.set_decorated(False)
 
-            style=get_color_style(w, 'black', 'white')
-            w.set_style(style)
+            w.get_style_context().add_class('advene_drag_icon')
 
-            v=gtk.VBox()
-            v.set_style(style)
-            h=gtk.HBox()
-            h.set_style(style)
-            begin=gtk.Image()
-            h.pack_start(begin, expand=False)
-            padding=gtk.HBox()
+            v=Gtk.VBox()
+            v.get_style_context().add_class('advene_drag_icon')
+            h=Gtk.HBox()
+            h.get_style_context().add_class('advene_drag_icon')
+            begin=Gtk.Image()
+            h.pack_start(begin, False, True, 0)
+            padding=Gtk.HBox()
             # Padding
-            h.pack_start(padding, expand=True)
-            end=gtk.Image()
-            h.pack_start(end, expand=False)
-            v.pack_start(h, expand=False)
-            l=gtk.Label()
-            l.set_ellipsize(pango.ELLIPSIZE_END)
-            l.set_style(style)
-            v.pack_start(l, expand=False)
+            h.pack_start(padding, True, True, 0)
+            end=Gtk.Image()
+            h.pack_start(end, False, True, 0)
+            v.pack_start(h, False, True, 0)
+            l=Gtk.Label()
+            l.set_ellipsize(Pango.EllipsizeMode.END)
+            l.get_style_context().add_class('advene_drag_icon')
+            v.pack_start(l, False, True, 0)
 
             def set_cursor(wid, t=None, precision=None):
                 if t is None:
-                    t=self.annotation or self.begin
-                cache=self.controller.package.imagecache
+                    t = self.annotation or self.begin
+
                 if self.no_image_pixbuf is None:
-                    self.no_image_pixbuf=png_to_pixbuf(cache.not_yet_available_image, width=config.data.preferences['drag-snapshot-width'])
+                    self.no_image_pixbuf = png_to_pixbuf(self.controller.get_snapshot(-1), width=config.data.preferences['drag-snapshot-width'])
                 if not t == w._current:
-                    if isinstance(t, long) or isinstance(t, int):
-                        if cache.is_initialized(t, epsilon=config.data.preferences['bookmark-snapshot-precision']):
-                            begin.set_from_pixbuf(png_to_pixbuf (cache.get(t, epsilon=config.data.preferences['bookmark-snapshot-precision']), width=config.data.preferences['drag-snapshot-width']))
-                        elif begin.get_pixbuf() != self.no_image_pixbuf:
-                            begin.set_from_pixbuf(self.no_image_pixbuf)
+                    if isinstance(t, int):
+                        snap = self.controller.get_snapshot(position=t, annotation=self.annotation, precision=config.data.preferences['bookmark-snapshot-precision'])
+                        if snap.is_default:
+                            pixbuf = self.no_image_pixbuf
+                        else:
+                            pixbuf = png_to_pixbuf(snap, width=config.data.preferences['drag-snapshot-width'])
+                        begin.set_from_pixbuf(pixbuf)
                         end.hide()
                         padding.hide()
                         l.set_text(helper.format_time(t))
                     elif isinstance(t, Annotation):
                         # It can be an annotation
-                        begin.set_from_pixbuf(png_to_pixbuf (cache.get(t.fragment.begin), width=config.data.preferences['drag-snapshot-width']))
-                        end.set_from_pixbuf(png_to_pixbuf (cache.get(t.fragment.end), width=config.data.preferences['drag-snapshot-width']))
+                        begin.set_from_pixbuf(png_to_pixbuf(self.controller.get_snapshot(annotation=t),
+                                                            width=config.data.preferences['drag-snapshot-width']))
+                        end.set_from_pixbuf(png_to_pixbuf(self.controller.get_snapshot(annotation=t,
+                                                                                       position=t.fragment.end),
+                                                          width=config.data.preferences['drag-snapshot-width']))
                         end.show()
                         padding.show()
                         l.set_text(self.controller.get_title(t))
@@ -1409,9 +1350,9 @@ class ActiveBookmark(object):
             w._current=None
             w.set_cursor = set_cursor.__get__(w)
             w.set_cursor()
-            w.set_size_request(long(2.5 * config.data.preferences['drag-snapshot-width']), -1)
+            w.set_size_request(int(2.5 * config.data.preferences['drag-snapshot-width']), -1)
             widget._icon=w
-            context.set_icon_widget(w, 0, 0)
+            Gtk.drag_set_icon_widget(context, w, 0, 0)
             return True
 
         def _drag_end(widget, context):
@@ -1420,7 +1361,7 @@ class ActiveBookmark(object):
             return True
 
         def _drag_motion(widget, drag_context, x, y, timestamp):
-            w=drag_context.get_source_widget()
+            w=Gtk.drag_get_source_widget(drag_context)
             try:
                 w._icon.set_cursor()
             except AttributeError:
@@ -1434,7 +1375,7 @@ class ActiveBookmark(object):
             eb.connect('drag-motion', _drag_motion)
 
         def _button_press(widget, event):
-            if event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS:
+            if event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
                 if self.annotation is not None:
                     menu=advene.gui.popup.Menu(self.annotation, controller=self.controller)
                     menu.popup()
diff --git a/lib/advene/gui/views/annotationdisplay.py b/lib/advene/gui/views/annotationdisplay.py
index b44ffde..81f16f0 100644
--- a/lib/advene/gui/views/annotationdisplay.py
+++ b/lib/advene/gui/views/annotationdisplay.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,8 +19,10 @@
 """Module displaying the contents of an annotation.
 """
 
-import gobject
-import gtk
+from gi.repository import GObject
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import Gtk
 from gettext import gettext as _
 
 import advene.core.config as config
@@ -86,7 +88,7 @@ class AnnotationDisplay(AdhocView):
                 'end': helper.format_time(None),
                 'contents': '',
                 'imagecontents': None}
-        elif isinstance(self.annotation, int) or isinstance(self.annotation, long):
+        elif isinstance(self.annotation, int):
             d={ 'title': _("Current time"),
                 'begin': helper.format_time(self.annotation),
                 'end': helper.format_time(None),
@@ -143,14 +145,14 @@ class AnnotationDisplay(AdhocView):
             elif self.annotation.content.mimetype.startswith('image/'):
                 # Image content, other than image/svg
                 # Load the element content
-                loader = gtk.gdk.PixbufLoader()
+                loader = GdkPixbuf.PixbufLoader()
                 try:
                     loader.write (self.annotation.content.data, len (self.annotation.content.data))
                     loader.close ()
                     pixbuf = loader.get_pixbuf ()
-                except gobject.GError:
+                except GObject.GError:
                     # The PNG data was invalid.
-                    pixbuf=gtk.gdk.pixbuf_new_from_file(config.data.advenefile( ( 'pixmaps', 'notavailable.png' ) ))
+                    pixbuf=GdkPixbuf.Pixbuf.new_from_file(config.data.advenefile( ( 'pixmaps', 'notavailable.png' ) ))
 
                 d['contents']=''
                 d['imagecontents'] = pixbuf
@@ -158,7 +160,7 @@ class AnnotationDisplay(AdhocView):
                 d['contents']=self.annotation.content.data
                 d['imagecontents']=None
 
-        for k, v in d.iteritems():
+        for k, v in d.items():
             if k == 'title':
                 self.label[k].set_markup(v)
             elif k == 'imagecontents':
@@ -175,7 +177,7 @@ class AnnotationDisplay(AdhocView):
                     height=pixbuf.get_height()
                     if width > w and w > 0:
                         height = 1.0 * w * height / width
-                        pixbuf=pixbuf.scale_simple(int(w), int(height), gtk.gdk.INTERP_BILINEAR)
+                        pixbuf=pixbuf.scale_simple(int(w), int(height), GdkPixbuf.InterpType.BILINEAR)
                     self.label['imagecontents'].set_from_pixbuf(pixbuf)
             else:
                 widget = self.label.get(k)
@@ -184,7 +186,7 @@ class AnnotationDisplay(AdhocView):
         if self.annotation is None or isinstance(self.annotation, AnnotationType):
             self.label['image'].hide()
         else:
-            if isinstance(self.annotation, int) or isinstance(self.annotation, long):
+            if isinstance(self.annotation, int):
                 b=self.annotation
             elif isinstance(self.annotation, Annotation):
                 b=self.annotation.fragment.begin
@@ -193,51 +195,51 @@ class AnnotationDisplay(AdhocView):
         return False
 
     def build_widget(self):
-        v=gtk.VBox()
+        v=Gtk.VBox()
 
         self.label={}
         self.sw={}
 
-        h=gtk.HBox()
-        self.label['title']=gtk.Label()
-        h.pack_start(self.label['title'], expand=False)
-        v.pack_start(h, expand=False)
+        h=Gtk.HBox()
+        self.label['title']=Gtk.Label()
+        h.pack_start(self.label['title'], False, True, 0)
+        v.pack_start(h, False, True, 0)
 
-        h=gtk.HBox()
-        self.label['begin']=gtk.Label()
-        h.pack_start(self.label['begin'], expand=False)
-        l=gtk.Label(' - ')
-        h.pack_start(l, expand=False)
-        self.label['end']=gtk.Label()
-        h.pack_start(self.label['end'], expand=False)
-        v.pack_start(h, expand=False)
+        h=Gtk.HBox()
+        self.label['begin']=Gtk.Label()
+        h.pack_start(self.label['begin'], False, True, 0)
+        l=Gtk.Label(label=' - ')
+        h.pack_start(l, False, True, 0)
+        self.label['end']=Gtk.Label()
+        h.pack_start(self.label['end'], False, True, 0)
+        v.pack_start(h, False, True, 0)
 
         def handle_motion(widget, event):
             if isinstance(self.annotation, Annotation):
                 i = self.label['image']
-                i.epsilon = self.annotation.fragment.duration / widget.allocation.width
-                v = self.annotation.fragment.begin + i.epsilon * 20 * int(event.x / 20)
+                i.precision = int(self.annotation.fragment.duration / widget.get_allocation().width)
+                v = self.annotation.fragment.begin + i.precision * 20 * int(event.x / 20)
                 i.set_value(v)
             return True
 
         def handle_leave(widget, event):
             if isinstance(self.annotation, Annotation):
                 i = self.label['image']
-                i.epsilon = config.data.preferences['bookmark-snapshot-precision']
+                i.precision = config.data.preferences['bookmark-snapshot-precision']
                 i.set_value(self.annotation.fragment.begin)
             return True
 
-        fr = gtk.Expander ()
+        fr = Gtk.Expander ()
         fr.set_label(_("Screenshot"))
-        self.label['image'] = TimestampRepresentation(-1, self.controller, width=config.data.preferences['drag-snapshot-width'], epsilon=config.data.preferences['bookmark-snapshot-precision'], visible_label=False)
-        self.label['image'].add_events(gtk.gdk.POINTER_MOTION_MASK
-                                       | gtk.gdk.LEAVE_NOTIFY_MASK)
+        self.label['image'] = TimestampRepresentation(-1, None, self.controller, width=config.data.preferences['drag-snapshot-width'], precision=config.data.preferences['bookmark-snapshot-precision'], visible_label=False)
+        self.label['image'].add_events(Gdk.EventMask.POINTER_MOTION_MASK
+                                       | Gdk.EventMask.LEAVE_NOTIFY_MASK)
         self.label['image'].connect('motion-notify-event', handle_motion)
         self.label['image'].connect('leave-notify-event', handle_leave)
 
         fr.add(self.label['image'])
         fr.set_expanded(True)
-        v.pack_start(fr, expand=False)
+        v.pack_start(fr, False, True, 0)
 
         # Contents frame
         def handle_ok(b):
@@ -249,15 +251,15 @@ class AnnotationDisplay(AdhocView):
                 self.controller.notify('EditSessionEnd', element=self.annotation)
             return True
 
-        hbox = gtk.HBox()
-        hbox.pack_start(gtk.Label(_("Contents")), expand=False)
+        hbox = Gtk.HBox()
+        hbox.pack_start(Gtk.Label(_("Contents")), False, False, 0)
         ok_button=get_pixmap_button('small_ok.png', handle_ok)
-        ok_button.set_relief(gtk.RELIEF_NONE)
+        ok_button.set_relief(Gtk.ReliefStyle.NONE)
         ok_button.set_tooltip_text(_("Validate"))
         ok_button.set_no_show_all(True)
-        hbox.pack_start(ok_button, expand=False)
+        hbox.pack_start(ok_button, False, True, 0)
 
-        f=gtk.Frame()
+        f=Gtk.Frame()
         f.set_label_widget(hbox)
 
         def contents_modified(buf):
@@ -268,12 +270,12 @@ class AnnotationDisplay(AdhocView):
                 ok_button.hide()
             return True
 
-        c=self.label['contents']=gtk.TextView()
-        c.set_wrap_mode(gtk.WRAP_WORD_CHAR)
+        c=self.label['contents']=Gtk.TextView()
+        c.set_wrap_mode(Gtk.WrapMode.WORD_CHAR)
         c.get_buffer().ignore_modified = False
         c.get_buffer().connect('modified-changed', contents_modified)
-        sw=gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        sw=Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         sw.add(c)
         def set_text(widget, t):
             b=widget.get_buffer()
@@ -286,13 +288,13 @@ class AnnotationDisplay(AdhocView):
         c.set_text = set_text.__get__(c)
         def get_text(widget):
             b=widget.get_buffer()
-            return b.get_text(*b.get_bounds())
+            return b.get_text(*b.get_bounds() + ( False, ))
         c.get_text = get_text.__get__(c)
         self.sw['contents']=sw
 
         def handle_keypress(widget, event):
-            if (event.keyval == gtk.keysyms.Return
-                and event.state & gtk.gdk.CONTROL_MASK
+            if (event.keyval == Gdk.KEY_Return
+                and event.get_state() & Gdk.ModifierType.CONTROL_MASK
                 and widget.get_buffer().get_modified()):
                 handle_ok(ok_button)
                 return True
@@ -306,14 +308,14 @@ class AnnotationDisplay(AdhocView):
                                      element=self.annotation,
                                      indexer=self.controller.package._indexer)
 
-        image=self.label['imagecontents']=gtk.Image()
+        image=self.label['imagecontents']=Gtk.Image()
 
-        swi=gtk.ScrolledWindow()
-        swi.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        swi=Gtk.ScrolledWindow()
+        swi.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         swi.add_with_viewport(image)
         self.sw['imagecontents']=swi
 
-        vb=gtk.VBox()
+        vb=Gtk.VBox()
         vb.add(sw)
         vb.add(swi)
 
@@ -328,17 +330,17 @@ class AnnotationDisplay(AdhocView):
             """Handle the drop of an annotation.
             """
             if targetType == config.data.target_type['annotation']:
-                sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+                sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
                 if sources:
                     self.set_annotation(sources[0])
                 return True
             return False
         # The button can receive drops (to display annotations)
         v.connect('drag-data-received', annotation_drag_received_cb)
-        v.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                        gtk.DEST_DEFAULT_HIGHLIGHT |
-                        gtk.DEST_DEFAULT_ALL,
-                        config.data.drag_type['annotation'],
-                        gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_MOVE)
+        v.drag_dest_set(Gtk.DestDefaults.MOTION |
+                        Gtk.DestDefaults.HIGHLIGHT |
+                        Gtk.DestDefaults.ALL,
+                        config.data.get_target_types('annotation'),
+                        Gdk.DragAction.COPY | Gdk.DragAction.LINK | Gdk.DragAction.MOVE)
 
         return v
diff --git a/lib/advene/gui/views/bookmarks.py b/lib/advene/gui/views/bookmarks.py
index 5e7390b..1630761 100755
--- a/lib/advene/gui/views/bookmarks.py
+++ b/lib/advene/gui/views/bookmarks.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -17,10 +17,13 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
 """Module displaying time bookmarks (for navigation history for instance)."""
+import logging
+logger = logging.getLogger(__name__)
 
-import gtk
-import pango
-import urllib
+from gi.repository import Gdk
+from gi.repository import Gtk
+from gi.repository import Pango
+import urllib.request, urllib.parse, urllib.error
 
 # Advene part
 import advene.core.config as config
@@ -97,7 +100,7 @@ class Bookmarks(AdhocView):
         for n, v in arg:
             if n == 'bookmark':
                 t, c = v.split(':', 1)
-                h.append( (long(float(t)), urllib.unquote(c)) )
+                h.append( (int(float(t)), urllib.parse.unquote(c)) )
         if h:
             history=h
 
@@ -151,7 +154,7 @@ class Bookmarks(AdhocView):
             return True
 
         try:
-            d=long(d)
+            d=int(d)
         except ValueError:
             # Use a default value
             d=2000
@@ -174,7 +177,7 @@ class Bookmarks(AdhocView):
             return True
         b=BookmarkWidget(self.controller, position, comment, self.display_comments)
         self.bookmarks.append(b)
-        self.mainbox.pack_start(b.widget, expand=False)
+        self.mainbox.pack_start(b.widget, False, True, 0)
         b.widget.show_all()
         self.autoscroll()
         return True
@@ -182,7 +185,7 @@ class Bookmarks(AdhocView):
     def refresh(self, *p):
         self.mainbox.foreach(self.mainbox.remove)
         for b in self.bookmarks:
-            self.mainbox.pack_start(b.widget, expand=False)
+            self.mainbox.pack_start(b.widget, False, True, 0)
         self.mainbox.show_all()
         self.autoscroll()
         return True
@@ -198,69 +201,67 @@ class Bookmarks(AdhocView):
                 adj=self.scrollwindow.get_vadjustment()
             else:
                 adj=self.scrollwindow.get_hadjustment()
-            adj.set_value(adj.upper)
+            adj.set_value(adj.get_upper())
 
     def build_widget(self):
-        v=gtk.VBox()
+        v=Gtk.VBox()
 
-        hb=gtk.HBox()
+        hb=Gtk.HBox()
         hb.set_homogeneous(False)
 
         def remove_drag_received(widget, context, x, y, selection, targetType, time):
             if targetType == config.data.target_type['timestamp']:
-                data=decode_drop_parameters(selection.data)
-                position=long(data['timestamp'])
+                data=decode_drop_parameters(selection.get_data())
+                position=int(data['timestamp'])
                 w=self.get_matching_bookmark(position)
                 if position is not None:
                     self.bookmarks.remove(w)
                     self.refresh()
                 return True
             else:
-                print "Unknown target type for drop: %d" % targetType
+                logger.warn("Unknown target type for drop: %d" % targetType)
             return False
 
-        b=get_small_stock_button(gtk.STOCK_DELETE)
+        b=get_small_stock_button(Gtk.STOCK_DELETE)
         b.set_tooltip_text(_("Drop a position here to remove it from the list"))
-        b.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                        gtk.DEST_DEFAULT_HIGHLIGHT |
-                        gtk.DEST_DEFAULT_ALL,
-                        config.data.drag_type['timestamp'], gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_COPY)
+        b.drag_dest_set(Gtk.DestDefaults.MOTION |
+                        Gtk.DestDefaults.HIGHLIGHT |
+                        Gtk.DestDefaults.ALL,
+                        config.data.get_target_types('timestamp'),
+                        Gdk.DragAction.LINK | Gdk.DragAction.COPY)
         b.connect('drag-data-received', remove_drag_received)
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
         def bookmark_current_time(b):
             p=self.controller.player
-            if p.status in (p.PlayingStatus, p.PauseStatus):
-                v=p.current_position_value
-                # Make a snapshot
-                self.controller.update_snapshot(v)
-                self.append(v)
+            if p.is_playing():
+                self.append(p.current_position_value)
             return True
 
-        tb=gtk.Toolbar()
-        tb.set_style(gtk.TOOLBAR_ICONS)
+        tb=Gtk.Toolbar()
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
         for icon, action, tip in (
             ('set-to-now.png', bookmark_current_time, _("Insert a bookmark for the current video time")),
-            (gtk.STOCK_CONVERT, self.convert_to_annotations, _("Convert bookmarks to annotations")),
-            (gtk.STOCK_SAVE, self.save_view, _("Save view")),
+            (Gtk.STOCK_CONVERT, self.convert_to_annotations, _("Convert bookmarks to annotations")),
+            (Gtk.STOCK_SAVE, self.save_view, _("Save view")),
             ):
             if icon.endswith('.png'):
                 b=get_pixmap_toolbutton(icon)
             else:
-                b=gtk.ToolButton(stock_id=icon)
+                b=Gtk.ToolButton(stock_id=icon)
             b.set_tooltip_text(tip)
             b.connect('clicked', action)
             tb.insert(b, -1)
         hb.add(tb)
-        v.pack_start(hb, expand=False)
+        v.pack_start(hb, False, True, 0)
 
         if self.options['vertical']:
-            mainbox=gtk.VBox()
+            mainbox=Gtk.VBox()
         else:
-            mainbox=gtk.HBox()
+            mainbox=Gtk.HBox()
 
-        sw=gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        sw=Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
 
         sw.add_with_viewport(mainbox)
         self.scrollwindow=sw
@@ -268,19 +269,19 @@ class Bookmarks(AdhocView):
 
         def mainbox_drag_received(widget, context, x, y, selection, targetType, time):
             if targetType == config.data.target_type['timestamp']:
-                data=decode_drop_parameters(selection.data)
-                position=long(data['timestamp'])
+                data=decode_drop_parameters(selection.get_data())
+                position=int(data['timestamp'])
                 comment=data.get('comment', '')
                 self.append(position, comment=comment)
                 return True
             else:
-                print "Unknown target type for drop: %d" % targetType
+                logger.warn("Unknown target type for drop: %d" % targetType)
             return False
 
-        self.mainbox.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                  gtk.DEST_DEFAULT_HIGHLIGHT |
-                                  gtk.DEST_DEFAULT_ALL,
-                                  config.data.drag_type['timestamp'], gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_COPY)
+        self.mainbox.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                  Gtk.DestDefaults.HIGHLIGHT |
+                                  Gtk.DestDefaults.ALL,
+                                  config.data.get_target_types('timestamp'), Gdk.DragAction.LINK | Gdk.DragAction.COPY)
         self.mainbox.connect('drag-data-received', mainbox_drag_received)
 
         v.add(sw)
@@ -309,48 +310,48 @@ class BookmarkWidget(object):
         return True
 
     def build_widget(self):
-        self.image=TimestampRepresentation(self.value, self.controller, comment_getter=lambda: self.comment, width=self.width, epsilon=config.data.preferences['bookmark-snapshot-precision'])
+        self.image=TimestampRepresentation(self.value, None, self.controller, comment_getter=lambda: self.comment, width=self.width, precision=config.data.preferences['bookmark-snapshot-precision'])
 
         self.image.connect('clicked', self.image.goto_and_refresh)
 
         if self.display_comments:
-            hbox=gtk.HBox()
-            self.comment_entry=gtk.TextView()
+            hbox=Gtk.HBox()
+            self.comment_entry=Gtk.TextView()
             # Hook the completer component
             completer=Completer(textview=self.comment_entry,
                                 controller=self.controller,
                                 element=self.comment_entry.get_buffer(),
                                 indexer=self.controller.package._indexer)
-            self.comment_entry.set_wrap_mode(gtk.WRAP_WORD)
-            fd=pango.FontDescription('sans %d' % config.data.preferences['timeline']['font-size'])
+            self.comment_entry.set_wrap_mode(Gtk.WrapMode.WORD)
+            fd=Pango.FontDescription('sans %d' % config.data.preferences['timeline']['font-size'])
             self.comment_entry.modify_font(fd)
             b=self.comment_entry.get_buffer()
             b.set_text(self.comment)
 
             def focus_in_event(wid, event):
-                if unicode(b.get_text(*b.get_bounds())) == self.default_comment:
+                if b.get_text(*b.get_bounds() + (False,)) == self.default_comment:
                     b.set_text('')
                 return False
             self.comment_entry.connect('focus-in-event', focus_in_event)
 
             def focus_out_event(wid, event):
-                if b.get_text(*b.get_bounds()) == '':
+                if b.get_text(*b.get_bounds() + (False,)) == '':
                     b.set_text(self.default_comment)
                 return False
             self.comment_entry.connect('focus-out-event', focus_out_event)
 
             def update_comment(buf):
-                self.comment=unicode(buf.get_text(*buf.get_bounds()))
+                self.comment=buf.get_text(*buf.get_bounds() + (False,))
                 return True
             b.connect('changed', update_comment)
 
             #self.comment_entry.set_size_request(config.data.preferences['bookmark-snapshot-width'], -1)
 
-            sw=gtk.ScrolledWindow()
+            sw=Gtk.ScrolledWindow()
             sw.add(self.comment_entry)
-            sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_NEVER)
-            hbox.pack_start(self.image, expand=False)
-            hbox.pack_start(sw, expand=True)
+            sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER)
+            hbox.pack_start(self.image, False, True, 0)
+            hbox.pack_start(sw, True, True, 0)
             hbox.show_all()
             return hbox
         else:
diff --git a/lib/advene/gui/views/browser.py b/lib/advene/gui/views/browser.py
index fc5d3cd..4306a15 100755
--- a/lib/advene/gui/views/browser.py
+++ b/lib/advene/gui/views/browser.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,6 +19,8 @@
 
 # Advene browser, a la NeXT's workspace manager
 # FIXME: implement set_path to directly display a given path
+import logging
+logger = logging.getLogger(__name__)
 
 # Advene part
 import advene.core.config as config
@@ -28,10 +30,13 @@ from advene.model.exception import AdveneException
 
 from gettext import gettext as _
 
-import gtk
+from gi.repository import Gdk
+from gi.repository import Gtk
 
 name="TALES browser view plugin"
 
+TREEPATH_FIRST=Gtk.TreePath.new_first()
+
 def register(controller):
     controller.register_viewclass(Browser)
 
@@ -40,18 +45,18 @@ class BrowserColumn:
         self.model=element
         self.name=name
         self.callback=callback
-        self.next=None
+        self.next_column=None
         self.previous=parent
         self.widget=self.build_widget()
         self.widget.connect('key-press-event', self.key_pressed_cb)
 
     def key_pressed_cb(self, col, event):
-        if event.keyval == gtk.keysyms.Right:
+        if event.keyval == Gdk.KEY_Right:
             # Next column
-            if self.next is not None:
-                self.next.get_focus()
+            if self.next_column is not None:
+                self.next_column.get_focus()
             return True
-        elif event.keyval == gtk.keysyms.Left:
+        elif event.keyval == Gdk.KEY_Left:
             # Previous column
             if self.previous is not None:
                 self.previous.get_focus()
@@ -60,17 +65,18 @@ class BrowserColumn:
 
     def get_focus(self):
         self.listview.grab_focus()
-        cursor=self.listview.get_cursor()[0]
-        if cursor == (0,):
+        cursor=self.listview.get_cursor().path
+        if cursor == TREEPATH_FIRST:
             # Initial selection. Directly put the cursor on the second element.
-            self.listview.set_cursor((1,))
+            cursor.next()
+            self.listview.set_cursor(cursor)
         return True
 
     def get_widget(self):
         return self.widget
 
     def get_liststore(self):
-        ls=gtk.ListStore(str)
+        ls=Gtk.ListStore(str)
         if self.model is None:
             return ls
         for att in helper.get_valid_members(self.model):
@@ -85,7 +91,7 @@ class BrowserColumn:
         self.name=name
         self.label.set_label(name)
         # Destroy all following columns
-        self.next=None
+        self.next_column=None
         return True
 
     def row_activated(self, widget, treepath, treecolumn):
@@ -130,21 +136,21 @@ class BrowserColumn:
         return False
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        self.label=gtk.Button(self.name, use_underline=False)
+        self.label=Gtk.Button(self.name, use_underline=False)
         self.label.connect('clicked', self.on_column_activation)
-        vbox.pack_start(self.label, expand=False)
+        vbox.pack_start(self.label, False, True, 0)
 
-        sw = gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        sw = Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         vbox.add (sw)
 
         self.liststore = self.get_liststore()
-        self.listview = gtk.TreeView(self.liststore)
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn("Attributes", renderer, text=0)
-        column.set_widget(gtk.Label())
+        self.listview = Gtk.TreeView(self.liststore)
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn("Attributes", renderer, text=0)
+        column.set_widget(Gtk.Label())
         self.listview.append_column(column)
         self.listview.connect('key-press-event', self.key_pressed_cb)
 
@@ -179,14 +185,14 @@ class Browser(AdhocView):
         if self.callback:
             def validate_path(*p):
                 if self.callback:
-                    p=unicode(self.pathlabel.get_text())
+                    p=self.pathlabel.get_text()
                     self.close()
                     self.callback(p)
                 return True
 
             def validate_value(*p):
                 if self.callback:
-                    v="string:%s" % unicode(self.valuelabel.get_text())
+                    v="string:%s" % self.valuelabel.get_text()
                     self.close()
                     self.callback(v)
                 return True
@@ -205,11 +211,11 @@ class Browser(AdhocView):
             package = self.controller.package
 
         # Reset to the rootcolumn
-        cb=self.rootcolumn.next
+        cb=self.rootcolumn.next_column
         while cb is not None:
             cb.widget.destroy()
-            cb=cb.next
-        self.rootcolumn.next=None
+            cb=cb.next_column
+        self.rootcolumn.next_column=None
 
         # Update the rootcolumn element
         self.rootcolumn.update(element=package, name="here")
@@ -228,66 +234,66 @@ class Browser(AdhocView):
         if columnbrowser is not None:
             col=self.rootcolumn
             while (col is not columnbrowser) and (col is not None):
-                col=col.next
+                col=col.next_column
                 if col is not None:
                     path.append(col.name)
             path.append(attribute)
 
         try:
             el=context.evaluateValue("/".join(path))
-        except (AdveneException, TypeError), e:
+        except (AdveneException, TypeError) as e:
             # Delete all next columns
             if columnbrowser is None:
-                cb=self.rootcolumn.next
+                cb=self.rootcolumn.next_column
             else:
-                cb=columnbrowser.next
+                cb=columnbrowser.next_column
             while cb is not None:
                 cb.widget.destroy()
-                cb=cb.next
+                cb=cb.next_column
             if columnbrowser is not None:
-                columnbrowser.next=None
+                columnbrowser.next_column=None
                 self._update_view(path, Exception(_("Expression returned None (there was an exception)")))
                 if config.data.preferences['expert-mode']:
                     self.log("Exception when evaluating %s :\n%s" % ("/".join(path),
-                                                                     str(e)))
+                                                                      str(e)))
             return True
 
         self._update_view(path, el)
 
         if columnbrowser is None:
             # We selected  the rootcolumn. Delete the next ones
-            cb=self.rootcolumn.next
+            cb=self.rootcolumn.next_column
             while cb is not None:
                 cb.widget.destroy()
-                cb=cb.next
-            self.rootcolumn.next=None
-        elif columnbrowser.next is None:
+                cb=cb.next_column
+            self.rootcolumn.next_column=None
+        elif columnbrowser.next_column is None:
             # Create a new columnbrowser
             col=BrowserColumn(element=el, name=attribute, callback=self.clicked_callback,
                               parent=columnbrowser)
             col.widget.set_property("width-request", self.column_width)
-            self.hbox.pack_start(col.get_widget(), expand=False)
-            columnbrowser.next=col
+            self.hbox.pack_start(col.get_widget(), False, False, 0)
+            columnbrowser.next_column=col
         else:
             # Delete all next+1 columns (we reuse the next one)
-            cb=columnbrowser.next.next
+            cb=columnbrowser.next_column.next_column
             while cb is not None:
                 cb.widget.destroy()
-                cb=cb.next
-            columnbrowser.next.update(element=el, name=attribute)
+                cb=cb.next_column
+            columnbrowser.next_column.update(element=el, name=attribute)
 
         # Scroll the columns
         adj=self.sw.get_hadjustment()
-        adj.value = adj.upper - .1
+        adj.set_value(adj.get_upper() - .1)
         return True
 
     def _update_view(self, path, element):
         self.pathlabel.set_text("/".join(path))
-        self.typelabel.set_text(unicode(type(element)))
+        self.typelabel.set_text(str(type(element)))
         try:
-            val=unicode(element)
+            val=str(element)
         except UnicodeDecodeError:
-            val=unicode(repr(element))
+            val=str(repr(element))
         if '\n' in val:
             val=val[:val.index('\n')]+'...'
         if len(val) > 80:
@@ -296,7 +302,7 @@ class Browser(AdhocView):
         self.current_value=element
 
     def display_result(self, *p):
-        """Display the results as annotations in a timeline.
+        """Display the results as annotations in a table
         """
         if not hasattr(self.current_value, '__iter__'):
             self.log(_("Result is not a list"))
@@ -306,70 +312,68 @@ class Browser(AdhocView):
         return True
 
     def scroll_event(self, widget=None, event=None):
-        if event.state & gtk.gdk.CONTROL_MASK:
+        if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             a=widget.get_hadjustment()
-            if event.direction == gtk.gdk.SCROLL_DOWN or event.direction == gtk.gdk.SCROLL_RIGHT:
-                val = a.value + a.step_increment
-                if val > a.upper - a.page_size:
-                    val = a.upper - a.page_size
-                if val != a.value:
-                    a.value = val
+            if event.direction == Gdk.ScrollDirection.DOWN or event.direction == Gdk.ScrollDirection.RIGHT:
+                val = helper.clamp(a.get_value() + a.get_step_increment(),
+                                   a.get_lower(),
+                                   a.get_upper() - a.get_page_size())
+                if val != a.get_value():
+                    a.set_value(val)
                     a.value_changed ()
                 return True
-            elif event.direction == gtk.gdk.SCROLL_UP or event.direction == gtk.gdk.SCROLL_LEFT:
-                val = a.value - a.step_increment
-                if val < a.lower:
-                    val = a.lower
-                if val != a.value:
-                    a.value = val
+            elif event.direction == Gdk.ScrollDirection.UP or event.direction == Gdk.ScrollDirection.LEFT:
+                val = helper.clamp(a.get_value() - a.get_step_increment(),
+                                   a.get_lower(),
+                                   a.get_upper() - a.get_page_size())
+                if val != a.get_value():
+                    a.set_value(val)
                     a.value_changed ()
                 return True
         return False
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        self.sw=gtk.ScrolledWindow()
-        self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        self.sw=Gtk.ScrolledWindow()
+        self.sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
 
         self.sw.connect('scroll-event', self.scroll_event)
         vbox.add(self.sw)
 
-        self.hbox = gtk.HBox()
+        self.hbox = Gtk.HBox()
 
         self.rootcolumn=BrowserColumn(element=self.element, name='here',
                                       callback=self.clicked_callback,
                                       parent=None)
         self.rootcolumn.widget.set_property("width-request", self.column_width)
-        self.hbox.pack_start(self.rootcolumn.get_widget(), expand=False)
+        self.hbox.pack_start(self.rootcolumn.get_widget(), False, False, 0)
 
         self.sw.add_with_viewport(self.hbox)
 
         def name_label(name, label):
-            hb=gtk.HBox()
-            l=gtk.Label()
+            hb=Gtk.HBox()
+            l=Gtk.Label()
             l.set_markup("<b>%s :</b> " % name)
-            hb.pack_start(l, expand=False)
-            hb.pack_start(label, expand=False)
+            hb.pack_start(l, False, True, 0)
+            hb.pack_start(label, False, True, 0)
             return hb
 
         # Display the type/value of the current element
-        self.pathlabel = gtk.Label("here")
+        self.pathlabel = Gtk.Label(label="here")
         self.pathlabel.set_selectable(True)
-        vbox.pack_start(name_label(_("Path"), self.pathlabel), expand=False)
+        vbox.pack_start(name_label(_("Path"), self.pathlabel), False, False, 0)
 
-        self.typelabel = gtk.Label(unicode(type(self.element)))
-        vbox.pack_start(name_label(_("Type"), self.typelabel), expand=False)
+        self.typelabel = Gtk.Label(label=str(type(self.element)))
+        vbox.pack_start(name_label(_("Type"), self.typelabel), False, False, 0)
 
-        self.valuelabel = gtk.Label("here")
+        self.valuelabel = Gtk.Label(label="here")
         self.valuelabel.set_selectable(True)
-        vbox.pack_start(name_label(_("Value"), self.valuelabel), expand=False)
+        vbox.pack_start(name_label(_("Value"), self.valuelabel), False, False, 0)
 
         vbox.show_all()
         def debug(*p):
-            print "browser debug", p
-            import traceback
-            traceback.print_stack()
+            logger.warn("browser debug %s", str(p), exc_info=True)
             return True
 
         #vbox.connect('destroy', debug)
diff --git a/lib/advene/gui/views/caption.py b/lib/advene/gui/views/caption.py
index 389e66b..14cd54a 100644
--- a/lib/advene/gui/views/caption.py
+++ b/lib/advene/gui/views/caption.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -22,9 +22,8 @@
 from advene.gui.views import AdhocView
 
 from gettext import gettext as _
-from advene.gui.util import get_color_style
 
-import gtk
+from gi.repository import Gtk
 
 class CaptionView(AdhocView):
     view_name = _("Caption")
@@ -59,19 +58,18 @@ class CaptionView(AdhocView):
         return True
 
     def build_widget(self):
-        v=gtk.HBox()
+        v=Gtk.HBox()
 
-        style=get_color_style(v, 'black', 'white')
-        v.set_style(style)
+        v.get_style_context().add_class('advene_caption')
 
         def create_label(text, widget):
-            eb=gtk.EventBox()
-            l=gtk.Label(text)
+            eb=Gtk.EventBox()
+            l=Gtk.Label(label=text)
             l.set_single_line_mode(True)
             eb.add(l)
-            l.set_style(style)
-            eb.set_style(style)
-            widget.pack_start(eb)
+            l.get_style_context().add_class('advene_caption')
+            eb.get_style_context().add_class('advene_caption')
+            widget.pack_start(eb, True, True, 0)
             return l
 
         self.label=create_label('', v)
diff --git a/lib/advene/gui/views/checker.py b/lib/advene/gui/views/checker.py
index 0d956f5..b7eadb7 100644
--- a/lib/advene/gui/views/checker.py
+++ b/lib/advene/gui/views/checker.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@
 """
 
 import itertools
-import gtk
+from gi.repository import Gtk
 
 from gettext import gettext as _
 
@@ -41,8 +41,7 @@ class CheckerView(AdhocView):
     def __init__ (self, controller=None, parameters=None):
         super(CheckerView, self).__init__(controller=controller)
         self.close_on_package_load = False
-        self.contextual_actions = (
-            )
+        self.contextual_actions = ()
         self.controller=controller
         self.options = {
             }
@@ -62,7 +61,7 @@ class CheckerView(AdhocView):
         begins = set()
         ends = set()
         for at in self.controller.package.annotationTypes:
-            for a, b in itertools.izip(at.annotations, at.annotations[1:]):
+            for a, b in zip(at.annotations, at.annotations[1:]):
                 if a.fragment.end > b.fragment.begin:
                     ends.add(a)
                     begins.add(b)
@@ -82,15 +81,15 @@ class CheckerView(AdhocView):
                 end = "#ff6666"
             return (begin, end)
         self.overlap_table.set_elements(overlap, custom_data)
-        self.overlap_table.model.set_sort_column_id(advene.gui.views.table.COLUMN_TYPE, gtk.SORT_ASCENDING)
+        self.overlap_table.model.set_sort_column_id(advene.gui.views.table.COLUMN_TYPE, Gtk.SortType.ASCENDING)
 
     def build_widget(self):
-        mainbox = gtk.VBox()
+        mainbox = Gtk.VBox()
 
-        mainbox.pack_start(gtk.Label(_("List of possible issues in the current package")), expand=False)
+        mainbox.pack_start(Gtk.Label(_("List of possible issues in the current package")), False, False, 0)
 
-        notebook=gtk.Notebook()
-        notebook.set_tab_pos(gtk.POS_TOP)
+        notebook=Gtk.Notebook()
+        notebook.set_tab_pos(Gtk.PositionType.TOP)
         notebook.popup_disable()
         mainbox.add(notebook)
 
@@ -98,14 +97,14 @@ class CheckerView(AdhocView):
         self.overlap_table = table
 
         # Set colors
-        table.columns['begin'].add_attribute(table.columns['begin'].get_cell_renderers()[0],
+        table.columns['begin'].add_attribute(table.columns['begin'].get_cells()[0],
                                              'cell-background',
                                              advene.gui.views.table.COLUMN_CUSTOM_FIRST)
-        table.columns['end'].add_attribute(table.columns['end'].get_cell_renderers()[0],
+        table.columns['end'].add_attribute(table.columns['end'].get_cells()[0],
                                            'cell-background',
                                            advene.gui.views.table.COLUMN_CUSTOM_FIRST + 1)
 
-        notebook.append_page(table.widget, gtk.Label(_("Overlapping")))
+        notebook.append_page(table.widget, Gtk.Label(label=_("Overlapping")))
 
         return mainbox
 
diff --git a/lib/advene/gui/views/editaccumulator.py b/lib/advene/gui/views/editaccumulator.py
index 068ed20..3e91c80 100644
--- a/lib/advene/gui/views/editaccumulator.py
+++ b/lib/advene/gui/views/editaccumulator.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -21,8 +21,11 @@
 
 This widget allows to stack compact editing widgets.
 """
+import logging
+logger = logging.getLogger(__name__)
 
-import gtk
+from gi.repository import Gdk
+from gi.repository import Gtk
 
 from gettext import gettext as _
 
@@ -30,6 +33,7 @@ import advene.core.config as config
 from advene.gui.views.accumulatorpopup import AccumulatorPopup
 from advene.gui.edit.elements import get_edit_popup
 from advene.gui.util import get_pixmap_button
+import advene.util.helper as helper
 
 name="Edit accumulator view plugin"
 
@@ -57,7 +61,7 @@ class EditAccumulator(AccumulatorPopup):
         w=e.compact()
 
         # Buttons hbox
-        hbox=gtk.HBox()
+        hbox=Gtk.HBox()
 
         def handle_ok(b, w):
             e.apply_cb()
@@ -66,20 +70,20 @@ class EditAccumulator(AccumulatorPopup):
 
         # OK button
         b=get_pixmap_button('small_ok.png', handle_ok, w)
-        b.set_relief(gtk.RELIEF_NONE)
+        b.set_relief(Gtk.ReliefStyle.NONE)
         b.set_tooltip_text(_("Validate"))
-        hbox.pack_start(b, expand=False)
+        hbox.pack_start(b, False, True, 0)
 
         # Close button
         b=get_pixmap_button('small_close.png', self.undisplay_cb, w)
-        b.set_relief(gtk.RELIEF_NONE)
+        b.set_relief(Gtk.ReliefStyle.NONE)
         b.set_tooltip_text(_("Close"))
-        hbox.pack_start(b, expand=False)
+        hbox.pack_start(b, False, True, 0)
 
         t=self.get_short_title(element)
-        l=gtk.Label()
+        l=Gtk.Label()
         l.set_markup('<b>%s</b>' % t.replace('<', '<'))
-        hbox.pack_start(l, expand=True)
+        hbox.pack_start(l, True, True, 0)
 
         self.edited_elements[element]=w
         w._title_label=l
@@ -109,9 +113,9 @@ class EditAccumulator(AccumulatorPopup):
         # Limit label size
         # Ellipsize does not work well here, the label is always
         # allocated too small a space
-        #l.set_ellipsize(pango.ELLIPSIZE_END)
+        #l.set_ellipsize(Pango.EllipsizeMode.END)
         if len(t) > 80:
-            t=unicode(t[:79])+u'\u2026'
+            t=str(t[:79])+helper.chars.ellipsis
         return t
 
     def edit_element_handler(self, context, parameters):
@@ -162,11 +166,11 @@ class EditAccumulator(AccumulatorPopup):
 
     def drag_received(self, widget, context, x, y, selection, targetType, time):
         if targetType == config.data.target_type['annotation']:
-            sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+            sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
             for source in sources:
                 self.edit(source)
         else:
-            print "Unknown target type for drop: %d" % targetType
+            logger.warn("Unknown target type for drop: %d" % targetType)
         return True
 
     def build_widget(self):
@@ -174,9 +178,9 @@ class EditAccumulator(AccumulatorPopup):
 
         # The widget can receive drops from annotations
         mainbox.connect('drag-data-received', self.drag_received)
-        mainbox.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                  gtk.DEST_DEFAULT_HIGHLIGHT |
-                                  gtk.DEST_DEFAULT_ALL,
-                                  config.data.drag_type['annotation'], gtk.gdk.ACTION_LINK)
+        mainbox.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                  Gtk.DestDefaults.HIGHLIGHT |
+                                  Gtk.DestDefaults.ALL,
+                                  config.data.get_target_types('annotation'), Gdk.DragAction.LINK)
 
         return mainbox
diff --git a/lib/advene/gui/views/editionhistory.py b/lib/advene/gui/views/editionhistory.py
index 60bb79a..9eaff3d 100644
--- a/lib/advene/gui/views/editionhistory.py
+++ b/lib/advene/gui/views/editionhistory.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -23,7 +23,7 @@ This view displays a list of last n edited/created elements.
 
 from gettext import gettext as _
 
-import gtk
+from gi.repository import Gtk
 
 import advene.core.config as config
 from advene.gui.views import AdhocView
@@ -43,7 +43,7 @@ class EditionHistory(AdhocView):
     def __init__ (self, controller=None, **kw):
         super(EditionHistory, self).__init__(controller=controller)
         self.close_on_package_load = False
-        self.contextual_actions = ( )
+        self.contextual_actions = ()
 
         self.options={}
 
@@ -72,19 +72,19 @@ class EditionHistory(AdhocView):
                                (self.edited, g.last_edited) ):
             w.foreach(w.remove)
             for e in reversed(elements):
-                b=gtk.Button("\n".join((helper.get_type(e), self.controller.get_title(e))), use_underline=False)
+                b=Gtk.Button("\n".join((helper.get_type(e), self.controller.get_title(e))), use_underline=False)
                 b.set_alignment(0, 0)
                 colorname=self.controller.get_element_color(e)
                 if colorname:
                     if config.data.os == 'win32':
                         text=b.get_label()
                         b.foreach(b.remove)
-                        l=gtk.Label()
+                        l=Gtk.Label()
                         l.set_markup('<span background="%s">%s</span>' % (colorname, text))
                         l.show()
                         b.add(l)
                     else:
-                        style = b.modify_bg(gtk.STATE_NORMAL, name2color(colorname))
+                        style = b.modify_bg(Gtk.StateType.NORMAL, name2color(colorname))
                 b.connect('clicked', (lambda i, el: self.controller.gui.edit_element(el)),
                           e)
                 content=getattr(e, 'content', None)
@@ -92,23 +92,23 @@ class EditionHistory(AdhocView):
                     b.set_tooltip_text(content.data)
                 enable_drag_source(b, e, self.controller)
                 b.connect('button-press-event', display_popup, e)
-                w.pack_start(b, expand=False)
+                w.pack_start(b, False, True, 0)
         self.widget.show_all()
         return True
 
     def build_widget(self):
-        hb=gtk.HBox()
+        hb=Gtk.HBox()
 
         for (label, attname) in ( (_("Created"), 'created'),
                                   (_("Edited"), 'edited' ) ):
-            c=gtk.VBox()
-            c.pack_start(gtk.Label(label), expand=False)
+            c=Gtk.VBox()
+            c.pack_start(Gtk.Label(label), False, False, 0)
 
-            sw = gtk.ScrolledWindow()
-            sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+            sw = Gtk.ScrolledWindow()
+            sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
             c.add(sw)
 
-            v=gtk.VBox()
+            v=Gtk.VBox()
             sw.add_with_viewport(v)
             setattr(self, attname, v)
 
diff --git a/lib/advene/gui/views/finder.py b/lib/advene/gui/views/finder.py
index 6983616..d9f4387 100644
--- a/lib/advene/gui/views/finder.py
+++ b/lib/advene/gui/views/finder.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,28 +18,36 @@
 #
 
 # Advene finder, a la MacOS X
+import logging
+logger = logging.getLogger(__name__)
 
 from gettext import gettext as _
 
-import gtk
-import gobject
-import urllib
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import Gtk
+from gi.repository import GObject
+import urllib.request, urllib.parse, urllib.error
 
 import advene.core.config as config
-from advene.gui.views.tree import DetailedTreeModel
+from advene.gui.edit.properties import EditWidget
 from advene.gui.views import AdhocView
 from advene.gui.views.annotationdisplay import AnnotationDisplay
 from advene.gui.views.relationdisplay import RelationDisplay
-from advene.model.schema import AnnotationType, RelationType
+
+from advene.model.package import Package
 from advene.model.annotation import Annotation, Relation
-from advene.model.view import View
-from advene.model.resources import ResourceData
+from advene.model.schema import Schema, AnnotationType, RelationType
+from advene.model.bundle import AbstractBundle
+from advene.model.resources import Resources, ResourceData
 from advene.model.query import Query
+from advene.model.view import View
+
 import advene.rules.elements
 import advene.gui.popup
 import advene.util.helper as helper
 import advene.model.tal.context
-from advene.gui.util import drag_data_get_cb, get_target_types, enable_drag_source, contextual_drag_begin, name2color
+from advene.gui.util import get_target_types, enable_drag_source, contextual_drag_begin, drag_data_get_cb
 
 name="Package finder view plugin"
 
@@ -49,26 +57,207 @@ def register(controller):
 # Matching between element classes and the FinderColumn class
 CLASS2COLUMN={}
 
+class Metadata(object):
+    """Virtual object describing an element Metadata.
+    """
+    def __init__(self, element, package, viewableType=None):
+        self.element = element
+        self.rootPackage = package
+        self.viewableType = viewableType
+
+    def get_config(self, uri):
+        (ns, k) = uri.split(':')
+        return self.element.getMetaData(config.data.namespace_prefix[ns], k)
+
+    def set_config(self, uri, value):
+        (ns, k) = uri.split(':')
+        self.element.setMetaData(config.data.namespace_prefix[ns], k, value)
+
+    def list_keys(self):
+        try:
+            return [ "%s:%s" % (config.data.reverse_namespace_prefix[nsuri],
+                                name)
+                     for (nsuri, name, value) in self.element.listMetaData() ]
+        except AttributeError:
+            return []
+
+class VirtualNode:
+    """Virtual node.
+    """
+    def __init__(self, name, package, viewableType=None):
+        self.title=name
+        self.rootPackage=package
+        self.viewableType=viewableType
+
+class DetailedTreeModel(object):
+    """Detailed Tree Model.
+
+    In this model,
+       - Annotations and Relations depend on their types.
+       - Types depend on their schema
+       - Schemas depend on their package list of schemas
+       - Views depend on their package list of views
+       - Resources depend on the Resource node
+    """
+    def __init__(self, controller=None, package=None):
+        self.childrencache = {}
+        self.virtual={}
+        self.virtual['root']    = VirtualNode(_("Package"),       package)
+        self.virtual['views']   = VirtualNode(_("List of views"), package, viewableType='view-list')
+        self.virtual['static']  = VirtualNode(_("Static views"),  package, viewableType='view-list')
+        self.virtual['dynamic'] = VirtualNode(_("Dynamic views"), package, viewableType='view-list')
+        self.virtual['admin']   = VirtualNode(_("Admin views"),   package, viewableType='view-list')
+        self.virtual['adhoc']   = VirtualNode(_("Adhoc views"),   package)
+
+    def nodeParent (self, node):
+        #logger.warn("nodeparent %s", node)
+        if isinstance (node, Annotation):
+            parent = node.type
+        elif isinstance (node, Relation):
+            parent = node.type
+        elif isinstance (node, RelationType):
+            parent = node.schema
+        elif isinstance (node, AnnotationType):
+            parent = node.schema
+        elif isinstance (node, Schema):
+            parent = node.rootPackage.schemas
+        elif isinstance (node, View):
+            if node.id.startswith('_'):
+                parent=self.virtual['admin']
+            else:
+                t=helper.get_view_type(node)
+                parent=self.virtual[t]
+        elif isinstance (node, Query):
+            parent = node.rootPackage.queries
+        elif isinstance (node, Package):
+            parent = None
+        elif isinstance (node, AbstractBundle):
+            parent = node.rootPackage
+        elif isinstance (node, Resources):
+            parent = node.parent
+        elif isinstance (node, ResourceData):
+            parent = node.parent
+        elif node in (self.virtual['static'], self.virtual['dynamic'], self.virtual['adhoc'], self.virtual['admin']):
+            parent = self.virtual['views']
+        elif node == self.virtual['views']:
+            parent=node.rootPackage
+        else:
+            parent = None
+        return parent
+
+    def nodeChildren (self, node):
+        #logger.warn("nodechildren %s %s", type(node), node)
+        children = []
+        if isinstance (node, Annotation):
+            children = []
+        elif isinstance (node, Relation):
+            children = []
+        elif isinstance (node, AnnotationType):
+            if not node in self.childrencache:
+                self.childrencache[node] = node.annotations
+            children = self.childrencache[node]
+        elif isinstance (node, RelationType):
+            if not node in self.childrencache:
+                self.childrencache[node] = node.relations
+            children = self.childrencache[node]
+        elif isinstance (node, Schema):
+            # Do not cache these elements
+            l=list(node.annotationTypes)
+            l.extend(node.relationTypes)
+            children = l
+        elif isinstance (node, View):
+            children = []
+        elif isinstance (node, Query):
+            children = []
+        elif isinstance (node, Package):
+            if not node in self.childrencache:
+                self.childrencache[node] = [node.schemas, self.virtual['views'], node.queries, node.resources or _("No resources") ]
+            children = self.childrencache[node]
+        elif isinstance (node, AbstractBundle):
+            children = node
+        elif isinstance (node, Resources):
+            if not node in self.childrencache:
+                self.childrencache[node] = node.children()
+            children = self.childrencache[node]
+        elif isinstance (node, ResourceData):
+            children = []
+        elif node == self.virtual['views']:
+            children=[ self.virtual['static'], self.virtual['dynamic'], self.virtual['adhoc'], self.virtual['admin'] ]
+        elif node is []:
+            children = [ self.get_package() ]
+        else:
+            children = []
+            if node == self.virtual['admin']:
+                children=sorted([ v
+                                  for v in node.rootPackage.views
+                                  if v.id.startswith('_') ],
+                                key=lambda e: (e.title or e.id).lower())
+            else:
+                for t in ('static', 'dynamic', 'adhoc'):
+                    if node == self.virtual[t]:
+                        children=sorted([ v
+                                          for v in node.rootPackage.views
+                                          if not v.id.startswith('_')
+                                          and helper.get_view_type(v) == t ],
+                                        key=lambda e: (e.title or e.id).lower())
+                        break
+        return children
+
+    def nodeHasChildren (self, node):
+        children = self.nodeChildren(node)
+        return (children is not None and children)
+
+    def update_element(self, e, created=False):
+        """Update an element.
+
+        This is called when a element has been modified or created.
+        """
+        parent=self.nodeParent(e)
+        try:
+            del (self.childrencache[parent])
+        except KeyError:
+            pass
+
+    def remove_element (self, e):
+        """Remove an element from the model.
+
+        Return its parent node, so that we can update representations.
+        """
+        parent=None
+        for p in self.childrencache:
+            if e in self.childrencache[p]:
+                parent=p
+                break
+        if parent is None:
+            # Could not find the element in the cache.
+            # It was not yet displayed
+            pass
+        else:
+            del self.childrencache[parent]
+        return parent
+
 class FinderColumn(object):
     """Abstract FinderColumn class.
     """
-    def __init__(self, controller=None, node=None, callback=None, parent=None):
+    def __init__(self, controller=None, model=None, node=None, callback=None, parent=None):
         self.controller=controller
+        self.model=model
         self.node=node
         self.callback=callback
         self.previous=parent
-        self.next=None
-        self.widget=gtk.Frame()
+        self.next_column=None
+        self.widget=Gtk.Frame()
+        self.in_update = False
         self.widget.add(self.build_widget())
         self.widget.connect('key-press-event', self.key_pressed_cb)
 
     def key_pressed_cb(self, col, event):
-        if event.keyval == gtk.keysyms.Right:
+        if event.keyval == Gdk.KEY_Right:
             # Next column
-            if self.next is not None:
-                self.next.get_focus()
+            if self.next_column is not None:
+                self.next_column.get_focus()
             return True
-        elif event.keyval == gtk.keysyms.Left:
+        elif event.keyval == Gdk.KEY_Left:
             # Previous column
             if self.previous is not None:
                 self.previous.get_focus()
@@ -78,7 +267,7 @@ class FinderColumn(object):
     def get_focus(self):
         """Get the focus on the column.
 
-        As we use a gtk.Button at the top of every specialized
+        As we use a Gtk.Button at the top of every specialized
         ViewColumn, we want to use the second button.
         """
         b=self.get_child_buttons(self.widget)
@@ -89,74 +278,80 @@ class FinderColumn(object):
     def get_child_buttons(self, w):
         """Return the buttons contained in the widget.
         """
-        if isinstance(w, gtk.Frame):
+        if isinstance(w, Gtk.Frame):
             w=w.get_children()[0]
         b=[]
         try:
-            b=[ c for c in w.get_children() if isinstance(c, gtk.Button) ]
+            b=[ c for c in w.get_children() if isinstance(c, Gtk.Button) ]
         except AttributeError:
             return []
         for c in w.get_children():
             b.extend(self.get_child_buttons(c))
         return b
 
+    def get_selected_annotation_widgets(self):
+        return []
+
     def close(self):
         """Close this column, and all following ones.
         """
-        if self.next is not None:
-            self.next.close()
+        logger.debug("Findercolumn.close")
+        if self.next_column is not None:
+            self.next_column.close()
         self.widget.destroy()
         if self.previous is not None:
-            self.previous.next=None
+            self.previous.next_column=None
 
     def get_name(self):
-        if self.node is None:
-            return "FIXME"
-        return self.node[self.COLUMN_TITLE]
+        return self.controller.get_title(self.node)
     name=property(fget=get_name, doc="Displayed name for the element")
 
     def update(self, node=None):
+        logger.debug("FinderColumn.update %s", node)
         self.node=node
         return True
 
     def on_column_activation(self, widget):
         # Delete all next columns
-        cb=self.next
+        cb=self.next_column
         if cb:
             cb.close()
-        self.next=None
+        self.next_column=None
         return True
 
     def build_widget(self):
-        return gtk.Label("Generic finder column")
+        return Gtk.Label(label="Generic column for %s" % self.name)
 
 class ModelColumn(FinderColumn):
     COLUMN_TITLE=0
-    COLUMN_NODE=1
+    COLUMN_ELEMENT=1
     COLUMN_COLOR=2
 
-    def get_valid_members(self, el):
+    def get_valid_members(self, node):
         """Return the list of valid members for the element.
         """
-        def title(c):
-            el=c[DetailedTreeModel.COLUMN_ELEMENT]
+        def title(el):
+            t = self.controller.get_title(el)
             if isinstance(el, AnnotationType):
-                return "%s (%d)" % (c[DetailedTreeModel.COLUMN_TITLE], len(el.annotations))
+                return "%s (%d)" % (t, len(el.annotations))
             elif isinstance(el, RelationType):
-                return "%s (%d)" % (c[DetailedTreeModel.COLUMN_TITLE], len(el.relations))
+                return "%s (%d)" % (t, len(el.relations))
             else:
-                return c[DetailedTreeModel.COLUMN_TITLE]
+                return t
 
         return [ (title(c),
                   c,
-                  c[DetailedTreeModel.COLUMN_COLOR]) for c in self.node.iterchildren() ]
+                  self.controller.get_element_color(c)) for c in self.model.nodeChildren(node) ]
+
+    def get_selected_annotation_widgets(self):
+        return []
 
     def get_focus(self):
         self.listview.grab_focus()
         return True
 
     def get_liststore(self):
-        ls=gtk.ListStore(str, object, str)
+        ls=Gtk.ListStore(str, object, str)
         if self.node is None:
             return ls
         for row in self.get_valid_members(self.node):
@@ -164,21 +359,26 @@ class ModelColumn(FinderColumn):
         return ls
 
     def update(self, node=None):
+        logger.debug("ModelColumn.update %s", node)
+        self.in_update = True
         self.node=node
         self.liststore.clear()
         if self.node is None:
             return True
+        self.column.set_title(self.controller.get_title(node))
         for row in self.get_valid_members(node):
             self.liststore.append(row)
+        self.in_update = False
+        self.on_changed_selection(None, self.model)
 
-        if self.next is not None:
+        if self.next_column is not None:
             # There is a next column. Should we still display it ?
             if not [ r
                      for r in self.liststore
-                     if r[self.COLUMN_NODE][DetailedTreeModel.COLUMN_ELEMENT] == self.next.node[self.COLUMN_NODE] ]:
+                     if r[self.COLUMN_ELEMENT] == self.next_column.node ]:
                 # The next node is no more in the current elements.
-                self.next.close()
-                self.next=None
+                self.next_column.close()
+                self.next_column=None
         return True
 
     def on_button_press(self, widget, event):
@@ -195,14 +395,14 @@ class ModelColumn(FinderColumn):
             return False
         path, col, cx, cy = t
         it = model.get_iter(path)
-        node = model.get_value(it, DetailedTreeModel.COLUMN_ELEMENT)
+        node = model.get_value(it, self.COLUMN_ELEMENT)
         widget.get_selection().select_path (path)
-        if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+        if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
             # Double-click: edit the element
-            self.controller.gui.edit_element(node[DetailedTreeModel.COLUMN_ELEMENT])
+            self.controller.gui.edit_element(node)
             return True
         elif event.button == 3:
-            menu = advene.gui.popup.Menu(node[DetailedTreeModel.COLUMN_ELEMENT], controller=self.controller)
+            menu = advene.gui.popup.Menu(node, controller=self.controller)
             menu.popup()
             return True
         return False
@@ -212,8 +412,8 @@ class ModelColumn(FinderColumn):
         if selection is not None:
             store, it = selection.get_selected()
             if it is not None:
-                att = model.get_value (it, self.COLUMN_NODE)
-        if att and self.callback:
+                att = model.get_value (it, self.COLUMN_ELEMENT)
+        if not self.in_update and att is not None and self.callback:
             self.callback(self, att)
             return True
         return False
@@ -225,7 +425,7 @@ class ModelColumn(FinderColumn):
             if row is None:
                 element=None
             else:
-                element = treeview.get_model()[row[0]][self.COLUMN_NODE][DetailedTreeModel.COLUMN_ELEMENT]
+                element = treeview.get_model()[row[0]][self.COLUMN_ELEMENT]
             self.drag_data=(int(x), int(y), event, element)
 
     def on_treeview_button_release_event(self, treeview, event):
@@ -233,7 +433,7 @@ class ModelColumn(FinderColumn):
         self.drag_context=None
 
     def on_treeview_motion_notify_event(self, treeview, event):
-        if (event.state == gtk.gdk.BUTTON1_MASK
+        if (event.get_state() == Gdk.ModifierType.BUTTON1_MASK
             and self.drag_context is None
             and self.drag_data is not None
             and self.drag_data[3] is not None):
@@ -244,27 +444,46 @@ class ModelColumn(FinderColumn):
             if threshold:
                 # A drag was started. Setup the appropriate target.
                 element=self.drag_data[3]
-                targets=get_target_types(element)
-                actions = gtk.gdk.ACTION_MOVE | gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_COPY
+                targets = Gtk.TargetList.new(get_target_types(element))
+                actions = Gdk.DragAction.MOVE | Gdk.DragAction.LINK | Gdk.DragAction.COPY
                 button = 1
-                self.drag_context = treeview.drag_begin(targets, actions, button, self.drag_data[2])
+                self.drag_context = treeview.drag_begin_with_coordinates(targets, actions, button, event, -1, -1)
                 contextual_drag_begin(treeview, self.drag_context, element, self.controller)
                 self.drag_context._element=element
 
+    def on_title_clicked(self, column):
+        # Display metadata
+        if self.callback:
+            self.callback(self, Metadata(self.node, self.node.rootPackage))
+        return True
+
+    def own_drag_data_get_cb(self, treeview, context, selection, targetType, timestamp):
+        model, paths = treeview.get_selection().get_selected_rows()
+
+        els=[ model[p][self.COLUMN_ELEMENT] for p in paths ]
+
+        context._element = els[0]
+        drag_data_get_cb(treeview, context, selection, targetType, timestamp, self.controller)
+        return True
+
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        sw = gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        sw = Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         vbox.add (sw)
 
         self.liststore = self.get_liststore()
-        self.listview = gtk.TreeView(self.liststore)
-        renderer = gtk.CellRendererText()
-        column = gtk.TreeViewColumn("Attributes", renderer,
+        self.listview = Gtk.TreeView(self.liststore)
+        self.listview.container = self
+        renderer = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn("Attributes", renderer,
                                     text=self.COLUMN_TITLE,
                                     cell_background=self.COLUMN_COLOR)
-        column.set_widget(gtk.Label())
+        self.column = column
+        column.set_title(self.get_name())
+        column.set_clickable(True)
+        column.connect('clicked', self.on_title_clicked)
         self.listview.append_column(column)
 
         selection = self.listview.get_selection()
@@ -278,7 +497,7 @@ class ModelColumn(FinderColumn):
         self.listview.connect('button-press-event', self.on_treeview_button_press_event)
         self.listview.connect('button-release-event', self.on_treeview_button_release_event)
         self.listview.connect('motion-notify-event', self.on_treeview_motion_notify_event)
-        self.listview.connect('drag-data-get', drag_data_get_cb, self.controller)
+        self.listview.connect('drag-data-get', self.own_drag_data_get_cb)
 
         sw.add(self.listview)
 
@@ -289,13 +508,16 @@ class ModelColumn(FinderColumn):
 class AnnotationColumn(FinderColumn):
     def update(self, node=None):
         self.node=node
-        self.view.set_annotation(node[DetailedTreeModel.COLUMN_ELEMENT])
+        self.view.set_annotation(node)
         return True
 
+    def get_selected_annotation_widgets(self):
+        return []
+
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        self.view=AnnotationDisplay(controller=self.controller, annotation=self.node[DetailedTreeModel.COLUMN_ELEMENT])
+        self.view=AnnotationDisplay(controller=self.controller, annotation=self.node)
         vbox.add(self.view.widget)
         vbox.show_all()
         return vbox
@@ -304,27 +526,27 @@ CLASS2COLUMN[Annotation]=AnnotationColumn
 class RelationColumn(FinderColumn):
     def update(self, node=None):
         self.node=node
-        self.view.set_relation(node[DetailedTreeModel.COLUMN_ELEMENT])
+        self.view.set_relation(node)
         return True
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        self.view=RelationDisplay(controller=self.controller, relation=self.node[DetailedTreeModel.COLUMN_ELEMENT])
+        self.view=RelationDisplay(controller=self.controller, relation=self.node)
         vbox.add(self.view.widget)
         vbox.show_all()
         return vbox
 CLASS2COLUMN[Relation]=RelationColumn
 
 class ViewColumn(FinderColumn):
-    def __init__(self, controller=None, node=None, callback=None, parent=None):
-        self.element=node[DetailedTreeModel.COLUMN_ELEMENT]
-        FinderColumn.__init__(self, controller, node, callback, parent)
+    def __init__(self, controller=None, model=None, node=None, callback=None, parent=None):
+        self.element=node
+        FinderColumn.__init__(self, controller, model, node, callback, parent)
         self.update(node)
 
     def update(self, node=None):
         self.node=node
-        self.element=self.node[DetailedTreeModel.COLUMN_ELEMENT]
+        self.element = self.node
 
         self.label['title'].set_markup(_("View <b>%(title)s</b>\nId: %(id)s") % {
                 'title': self.controller.get_title(self.element).replace('<', '<'),
@@ -354,8 +576,11 @@ class ViewColumn(FinderColumn):
         t=helper.get_view_type(self.element)
         if t == 'static':
             c=self.controller.build_context()
-            url=c.evaluateValue('here/view/%s/absolute_url' % self.element.id)
-            self.controller.open_url(url)
+            try:
+                url=c.evaluateValue('here/view/%s/absolute_url' % self.element.id)
+                self.controller.open_url(url)
+            except:
+                logger.warn("Cannot open static view: error when trying to get its url", exc_info=True)
         elif t == 'dynamic':
             self.controller.activate_stbv(self.element)
         elif t == 'adhoc':
@@ -363,22 +588,22 @@ class ViewColumn(FinderColumn):
         return True
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
         self.label={}
-        self.label['title']=gtk.Label()
-        vbox.pack_start(self.label['title'], expand=False)
-        self.label['info']=gtk.Label()
-        vbox.pack_start(self.label['info'], expand=False)
-        b=self.label['edit']=gtk.Button(_("Edit view"))
+        self.label['title']=Gtk.Label()
+        vbox.pack_start(self.label['title'], False, True, 0)
+        self.label['info']=Gtk.Label()
+        vbox.pack_start(self.label['info'], False, True, 0)
+        b=self.label['edit']=Gtk.Button(_("Edit view"))
         b.connect('clicked', lambda w: self.controller.gui.edit_element(self.element))
         # Enable DND
         def get_element():
             return self.element
         enable_drag_source(b, get_element, self.controller)
 
-        vbox.pack_start(b, expand=False)
+        vbox.pack_start(b, False, True, 0)
 
-        b=self.label['activate']=gtk.Button(_("Open view"))
+        b=self.label['activate']=Gtk.Button(_("Open view"))
         b.connect('clicked', self.activate)
         # Drag and drop for adhoc views
 
@@ -388,35 +613,35 @@ class ViewColumn(FinderColumn):
                     return False
                 if helper.get_view_type(self.element) != 'adhoc':
                     return False
-                selection.set(selection.target, 8,
-                              urllib.urlencode( {
+                selection.set(selection.get_target(), 8,
+                              urllib.parse.urlencode( {
                             'id': self.element.id,
                             } ).encode('utf8'))
                 return True
             else:
-                print "Unknown target type for drag: %d" % targetType
+                logger.warn("Unknown target type for drag: %d" % targetType)
             return True
 
-        b.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                          config.data.drag_type['adhoc-view'],
-                          gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
+        b.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                          config.data.get_target_types('adhoc-view'),
+                          Gdk.DragAction.LINK | Gdk.DragAction.COPY | Gdk.DragAction.MOVE)
         b.connect('drag-data-get', drag_data_get_cb)
 
-        vbox.pack_start(b, expand=False)
+        vbox.pack_start(b, False, True, 0)
 
         vbox.show_all()
         return vbox
 CLASS2COLUMN[View]=ViewColumn
 
 class QueryColumn(FinderColumn):
-    def __init__(self, controller=None, node=None, callback=None, parent=None):
-        self.element=node[DetailedTreeModel.COLUMN_ELEMENT]
-        FinderColumn.__init__(self, controller, node, callback, parent)
+    def __init__(self, controller=None, model=None, node=None, callback=None, parent=None):
+        self.element=node
+        FinderColumn.__init__(self, controller, model, node, callback, parent)
         self.update(node)
 
     def update(self, node=None):
         self.node=node
-        self.element=self.node[DetailedTreeModel.COLUMN_ELEMENT]
+        self.element=self.node
 
         self.label['title'].set_markup(_("%(type)s <b>%(title)s</b>\nId: %(id)s") % {
                 'type': helper.get_type(self.element),
@@ -428,21 +653,21 @@ class QueryColumn(FinderColumn):
         return True
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
         self.label={}
-        self.label['title']=gtk.Label()
-        vbox.pack_start(self.label['title'], expand=False)
+        self.label['title']=Gtk.Label()
+        vbox.pack_start(self.label['title'], False, True, 0)
 
-        b=self.label['edit']=gtk.Button(_("Edit query"))
+        b=self.label['edit']=Gtk.Button(_("Edit query"))
         # Enable DND
         def get_element():
             return self.element
         enable_drag_source(b, get_element, self.controller)
         b.connect('clicked', lambda w: self.controller.gui.edit_element(self.element))
-        vbox.pack_start(b, expand=False)
+        vbox.pack_start(b, False, True, 0)
 
-        f=gtk.Frame(_("Try to apply the query on..."))
-        v=gtk.VBox()
+        f=Gtk.Frame.new(_("Try to apply the query on..."))
+        v=Gtk.VBox()
         f.add(v)
 
         def try_query(b, expr):
@@ -452,10 +677,8 @@ class QueryColumn(FinderColumn):
                                                     query=self.element,
                                                     result=res,
                                                     destination='east')
-            except Exception, e:
-                #print "********** Oops"
-                #import traceback
-                #traceback.print_exc()
+            except Exception:
+                logger.debug("Exception in query evaluation", exc_info=True)
                 b.set_sensitive(False)
             return True
 
@@ -465,9 +688,9 @@ class QueryColumn(FinderColumn):
              ('package/annotations', _("all annotations of the package")),
              ('package/annotations/first', _("the first annotation of the package")),
             ):
-            b=gtk.Button(label, use_underline=False)
+            b=Gtk.Button(label, use_underline=False)
             b.connect('clicked', try_query, expr)
-            v.pack_start(b, expand=False)
+            v.pack_start(b, False, True, 0)
             self.apply_buttons.append(b)
 
         vbox.add(f)
@@ -476,14 +699,14 @@ class QueryColumn(FinderColumn):
 CLASS2COLUMN[Query]=QueryColumn
 
 class ResourceColumn(FinderColumn):
-    def __init__(self, controller=None, node=None, callback=None, parent=None):
-        self.element=node[DetailedTreeModel.COLUMN_ELEMENT]
-        FinderColumn.__init__(self, controller, node, callback, parent)
+    def __init__(self, controller=None, model=None, node=None, callback=None, parent=None):
+        self.element=node
+        FinderColumn.__init__(self, controller, model, node, callback, parent)
         self.update(node)
 
     def update(self, node=None):
         self.node=node
-        self.element=self.node[DetailedTreeModel.COLUMN_ELEMENT]
+        self.element=self.node
         self.label['title'].set_markup(_("%(type)s <b>%(title)s</b>\nId: %(id)s") % {
                 'type': helper.get_type(self.element),
                 'title': self.controller.get_title(self.element).replace('<', '<'),
@@ -494,31 +717,93 @@ class ResourceColumn(FinderColumn):
     def update_preview(self):
         self.preview.foreach(self.preview.remove)
         if self.element.mimetype.startswith('image/'):
-            i=gtk.Image()
-            pixbuf=gtk.gdk.pixbuf_new_from_file(self.element.file_)
+            i=Gtk.Image()
+            pixbuf=GdkPixbuf.Pixbuf.new_from_file(self.element.file_)
             i.set_from_pixbuf(pixbuf)
             self.preview.add(i)
             i.show()
+        # FIXME: if self.element.mimetype.startswith('audio/'):
+        # Add play icon
         return True
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
         self.label={}
-        self.label['title']=gtk.Label()
-        vbox.pack_start(self.label['title'], expand=False)
-        b=self.label['edit']=gtk.Button(_("Edit resource"))
+        self.label['title']=Gtk.Label()
+        vbox.pack_start(self.label['title'], False, True, 0)
+        b=self.label['edit']=Gtk.Button(_("Edit resource"))
         # Enable DND
         def get_element():
             return self.element
         enable_drag_source(b, get_element, self.controller)
         b.connect('clicked', lambda w: self.controller.gui.edit_element(self.element))
-        vbox.pack_start(b, expand=False)
-        self.preview=gtk.VBox()
+        vbox.pack_start(b, False, True, 0)
+        self.preview=Gtk.VBox()
         vbox.add(self.preview)
         vbox.show_all()
         return vbox
 CLASS2COLUMN[ResourceData]=ResourceColumn
 
+class MetadataColumn(FinderColumn):
+    def update(self, node=None):
+        self.node=node
+        return True
+
+    def build_widget(self):
+        el = self.node.element
+        vbox=Gtk.VBox()
+
+        info = Gtk.TextView()
+        info.set_wrap_mode(Gtk.WrapMode.WORD_CHAR)
+        def set_text(widget, t):
+            b=widget.get_buffer()
+            b.delete(*b.get_bounds())
+            b.set_text(t)
+            b.set_modified(False)
+            return True
+        info.set_text = set_text.__get__(info)
+        sw = Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
+
+        if isinstance(el, Package):
+            info.set_text(_("""Package %(title)s:
+%(schema)s
+%(annotation)s in %(annotation_type)s
+%(relation)s in %(relation_type)s
+%(query)s
+%(view)s
+
+Description:
+%(description)s
+""") % {
+        'title': el.title,
+        'schema': helper.format_element_name('schema', len(el.schemas)),
+        'annotation': helper.format_element_name('annotation', len(el.annotations)),
+        'annotation_type': helper.format_element_name('annotation_type', len(el.annotationTypes)),
+        'relation': helper.format_element_name('relation', len(el.relations)),
+        'relation_type': helper.format_element_name('relation_type', len(el.relationTypes)),
+        'query': helper.format_element_name('query', len(el.queries)),
+        'view': helper.format_element_name('view', len(el.views)),
+        'description': el.getMetaData(config.data.namespace_prefix['dc'], 'description')
+        })
+        else:
+            info.set_text(_("""%(type)s %(title)s""") % ({"type": type(el),
+                                                          "title": self.controller.get_title(el)}))
+
+        frame = Gtk.Expander.new(_("Metadata"))
+        frame.set_expanded(False)
+        self.view = EditWidget(self.node.set_config, self.node.get_config)
+        for p in self.node.list_keys():
+            self.view.add_entry(p, p, "")
+
+        sw.add(info)
+        vbox.add(sw)
+        frame.add(self.view)
+        vbox.add(frame)
+        vbox.show_all()
+        return vbox
+CLASS2COLUMN[Metadata] = MetadataColumn
+
 class Finder(AdhocView):
     view_name = _("Package finder")
     view_id = 'finder'
@@ -540,12 +825,13 @@ class Finder(AdhocView):
     def refresh(self):
         c=self.rootcolumn
         c.update(c.node)
-        while c.next is not None:
-            c=c.next
+        while c.next_column is not None:
+            c=c.next_column
             c.update(c.node)
         return True
 
     def update_element(self, element=None, event=None):
+        logger.debug("update_element %s %s", event, element)
         if event.endswith('Create'):
             self.model.update_element(element, created=True)
             self.refresh()
@@ -553,21 +839,15 @@ class Finder(AdhocView):
             self.model.update_element(element, created=False)
             self.refresh()
         elif event.endswith('Delete'):
-            self.model.remove_element(element)
-            cb=self.rootcolumn.next
-            while cb is not None:
-                if [ r
-                     for r in cb.liststore
-                     if r[ModelColumn.COLUMN_NODE][DetailedTreeModel.COLUMN_ELEMENT] == element ]:
-                    # The element is present in the list of
-                    # children. Remove the next column if necessary
-                    # and update the children list.
-                    cb.update(node=cb.node)
-                    if cb.next is not None and cb.next.node[DetailedTreeModel.COLUMN_ELEMENT] == element:
-                        cb.next.close()
-
-                cb=cb.next
-            #self.update_model(element.rootPackage)
+            parent = self.model.remove_element(element)
+            if parent is not None:
+                cb=self.rootcolumn.next_column
+                while cb is not None:
+                    if cb.node == parent:
+                        cb.update(node=cb.node)
+                        if cb.next_column is not None and cb.next_column.node == element:
+                            cb.next_column.close()
+                    cb=cb.next_column
         else:
             return "Unknown event %s" % event
         return
@@ -615,102 +895,105 @@ class Finder(AdhocView):
             package = self.controller.package
 
         # Reset to the rootcolumn
-        cb=self.rootcolumn.next
+        cb=self.rootcolumn.next_column
         while cb is not None:
             cb.widget.destroy()
-            cb=cb.next
-        self.rootcolumn.next=None
+            cb=cb.next_column
+        self.rootcolumn.next_column=None
 
         self.package = package
         self.model=DetailedTreeModel(controller=self.controller, package=package)
 
         # Update the rootcolumn element
-        self.rootcolumn.update(self.model[0])
+        self.rootcolumn.update(package)
         return True
 
     def clicked_callback(self, columnbrowser, node):
+        logger.debug("clicked_callback %s %s %s", columnbrowser, node, columnbrowser.next_column)
         if columnbrowser is None:
             # We selected  the rootcolumn. Delete the next ones
-            cb=self.rootcolumn.next
+            cb=self.rootcolumn.next_column
             while cb is not None:
                 cb.widget.destroy()
-                cb=cb.next
-            self.rootcolumn.next=None
-        elif columnbrowser.next is None:
-            t=type(node[DetailedTreeModel.COLUMN_ELEMENT])
+                cb=cb.next_column
+            self.rootcolumn.next_column=None
+        elif columnbrowser.next_column is None:
+            t=type(node)
             clazz=CLASS2COLUMN.get(t, ModelColumn)
             # Create a new columnbrowser
             col=clazz(controller=self.controller,
+                      model=self.rootcolumn.model,
                       node=node,
                       callback=self.clicked_callback,
                       parent=columnbrowser)
             col.widget.set_property("width-request", self.column_width)
-            self.hbox.pack_start(col.widget, expand=False)
+            self.hbox.pack_start(col.widget, False, True, 0)
             col.widget.show_all()
-            columnbrowser.next=col
+            columnbrowser.next_column=col
         else:
             # Delete all next+1 columns (we reuse the next one)
-            cb=columnbrowser.next.next
+            cb=columnbrowser.next_column.next_column
             if cb is not None:
                 cb.close()
             # Check if the column is still appropriate for the node
-            clazz=CLASS2COLUMN.get(type(node[DetailedTreeModel.COLUMN_ELEMENT]), ModelColumn)
-            if not isinstance(columnbrowser.next, clazz):
+            clazz=CLASS2COLUMN.get(type(node), None)
+            if clazz is None or not isinstance(columnbrowser.next_column, clazz):
                 # The column is not appropriate for the new node.
                 # Close it and reopen it.
-                columnbrowser.next.close()
+                columnbrowser.next_column.close()
                 self.clicked_callback(columnbrowser, node)
             else:
-                columnbrowser.next.update(node)
+                columnbrowser.next_column.update(node)
 
         # Scroll the columns
-        gobject.timeout_add(100, lambda: self.autoscroll_end() and False)
+        GObject.timeout_add(100, lambda: self.autoscroll_end() and False)
         return True
 
     def autoscroll_end(self):
         adj=self.sw.get_hadjustment()
-        adj.value = adj.upper - adj.page_size
+        adj.set_value(adj.get_upper() - adj.get_page_size())
         return True
 
     def scroll_event(self, widget=None, event=None):
         a=widget.get_hadjustment()
-        if ((event.direction == gtk.gdk.SCROLL_DOWN and event.state & gtk.gdk.SHIFT_MASK)
-            or event.direction == gtk.gdk.SCROLL_RIGHT):
-            val = a.value + a.step_increment
-            if val > a.upper - a.page_size:
-                val = a.upper - a.page_size
-            if val != a.value:
-                a.value = val
+        if ((event.direction == Gdk.ScrollDirection.DOWN and event.get_state() & Gdk.ModifierType.SHIFT_MASK)
+            or event.direction == Gdk.ScrollDirection.RIGHT):
+            val = a.get_value() + a.get_step_increment()
+            if val > a.get_upper() - a.get_page_size():
+                val = a.get_upper() - a.get_page_size()
+            if val != a.get_value():
+                a.set_value(val)
                 a.value_changed ()
             return True
-        elif ((event.direction == gtk.gdk.SCROLL_UP and event.state & gtk.gdk.SHIFT_MASK)
-              or event.direction == gtk.gdk.SCROLL_LEFT):
-            val = a.value - a.step_increment
-            if val < a.lower:
-                val = a.lower
-            if val != a.value:
-                a.value = val
+        elif ((event.direction == Gdk.ScrollDirection.UP and event.get_state() & Gdk.ModifierType.SHIFT_MASK)
+              or event.direction == Gdk.ScrollDirection.LEFT):
+            val = a.get_value() - a.get_step_increment()
+            if val < a.get_lower():
+                val = a.get_lower()
+            if val != a.get_value():
+                a.set_value(val)
                 a.value_changed ()
             return True
         return False
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        self.sw=gtk.ScrolledWindow()
-        self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        self.sw=Gtk.ScrolledWindow()
+        self.sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
 
         self.sw.connect('scroll-event', self.scroll_event)
         vbox.add(self.sw)
 
-        self.hbox = gtk.HBox()
+        self.hbox = Gtk.HBox()
 
         self.rootcolumn=ModelColumn(controller=self.controller,
-                                     node=self.model[0],
-                                     callback=self.clicked_callback,
-                                     parent=None)
+                                    model=self.model,
+                                    node=self.package,
+                                    callback=self.clicked_callback,
+                                    parent=None)
         self.rootcolumn.widget.set_property("width-request", self.column_width)
-        self.hbox.pack_start(self.rootcolumn.widget, expand=False)
+        self.hbox.pack_start(self.rootcolumn.widget, False, True, 0)
 
         self.sw.add_with_viewport(self.hbox)
 
diff --git a/lib/advene/gui/views/html.py b/lib/advene/gui/views/html.py
index adeba2c..2109a9f 100644
--- a/lib/advene/gui/views/html.py
+++ b/lib/advene/gui/views/html.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,156 +20,26 @@
 
 FIXME: add navigation buttons (back, history)
 """
+import logging
+logger = logging.getLogger(__name__)
 
-import gtk
-import urllib
-import urlparse
+from gi.repository import Gtk
+import urllib.request, urllib.parse, urllib.error
+import urllib.parse
 import re
 
 engine=None
 try:
-    import webkit
+    import gi
+    gi.require_version('WebKit', '3.0')
+    from gi.repository import WebKit
     engine='webkit'
 except ImportError:
-    try:
-        import gtkmozembed
-        gtkmozembed.set_comp_path('')
-        engine='mozembed'
-    except ImportError:
-        try:
-            import gtkhtml2
-            engine='gtkhtml2'
-        except ImportError:
-            pass
+    pass
 
 from gettext import gettext as _
 from advene.gui.views import AdhocView
 
-class gtkhtml_wrapper:
-    def __init__(self, controller=None, notify=None):
-        self.controller=controller
-        self.notify=notify
-        self.history = []
-        self.current = ""
-        self.widget = self.build_widget()
-
-    def refresh(self, *p):
-        self.set_url(self.current)
-        return True
-
-    def back(self, *p):
-        if len(self.history) <= 1:
-            self.log(_("Cannot go back: first item in history"))
-        else:
-            # Current URL
-            u=self.history.pop()
-            # Previous one
-            self.set_url(self.history[-1])
-        return True
-
-    def set_url(self, url):
-        self.update_history(url)
-        d=self.component.document
-        d.clear()
-
-        u=urllib.urlopen(url)
-
-        d.open_stream(u.info().type)
-        for l in u:
-            d.write_stream (l)
-
-        u.close()
-        d.close_stream()
-
-        self.current=url
-        if self.notify:
-            self.notify(url=url)
-        return True
-
-    def get_url(self):
-        return self.current
-
-    def update_history(self, url):
-        if not self.history:
-            self.history.append(url)
-        elif self.history[-1] != url:
-            self.history.append(url)
-        return
-
-    def build_widget(self):
-        w=gtk.ScrolledWindow()
-        w.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-
-        c=gtkhtml2.View()
-        c.document=gtkhtml2.Document()
-
-        def request_url(document, url, stream):
-            print "request url", url, stream
-            pass
-
-        def link_clicked(document, link):
-            u=self.get_url()
-            if u:
-                url=urllib.basejoin(u, link)
-            else:
-                url=link
-            self.set_url(url)
-            return True
-
-        c.document.connect('link-clicked', link_clicked)
-        c.document.connect('request-url', request_url)
-
-        c.get_vadjustment().set_value(0)
-        w.set_hadjustment(c.get_hadjustment())
-        w.set_vadjustment(c.get_vadjustment())
-        c.document.clear()
-        c.set_document(c.document)
-        w.add(c)
-        self.component=c
-        return w
-
-class mozembed_wrapper:
-    def __init__(self, controller=None, notify=None):
-        self.controller=controller
-        self.notify=notify
-        self.widget=self.build_widget()
-
-    def refresh(self, *p):
-        self.component.reload(0)
-        return True
-
-    def back(self, *p):
-        self.component.go_back()
-        return True
-
-    def set_url(self, url):
-        self.component.load_url(url)
-        return True
-
-    def get_url(self):
-        return self.component.get_location()
-
-    def build_widget(self):
-        w=gtkmozembed.MozEmbed()
-        # A profile must be initialized, cf
-        # http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq19.018.htp
-        gtkmozembed.set_profile_path("/tmp", "foobar")
-
-        def update_location(c):
-            if self.notify:
-                self.notify(url=self.get_url())
-            return False
-
-        def update_label(c):
-            if self.notify:
-                self.notify(label=c.get_link_message())
-            return False
-
-        w.connect('location', update_location)
-        w.connect('link-message', update_label)
-        self.component=w
-        return w
-
 class webkit_wrapper:
     def __init__(self, controller=None, notify=None):
         self.controller=controller
@@ -190,10 +60,10 @@ class webkit_wrapper:
         return True
 
     def build_widget(self):
-        w=webkit.WebView()
+        w = WebKit.WebView()
 
         def update_location(url):
-            l=urlparse.urlparse(url)
+            l=urllib.parse.urlparse(url)
             if self.no_content_re.match(l[2]):
                 # webkit does not correctly handle 204 return code.
                 # Automatically go back.
@@ -233,10 +103,10 @@ class webkit_wrapper:
             self.notify(label=text)
 
         def _icon_loaded_cb(self, *p):
-            print "icon loaded"
+            logger.info("icon loaded")
 
         def _selection_changed_cb(self):
-            print "selection changed"
+            logger.info("selection changed")
 
         def _navigation_requested_cb(view, frame, networkRequest):
             return 1
@@ -277,7 +147,7 @@ class webkit_wrapper:
                               _javascript_script_prompt_cb)
 
         self.component=w
-        s=gtk.ScrolledWindow()
+        s=Gtk.ScrolledWindow()
         s.add(w)
 
         return s
@@ -311,12 +181,10 @@ class HTMLView(AdhocView):
 
     def build_widget(self):
         mapping={ 'webkit': webkit_wrapper,
-                  'mozembed': mozembed_wrapper,
-                  'gtkhtml2': gtkhtml_wrapper,
                   None: None}
         wrapper=mapping.get(engine)
         if wrapper is None:
-            w=gtk.Label(_("No available HTML rendering component"))
+            w=Gtk.Label(label=_("No available HTML rendering component"))
             self.component=w
         else:
             self.component = wrapper(controller=self.controller,
@@ -326,18 +194,18 @@ class HTMLView(AdhocView):
         def utbv_menu(*p):
             if self.controller and self.controller.gui:
                 m=self.controller.gui.build_utbv_menu(action=self.open_url)
-                m.popup(None, None, None, 0, gtk.get_current_event_time())
+                m.popup_at_pointer()
             return True
 
-        tb=gtk.Toolbar()
-        tb.set_style(gtk.TOOLBAR_ICONS)
+        tb=Gtk.Toolbar()
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
 
         for icon, action in (
-            (gtk.STOCK_GO_BACK, self.component.back),
-            (gtk.STOCK_REFRESH, self.component.refresh),
-            (gtk.STOCK_HOME, utbv_menu),
+            (Gtk.STOCK_GO_BACK, self.component.back),
+            (Gtk.STOCK_REFRESH, self.component.refresh),
+            (Gtk.STOCK_HOME, utbv_menu),
             ):
-            b=gtk.ToolButton(stock_id=icon)
+            b=Gtk.ToolButton(stock_id=icon)
             b.connect('clicked', action)
             tb.insert(b, -1)
 
@@ -345,26 +213,26 @@ class HTMLView(AdhocView):
             self.component.set_url(self.current_url())
             return True
 
-        self.url_entry=gtk.Entry()
+        self.url_entry=Gtk.Entry()
         self.url_entry.connect('activate', entry_validated)
-        ti=gtk.ToolItem()
+        ti=Gtk.ToolItem()
         ti.add(self.url_entry)
         ti.set_expand(True)
         tb.insert(ti, -1)
 
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
 
-        vbox.pack_start(tb, expand=False)
+        vbox.pack_start(tb, False, True, 0)
 
         vbox.add(w)
 
-        self.url_label=gtk.Label('')
+        self.url_label=Gtk.Label(label='')
         self.url_label.set_alignment(0, 0)
-        vbox.pack_start(self.url_label, expand=False)
+        vbox.pack_start(self.url_label, False, True, 0)
 
         return vbox
 
     def current_url(self, url=None):
         if url is not None:
             self.url_entry.set_text(url)
-        return unicode(self.url_entry.get_text())
+        return self.url_entry.get_text()
diff --git a/lib/advene/gui/views/interactivequery.py b/lib/advene/gui/views/interactivequery.py
index a2d4b42..c4aee5e 100644
--- a/lib/advene/gui/views/interactivequery.py
+++ b/lib/advene/gui/views/interactivequery.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -23,8 +23,9 @@ Display the query results in a view (timeline, tree, etc).
 from gettext import gettext as _
 import pprint
 
-import gtk
-import pango
+from gi.repository import Gdk
+from gi.repository import Gtk
+from gi.repository import Pango
 
 import advene.core.config as config
 from advene.gui.edit.rules import EditQuery
@@ -181,10 +182,10 @@ class InteractiveQuery(AdhocView):
         c=self.controller.build_context(here=self.here)
         try:
             res=c.evaluateValue("here/query/_interactive")
-        except AdveneTalesException, e:
+        except AdveneTalesException as e:
             # Display a dialog with the value
             dialog.message_dialog(_("TALES error in interactive expression:\n%s" % str(e)),
-                icon=gtk.MESSAGE_ERROR)
+                icon=Gtk.MessageType.ERROR)
             return True
 
         # Close the search window
@@ -203,30 +204,30 @@ class InteractiveQuery(AdhocView):
         return True
 
     def build_widget(self):
-        vbox = gtk.VBox()
+        vbox = Gtk.VBox()
 
         self.eq=EditQuery(self.query,
                           editable=True,
                           controller=self.controller)
         vbox.add(self.eq.widget)
 
-        hb=gtk.HButtonBox()
+        hb=Gtk.HButtonBox()
 
-        b=gtk.Button(stock=gtk.STOCK_OK)
+        b=Gtk.Button(stock=Gtk.STOCK_OK)
         b.connect('clicked', self.validate)
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
-        b=gtk.Button(stock=gtk.STOCK_CANCEL)
+        b=Gtk.Button(stock=Gtk.STOCK_CANCEL)
         b.connect('clicked', self.cancel)
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
-        vbox.pack_start(hb, expand=False)
+        vbox.pack_start(hb, False, True, 0)
 
         def handle_key_press_event(widget, event):
-            if event.keyval == gtk.keysyms.Return:
+            if event.keyval == Gdk.KEY_Return:
                 self.validate()
                 return True
-            elif event.keyval == gtk.keysyms.Escape:
+            elif event.keyval == Gdk.KEY_Escape:
                 self.cancel()
                 return True
             return False
@@ -261,7 +262,7 @@ class InteractiveResult(AdhocView):
             result=query.result
         self.result=result
 
-        if isinstance(self.query, basestring):
+        if isinstance(self.query, str):
             # Quicksearch entry. Convert to Quicksearch class.
             q=Quicksearch(controller=self.controller,
                           sources=config.data.preferences['quicksearch-sources'],
@@ -370,7 +371,7 @@ class InteractiveResult(AdhocView):
         return True
 
     def redo_quicksearch(self, b, entry):
-        s=unicode(entry.get_text())
+        s=entry.get_text()
         if not s:
             self.log(_("Empty quicksearch string"))
             return True
@@ -383,37 +384,37 @@ class InteractiveResult(AdhocView):
         return True
 
     def build_widget(self):
-        v=gtk.VBox()
+        v=Gtk.VBox()
 
-        tb=gtk.Toolbar()
-        tb.set_style(gtk.TOOLBAR_ICONS)
-        v.pack_start(tb, expand=False)
+        tb=Gtk.Toolbar()
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
+        v.pack_start(tb, False, True, 0)
 
-        top_box=gtk.HBox()
-        v.pack_start(top_box, expand=False)
+        top_box=Gtk.HBox()
+        v.pack_start(top_box, False, True, 0)
 
         if hasattr(self.query, 'container') and self.query.container.id == '_interactive':
-            b=gtk.Button(_("Edit query again"))
+            b=Gtk.Button(_("Edit query again"))
             b.connect('clicked', self.edit_query)
-            top_box.pack_start(b, expand=False)
+            top_box.pack_start(b, False, True, 0)
         elif isinstance(self.query, SimpleQuery):
-            b=gtk.Button(_("Edit query"))
+            b=Gtk.Button(_("Edit query"))
             b.connect('clicked', lambda b: self.controller.gui.edit_element(self.query))
-            top_box.pack_start(b, expand=False)
+            top_box.pack_start(b, False, True, 0)
         elif isinstance(self.query, Quicksearch):
-            e=gtk.Entry()
+            e=Gtk.Entry()
             e.set_text(self.query.searched)
             e.set_width_chars(12)
             e.connect('activate', self.redo_quicksearch, e)
-            b=get_small_stock_button(gtk.STOCK_FIND, self.redo_quicksearch, e)
+            b=get_small_stock_button(Gtk.STOCK_FIND, self.redo_quicksearch, e)
             e.set_tooltip_text(_('String to search'))
             b.set_tooltip_text(_('Search again'))
-            top_box.pack_start(e, expand=False)
-            top_box.pack_start(b, expand=False)
+            top_box.pack_start(e, False, True, 0)
+            top_box.pack_start(b, False, True, 0)
 
         # Present choices to display the result
         if not self.result:
-            v.add(gtk.Label(_("Empty result")))
+            v.add(Gtk.Label(label=_("Empty result")))
         elif (isinstance(self.result, list) or isinstance(self.result, tuple)
             or isinstance(self.result, AbstractBundle)):
             # Check if there are annotations
@@ -428,8 +429,8 @@ class InteractiveResult(AdhocView):
                     'elements': helper.format_element_name("annotation", len(l)),
                     'number': len(self.result)}
 
-            label=gtk.Label(t)
-            label.set_ellipsize(pango.ELLIPSIZE_END)
+            label=Gtk.Label(label=t)
+            label.set_ellipsize(Pango.EllipsizeMode.END)
             label.set_line_wrap(True)
             top_box.add(label)
 
@@ -456,18 +457,18 @@ class InteractiveResult(AdhocView):
                     v.add(table.widget)
                 else:
                     # Mixed annotations + other elements
-                    notebook=gtk.Notebook()
-                    notebook.set_tab_pos(gtk.POS_TOP)
+                    notebook=Gtk.Notebook()
+                    notebook.set_tab_pos(Gtk.PositionType.TOP)
                     notebook.popup_disable()
                     v.add(notebook)
 
-                    notebook.append_page(table.widget, gtk.Label(_("Annotations")))
+                    notebook.append_page(table.widget, Gtk.Label(label=_("Annotations")))
 
                     gtable=GenericTable(controller=self.controller, elements=[ e
                                                                                for e in self.result
                                                                                if not isinstance(e, Annotation) ]
                                                                                )
-                    notebook.append_page(gtable.widget, gtk.Label(_("Other elements")))
+                    notebook.append_page(gtable.widget, Gtk.Label(label=_("Other elements")))
 
 
                 for (icon, tip, action) in (
@@ -478,16 +479,16 @@ class InteractiveResult(AdhocView):
                                                              destination=self._destination,
                                                              elements=l)),
                     ('highlight.png', _("Highlight annotations"), lambda b: toggle_highlight(b, l)),
-                    (gtk.STOCK_CONVERT, _("Export table"), lambda b: table.csv_export()),
-                    (gtk.STOCK_NEW, _("Create annotations from the result"), self.create_annotations),
+                    (Gtk.STOCK_CONVERT, _("Export table"), lambda b: table.csv_export()),
+                    (Gtk.STOCK_NEW, _("Create annotations from the result"), self.create_annotations),
                     ('montage.png', _("Define a montage with the result"), self.create_montage),
                     ('comment.png', _("Create a comment view with the result"), self.create_comment),
-                    (gtk.STOCK_FIND_AND_REPLACE, _("Search and replace strings in the annotations content"), self.search_replace),
+                    (Gtk.STOCK_FIND_AND_REPLACE, _("Search and replace strings in the annotations content"), self.search_replace),
                     ):
                     if icon.endswith('.png'):
                         ti=get_pixmap_toolbutton(icon)
                     else:
-                        ti=gtk.ToolButton(stock_id=icon)
+                        ti=Gtk.ToolButton(stock_id=icon)
                     ti.connect('clicked', action)
                     ti.set_tooltip_text(tip)
                     tb.insert(ti, -1)
@@ -498,7 +499,7 @@ class InteractiveResult(AdhocView):
                 gtable=GenericTable(controller=self.controller, elements=self.result)
                 v.add(gtable.widget)
 
-                ti=gtk.ToolButton(gtk.STOCK_CONVERT)
+                ti=Gtk.ToolButton(Gtk.STOCK_CONVERT)
                 ti.connect('clicked', lambda b: gtable.csv_export())
                 ti.set_tooltip_text(_("Export table"))
                 tb.insert(ti, -1)
@@ -516,7 +517,7 @@ class InteractiveResult(AdhocView):
                 ti.set_tooltip_text(_("Open in python evaluator"))
                 tb.insert(ti, -1)
         else:
-            v.add(gtk.Label(_("Result:\n%s") % unicode(self.result)))
+            v.add(Gtk.Label(label=_("Result:\n%s") % str(self.result)))
         v.show_all()
         return v
 
diff --git a/lib/advene/gui/views/logwindow.py b/lib/advene/gui/views/logwindow.py
index 50443b8..6fc783b 100644
--- a/lib/advene/gui/views/logwindow.py
+++ b/lib/advene/gui/views/logwindow.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -30,7 +30,7 @@ import advene.util.helper as helper
 
 from gettext import gettext as _
 
-import gtk
+from gi.repository import Gtk
 
 import advene.rules.elements
 
@@ -66,13 +66,13 @@ class LogWindow(AdhocView):
         return False
 
     def build_widget(self):
-        w=gtk.VBox()
+        w=Gtk.VBox()
 
-        sw = gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        sw = Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         w.add(sw)
 
-        self.datawidget=gtk.VBox()
+        self.datawidget=Gtk.VBox()
         sw.add_with_viewport(self.datawidget)
 
         return w
@@ -98,7 +98,7 @@ class LogWindow(AdhocView):
         return True
 
     def goto_position(self, button=None, position=None):
-        self.controller.update_status("set", position)
+        self.controller.update_status("seek", position)
         return True
 
     def goto_url(self, button=None, url=None):
@@ -114,24 +114,24 @@ class LogWindow(AdhocView):
         if l:
             return True
 
-        hb=gtk.HBox()
+        hb=Gtk.HBox()
 
-        b=gtk.Button(message)
+        b=Gtk.Button(message)
         # Make the message left-aligned
-        b.child.set_alignment(0.0, 0.5)
+        b.get_child().set_alignment(0.0, 0.5)
         b.connect('clicked', self.goto_url, url)
         b.set_tooltip_text(_("Go to %s") % url)
         hb.add(b)
 
-        b=gtk.Button(helper.format_time(position))
-        b.child.set_alignment(0.0, 0.5)
+        b=Gtk.Button(helper.format_time(position))
+        b.get_child().set_alignment(0.0, 0.5)
         b.connect('clicked', self.goto_position, position)
         b.set_tooltip_text(_("Go to the given position"))
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
         hb.show_all()
 
-        self.datawidget.pack_start(hb, expand=False)
+        self.datawidget.pack_start(hb, False, True, 0)
         self.data.append( (time.time(), position, message, url, hb) )
         return True
 
diff --git a/lib/advene/gui/views/relation.py b/lib/advene/gui/views/relation.py
index d13aa25..ee81eb4 100755
--- a/lib/advene/gui/views/relation.py
+++ b/lib/advene/gui/views/relation.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -17,6 +17,9 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
 # Advene part
+import logging
+logger = logging.getLogger(__name__)
+
 import advene.core.config as config
 
 from gettext import gettext as _
@@ -24,7 +27,7 @@ from gettext import gettext as _
 import advene.gui.popup
 from advene.gui.util import name2color
 
-import gtk
+from gi.repository import Gtk
 
 class RelationView:
     """Controller for the MVC representing a relation."""
@@ -40,18 +43,18 @@ class RelationView:
         return True
 
     def activate(self, button):
-        print "Relation %s activated" % self.relation.id
+        logger.warn("Relation %s activated %s", self.relation.id)
         if self.controller:
             self.controller.notify("RelationActivate", relation=self.relation)
         return True
 
     def build_widget(self):
-        l=gtk.Label()
+        l=Gtk.Label()
         l.set_markup("<b>%s</b> relation between\nann. <i>%s</i>\nand\nann. <i>%s</i>" %
                      (self.relation.type.title.replace('<', '<'),
                       self.relation.members[0].id,
                       self.relation.members[1].id))
-        b=gtk.Button()
+        b=Gtk.Button()
         b.add(l)
         b.connect('clicked', self.popup)
 
@@ -73,22 +76,20 @@ class RelationsBox:
         self.controller=controller
         self.relationviews=[]
         self.active_color = name2color('red')
-        self.inactive_color = gtk.Button().get_style().bg[0]
+        self.inactive_color = Gtk.Button().get_style().bg[0]
         self.widget = self.build_widget()
 
     def build_widget(self):
-        vbox=gtk.VBox()
+        vbox=Gtk.VBox()
         for r in self.package.relations:
             v=RelationView(relation=r, controller=self.controller)
             self.relationviews.append(v)
-            vbox.pack_start(v.get_widget(), expand=False)
+            vbox.pack_start(v.get_widget(), False, False, 0)
         vbox.show_all()
         return vbox
 
     def debug_cb (self, widget, data=None):
-        print "Debug event."
-        if data is not None:
-            print "Data: %s" % data
+        logger.warn("Debug event: %s", data or "No data")
         return True
 
     def get_widget_for_relation (self, relation):
@@ -127,9 +128,9 @@ class RelationsBox:
         bs = self.get_widget_for_relation (relation)
         for b in bs:
             b.active = True
-            for style in (gtk.STATE_ACTIVE, gtk.STATE_NORMAL,
-                          gtk.STATE_SELECTED, gtk.STATE_INSENSITIVE,
-                          gtk.STATE_PRELIGHT):
+            for style in (Gtk.StateType.ACTIVE, Gtk.StateType.NORMAL,
+                          Gtk.StateType.SELECTED, Gtk.StateType.INSENSITIVE,
+                          Gtk.StateType.PRELIGHT):
                 b.modify_bg (style, self.active_color)
         return True
 
@@ -138,9 +139,9 @@ class RelationsBox:
         bs = self.get_widget_for_relation (relation)
         for b in bs:
             b.active = True
-            for style in (gtk.STATE_ACTIVE, gtk.STATE_NORMAL,
-                          gtk.STATE_SELECTED, gtk.STATE_INSENSITIVE,
-                          gtk.STATE_PRELIGHT):
+            for style in (Gtk.StateType.ACTIVE, Gtk.StateType.NORMAL,
+                          Gtk.StateType.SELECTED, Gtk.StateType.INSENSITIVE,
+                          Gtk.StateType.PRELIGHT):
                 b.modify_bg (style, self.inactive_color)
         return True
 
@@ -155,7 +156,7 @@ class RelationsBox:
             if element in self.list:
                 v=RelationView(relation=element, controller=self.controller)
                 self.relationviews.append(v)
-                self.widget.pack_start(v.get_widget(), expand=False)
+                self.widget.pack_start(v.get_widget(), False, False, 0)
             return True
 
         bs = self.get_widget_for_relation (element)
@@ -165,21 +166,19 @@ class RelationsBox:
             elif event == 'RelationDelete':
                 b.destroy()
             else:
-                print "Unknown event %s" % event
+                logger.warn("Unknown event %s", event)
         return True
 
     def drag_sent(self, widget, context, selection, targetType, eventTime):
-        #print "drag_sent event from %s" % widget.annotation.content.data
         if targetType == config.data.target_type['annotation']:
-            selection.set(selection.target, 8, widget.annotation.uri.encode('utf8'))
+            selection.set(selection.get_target(), 8, widget.annotation.uri.encode('utf8'))
         else:
-            print "Unknown target type for drag: %d" % targetType
+            logger.warn("Unknown target type for drag: %d" % targetType)
         return True
 
     def drag_received(self, widget, context, x, y, selection, targetType, time):
-        #print "drag_received event for %s" % widget.annotation.content.data
         if targetType == config.data.target_type['annotation']:
-            source=self.package.annotations.get(unicode(selection.data, 'utf8').split('\n')[0])
+            source=self.package.annotations.get(str(selection.get_data(), 'utf8').split('\n')[0])
             dest=widget.annotation
             self.create_relation_popup(source, dest)
             # FIXME: TODO
@@ -198,5 +197,5 @@ class RelationsBox:
             #     # FIXME...
             #     rel=self.package.createRelation(chosen_relation, members=(source, dest))
         else:
-            print "Unknown target type for drop: %d" % targetType
+            logger.warn("Unknown target type for drop: %d" % targetType)
         return True
diff --git a/lib/advene/gui/views/relationdisplay.py b/lib/advene/gui/views/relationdisplay.py
index 8441448..c7d7787 100644
--- a/lib/advene/gui/views/relationdisplay.py
+++ b/lib/advene/gui/views/relationdisplay.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
 """Module displaying the contents of a relation
 """
 
-import gtk
+from gi.repository import Gtk
 from gettext import gettext as _
 
 from advene.gui.views import AdhocView
@@ -87,32 +87,32 @@ class RelationDisplay(AdhocView):
             self.label['title'].set_markup(title)
             self.label['contents'].set_text('')
             for a in self.relation.members:
-                self.members_widget.pack_start(AnnotationRepresentation(a, self.controller), expand=False)
+                self.members_widget.pack_start(AnnotationRepresentation(a, self.controller), False, False, 0)
             self.widget.show_all()
         return False
 
     def build_widget(self):
-        v=gtk.VBox()
+        v=Gtk.VBox()
 
         self.label={}
 
-        self.label['title']=gtk.Label()
-        v.pack_start(self.label['title'], expand=False)
+        self.label['title']=Gtk.Label()
+        v.pack_start(self.label['title'], False, True, 0)
 
-        exp=gtk.Expander()
+        exp=Gtk.Expander()
         exp.set_expanded(False)
         exp.set_label(_("Contents"))
-        c=self.label['contents']=gtk.Label()
+        c=self.label['contents']=Gtk.Label()
         c.set_line_wrap(True)
         c.set_selectable(True)
         c.set_single_line_mode(False)
         c.set_alignment(0.0, 0.0)
         exp.add(c)
-        v.pack_start(exp, expand=False)
+        v.pack_start(exp, False, True, 0)
 
-        f=gtk.Frame(_("Members"))
+        f=Gtk.Frame.new(_("Members"))
         #  Display members
-        self.members_widget=gtk.VBox()
+        self.members_widget=Gtk.VBox()
         f.add(self.members_widget)
 
         v.add(f)
diff --git a/lib/advene/gui/views/scroller.py b/lib/advene/gui/views/scroller.py
index 21bd229..3d5cac3 100644
--- a/lib/advene/gui/views/scroller.py
+++ b/lib/advene/gui/views/scroller.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -23,7 +23,8 @@ from advene.gui.views import AdhocView
 
 from gettext import gettext as _
 
-import gtk
+from gi.repository import Gdk
+from gi.repository import Gtk
 
 class ScrollerView(AdhocView):
     view_name = _("Scroller")
@@ -49,17 +50,17 @@ class ScrollerView(AdhocView):
         return True
 
     def build_widget(self):
-        v=gtk.HBox()
+        v=Gtk.HBox()
 
         style=v.get_style().copy()
         self.style = style
 
-        black=gtk.gdk.color_parse('black')
-        white=gtk.gdk.color_parse('white')
+        black=Gdk.color_parse('black')
+        white=Gdk.color_parse('white')
 
-        for state in (gtk.STATE_ACTIVE, gtk.STATE_NORMAL,
-                      gtk.STATE_SELECTED, gtk.STATE_INSENSITIVE,
-                      gtk.STATE_PRELIGHT):
+        for state in (Gtk.StateType.ACTIVE, Gtk.StateType.NORMAL,
+                      Gtk.StateType.SELECTED, Gtk.StateType.INSENSITIVE,
+                      Gtk.StateType.PRELIGHT):
             style.bg[state]=black
             style.fg[state]=white
             style.text[state]=white
@@ -67,17 +68,17 @@ class ScrollerView(AdhocView):
 
         v.set_style(style)
 
-        self.past_widget=gtk.VBox()
+        self.past_widget=Gtk.VBox()
         self.past_widget.set_style(style)
 
-        self.present_widget=gtk.VBox()
+        self.present_widget=Gtk.VBox()
         self.present_widget.set_style(style)
-        #self.present_alignment=gtk.Alignment(0.25, 0.25, 0, 0)
+        #self.present_alignment=Gtk.Alignment.new(0.25, 0.25, 0, 0)
         #self.present_alignment.add(self.present_widget)
         self.present_widget.set_style(style)
         #self.present_alignment.set_style(style)
 
-        self.future_widget=gtk.VBox()
+        self.future_widget=Gtk.VBox()
         self.future_widget.set_style(style)
 
         v.add(self.past_widget)
@@ -86,13 +87,13 @@ class ScrollerView(AdhocView):
         v.add(self.future_widget)
 
         def create_label(text, widget):
-            eb=gtk.EventBox()
-            l=gtk.Label(text)
+            eb=Gtk.EventBox()
+            l=Gtk.Label(label=text)
             l.set_single_line_mode(False)
             eb.add(l)
             l.set_style(style)
             eb.set_style(style)
-            widget.pack_start(eb)
+            widget.pack_start(eb, True, True, 0)
             return l
 
         self.present_label = create_label('present',
diff --git a/lib/advene/gui/views/singletonpopup.py b/lib/advene/gui/views/singletonpopup.py
index 04a8a4d..80aef46 100755
--- a/lib/advene/gui/views/singletonpopup.py
+++ b/lib/advene/gui/views/singletonpopup.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
 
 import time
 
-import gtk
+from gi.repository import Gtk
 
 from gettext import gettext as _
 from advene.gui.views import AdhocView
@@ -60,7 +60,7 @@ class SingletonPopup(AdhocView):
         self.widget=widget
         self.vbox.add(widget)
         if timeout is not None and timeout != 0:
-            self.hidetime=time.time() + (long(timeout) / 1000.0)
+            self.hidetime=time.time() + (int(timeout) / 1000.0)
         self.show()
         return True
 
@@ -90,12 +90,12 @@ class SingletonPopup(AdhocView):
         return True
 
     def build_widget(self):
-        mainbox=gtk.VBox()
+        mainbox=Gtk.VBox()
 
-        self.vbox = gtk.VBox()
+        self.vbox = Gtk.VBox()
         mainbox.add(self.vbox)
 
-        self.widget=gtk.Label(_("Navigation popup"))
+        self.widget=Gtk.Label(label=_("Navigation popup"))
         self.vbox.add(self.widget)
 
         return mainbox
diff --git a/lib/advene/gui/views/table.py b/lib/advene/gui/views/table.py
index 9eb13b5..0192120 100644
--- a/lib/advene/gui/views/table.py
+++ b/lib/advene/gui/views/table.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,7 +16,12 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-import gtk
+import logging
+logger = logging.getLogger(__name__)
+
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import Gtk
 import csv
 
 from gettext import gettext as _
@@ -43,7 +48,8 @@ COLUMN_BEGIN_FORMATTED=7
 COLUMN_END_FORMATTED=8
 COLUMN_PIXBUF=9
 COLUMN_COLOR=10
-COLUMN_CUSTOM_FIRST=11
+COLUMN_SOURCE_PACKAGE=11
+COLUMN_CUSTOM_FIRST=12
 
 name="Element tabular view plugin"
 
@@ -56,15 +62,31 @@ class AnnotationTable(AdhocView):
     view_id = 'table'
     tooltip=_("Display annotations in a table")
 
-    def __init__(self, controller=None, parameters=None, custom_data=None, elements=None):
+    def __init__(self, controller=None, parameters=None, custom_data=None, elements=None, source=None):
+        """We can initialize the table using either a list of elements, or  a TALES source expression.
+
+        If both are specified, the list of elements takes precedence.
+        """
         super(AnnotationTable, self).__init__(controller=controller)
         self.registered_rules = []
         self.close_on_package_load = False
         self.contextual_actions = (
+            (_("Export as CSV"), self.csv_export),
             )
         self.controller=controller
-        self.elements=elements
-        self.options={}
+
+        opt, arg = self.load_parameters(parameters)
+        self.options.update(opt)
+        a=dict(arg)
+        if source is None and 'source' in a:
+            source=a['source']
+
+        self.source = source
+        if elements is None and source:
+            elements = self.get_elements_from_source(source)
+
+        self.elements = elements
+        self.options={ 'confirm-time-update': True }
 
         self.mouseover_annotation = None
         self.last_edited_path = None
@@ -80,17 +102,33 @@ class AnnotationTable(AdhocView):
                 self.controller.event_handler.remove_rule(r, type_="internal")
         self.widget.connect('destroy', unregister)
 
+    def get_save_arguments(self):
+        if self.source is not None:
+            arguments = [ ('source', self.source) ]
+        else:
+            arguments = []
+        return self.options, arguments
+
     def update_annotation(self, annotation=None, event=None):
-        if annotation in self.elements:
+        if self.source:
+            # Re-evaluate source parameter, in case the annotation was
+            # created.
+            elements = self.get_elements_from_source(self.source)
+        else:
+            elements = self.elements
+
+        if elements and annotation in elements:
             if event.endswith('Delete'):
-                self.elements.remove(annotation)
-            self.set_elements(self.elements)
+                elements.remove(annotation)
+            self.set_elements(elements)
 
     def update_snapshot(self, context, parameters):
-        pos = long(context.globals['position'])
-        eps = self.controller.package.imagecache.epsilon
+        pos = int(context.globals['position'])
+        media = context.globals['media']
+        eps = self.controller.package.imagecache.precision
         for r in self.widget.treeview.get_model():
-            if abs(r[COLUMN_BEGIN] - pos) <= eps:
+            if (r[COLUMN_ELEMENT].media == media
+                and abs(r[COLUMN_BEGIN] - pos) <= eps):
                 # Update pixbuf
                 r[COLUMN_PIXBUF] = png_to_pixbuf(self.controller.package.imagecache[pos],
                                                  height=32)
@@ -117,14 +155,12 @@ class AnnotationTable(AdhocView):
         else:
             def custom(a):
                 return tuple()
-        args = (object, str, str, str, long, long, str, str, str, gtk.gdk.Pixbuf, str) + custom(None)
-        l=gtk.ListStore(*args)
+        args = (object, str, str, str, int, int, str, str, str, GdkPixbuf.Pixbuf, str, str) + custom(None)
+        l=Gtk.ListStore(*args)
         if not elements:
             return l
         for a in elements:
             if isinstance(a, Annotation):
-                if not self.controller.package.imagecache.is_initialized(a.fragment.begin):
-                    self.controller.update_snapshot(a.fragment.begin)
                 l.append( (a,
                            self.controller.get_title(a),
                            self.controller.get_title(a.type),
@@ -134,9 +170,10 @@ class AnnotationTable(AdhocView):
                            helper.format_time(a.fragment.duration),
                            helper.format_time(a.fragment.begin),
                            helper.format_time(a.fragment.end),
-                           png_to_pixbuf(self.controller.package.imagecache[a.fragment.begin],
+                           png_to_pixbuf(self.controller.get_snapshot(annotation=a),
                                          height=32),
-                           self.controller.get_element_color(a)
+                           self.controller.get_element_color(a),
+                           a.ownerPackage.getTitle()
                            ) + custom(a),
                           )
         return l
@@ -156,6 +193,8 @@ class AnnotationTable(AdhocView):
         tuple with the appropriate values for the annotation in the
         custom columns.
         """
+        if elements is None:
+            elements = []
         model=self.build_model(elements, custom_data)
         self.widget.treeview.set_model(model)
         self.model = model
@@ -163,25 +202,27 @@ class AnnotationTable(AdhocView):
         if self.last_edited_path is not None:
             # We just edited an annotation. This update must come from
             # it, so let us try to set the cursor position at the next element.
-            path = str(long(self.last_edited_path) + 1)
+            path = self.last_edited_path.next()
             try:
                 self.model.get_iter(path)
-            except ValueError:
+            except (ValueError, TypeError):
                 path = self.last_edited_path
             self.widget.treeview.set_cursor(path,
-                                            focus_column=self.columns['content'],
-                                            start_editing=True)
+                                            self.columns['content'],
+                                            True)
+            self.widget.treeview.grab_focus()
             self.last_edited_path = None
 
     def motion_notify_event_cb(self, tv, event):
-        if not event.window is tv.get_bin_window():
+        if not event.get_window() is tv.get_bin_window():
             return False
         if event.is_hint:
-            x, y, state = event.window.get_pointer()
+            pointer = event.get_window().get_pointer()
+            x = pointer.x
+            y = pointer.y
         else:
-            x = long(event.x)
-            y = long(event.y)
-            state = event.state
+            x = int(event.x)
+            y = int(event.y)
         t = tv.get_path_at_pos(x, y)
         if t is not None:
             path, col, cx, cy = t
@@ -191,22 +232,22 @@ class AnnotationTable(AdhocView):
             if self.mouseover_annotation != ann:
                 # Update
                 if self.mouseover_annotation is not None:
-                    self.controller.notify('BookmarkUnhighlight', timestamp=self.mouseover_annotation.fragment.begin, immediate=True)
-                self.controller.notify('BookmarkHighlight', timestamp=ann.fragment.begin, immediate=True)
+                    self.controller.notify('BookmarkUnhighlight', timestamp=self.mouseover_annotation.fragment.begin, media=self.mouseover_annotation.media, immediate=True)
+                self.controller.notify('BookmarkHighlight', timestamp=ann.fragment.begin, media=ann.media, immediate=True)
                 self.mouseover_annotation = ann
         return False
 
     def leave_notify_event_cb(self, tv, event):
         if self.mouseover_annotation is not None:
-            self.controller.notify('BookmarkUnhighlight', timestamp=self.mouseover_annotation.fragment.begin, immediate=True)
+            self.controller.notify('BookmarkUnhighlight', timestamp=self.mouseover_annotation.fragment.begin, media=self.mouseover_annotation.media, immediate=True)
             self.mouseover_annotation = None
         return False
 
     def build_widget(self):
-        tree_view = gtk.TreeView(self.model)
+        tree_view = Gtk.TreeView(self.model)
 
         select = tree_view.get_selection()
-        select.set_mode(gtk.SELECTION_MULTIPLE)
+        select.set_mode(Gtk.SelectionMode.MULTIPLE)
 
         tree_view.connect('button-press-event', self.tree_view_button_cb)
         tree_view.connect('key-press-event', self.tree_view_key_cb)
@@ -224,7 +265,7 @@ class AnnotationTable(AdhocView):
 
         columns={}
 
-        columns['snapshot']=gtk.TreeViewColumn(_("Snapshot"), gtk.CellRendererPixbuf(), pixbuf=COLUMN_PIXBUF)
+        columns['snapshot']=Gtk.TreeViewColumn(_("Snapshot"), Gtk.CellRendererPixbuf(), pixbuf=COLUMN_PIXBUF)
         columns['snapshot'].set_reorderable(True)
         tree_view.append_column(columns['snapshot'])
 
@@ -234,28 +275,51 @@ class AnnotationTable(AdhocView):
                 return
             a = self.model.get_value (it, COLUMN_ELEMENT)
             new_content = helper.title2content(text,
-                                               a.content.data,
+                                               a.content,
                                                a.type.getMetaData(config.data.namespace, "representation"))
             if new_content is None:
                 self.log(_("Cannot update the annotation, its representation is too complex"))
             elif a.content.data != new_content:
-                self.last_edited_path = path_string
+                self.last_edited_path = Gtk.TreePath.new_from_string(path_string)
                 self.controller.notify('EditSessionStart', element=a)
                 a.content.data = new_content
                 self.controller.notify('AnnotationEditEnd', annotation=a)
                 self.controller.notify('EditSessionEnd', element=a)
             return True
 
+        def validate_entry_on_focus_out(widget, event, cell, path):
+            cell.emit("edited", path, widget.get_text())
+            return True
+
+        def entry_editing_started(cell, editable, path):
+            if isinstance(editable, Gtk.Entry):
+                completion = Gtk.EntryCompletion()
+                it = self.model.get_iter_from_string(path)
+                if not it:
+                    return
+                el = self.model.get_value(it, COLUMN_ELEMENT)
+                # Build the completion list
+                store = Gtk.ListStore(str)
+                for c in self.controller.package._indexer.get_completions("", context=el):
+                    store.append([ c ])
+                completion.set_model(store)
+                completion.set_text_column(0)
+                editable.set_completion(completion)
+                editable.connect('focus-out-event', validate_entry_on_focus_out, cell, path)
+
         for (name, label, col) in (
-            ('content', _("Content"), COLUMN_CONTENT),
-            ('type', _("Type"), COLUMN_TYPE),
-            ('begin', _("Begin"), COLUMN_BEGIN_FORMATTED),
-            ('end', _("End"), COLUMN_END_FORMATTED),
-            ('duration', _("Duration"), COLUMN_DURATION),
-            ('id', _("Id"), COLUMN_ID) ):
-            renderer = gtk.CellRendererText()
-            columns[name]=gtk.TreeViewColumn(label, renderer, text=col)
+                ('content', _("Content"), COLUMN_CONTENT),
+                ('type', _("Type"), COLUMN_TYPE),
+                ('begin', _("Begin"), COLUMN_BEGIN_FORMATTED),
+                ('end', _("End"), COLUMN_END_FORMATTED),
+                ('duration', _("Duration"), COLUMN_DURATION),
+                ('id', _("Id"), COLUMN_ID),
+                ('package', _("Package"), COLUMN_SOURCE_PACKAGE)
+        ):
+            renderer = Gtk.CellRendererText()
+            columns[name]=Gtk.TreeViewColumn(label, renderer, text=col)
             if name == 'content':
+                renderer.connect('editing-started', entry_editing_started)
                 renderer.connect('edited', cell_edited)
                 renderer.props.editable = True
 
@@ -266,29 +330,29 @@ class AnnotationTable(AdhocView):
         # Column-specific settings
         columns['begin'].set_sort_column_id(COLUMN_BEGIN)
         columns['end'].set_sort_column_id(COLUMN_END)
-        self.model.set_sort_column_id(COLUMN_BEGIN, gtk.SORT_ASCENDING)
-        columns['type'].add_attribute(columns['type'].get_cell_renderers()[0],
+        self.model.set_sort_column_id(COLUMN_BEGIN, Gtk.SortType.ASCENDING)
+        columns['type'].add_attribute(columns['type'].get_cells()[0],
                                       'cell-background',
                                       COLUMN_COLOR)
 
         # Resizable columns: content, type
         for name in ('content', 'type', 'snapshot'):
-            columns[name].set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+            columns[name].set_sizing(Gtk.TreeViewColumnSizing.FIXED)
             columns[name].set_resizable(True)
             columns[name].set_min_width(40)
         columns['content'].set_expand(True)
+        columns['content'].set_max_width(800)
 
         # Allow user classes to tweak behaviour
         self.columns = columns
 
         # Drag and drop for annotations
-        tree_view.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                                  config.data.drag_type['annotation']
-                                  + config.data.drag_type['text-plain']
-                                  + config.data.drag_type['TEXT']
-                                  + config.data.drag_type['STRING']
-                                  ,
-                                  gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
+        tree_view.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                                  config.data.get_target_types('annotation',
+                                                               'text-plain',
+                                                               'TEXT',
+                                                               'STRING'),
+                                  Gdk.DragAction.LINK | Gdk.DragAction.COPY | Gdk.DragAction.MOVE)
 
         def get_element():
             selection = tree_view.get_selection ()
@@ -311,32 +375,31 @@ class AnnotationTable(AdhocView):
         def drag_received_cb(widget, context, x, y, selection, targetType, time):
             """Handle the drop of an annotation type.
             """
-            if context.get_source_widget().is_ancestor(self.widget):
+            if Gtk.drag_get_source_widget(context).is_ancestor(self.widget):
                 # Ignore drops from our own widget
                 return False
 
             if targetType == config.data.target_type['annotation']:
-                sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+                sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
                 if sources:
                     self.set_elements(sources)
                 return True
             elif targetType == config.data.target_type['annotation-type']:
-                sources=[ self.controller.package.annotationTypes.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+                sources=[ self.controller.package.annotationTypes.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
                 if sources:
                     self.set_elements(sources[0].annotations)
                 return True
             return False
 
         tree_view.connect('drag-data-received', drag_received_cb)
-        tree_view.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                        gtk.DEST_DEFAULT_HIGHLIGHT |
-                        gtk.DEST_DEFAULT_ALL,
-                        config.data.drag_type['annotation'] +
-                        config.data.drag_type['annotation-type'],
-                        gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_MOVE)
-
-        sw = gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        tree_view.drag_dest_set(Gtk.DestDefaults.MOTION |
+                        Gtk.DestDefaults.HIGHLIGHT |
+                        Gtk.DestDefaults.ALL,
+                        config.data.get_target_types('annotation', 'annotation-type'),
+                        Gdk.DragAction.COPY | Gdk.DragAction.LINK | Gdk.DragAction.MOVE)
+
+        sw = Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         sw.add(tree_view)
 
         sw.treeview = tree_view
@@ -349,50 +412,60 @@ class AnnotationTable(AdhocView):
         els=[ model[p][COLUMN_ELEMENT] for p in paths ]
 
         if targetType == config.data.target_type['annotation']:
-            selection.set(selection.target, 8, "\n".join( e.uri.encode('utf8')
+            selection.set(selection.get_target(), 8, "\n".join( e.uri.encode('utf8')
                                                           for e in els
                                                           if isinstance(e, Annotation) ))
             return True
         elif (targetType == config.data.target_type['text-plain']
               or targetType == config.data.target_type['TEXT']
               or targetType == config.data.target_type['STRING']):
-            selection.set(selection.target, 8, "\n".join(e.content.data.encode('utf8')
+            selection.set(selection.get_target(), 8, "\n".join(e.content.data.encode('utf8')
                                                           for e in els
                                                           if isinstance(e, Annotation) ))
         else:
-            print "Unknown target type for drag: %d" % targetType
+            logger.warn("Unknown target type for drag: %d" % targetType)
         return True
 
-    def get_selected_nodes (self):
+    def get_selected_nodes(self, with_path=False):
+        """Return the currently selected nodes.
+        """
+        selection = self.widget.treeview.get_selection()
+        store, paths = selection.get_selected_rows()
+        if with_path:
+            return [ (store.get_value(store.get_iter(p), COLUMN_ELEMENT), p) for p in paths ]
+        else:
+            return [ store.get_value(store.get_iter(p), COLUMN_ELEMENT) for p in paths ]
+
+    def get_selected_node(self, with_path=False):
         """Return the currently selected node.
 
         None if no node is selected or multiple nodes are selected.
         """
-        selection = self.widget.treeview.get_selection ()
-        store, paths=selection.get_selected_rows()
-        return [ store.get_value (store.get_iter(p), COLUMN_ELEMENT) for p in paths ]
+        nodes = self.get_selected_nodes(with_path)
+        if len(nodes) != 1:
+            return None
+        else:
+            return nodes[0]
 
     def debug_cb (self, *p, **kw):
-        print "Debug cb:\n"
-        print "Parameters: %s" % str(p)
-        print "KW: %s" % str(kw)
+        logger.debug("Parameters: %s\nkw: %s", str(p), str(kw))
 
     def csv_export(self, name=None):
         if name is None:
             name=dialog.get_filename(title=_("Export data to file..."),
                                               default_file="advene_data.csv",
-                                              action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                              button=gtk.STOCK_SAVE)
+                                              action=Gtk.FileChooserAction.SAVE,
+                                              button=Gtk.STOCK_SAVE)
         if name is None:
             return True
         try:
-            f=open(name, 'w')
-        except IOError, e:
+            f=open(name, 'w', encoding='utf-8')
+        except IOError as e:
             dialog.message_dialog(label=_("Error while exporting data to %(filename)s: %(error)s"
                                           % {
                         'filename': name,
-                        'error': unicode(e),
-                        }), icon=gtk.MESSAGE_ERROR)
+                        'error': str(e),
+                        }), icon=Gtk.MessageType.ERROR)
         w=csv.writer(f)
         tv=self.widget.treeview
         store, paths=tv.get_selection().get_selected_rows()
@@ -401,35 +474,60 @@ class AnnotationTable(AdhocView):
             source=tv.get_model()
         w.writerow( (_("id"), _("type"), _("begin"), _("end"), _("content")) )
         for r in source:
-            w.writerow( (r[COLUMN_ID], unicode(r[COLUMN_TYPE]).encode('utf-8'), r[COLUMN_BEGIN], r[COLUMN_END], unicode(r[COLUMN_ELEMENT].content.data).encode('utf-8') ) )
+            w.writerow( (r[COLUMN_ID], str(r[COLUMN_TYPE]).encode('utf-8'), r[COLUMN_BEGIN], r[COLUMN_END], str(r[COLUMN_ELEMENT].content.data).encode('utf-8') ) )
         f.close()
         self.log(_("Data exported to %s") % name)
 
     def row_activated_cb(self, widget, path, view_column):
         """Edit the element on Return or double click
         """
-        nodes = self.get_selected_nodes ()
-        if len(nodes) != 1:
-            return True
-        node=nodes[0]
-        if node is not None:
-            self.controller.gui.edit_element(node)
+        ann = self.get_selected_node ()
+        if ann is not None:
+            self.controller.gui.edit_element(ann)
             return True
         return False
 
+    def set_time(self, attr):
+        """Sets the time of the current annotation to the current player time.
+        """
+        an, an_path = self.get_selected_node(with_path=True)
+        if an is None:
+            return
+        current_time = self.controller.player.current_position_value
+        confirm = True
+        if self.options['confirm-time-update']:
+            confirm = dialog.message_dialog(_("Set %(attr)s time to %(time)s") % {
+                'attr': _(attr),
+                'time': helper.format_time(current_time)
+                }, icon=Gtk.MessageType.QUESTION)
+        if confirm:
+            self.last_edited_path = an_path
+            self.controller.notify('EditSessionStart', element=an, immediate=True)
+            setattr(an.fragment, attr, current_time)
+            self.controller.notify("AnnotationEditEnd", annotation=an)
+            self.controller.notify('EditSessionEnd', element=an)
+
+
     def tree_view_key_cb(self, widget=None, event=None):
-        if event.keyval == gtk.keysyms.Return and event.state & gtk.gdk.CONTROL_MASK:
-            # Control-return: goto annotation
-            nodes = self.get_selected_nodes ()
-            if len(nodes) == 1 and nodes[0] is not None:
-                ann = nodes[0]
-                self.controller.update_status (status="set", position=ann.fragment.begin)
+        if event.keyval == Gdk.KEY_space or (event.keyval == Gdk.KEY_Return and event.get_state() & Gdk.ModifierType.CONTROL_MASK):
+            # Space or Control-return: goto annotation
+            ann = self.get_selected_node ()
+            if ann is not None:
+                self.controller.update_status (status="seek", position=ann.fragment.begin)
                 self.controller.gui.set_current_annotation(ann)
                 return True
+        elif event.keyval == Gdk.KEY_less and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
+            # Control-< : set begin time
+            self.set_time('begin')
+            return True
+        elif event.keyval == Gdk.KEY_greater and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
+            # Control-> : set end time
+            self.set_time('end')
+            return True
         return False
 
     def tree_view_button_cb(self, widget=None, event=None):
-        if not event.window is widget.get_bin_window():
+        if not event.get_window() is widget.get_bin_window():
             return False
 
         retval = False
@@ -461,18 +559,42 @@ class GenericTable(AdhocView):
     view_id = 'generictable'
     tooltip=_("Display Advene elements in a table.")
 
-    def __init__(self, controller=None, parameters=None, elements=None):
+    def __init__(self, controller=None, parameters=None, elements=None, source=None):
         super(GenericTable, self).__init__(controller=controller)
         self.close_on_package_load = False
-        self.contextual_actions = (
-            )
+        self.contextual_actions = ()
         self.controller=controller
         self.elements=elements
-        self.options={}
+        self.source = source
+        self.options = { }
+
+        opt, arg = self.load_parameters(parameters)
+        self.options.update(opt)
+        a=dict(arg)
+        if source is None and 'source' in a:
+            source=a['source']
+
+        if elements is None and source:
+            c=self.controller.build_context()
+            try:
+                elements = c.evaluateValue(source)
+                self.source = source
+            except Exception as e:
+                self.log(_("Error in source evaluation %(source)s: %(error)s") % {
+                    'source': self.source,
+                    'error': str(e) })
+                elements = []
 
         self.model=self.build_model(elements)
         self.widget = self.build_widget()
 
+    def get_save_arguments(self):
+        if self.source is not None:
+            arguments = [ ('source', self.source) ]
+        else:
+            arguments = []
+        return self.options, arguments
+
     def get_elements(self):
         """Return the list of elements in their displayed order.
 
@@ -496,7 +618,7 @@ class GenericTable(AdhocView):
 
         Columns: element, content (title), type, id
         """
-        l=gtk.ListStore(object, str, str, str)
+        l=Gtk.ListStore(object, str, str, str)
         if not elements:
             return l
         for e in elements:
@@ -510,19 +632,19 @@ class GenericTable(AdhocView):
         if name is None:
             name=dialog.get_filename(title=_("Export data to file..."),
                                               default_file="advene_data.csv",
-                                              action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                              button=gtk.STOCK_SAVE)
+                                              action=Gtk.FileChooserAction.SAVE,
+                                              button=Gtk.STOCK_SAVE)
         if name is None:
             return True
         try:
-            f=open(name, 'w')
-        except IOError, e:
+            f=open(name, 'w', encoding='utf-8')
+        except IOError as e:
             dialog.message_dialog(label=_("Error while exporting data to %(filename)s: %(error)s"
                                           % {
                         'filename': name,
-                        'error': unicode(e),
+                        'error': str(e),
                         }),
-                                  icon=gtk.MESSAGE_ERROR)
+                                  icon=Gtk.MessageType.ERROR)
         w=csv.writer(f)
         tv=self.widget.treeview
         store, paths=tv.get_selection().get_selected_rows()
@@ -531,18 +653,20 @@ class GenericTable(AdhocView):
             source=tv.get_model()
         w.writerow( (_("Element title"), _("Element type"), _("Element id")) )
         for r in source:
-            w.writerow( (unicode(r[COLUMN_CONTENT]).encode('utf-8'), unicode(r[COLUMN_TYPE]).encode('utf-8'), r[COLUMN_ID]) )
+            w.writerow( (str(r[COLUMN_CONTENT]).encode('utf-8'), str(r[COLUMN_TYPE]).encode('utf-8'), r[COLUMN_ID]) )
         f.close()
         self.log(_("Data exported to %s") % name)
 
     def build_widget(self):
-        tree_view = gtk.TreeView(self.model)
+        tree_view = Gtk.TreeView(self.model)
 
         select = tree_view.get_selection()
-        select.set_mode(gtk.SELECTION_MULTIPLE)
+        select.set_mode(Gtk.SelectionMode.MULTIPLE)
 
         tree_view.connect('button-press-event', self.tree_view_button_cb)
         tree_view.connect('row-activated', self.row_activated_cb)
+        # Deactivate starting search by simply typing. Users have to use the search shortcut (Control-F)
+        tree_view.set_enable_search(False)
         #tree_view.set_search_column(COLUMN_CONTENT)
 
         def search_content(model, column, key, it):
@@ -557,22 +681,22 @@ class GenericTable(AdhocView):
             ('title', _("Title"), COLUMN_CONTENT),
             ('type', _("Type"), COLUMN_TYPE),
             ('id', _("Id"), COLUMN_ID) ):
-            columns[name]=gtk.TreeViewColumn(label, gtk.CellRendererText(), text=col)
+            columns[name]=Gtk.TreeViewColumn(label, Gtk.CellRendererText(), text=col)
             columns[name].set_reorderable(True)
             columns[name].set_sort_column_id(col)
             tree_view.append_column(columns[name])
 
-        self.model.set_sort_column_id(COLUMN_CONTENT, gtk.SORT_ASCENDING)
+        self.model.set_sort_column_id(COLUMN_CONTENT, Gtk.SortType.ASCENDING)
 
         # Resizable columns: title, type
         for name in ('title', 'type'):
-            columns[name].set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+            columns[name].set_sizing(Gtk.TreeViewColumnSizing.FIXED)
             columns[name].set_resizable(True)
             columns[name].set_min_width(40)
         columns['title'].set_expand(True)
 
-        sw = gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+        sw = Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
         sw.add(tree_view)
 
         sw.treeview = tree_view
@@ -581,54 +705,61 @@ class GenericTable(AdhocView):
         def drag_received_cb(widget, context, x, y, selection, targetType, time):
             """Handle the drop of an annotation type.
             """
-            if context.get_source_widget().is_ancestor(self.widget):
+            if Gtk.drag_get_source_widget(context).is_ancestor(self.widget):
                 # Ignore drops from our own widget
                 return False
 
             if targetType == config.data.target_type['annotation']:
-                sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+                sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
                 if sources:
                     self.set_elements(sources)
                 return True
             elif targetType == config.data.target_type['annotation-type']:
-                sources=[ self.controller.package.annotationTypes.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+                sources=[ self.controller.package.annotationTypes.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
                 if sources:
                     self.set_elements(sources[0].annotations)
                 return True
             return False
 
         tree_view.connect('drag-data-received', drag_received_cb)
-        tree_view.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                        gtk.DEST_DEFAULT_HIGHLIGHT |
-                        gtk.DEST_DEFAULT_ALL,
-                        config.data.drag_type['annotation'] +
-                        config.data.drag_type['annotation-type'],
-                        gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_MOVE)
+        tree_view.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                Gtk.DestDefaults.HIGHLIGHT |
+                                Gtk.DestDefaults.ALL,
+                                config.data.get_target_types('annotation', 'annotation-type'),
+                                Gdk.DragAction.COPY | Gdk.DragAction.LINK | Gdk.DragAction.MOVE)
 
         return sw
 
-    def get_selected_nodes (self):
+    def get_selected_nodes(self, with_path=False):
+        """Return the currently selected nodes.
+        """
+        selection = self.widget.treeview.get_selection()
+        store, paths = selection.get_selected_rows()
+        if with_path:
+            return [ (store.get_value(store.get_iter(p), COLUMN_ELEMENT), p) for p in paths ]
+        else:
+            return [ store.get_value(store.get_iter(p), COLUMN_ELEMENT) for p in paths ]
+
+    def get_selected_node(self, with_path=False):
         """Return the currently selected node.
 
         None if no node is selected or multiple nodes are selected.
         """
-        selection = self.widget.treeview.get_selection ()
-        store, paths=selection.get_selected_rows()
-        return [ store.get_value (store.get_iter(p), COLUMN_ELEMENT) for p in paths ]
+        nodes = self.get_selected_nodes(with_path)
+        if len(nodes) != 1:
+            return None
+        else:
+            return nodes[0]
 
     def debug_cb (self, *p, **kw):
-        print "Debug cb:\n"
-        print "Parameters: %s" % str(p)
-        print "KW: %s" % str(kw)
+        logger.debug("Parameters: %s\nkw: %s", str(p), str(kw))
 
     def row_activated_cb(self, widget, path, view_column):
         """Edit the element on Return or double click
         """
-        nodes = self.get_selected_nodes ()
-        if len(nodes) != 1:
-            return True
-        if nodes[0] is not None:
-            self.controller.gui.edit_element(nodes[0])
+        el = self.get_selected_node ()
+        if el  is not None:
+            self.controller.gui.edit_element(el)
             return True
         return False
 
@@ -639,7 +770,7 @@ class GenericTable(AdhocView):
         y = int(event.y)
 
         if button == 3 or button == 2:
-            if event.window is widget.get_bin_window():
+            if event.get_window() is widget.get_bin_window():
                 model = self.model
                 t = widget.get_path_at_pos(x, y)
                 if t is not None:
diff --git a/lib/advene/gui/views/tagbag.py b/lib/advene/gui/views/tagbag.py
index 90ee04a..3d9d02c 100644
--- a/lib/advene/gui/views/tagbag.py
+++ b/lib/advene/gui/views/tagbag.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -29,6 +29,8 @@ Dragging a tag to an annotation with add the tag to the annotation's tag.
 Dragging an annotation to the tag bag will add the annotation tags to
 the presented list of tags.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 # Advene part
 import advene.core.config as config
@@ -39,7 +41,8 @@ from advene.gui.util import dialog, get_small_stock_button, name2color
 from gettext import gettext as _
 
 import re
-import gtk
+from gi.repository import Gdk
+from gi.repository import Gtk
 
 from advene.gui.widget import TagWidget
 
@@ -119,27 +122,27 @@ class TagBag(AdhocView):
     def new_tag(self, *p):
         """Enter a new tag.
         """
-        d = gtk.Dialog(title=_("New tag name"),
-                       parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-                                 gtk.STOCK_OK, gtk.RESPONSE_OK,
+        d = Gtk.Dialog(title=_("New tag name"),
+                       parent=self.controller.gui.gui.win,
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
+                                 Gtk.STOCK_OK, Gtk.ResponseType.OK,
                                  ))
-        l=gtk.Label(_("Enter a new tag name and select its color."))
-        d.vbox.pack_start(l, expand=False)
-
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Name")), expand=False)
-        tagname=gtk.Entry()
-        hb.pack_start(tagname, expand=False)
-        d.vbox.pack_start(hb, expand=False)
-
-        hb=gtk.HBox()
-        hb.pack_start(gtk.Label(_("Color")), expand=False)
-        colorbutton=gtk.ColorButton()
-        colorbutton.set_color(gtk.gdk.color_parse('red'))
-        hb.pack_start(colorbutton, expand=False)
-        d.vbox.pack_start(hb, expand=False)
+        l=Gtk.Label(label=_("Enter a new tag name and select its color."))
+        d.vbox.pack_start(l, False, True, 0)
+
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Name")), False, False, 0)
+        tagname=Gtk.Entry()
+        hb.pack_start(tagname, False, True, 0)
+        d.vbox.pack_start(hb, False, True, 0)
+
+        hb=Gtk.HBox()
+        hb.pack_start(Gtk.Label(_("Color")), False, False, 0)
+        colorbutton=Gtk.ColorButton()
+        colorbutton.set_color(Gdk.color_parse('red'))
+        hb.pack_start(colorbutton, False, True, 0)
+        d.vbox.pack_start(hb, False, True, 0)
 
         d.connect('key-press-event', dialog.dialog_keypressed_cb)
         d.show_all()
@@ -147,9 +150,9 @@ class TagBag(AdhocView):
 
         res=d.run()
         ret=None
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             try:
-                tag=unicode(tagname.get_text())
+                tag=tagname.get_text()
             except ValueError:
                 tag=None
             color=colorbutton.get_color()
@@ -160,7 +163,7 @@ class TagBag(AdhocView):
         if tag and not tag in self.tags:
             if not re.match('^[\w\d_]+$', tag):
                 dialog.message_dialog(_("The tag contains invalid characters"),
-                                               icon=gtk.MESSAGE_ERROR)
+                                               icon=Gtk.MessageType.ERROR)
                 return True
             self.tags.append(tag)
             self.controller.package._tag_colors[tag]="#%04x%04x%04x" % (color.red, color.green, color.blue)
@@ -222,17 +225,17 @@ class TagBag(AdhocView):
             return True
 
         def set_color(widget, tag):
-            d=gtk.ColorSelectionDialog(_("Choose the color for tag %s") % tag)
+            d=Gtk.ColorSelectionDialog(_("Choose the color for tag %s") % tag)
             try:
                 color=self.get_element_color(tag)
                 if color:
-                    d.colorsel.set_current_color(color)
+                    d.get_color_selection().set_current_color(color)
             except:
                 pass
 
             res=d.run()
-            if res == gtk.RESPONSE_OK:
-                col=d.colorsel.get_current_color()
+            if res == Gtk.ResponseType.OK:
+                col=d.get_color_selection().get_current_color()
                 self.controller.package._tag_colors[tag]="#%04x%04x%04x" % (col.red, col.green, col.blue)
                 self.controller.notify('TagUpdate', tag=tag)
                 # The color setting of the widget is done in the callback for TagUpdate
@@ -240,108 +243,108 @@ class TagBag(AdhocView):
             return True
 
         def popup_menu(widget, event):
-            if not (event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS):
+            if not (event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS):
                 return False
 
-            menu=gtk.Menu()
+            menu=Gtk.Menu()
 
             for label, action in (
                 (_("Set color"), set_color),
                 (_("Remove"), remove)
                 ):
-                item = gtk.MenuItem(label, use_underline=False)
+                item = Gtk.MenuItem(label, use_underline=False)
                 item.connect('activate', action, t)
                 menu.append(item)
             menu.show_all()
-            menu.popup(None, None, None, 0, gtk.get_current_event_time())
+            menu.popup_at_pointer(None)
             return True
 
-        b.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                          config.data.drag_type['tag'],
-                          gtk.gdk.ACTION_LINK)
+        b.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                          config.data.get_target_types('tag'),
+                          Gdk.DragAction.LINK)
 
         b.connect('button-press-event', popup_menu)
         b.show()
-        self.mainbox.pack_start(b, expand=False)
+        self.mainbox.pack_start(b, False, True, 0)
 
     def build_widget(self):
 
         if self.vertical:
-            v=gtk.VBox()
-            mainbox=gtk.VBox()
+            v=Gtk.VBox()
+            mainbox=Gtk.VBox()
         else:
-            v=gtk.HBox()
-            mainbox=gtk.HBox()
+            v=Gtk.HBox()
+            mainbox=Gtk.HBox()
 
         mainbox.set_homogeneous(False)
-        sw=gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER)
+        sw=Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER)
         sw.add_with_viewport(mainbox)
         self.mainbox=mainbox
 
         def mainbox_drag_received(widget, context, x, y, selection, targetType, time):
             if targetType == config.data.target_type['annotation']:
-                sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+                sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
                 for a in sources:
                     for tag in a.tags:
                         if not tag in self.tags:
                             self.tags.append(tag)
                 self.refresh()
             elif targetType == config.data.target_type['tag']:
-                tags=unicode(selection.data, 'utf8').split(',')
+                tags=str(selection.get_data(), 'utf8').split(',')
                 for tag in tags:
                     if not tag in self.tags:
                         self.tags.append(tag)
                 self.refresh()
             else:
-                self.log("Unknown target type for mainbox drop: %d" % targetType)
+                logger.warn("Unknown target type for mainbox drop: %d" % targetType)
             return True
 
-        self.mainbox.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                  gtk.DEST_DEFAULT_HIGHLIGHT |
-                                  gtk.DEST_DEFAULT_ALL,
-                                  config.data.drag_type['annotation']
-                                  + config.data.drag_type['tag']
-                                   , gtk.gdk.ACTION_LINK)
+        self.mainbox.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                   Gtk.DestDefaults.HIGHLIGHT |
+                                   Gtk.DestDefaults.ALL,
+                                   config.data.get_target_types('annotation', 'tag'),
+                                   Gdk.DragAction.LINK)
         self.mainbox.connect('drag-data-received', mainbox_drag_received)
 
         def remove_drag_received(widget, context, x, y, selection, targetType, time):
             if targetType == config.data.target_type['tag']:
-                tag=unicode(selection.data, 'utf8')
+                tag=str(selection.get_data(), 'utf8')
                 if tag in self.tags:
                     self.tags.remove(tag)
                 self.refresh()
             else:
-                self.log("Unknown target type for remove drop: %d" % targetType)
+                logger.warn("Unknown target type for remove drop: %d" % targetType)
             return True
 
 
-        hb=gtk.HBox()
+        hb=Gtk.HBox()
         hb.set_homogeneous(False)
 
-        b=get_small_stock_button(gtk.STOCK_DELETE)
+        b=get_small_stock_button(Gtk.STOCK_DELETE)
 
         b.set_tooltip_text(_("Drop a tag here to remove it from the list"))
-        b.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                        gtk.DEST_DEFAULT_HIGHLIGHT |
-                        gtk.DEST_DEFAULT_ALL,
-                        config.data.drag_type['tag'], gtk.gdk.ACTION_LINK)
+        b.drag_dest_set(Gtk.DestDefaults.MOTION |
+                        Gtk.DestDefaults.HIGHLIGHT |
+                        Gtk.DestDefaults.ALL,
+                        config.data.get_target_types('tag'),
+                        Gdk.DragAction.LINK)
         b.connect('drag-data-received', remove_drag_received)
-        hb.pack_start(b, expand=False)
+        hb.pack_start(b, False, True, 0)
 
         for (stock, tip, method) in (
-            (gtk.STOCK_SAVE, _("Save as adhoc view"), self.save_view),
-            (gtk.STOCK_ADD, _("Add a new tag"), self.new_tag),
-            (gtk.STOCK_INDEX, _("Display all defined tags"), self.all_tags),
+            (Gtk.STOCK_SAVE, _("Save as adhoc view"), self.save_view),
+            (Gtk.STOCK_ADD, _("Add a new tag"), self.new_tag),
+            (Gtk.STOCK_INDEX, _("Display all defined tags"), self.all_tags),
             ):
             b=get_small_stock_button(stock)
             b.set_tooltip_text(tip)
             b.connect('clicked', method)
-            hb.pack_start(b, expand=False)
+            hb.pack_start(b, False, True, 0)
 
         v.buttonbox=hb
 
-        v.pack_start(hb, expand=False)
+        v.pack_start(hb, False, True, 0)
         v.add(sw)
 
         return v
diff --git a/lib/advene/gui/views/timeline.py b/lib/advene/gui/views/timeline.py
index 099da67..f813857 100755
--- a/lib/advene/gui/views/timeline.py
+++ b/lib/advene/gui/views/timeline.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,17 +16,22 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-import sys
-import re
+import logging
+logger = logging.getLogger(__name__)
+
+from gettext import gettext as _
 import operator
-import urllib
+import re
+import sys
 import struct
-import gobject
-import gtk
-import cairo
-import pango
-from gettext import gettext as _
 from threading import Lock
+import urllib.request, urllib.parse, urllib.error
+
+from gi.repository import GObject
+from gi.repository import Gdk
+from gi.repository import Gtk
+import cairo
+from gi.repository import Pango
 
 # Advene part
 import advene.core.config as config
@@ -41,27 +46,27 @@ from advene.gui.util import decode_drop_parameters
 from advene.gui.views.annotationdisplay import AnnotationDisplay
 import advene.util.helper as helper
 from advene.gui.util import dialog, name2color, get_small_stock_button, get_pixmap_button, get_pixmap_toolbutton
-from advene.gui.widget import AnnotationWidget, AnnotationTypeWidget, GenericColorButtonWidget
+from advene.gui.widget import AnnotationWidget, AnnotationTypeWidget
 
 name="Timeline view plugin"
 
 def register(controller):
     controller.register_viewclass(TimeLine)
 
-class QuickviewBar(gtk.HBox):
+class QuickviewBar(Gtk.HBox):
     def __init__(self, controller=None):
-        gtk.HBox.__init__(self)
+        GObject.GObject.__init__(self)
         self.controller=controller
-        self.begin=gtk.Label()
-        self.end=gtk.Label()
-        self.content=gtk.ProgressBar()
-        self.content.set_ellipsize(pango.ELLIPSIZE_MIDDLE)
+        self.begin=Gtk.Label()
+        self.end=Gtk.Label()
+        self.content=Gtk.ProgressBar()
+        self.content.set_ellipsize(Pango.EllipsizeMode.MIDDLE)
 
         self.annotation=None
 
-        self.pack_start(self.content, expand=True)
-        self.pack_start(self.begin, expand=False)
-        self.pack_start(self.end, expand=False)
+        self.pack_start(self.content, True, True, 0)
+        self.pack_start(self.begin, False, True, 0)
+        self.pack_start(self.end, False, True, 0)
 
     def set_text(self, s, progress=0):
         self.begin.set_text("")
@@ -74,7 +79,7 @@ class QuickviewBar(gtk.HBox):
             b=""
             e=""
             c=""
-        elif isinstance(a, long) or isinstance(a, int):
+        elif isinstance(a, int):
             # Only display a time
             b="   " + helper.format_time(a)
             e=""
@@ -102,8 +107,8 @@ class QuickviewBar(gtk.HBox):
 class TimeLine(AdhocView):
     """Representation of a set of annotations placed on a timeline.
 
-    If l is None, then use controller.package.annotations (and handle
-    updates accordingly).
+    If elements is None, then use controller.package.annotations (and
+    handle updates accordingly).
 
     There are 2 adjustments used to adjust the display scale:
 
@@ -134,8 +139,8 @@ class TimeLine(AdhocView):
             (_("Refresh"), self.refresh),
             (_("Save view"), self.save_view),
             (_("Save default options"), self.save_default_options),
-            (_("Limit display to current area"), lambda i, b: self.limit_display()),
-            (_("Display whole movie"), lambda i, b: self.unlimit_display()),
+            (_("Limit display to current area"), self.limit_display),
+            (_("Display whole movie"), self.unlimit_display),
             )
         self.options = {
             'highlight': False,
@@ -157,7 +162,7 @@ class TimeLine(AdhocView):
         # Default position in ms.
         default_position=None
         default_zoom=1.0
-        pane_position=opt.get('pane-position', None)
+        inspector_width = opt.get('inspector-width', None)
         for n, v in arg:
             if n == 'annotation-type':
                 at=helper.get_id(self.controller.package.annotationTypes,
@@ -170,27 +175,39 @@ class TimeLine(AdhocView):
                 c=self.controller.build_context()
                 # Override a potentially existing value of elements
                 elements=c.evaluateValue(v)
+            elif n == 'element':
+                # Add to potential list of elements
+                a = self.controller.package.get_element_by_id(v)
+                if a is not None:
+                    if elements is None:
+                        elements = []
+                    elements.append(a)
             elif n == 'position':
                 default_position=int(float(v))
             elif n == 'zoom':
                 default_zoom=float(v)
             elif n == 'minimum':
-                minimum=long(v)
+                minimum=int(v)
             elif n == 'maximum':
-                maximum=long(v)
+                maximum=int(v)
         if ats:
             annotationtypes=ats
 
+        if not annotationtypes:
+            annotationtypes = list(self.controller.package.annotationTypes)
         self.list = elements
+        if len(annotationtypes or []) != len(self.controller.package.annotationTypes):
+            # Selected annotation types (else we would use all package's types)
+            self.annotationtypes_selection = annotationtypes
+        else:
+            self.annotationtypes_selection = None
         self.annotationtypes = annotationtypes
 
         # package used when the update_model has been called from
         # __init__. This is used to avoid a double initialization.
         self.package_from_init = None
 
-        self.current_marker = None
-        self.current_marker_scale = None
-        self.layout = gtk.Layout ()
+        self.layout = Gtk.Layout ()
 
         self.minimum = minimum
         self.maximum = maximum
@@ -202,7 +219,6 @@ class TimeLine(AdhocView):
 
         self.colors = {
             'active': name2color('#fdfd4b'),
-            'inactive': gtk.Button().get_style().bg[0],
             'background': name2color('red'),
             'white': name2color('white'),
             }
@@ -223,9 +239,9 @@ class TimeLine(AdhocView):
             callback=handle_autoscroll_combo)
 
         # Create annotation widget style:
-        self.annotation_font = pango.FontDescription("sans %d" % config.data.preferences['timeline']['font-size'])
+        self.annotation_font = Pango.FontDescription("sans %d" % config.data.preferences['timeline']['font-size'])
         self.annotation_type_font = self.annotation_font.copy()
-        self.annotation_type_font.set_style(pango.STYLE_ITALIC)
+        self.annotation_type_font.set_style(Pango.Style.ITALIC)
 
         # Maybe we should ask pango the height of 'l' plus margins
         self.button_height = config.data.preferences['timeline']['button-height']
@@ -234,22 +250,24 @@ class TimeLine(AdhocView):
         u2p = self.unit2pixel
 
         # How many units does a pixel represent ?
-        # self.scale.value = unit by pixel
+        # self.scale.get_value = unit by pixel
         # Unit = ms
-        self.scale = gtk.Adjustment (value=((self.maximum - self.minimum) or 60 * 60 * 1000) / gtk.gdk.get_default_root_window().get_size()[0],
-                                                lower=5,
-                                                upper=sys.maxint,
-                                                step_incr=20,
-                                                page_incr=100)
+        self.scale = Gtk.Adjustment.new(value=int(((self.maximum - self.minimum) or 60 * 60 * 1000) / Gdk.get_default_root_window().get_width()),
+                                        lower=5,
+                                        upper=sys.maxsize,
+                                        step_increment=20,
+                                        page_increment=100,
+                                        page_size=20)
         self.scale.connect('value-changed', self.scale_event)
         #self.scale.connect('changed', self.scale_event)
 
         # The same value in relative form
-        self.fraction_adj = gtk.Adjustment (value=1.0,
-                                            lower=0.01,
-                                            upper=1.0,
-                                            step_incr=.01,
-                                            page_incr=.1)
+        self.fraction_adj = Gtk.Adjustment.new(value=1.0,
+                                               lower=0.01,
+                                               upper=10.0,
+                                               step_increment=.01,
+                                               page_increment=.1,
+                                               page_size=.1)
         self.fraction_adj.connect('value-changed', self.fraction_event)
         self.fraction_adj.connect('changed', self.fraction_event)
 
@@ -262,20 +280,20 @@ class TimeLine(AdhocView):
         # accordingly.
         self.can_do_horizontal_scroll = False
 
-        self.layout.add_events( gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK | gtk.gdk.BUTTON1_MOTION_MASK )
-        self.scale_layout = gtk.Layout()
+        self.layout.add_events( Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.BUTTON1_MOTION_MASK )
+        self.scale_layout = Gtk.Layout()
         self.scale_layout.height=0
         self.scale_layout.step=0
-        self.scale_layout.add_events( gtk.gdk.BUTTON_PRESS_MASK )
+        self.scale_layout.add_events( Gdk.EventMask.BUTTON_PRESS_MASK )
 
         # Memorize the current scale height, so that we can refresh it
         # when it is changed by a given amount (typically 10 or 16
         # pixels)
         self.current_scale_height=0
-        # Global pane is the VPaned holding the scale and the layout.
+        # Global pane is the Paned holding the scale and the layout.
         self.global_pane=None
 
-        self.legend = gtk.Layout ()
+        self.legend = Gtk.Layout ()
 
         self.layout.connect('key-press-event', self.layout_key_press_cb)
         self.scale_layout.connect('key-press-event', self.layout_key_press_cb)
@@ -291,21 +309,19 @@ class TimeLine(AdhocView):
         self.scale_layout.connect('button-press-event', self.scale_layout_button_press_cb)
 
         self.layout.connect('size-allocate', self.layout_resize_event)
-        self.layout.connect('expose-event', self.draw_background)
-        self.layout.connect_after('expose-event', self.draw_relation_lines)
-        self.scale_layout.connect_after('expose-event', self.draw_bookmarks)
+        self.layout.connect('draw', self.draw_background)
+        self.layout.connect_after('draw', self.overlay_layout)
+        self.scale_layout.connect_after('draw', self.overlay_scale_layout)
 
         # The layout can receive drops
         self.layout.connect('drag-data-received', self.layout_drag_received)
-        self.layout.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                  gtk.DEST_DEFAULT_HIGHLIGHT |
-                                  gtk.DEST_DEFAULT_ALL,
-                                  config.data.drag_type['annotation']
-                                  + config.data.drag_type['annotation-type']
-                                  + config.data.drag_type['timestamp'],
-                                  gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_MOVE | gtk.gdk.ACTION_ASK )
+        self.layout.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                  Gtk.DestDefaults.HIGHLIGHT |
+                                  Gtk.DestDefaults.ALL,
+                                  config.data.get_target_types('annotation', 'annotation-type', 'timestamp'),
+                                  Gdk.DragAction.COPY | Gdk.DragAction.LINK | Gdk.DragAction.MOVE | Gdk.DragAction.ASK )
 
-        self.old_scale_value = self.scale.value
+        self.old_scale_value = self.scale.get_value()
 
         # Lines to draw in order to indicate related annotations
         self.relations_to_draw = []
@@ -319,66 +335,141 @@ class TimeLine(AdhocView):
         self.transmuted_annotation = None
         # Adjustment corresponding to the Virtual display
         # The page_size is the really displayed area
-        self.adjustment = gtk.Adjustment ()
+        self.adjustment = Gtk.Adjustment()
 
         # Dictionary holding the vertical position for each type
         self.layer_position = {}
-        self.draw_current_mark()
         self.widget = self.get_full_widget()
 
         # Set default parameters (zoom) and refresh the legend widget
         # on the first expose signal
-        def set_default_parameters(widget, event, zoom, pos, pane):
-            self.update_adjustment ()
-            self.adjustment.set_value(u2p(self.minimum, absolute=True))
-            self.fraction_adj.value=zoom
-            if pos >= self.minimum and pos <= self.maximum:
-                self.adjustment.set_value(u2p(pos, absolute=True))
+        def set_default_parameters(widget, event, default_zoom, pos, inspector_width):
+            logger.debug("set_default_parameters default zoom: %f  pos: %d inspector_width: %d", default_zoom or 0, pos or 0, inspector_width or 0)
+
             # Set annotation inspector width, so that it does not auto-resize
-            if pane is None:
-                w, h = self.widget.window.get_size()
-                pane=w - 160
-            self.inspector_pane.set_position(pane)
+            if inspector_width is None:
+                inspector_width = 160
+            self.set_inspector_size(inspector_width)
+
             # Check if display is limited
             if self.minimum > 0 and self.maximum < self.controller.package.cached_duration:
                 self.limit_navtools.show()
-            self.widget.disconnect(self.expose_signal)
+
+            self.update_adjustment ()
+            if pos >= self.minimum and pos <= self.maximum:
+                self.adjustment.set_value(u2p(pos, absolute=True))
+            else:
+                self.adjustment.set_value(u2p(self.minimum, absolute=True))
+
+            if self.expose_signal:
+                self.widget.disconnect(self.expose_signal)
+                self.expose_signal = None
             self.update_model(from_init=True)
+            logger.debug("set zoom value default zoom: %f width: %d", default_zoom, self.layout.get_clip().width)
+            self.fraction_adj.set_value(default_zoom)
             return False
         # Convert values, that could be strings
         if default_position is not None:
-            default_position=long(float(default_position))
-        if pane_position is not None:
-            pane_position=long(float(pane_position))
+            default_position=int(float(default_position))
+        if inspector_width is not None:
+            inspector_width = int(float(inspector_width))
 
-        self.expose_signal=self.widget.connect('expose-event', set_default_parameters,
-                                               default_zoom, default_position, pane_position)
+        self.expose_signal=self.widget.connect_after('draw', set_default_parameters,
+                                                     default_zoom, default_position, inspector_width)
 
     def get_save_arguments(self):
-        arguments = [ ('annotation-type', at.id) for at in self.annotationtypes ]
+        arguments = []
+        if self.annotationtypes_selection:
+            arguments.extend([ ('annotation-type', at.id) for at in self.annotationtypes_selection ])
+        if self.list:
+            arguments.extend([ ('element', el.id) for el in self.list ])
         arguments.append( ('minimum', self.minimum ) )
         arguments.append( ('maximum', self.maximum ) )
-        arguments.append( ('position', self.pixel2unit(self.adjustment.value, absolute=True) ) )
-        arguments.append( ('zoom', self.fraction_adj.value) )
-        self.options['pane-position']=self.inspector_pane.get_position()
+        arguments.append( ('position', self.pixel2unit(self.adjustment.get_value(), absolute=True) ) )
+        arguments.append( ('zoom', self.fraction_adj.get_value()) )
+        self.options['inspector-width'] = self.get_inspector_size()
         return self.options, arguments
 
-    def draw_background(self, layout, event):
+    def get_inspector_size(self):
+        return self.inspector_pane.get_clip().width - self.inspector_pane.get_position()
+
+    def set_inspector_size(self, inspector_width):
+        width = self.inspector_pane.get_clip().width
+        if inspector_width > width - 100:
+            logger.debug("Too large inspector. Use a default value")
+            if width > 300:
+                inspector_width = 160
+            else:
+                inspector_width = 0
+        self.inspector_pane.set_position(width - inspector_width)
+
+    def draw_background(self, layout, context):
+        """Draw annotation type separating lines
+        """
         width, height = layout.get_size()
         i=config.data.preferences['timeline']['interline-height']
-        drawable=layout.bin_window
-        gc=drawable.new_gc(foreground=self.colors['background'], line_style=gtk.gdk.LINE_ON_OFF_DASH)
-        for p in sorted(self.layer_position.itervalues()):
-            # Draw a different background
-            drawable.draw_line(gc, 0, p - i / 2, width, p - i / 2)
+        offset = layout.get_vadjustment().get_value()
+        context.set_source_rgb(.3, .3, .3)
+        context.set_line_width(1)
+        context.set_dash( (1, 3) )
+        for p in sorted(self.layer_position.values()):
+            y = p - offset - int(i / 2)
+            if y >= 0:
+                context.move_to(0, y)
+                context.line_to(width, y)
+        context.stroke()
+        context.set_dash([])
         return False
 
     def update_relation_lines(self):
         self.layout.queue_draw()
 
-    def draw_relation_lines(self, layout, event):
+    def draw_time_cursor(self, layout, context):
+        """Draw the time cursor in the given layout.
+
+        It will be used with both self.layout and self.scale_layout
+        """
+        p = self.controller.player
+        if not p.is_playing():
+            return
+
+        # Visible bounds
+        a = self.adjustment
+        begin = int(a.get_value())
+        end = int(a.get_value() + a.get_page_size())
+
+        w, h = layout.get_size()
+
+        if p.status == p.PlayingStatus:
+            context.set_source_rgba(1.0, 0, 0, .5)
+        else:
+            # Pause status
+            context.set_source_rgba(0, 0, 1.0, .5)
+        context.set_line_width(6)
+
+        x = self.unit2pixel(p.current_position_value, absolute=True)
+        # There is a clipping area applied to the context which
+        # restricts drawing to the visible area. We have to use
+        # coordinates relative to the visible area to draw the
+        # marks
+        if x >= begin or x <= end:
+            context.move_to(x - begin, 0)
+            context.line_to(x - begin, h)
+            context.stroke()
+
+    def overlay_scale_layout(self, layout, context):
+        """Overlay information over scale layout.
+        """
+        self.draw_time_cursor(layout, context)
+        if self.bookmarks_to_draw:
+            self.draw_bookmarks(layout, context)
+
+    def overlay_layout(self, layout, context):
+        """Overlay information over main layout.
+        """
+        self.draw_time_cursor(layout, context)
         if self.bookmarks_to_draw:
-            self.draw_bookmarks(layout, event)
+            self.draw_bookmarks(layout, context)
         if self.options['display-all-relations']:
             to_draw = [ (self.get_widget_for_annotation(r.members[0]),
                          self.get_widget_for_annotation(r.members[1]),
@@ -388,17 +479,18 @@ class TimeLine(AdhocView):
             to_draw = self.relations_to_draw
         if not to_draw:
             return False
-        context=layout.bin_window.cairo_create()
-
         for b1, b2, r in to_draw:
             if b1 is None or b2 is None:
                 continue
+            x_offset = self.layout.get_hadjustment().get_value()
+            y_offset = self.layout.get_vadjustment().get_value()
+
             r1 = b1.get_allocation()
             r2 = b2.get_allocation()
-            x_start = r1.x + 3 * r1.width / 4
-            y_start  = r1.y + r1.height / 4
-            x_end=r2.x + r2.width / 4
-            y_end=r2.y + 3 * r2.height / 4
+            x_start = int(r1.x + 3 * r1.width / 4) - x_offset
+            y_start  = int(r1.y + r1.height / 4) - y_offset
+            x_end = int(r2.x + r2.width / 4) - x_offset
+            y_end = int(r2.y + 3 * r2.height / 4) - y_offset
             context.set_source_rgb(0, 0, 0)
             context.set_line_width(1)
             context.move_to(x_start, y_start)
@@ -429,15 +521,15 @@ class TimeLine(AdhocView):
                 # but this should depend on the active gtk theme
                 color=self.get_element_color(r) or self.colors['white']
                 context.set_source_rgb(color.red / 65536.0, color.green / 65536.0, color.blue / 65536.0)
-                context.rectangle((x_start + x_end ) / 2,
-                                  (y_start + y_end ) / 2 - ext[3] - 2,
+                context.rectangle(int((x_start + x_end ) / 2),
+                                  int((y_start + y_end ) / 2 - ext[3] - 2),
                                   ext[2] + 2,
                                   ext[3] + 6)
                 context.fill()
 
                 context.set_source_rgb(0, 0, 0)
-                context.move_to((x_start + x_end ) / 2,
-                                (y_start + y_end ) / 2)
+                context.move_to(int((x_start + x_end ) / 2),
+                                int((y_start + y_end ) / 2))
                 context.show_text(t)
             context.stroke()
 
@@ -447,45 +539,52 @@ class TimeLine(AdhocView):
         self.scale_layout.queue_draw()
         self.layout.queue_draw()
 
-    def draw_bookmarks(self, layout, event):
+    def draw_bookmarks(self, layout, context):
         if not self.bookmarks_to_draw:
             return False
         a=self.adjustment
-        begin=long(a.value)
-        end=long(a.value + a.page_size)
-        context=layout.bin_window.cairo_create()
-        h=layout.get_size ()[1]
+        begin=int(a.get_value())
+        end=int(a.get_value() + a.get_page_size())
+
+        w, h = layout.get_size()
 
         context.set_source_rgb(1.0, 0, 0)
         context.set_line_width(2)
 
         for t in self.bookmarks_to_draw:
             x=self.unit2pixel(t, absolute=True)
+            # There is a clipping area applied to the context which
+            # restricts drawing to the visible area. We have to use
+            # coordinates relative to the visible area to draw the
+            # marks
             if x < begin:
                 # The bookmark is outside. Draw an arrow.
-                context.move_to(begin + 16, 2)
-                context.line_to(begin + 16, 16)
-                context.line_to(begin + 2, 9)
+                context.move_to(16, 2)
+                context.line_to(16, 16)
+                context.line_to(2, 9)
                 context.fill()
             elif x > end:
+                # (x1, y2, x2, y2)
+                clip_extents = context.clip_extents()
+                width = clip_extents[2] - clip_extents[0]
                 # The bookmark is outside. Draw an arrow.
-                context.move_to(end - 16, 2)
-                context.line_to(end - 16, 16)
-                context.line_to(end - 2, 9)
+                context.move_to(width - 16, 2)
+                context.line_to(width - 16, 16)
+                context.line_to(width - 2, 9)
                 context.fill()
             else:
-                context.move_to(x, 0)
-                context.line_to(x, h)
+                context.move_to(x - begin, 0)
+                context.line_to(x - begin, h)
                 context.stroke()
         return False
 
     def dialog_too_many_annotations(self, n):
-        d = gtk.Dialog(title=_("%d annotations") % n,
-                       parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT,
-                       buttons=( _("Display all types"), gtk.RESPONSE_YES,
-                                 gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE ) )
-        l = gtk.Label(_("There are %d annotations.\nThe current timeline may take a long time to display them, so only the first two annotation types are displayed. Use the annotation type selector (second button in the timeline) to select other annotations types to display, or click on the 'Display all types' button below.") % n)
+        d = Gtk.Dialog(title=_("%d annotations") % n,
+                       parent=self.controller.gui.gui.win,
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT,
+                       buttons=( _("Display all types"), Gtk.ResponseType.YES,
+                                 Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE ) )
+        l = Gtk.Label(_("There are %d annotations.\nThe current timeline may take a long time to display them, so only the first two annotation types are displayed. Use the annotation type selector (second button in the timeline) to select other annotations types to display, or click on the 'Display all types' button below.") % n)
         l.set_line_wrap(True)
         d.vbox.add(l)
         d.connect('key-press-event', dialog.dialog_keypressed_cb)
@@ -495,23 +594,25 @@ class TimeLine(AdhocView):
         dialog.center_on_mouse(d)
         def handle_response(d, res):
             d.destroy()
-            if res == gtk.RESPONSE_YES:
+            if res == Gtk.ResponseType.YES:
                 # Display all types
                 self.annotationtypes = list(self.controller.package.annotationTypes)
+                self.annotationtypes_selection = None
                 self.update_model(partial_update=True)
             return True
         d.connect('response', handle_response)
         return True
 
     def update_min_max(self):
+        logger.debug("update min max %d %d", self.minimum, self.maximum)
         oldmax = self.maximum
-        self.minimum=0
-        self.maximum=0
+        self.minimum = 0
+        self.maximum = 0
         duration = self.controller.cached_duration
         if duration <= 0:
             duration = self.bounds()[1]
         if duration:
-            self.maximum = long(duration)
+            self.maximum = int(duration)
 
         if not self.maximum:
             # self.maximum == 0, so try to compute it
@@ -524,10 +625,9 @@ class TimeLine(AdhocView):
         if self.minimum > self.maximum:
             self.minimum, self.maximum = self.maximum, self.minimum
 
-        if self.maximum != oldmax and self.layout.window is not None:
+        if self.maximum != oldmax and self.layout.get_window() is not None:
             # Reset to display whole timeline
-            (w, h) = self.layout.window.get_size()
-            self.scale.set_value( (self.maximum - self.minimum) / float(w) )
+            self.scale.set_value( (self.maximum - self.minimum) / float(self.layout.get_clip().width or 100) )
 
     def update_model(self, package=None, partial_update=False, from_init=False):
         """Update the whole model.
@@ -537,44 +637,28 @@ class TimeLine(AdhocView):
         @param partial_update: it is only an update for the existing package, we do not need to rebuild everything
         @param partial_update: boolean
         """
-        if not self.update_lock.acquire(False) or self.layout.window is None:
+        if not self.update_lock.acquire(False) or self.layout.get_window() is None:
             # An update is already ongoing or the layout is not realized yet
             return
 
         if package is None:
             package = self.controller.package
 
-        if from_init:
-            if len(self.layout.get_children()) < 3:
-                self.package_from_init = package
-            else:
-                self.update_lock.release()
-                return
-        else:
-            if package == self.package_from_init:
-                # update_model is called on the same package as in the
-                # __init__ method. This means that is is a result of
-                # the PackageActivate, so do not update it twice. Just
-                # reset package_from_init to enable future updates (in
-                # case of mass-modification of the package: merging,
-                # import...)
-                self.package_from_init = None
-                self.update_lock.release()
-                return
-
-        self.update_min_max()
         if partial_update:
             pos=self.get_middle_position()
         else:
             # It is not just an update, do a full redraw
-            if self.annotationtypes is None or self.list is None:
+            self.update_min_max()
+            if self.list is not None:
+                # We specified a list of annotations. Display only the
+                # annotation types for annotations present in the set
+                self.annotationtypes = list(set([ a.type for a in self.list ]))
+            elif self.annotationtypes_selection is not None:
+                self.annotationtypes = self.annotationtypes_selection
+            else:
                 # We display the whole package, so display also
                 # empty annotation types
                 self.annotationtypes = list(self.controller.package.annotationTypes)
-            else:
-                # We specified a list. Display only the annotation
-                # types for annotations present in the set
-                self.annotationtypes = list(set([ a.type for a in self.list ]))
 
         # Clear the layouts
         self.layout.foreach(self.layout.remove)
@@ -585,14 +669,14 @@ class TimeLine(AdhocView):
         self.update_layer_position()
 
         self.draw_marks()
-        self.draw_current_mark()
 
         def finalize_callback():
             self.update_legend_widget(self.legend)
             self.legend.show_all()
-            if self.layout.window is not None:
-                self.fraction_event(widget=None, forced_window_width=self.layout.window.get_size()[0])
             self.update_lock.release()
+            # Hackish fix for a refresh issue of the scale layout upon
+            # first invocation.
+            GObject.timeout_add(100, self.scale_layout.queue_resize)
 
         self.populate(finalize_callback)
 
@@ -635,10 +719,8 @@ class TimeLine(AdhocView):
         if self.bookmarks_to_draw:
             self.bookmarks_to_draw = []
 
-    def debug_cb (self, widget, data=None):
-        print "Debug event."
-        if data is not None:
-            print "Data: %s" % data
+    def debug_cb(self, *p):
+        logger.debug(" ".join(str(i) for i in p))
         return False
 
     def get_widget_for_annotation (self, annotation):
@@ -661,14 +743,13 @@ class TimeLine(AdhocView):
         """Scroll the view to center on the given position.
         """
         alloc = self.layout.get_allocation()
-        pos = self.unit2pixel(position, absolute=True) - (alloc.width / 2)
+        pos = self.unit2pixel(position, absolute=True) - int(alloc.width / 2)
         a = self.adjustment
-        if pos < a.lower:
-            pos = a.lower
-        elif pos >= a.upper - a.page_size:
-            pos = a.upper - a.page_size
-        if a.value != pos:
-            a.set_value (pos)
+        pos = helper.clamp(pos,
+                           a.get_lower(),
+                           a.get_upper() - a.get_page_size())
+        if a.get_value() != pos:
+            a.set_value(pos)
         return True
 
     def activate_annotation_handler (self, context, parameters):
@@ -700,7 +781,7 @@ class TimeLine(AdhocView):
         We should check the update_lock and if it is held, delay the
         call to update_model intended to update the timeline duration.
         """
-        if self.maximum != long(context.globals['duration']):
+        if self.maximum != int(context.globals['duration']):
             # Need a refresh.  It can happen while an update_model is
             # already taking place. In this case, we have to wait
             # until the update_model is done before doing our own update.
@@ -708,13 +789,13 @@ class TimeLine(AdhocView):
                 if not self.update_lock.locked():
                     # There is a race possibility here. Let's assume
                     # that it will be rare enough...
+                    self.update_min_max()
                     self.refresh()
                     return False
                 else:
-                    print "duration_updated timeout"
                     # Try again at next timeout.
                     return True
-            gobject.timeout_add(100, duration_updated, long(context.globals['duration']))
+            GObject.timeout_add(100, duration_updated, int(context.globals['duration']))
         return True
 
     def media_change_handler(self, context, parameters):
@@ -724,23 +805,29 @@ class TimeLine(AdhocView):
         return True
 
     def snapshot_update_handler(self, context, parameters):
-        pos=long(context.globals['position'])
-        epsilon=self.scale_layout.step / 2
+        if context.globals['media'] != self.controller.package.media:
+            # Not the active package.
+            logger.warn("no current media %s %s", context.globals['media'], self.controller.package.media)
+            return True
+        pos=int(context.globals['position'])
+        precision=int(self.scale_layout.step / 2)
         # Note: we check here w.timestamp, which is the timestamp of
         # the displayed snapshot, instead of w.mark (which is the
         # timestamp of the widget), so that the most precise snapshot
         # is kept.
         l=sorted( ( t
                     for t in ( (w, abs(w.mark - pos)) for w in self.scale_layout.get_children()
-                               if isinstance(w, gtk.Image) )
-                    if t[1] <= epsilon and t[1] < abs(t[0].timestamp - pos) ),
+                               if isinstance(w, Gtk.Image) )
+                    if t[1] <= precision and t[1] < abs(t[0].timestamp - pos) ),
                  key=operator.itemgetter(1))
+        l = list(l)
         for t in l:
-            w=t[0]
+            w = t[0]
             # Iterate only on the first one (if any)
-            png=self.controller.package.imagecache.get(pos)
-            w.set_from_pixbuf(png_to_pixbuf (png, height=self.scale_layout.height))
-            w.timestamp=png.timestamp
+            png = self.controller.get_snapshot(position=pos, media=self.controller.package.media)
+            w.set_from_pixbuf(png_to_pixbuf(png, height=self.scale_layout.height))
+            w.timestamp = png.timestamp
+            w.valid_screenshot = not png.is_default
             break
         return True
 
@@ -765,10 +852,9 @@ class TimeLine(AdhocView):
                                                         method=self.duration_update_handler),
                 controller.event_handler.internal_rule (event="MediaChange",
                                                         method=self.media_change_handler),
+                controller.event_handler.internal_rule (event="SnapshotUpdate",
+                                                        method=self.snapshot_update_handler),
                 ))
-        if 'async-snapshot' in self.controller.player.player_capabilities:
-            self.registered_rules.append( controller.event_handler.internal_rule (event="SnapshotUpdate",
-                                                                                  method=self.snapshot_update_handler))
 
     def type_restricted_handler(self, context, parameters):
         """Update the display when playing is restricted to a type.
@@ -780,13 +866,17 @@ class TimeLine(AdhocView):
         return True
 
     def bookmark_highlight_handler(self, context, parameters):
-        position=long(context.globals['timestamp'])
+        if context.globals['media'] != self.controller.package.media:
+            return True
+        position=int(context.globals['timestamp'])
         self.bookmarks_to_draw.append(position)
         self.update_bookmarks()
         return True
 
     def bookmark_unhighlight_handler(self, context, parameters):
-        position=long(context.globals['timestamp'])
+        if context.globals['media'] != self.controller.package.media:
+            return True
+        position=int(context.globals['timestamp'])
         try:
             self.bookmarks_to_draw.remove(position)
             self.update_bookmarks()
@@ -845,15 +935,15 @@ class TimeLine(AdhocView):
 
     def unit2pixel (self, v, absolute=False):
         if absolute:
-            return (long( ( v - self.minimum) / self.scale.value )) or 1
+            return (int( ( v - self.minimum) / self.scale.get_value() )) or 1
         else:
-            return (long(v / self.scale.value)) or 1
+            return (int(v / self.scale.get_value())) or 1
 
     def pixel2unit (self, v, absolute=False):
         if absolute:
-            return long((v * self.scale.value) + self.minimum)
+            return int((v * self.scale.get_value()) + self.minimum)
         else:
-            return long(v * self.scale.value)
+            return int(v * self.scale.get_value())
 
     def get_element_color(self, element):
         """Return the gtk color for the given element.
@@ -896,6 +986,8 @@ class TimeLine(AdhocView):
             return True
 
         b = self.get_widget_for_annotation (annotation)
+        if not b:
+            return True
         if event == 'AnnotationEditEnd':
             self.update_button (b)
         elif event == 'AnnotationDelete':
@@ -903,10 +995,10 @@ class TimeLine(AdhocView):
         elif event == 'AnnotationCreate':
             pass
         else:
-            print "Unknown event %s" % event
+            logger.warn("Unknown event %s" % event)
         return True
 
-    def update_annotationtype (self, annotationtype=None, event=None):
+    def update_annotationtype(self, annotationtype=None, event=None):
         """Update an annotationtype's representation.
         """
         if event == 'AnnotationTypeCreate':
@@ -950,7 +1042,7 @@ class TimeLine(AdhocView):
             z=1.0 * ann.fragment.duration / (self.maximum - self.minimum)
             if z < 0.05:
                 z=0.05
-            self.fraction_adj.value=z
+            self.fraction_adj.set_value(z)
 
             # Center on annotation
             self.center_on_position(ann.fragment.begin)
@@ -974,8 +1066,8 @@ class TimeLine(AdhocView):
     def dump_adjustment (self, a=None):
         if a is None:
             a = self.adjustment
-        print ("Lower: %.1f\tUpper: %.1f\tValue: %.1f\tPage size: %.1f"
-               % (a.lower, a.upper, a.value, a.page_size))
+        logger.debug("Lower: %.1f\tUpper: %.1f\tValue: %.1f\tPage size: %.1f"
+                     % (a.get_lower(), a.get_upper(), a.get_value(), a.get_page_size()))
 
     def align_annotations(self, source, dest, mode):
         new={
@@ -989,7 +1081,7 @@ class TimeLine(AdhocView):
             for k in ('begin', 'end'):
                 new[k]=getattr(dest.fragment, k)
         else:
-            print "Unknown drag mode: %s" % mode
+            logger.warn("Unknown drag mode: %s" % mode)
 
 
         if new['begin'] < new['end']:
@@ -1006,7 +1098,7 @@ class TimeLine(AdhocView):
         @return: a fraction (float)
         """
         x, y = widget.get_pointer()
-        w = widget.allocation.width
+        w = widget.get_allocation().width
         f = 1.0 * x / w
         return f
 
@@ -1040,14 +1132,14 @@ class TimeLine(AdhocView):
 
     def annotation_drag_received(self, widget, context, x, y, selection, targetType, time):
         if targetType == config.data.target_type['annotation']:
-            source=self.controller.package.annotations.get(unicode(selection.data, 'utf8').split('\n')[0])
+            source=self.controller.package.annotations.get(str(selection.get_data(), 'utf8').split('\n')[0])
             dest=widget.annotation
 
             if source == dest:
                 return True
 
             # Popup a menu to propose the drop options
-            menu=gtk.Menu()
+            menu=Gtk.Menu()
 
             def create_relation(item, s, d, t):
                 self.create_relation(s, d, t)
@@ -1068,17 +1160,17 @@ class TimeLine(AdhocView):
             relationtypes=helper.matching_relationtypes(self.controller.package,
                                                         source.type,
                                                         dest.type)
-            item=gtk.MenuItem(_("Create a relation"))
+            item=Gtk.MenuItem(_("Create a relation"))
             menu.append(item)
 
-            sm=gtk.Menu()
+            sm=Gtk.Menu()
             for rt in relationtypes:
-                sitem=gtk.MenuItem(self.controller.get_title(rt), use_underline=False)
+                sitem=Gtk.MenuItem(self.controller.get_title(rt), use_underline=False)
                 sitem.connect('activate', create_relation, source, dest, rt)
                 sm.append(sitem)
             if True:
                 # Propose to create a new one
-                sitem=gtk.MenuItem(_("Create a new relation-type."), use_underline=False)
+                sitem=Gtk.MenuItem(_("Create a new relation-type."), use_underline=False)
                 sitem.connect('activate', create_relation_type_and_relation, source, dest)
                 sm.append(sitem)
             item.set_submenu(sm)
@@ -1104,7 +1196,7 @@ class TimeLine(AdhocView):
                     def merge_annotations(widget, s, d):
                         self.controller.merge_annotations(s, d, extend_bounds=(s.type == d.type))
                         return True
-                    item=gtk.MenuItem(_("Merge with this annotation"))
+                    item=Gtk.MenuItem(_("Merge with this annotation"))
                     item.connect('activate', merge_annotations, source, dest)
                     menu.append(item)
 
@@ -1121,16 +1213,16 @@ class TimeLine(AdhocView):
                 ):
                 if not condition:
                     continue
-                item=gtk.ImageMenuItem(title)
-                im=gtk.Image()
+                item=Gtk.ImageMenuItem(title)
+                im=Gtk.Image()
                 im.set_from_file(config.data.advenefile( ( 'pixmaps', mode + '.png') ))
                 item.set_image(im)
                 item.connect('activate', align_annotations, source, dest, mode)
                 menu.append(item)
             menu.show_all()
-            menu.popup(None, None, None, 0, gtk.get_current_event_time())
+            menu.popup_at_pointer(None)
         elif targetType == config.data.target_type['tag']:
-            tags=unicode(selection.data, 'utf8').split(',')
+            tags=str(selection.get_data(), 'utf8').split(',')
             a=widget.annotation
             l=[t for t in tags if not t in a.tags ]
             self.controller.notify('EditSessionStart', element=a, immediate=True)
@@ -1138,10 +1230,10 @@ class TimeLine(AdhocView):
             self.controller.notify('AnnotationEditEnd', annotation=a)
             self.controller.notify('EditSessionEnd', element=a)
         else:
-            print "Unknown target type for drop: %d" % targetType
+            logger.warn("Unknown target type for drop: %d" % targetType)
         return True
 
-    def move_or_copy_annotations(self, sources, dest, position=None, action=gtk.gdk.ACTION_ASK):
+    def move_or_copy_annotations(self, sources, dest, position=None, action=Gdk.DragAction.ASK):
         """Display a popup menu to move or copy the sources annotation to the dest annotation type.
 
         If position is given (in ms), then the choice will also be
@@ -1156,7 +1248,7 @@ class TimeLine(AdhocView):
         def move_annotation(i, an, typ, position=None):
             if an.relations and an.type != typ:
                 dialog.message_dialog(_("Cannot delete the annotation : it has relations."),
-                                      icon=gtk.MESSAGE_WARNING)
+                                      icon=Gtk.MessageType.WARNING)
                 return True
 
             self.transmuted_annotation=self.controller.transmute_annotation(an,
@@ -1195,7 +1287,7 @@ class TimeLine(AdhocView):
                                                     source.type,
                                                     dest)
 
-        if action == gtk.gdk.ACTION_COPY:
+        if action == Gdk.DragAction.COPY:
             # Direct copy
             if len(sources) > 1:
                 if source.type == dest:
@@ -1208,7 +1300,7 @@ class TimeLine(AdhocView):
                     position=None
                 copy_annotation(None, source, dest, position=position)
             return True
-        elif action == gtk.gdk.ACTION_MOVE:
+        elif action == Gdk.DragAction.MOVE:
             if len(sources) > 1:
                 if source.type == dest:
                     return True
@@ -1220,7 +1312,7 @@ class TimeLine(AdhocView):
                     position=None
                 move_annotation(None, source, dest, position=position)
             return True
-        elif action == gtk.gdk.ACTION_LINK:
+        elif action == Gdk.DragAction.LINK:
             # Copy and create a relation. Ignore the selection (?)
             if len(relationtypes) == 1:
                 copy_annotation(None, source, dest, relationtype=relationtypes[0])
@@ -1229,56 +1321,56 @@ class TimeLine(AdhocView):
                 self.log("FIXME: no valid relation type is defined")
             else:
                 # Multiple valid relationtypes.
-                menu=gtk.Menu()
-                item=gtk.MenuItem(_("Select the appropriate relation type"))
+                menu=Gtk.Menu()
+                item=Gtk.MenuItem(_("Select the appropriate relation type"))
                 menu.append(item)
                 item.set_sensitive(False)
                 for rt in relationtypes:
-                    sitem=gtk.MenuItem(self.controller.get_title(rt), use_underline=False)
+                    sitem=Gtk.MenuItem(self.controller.get_title(rt), use_underline=False)
                     sitem.connect('activate', copy_annotation, source, dest, None, rt)
                     menu.append(sitem)
                 menu.show_all()
-                menu.popup(None, None, None, 0, gtk.get_current_event_time())
+                menu.popup_at_pointer(None)
             return True
 
         # ACTION_ASK: Popup a menu to propose the drop options
-        menu=gtk.Menu()
+        menu=Gtk.Menu()
 
         dest_title=self.controller.get_title(dest)
 
         if len(sources) > 1:
             if source.type == dest:
                 return True
-            item=gtk.MenuItem(_("Duplicate selection to type %s") % dest_title, use_underline=False)
+            item=Gtk.MenuItem(_("Duplicate selection to type %s") % dest_title, use_underline=False)
             item.connect('activate', copy_selection, sources, dest)
             menu.append(item)
-            item=gtk.MenuItem(_("Move selection to type %s") % dest_title, use_underline=False)
+            item=Gtk.MenuItem(_("Move selection to type %s") % dest_title, use_underline=False)
             item.connect('activate', copy_selection, sources, dest, True)
             menu.append(item)
 
             menu.show_all()
-            menu.popup(None, None, None, 0, gtk.get_current_event_time())
+            menu.popup_at_pointer(None)
             return True
 
         if source.type != dest:
-            item=gtk.MenuItem(_("Duplicate annotation to type %s") % dest_title, use_underline=False)
+            item=Gtk.MenuItem(_("Duplicate annotation to type %s") % dest_title, use_underline=False)
             item.connect('activate', copy_annotation, source, dest)
             menu.append(item)
 
-            item=gtk.MenuItem(_("Move annotation to type %s") % dest_title, use_underline=False)
+            item=Gtk.MenuItem(_("Move annotation to type %s") % dest_title, use_underline=False)
             item.connect('activate', move_annotation, source, dest)
             menu.append(item)
             if source.relations:
                 item.set_sensitive(False)
 
         if position is not None and abs(position-source.fragment.begin) > 1000:
-            item=gtk.MenuItem(_("Duplicate to type %(type)s at %(position)s") % {
+            item=Gtk.MenuItem(_("Duplicate to type %(type)s at %(position)s") % {
                     'type': dest_title,
                     'position': helper.format_time(position) }, use_underline=False)
             item.connect('activate', copy_annotation, source, dest, position)
             menu.append(item)
 
-            item=gtk.MenuItem(_("Move to type %(type)s at %(position)s") % {
+            item=Gtk.MenuItem(_("Move to type %(type)s at %(position)s") % {
                         'type': dest_title,
                         'position': helper.format_time(position) }, use_underline=False)
             item.connect('activate', move_annotation, source, dest, position)
@@ -1288,29 +1380,29 @@ class TimeLine(AdhocView):
 
         if relationtypes:
             if source.type != dest:
-                item=gtk.MenuItem(_("Duplicate and create a relation"), use_underline=False)
+                item=Gtk.MenuItem(_("Duplicate and create a relation"), use_underline=False)
                 # build a submenu
-                sm=gtk.Menu()
+                sm=Gtk.Menu()
                 for rt in relationtypes:
-                    sitem=gtk.MenuItem(self.controller.get_title(rt), use_underline=False)
+                    sitem=Gtk.MenuItem(self.controller.get_title(rt), use_underline=False)
                     sitem.connect('activate', copy_annotation, source, dest, None, rt)
                     sm.append(sitem)
                 menu.append(item)
                 item.set_submenu(sm)
 
             if position is not None:
-                item=gtk.MenuItem(_("Duplicate at %s and create a relation") % helper.format_time(position), use_underline=False)
+                item=Gtk.MenuItem(_("Duplicate at %s and create a relation") % helper.format_time(position), use_underline=False)
                 # build a submenu
-                sm=gtk.Menu()
+                sm=Gtk.Menu()
                 for rt in relationtypes:
-                    sitem=gtk.MenuItem(self.controller.get_title(rt), use_underline=False)
+                    sitem=Gtk.MenuItem(self.controller.get_title(rt), use_underline=False)
                     sitem.connect('activate', copy_annotation, source, dest, position, rt)
                     sm.append(sitem)
                 menu.append(item)
                 item.set_submenu(sm)
 
         menu.show_all()
-        menu.popup(None, None, None, 0, gtk.get_current_event_time())
+        menu.popup_at_pointer(None)
 
     def copy_annotation_type(self, source, dest):
         """Display a popup menu to copy the source annotation type to the dest annotation type.
@@ -1432,7 +1524,7 @@ class TimeLine(AdhocView):
             return True
 
         # Popup a menu to propose the drop options
-        menu=gtk.Menu()
+        menu=Gtk.Menu()
 
         source_title=self.controller.get_title(source)
         dest_title=self.controller.get_title(dest)
@@ -1452,42 +1544,42 @@ class TimeLine(AdhocView):
                 (_("Align all annotation contents using %s as reference") % source_title,
                  (DTWalign_annotations, source, dest, 'content', True) ),
                 ):
-                item=gtk.MenuItem(label, use_underline=False)
+                item=Gtk.MenuItem(label, use_underline=False)
                 item.connect('activate', *action)
                 menu.append(item)
 
         menu.show_all()
-        menu.popup(None, None, None, 0, gtk.get_current_event_time())
+        menu.popup_at_pointer(None)
 
     def annotation_type_drag_received_cb(self, widget, context, x, y, selection, targetType, time):
         if targetType == config.data.target_type['annotation']:
-            sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+            sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
             dest=widget.annotationtype
             self.move_or_copy_annotations(sources, dest)
         elif targetType == config.data.target_type['annotation-type']:
             # Copy annotations
-            source=self.controller.package.annotationTypes.get(unicode(selection.data, 'utf8'))
+            source=self.controller.package.annotationTypes.get(str(selection.get_data(), 'utf8'))
             dest=widget.annotationtype
             self.copy_annotation_type(source, dest)
         elif targetType == config.data.target_type['color']:
             # Got a color
             # The structure consists in 4 unsigned shorts: r, g, b, opacity
-            (r, g, b, opacity)=struct.unpack('HHHH', selection.data)
-            widget.annotationtype.setMetaData(config.data.namespace, 'color', u"string:#%04x%04x%04x" % (r, g, b))
+            (r, g, b, opacity)=struct.unpack('HHHH', selection.get_data())
+            widget.annotationtype.setMetaData(config.data.namespace, 'color', "string:#%04x%04x%04x" % (r, g, b))
             self.controller.notify('AnnotationTypeEditEnd', annotationtype=widget.annotationtype)
         elif targetType == config.data.target_type['timestamp']:
-            data=decode_drop_parameters(selection.data)
-            begin=long(data['timestamp'])
+            data=decode_drop_parameters(selection.get_data())
+            begin=int(data['timestamp'])
             content=data.get('comment', None)
             # Create an annotation with the timestamp as begin
             self.controller.create_annotation(begin, widget.annotationtype, content=content)
         else:
-            print "Unknown target type for drop: %d" % targetType
+            logger.warn("Unknown target type for drop: %d" % targetType)
         return True
 
     def new_annotation_type_drag_received_cb(self, widget, context, x, y, selection, targetType, time):
         if targetType == config.data.target_type['annotation']:
-            sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+            sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
             # Create a type
             dest=self.create_annotation_type()
             if dest is None:
@@ -1498,8 +1590,8 @@ class TimeLine(AdhocView):
         elif targetType == config.data.target_type['timestamp']:
             typ=self.create_annotation_type()
             if typ is not None:
-                data=decode_drop_parameters(selection.data)
-                begin=long(data['timestamp'])
+                data=decode_drop_parameters(selection.get_data())
+                begin=int(data['timestamp'])
                 content=data.get('comment', None)
                 # Create an annotation of type typ with the timestamp as begin
                 self.controller.create_annotation(begin, typ, content=content)
@@ -1509,18 +1601,18 @@ class TimeLine(AdhocView):
         """Handle the drop from an annotation-type to the legend
         """
         if targetType == config.data.target_type['annotation-type']:
-            source=self.controller.package.annotationTypes.get(unicode(selection.data, 'utf8'))
+            source=self.controller.package.annotationTypes.get(str(selection.get_data(), 'utf8'))
             # We received a drop. Determine the location.
             s = config.data.preferences['timeline']['interline-height']
 
             # Correct y value according to scrollbar position
-            y += widget.parent.get_vscrollbar().get_adjustment().get_value()
+            y += widget.get_parent().get_vscrollbar().get_adjustment().get_value()
 
             f=[ at
-                for (at, p) in self.layer_position.iteritems()
+                for (at, p) in self.layer_position.items()
                 if (y - s >= p and y - s <= p + self.button_height) ]
             t=[ at
-                for (at, p) in self.layer_position.iteritems()
+                for (at, p) in self.layer_position.items()
                 if (y + s >= p and y + s <= p + self.button_height) ]
             if f and t and f[0] != source and t[0] != source:
                 if source in self.annotationtypes:
@@ -1530,6 +1622,7 @@ class TimeLine(AdhocView):
                 l.append(source)
                 l.extend(self.annotationtypes[j+1:])
                 self.annotationtypes=l
+                self.annotationtypes_selection = self.annotationtypes
                 self.update_model(partial_update=True)
             elif y < self.button_height + s:
                 # Drop at the beginning of the list.
@@ -1540,14 +1633,16 @@ class TimeLine(AdhocView):
                 l=[ source ]
                 l.extend(self.annotationtypes)
                 self.annotationtypes=l
+                self.annotationtypes_selection = self.annotationtypes
                 self.update_model(partial_update=True)
-            elif y > max(self.layer_position.values() or (0,)):
+            elif y > max(list(self.layer_position.values()) or (0,)):
                 # Drop at the end of the list
                 if source in self.annotationtypes:
                     if self.annotationtypes.index(source) == len(self.annotationtypes) - 1:
                         return True
                     self.annotationtypes.remove(source)
                 self.annotationtypes.append(source)
+                self.annotationtypes_selection = self.annotationtypes
                 self.update_model(partial_update=True)
             return True
         return False
@@ -1562,11 +1657,7 @@ class TimeLine(AdhocView):
             self.locked_icon.show()
             self.controller.gui.set_current_annotation(annotation)
             # Goto annotation
-            c=self.controller
-            pos = c.create_position (value=annotation.fragment.begin,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-            self.controller.update_status (status="set", position=pos)
+            self.controller.update_status("seek", annotation.fragment.begin)
             if self.loop_toggle_button.get_active():
                 self.controller.gui.loop_on_annotation_gui(annotation)
             return True
@@ -1575,13 +1666,13 @@ class TimeLine(AdhocView):
         """Handle button presses on annotation widgets.
         """
         widget._single_click_guard=False
-        if event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS:
+        if event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
             self.annotation_cb(widget, annotation, event.x)
             return True
-        elif event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+        elif event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
             self.controller.gui.edit_element(annotation)
             return True
-        elif event.button == 1 and event.type == gtk.gdk.BUTTON_PRESS and event.state & gtk.gdk.CONTROL_MASK:
+        elif event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             # Control + click : set annotation begin/end time to current time
             f=self.annotation_fraction(widget)
             if f < .40:
@@ -1592,22 +1683,22 @@ class TimeLine(AdhocView):
                 return False
             f=annotation.fragment
             self.controller.notify('EditSessionStart', element=annotation, immediate=True)
-            setattr(f, at, long(self.controller.player.current_position_value))
+            setattr(f, at, int(self.controller.player.current_position_value))
             if f.begin > f.end:
                 f.begin, f.end = f.end, f.begin
             self.controller.notify('AnnotationEditEnd', annotation=annotation)
             self.controller.notify('EditSessionEnd', element=annotation)
             return True
         elif (event.button == 1
-              and event.type == gtk.gdk.BUTTON_PRESS
-              and event.state & gtk.gdk.SHIFT_MASK):
+              and event.type == Gdk.EventType.BUTTON_PRESS
+              and event.get_state() & Gdk.ModifierType.SHIFT_MASK):
             # Shift-click: toggle annotation selection/activation
             if widget.active:
                 self.desactivate_annotation (annotation, buttons=[ widget ])
             else:
                 self.activate_annotation (annotation, buttons=[ widget ])
             return True
-        elif event.button == 1 and event.type == gtk.gdk.BUTTON_PRESS:
+        elif event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS:
             widget._single_click_guard=True
             return True
         return False
@@ -1628,15 +1719,27 @@ class TimeLine(AdhocView):
             button.grab_focus()
             return True
 
-        e=gtk.Entry()
+        e=Gtk.Entry()
         # get_title will either return the content data, or the computed representation
         e.set_text(self.controller.get_title(annotation))
         e.set_activates_default(True)
 
+        completion = Gtk.EntryCompletion()
+        # Build the completion list
+        store = Gtk.ListStore(str)
+        for c in self.controller.package._indexer.get_completions("", context=annotation):
+            store.append([ c ])
+        completion.set_model(store)
+        completion.set_text_column(0)
+        completion.set_popup_single_match(False)
+        completion.set_inline_completion(True)
+        completion.set_minimum_key_length(2)
+        e.set_completion(completion)
+
         def key_handler(widget, event, ann, cb, controller, close_eb):
-            if event.keyval == gtk.keysyms.Return:
+            if event.keyval == Gdk.KEY_Return:
                 r = helper.title2content(widget.get_text(),
-                                         ann.content.data,
+                                         ann.content,
                                          ann.type.getMetaData(config.data.namespace, "representation"))
                 if r is None:
                     self.controller.log(_("Cannot update the annotation, its representation is too complex"))
@@ -1650,16 +1753,16 @@ class TimeLine(AdhocView):
                         self.controller.notify('EditSessionEnd', element=ann)
                 close_eb(widget)
                 return True
-            elif event.keyval == gtk.keysyms.Escape:
+            elif event.keyval == Gdk.KEY_Escape:
                 # Abort and close the entry
                 if cb:
                     cb('cancel', ann)
                 close_eb(widget)
                 return True
-            elif event.keyval == gtk.keysyms.Tab:
+            elif event.keyval == Gdk.KEY_Tab:
                 # Validate the current annotation and go to the previous/next one
                 r = helper.title2content(widget.get_text(),
-                                         ann.content.data,
+                                         ann.content,
                                          ann.type.getMetaData(config.data.namespace, "representation"))
                 if r is None:
                     self.controller.log("Cannot update the annotation, its representation is too complex")
@@ -1673,7 +1776,7 @@ class TimeLine(AdhocView):
                         self.controller.notify('EditSessionEnd', element=ann)
                 # Navigate
                 b=ann.fragment.begin
-                if event.state & gtk.gdk.SHIFT_MASK:
+                if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
                     # Previous.
                     l=[a
                        for a in ann.type.annotations
@@ -1695,7 +1798,6 @@ class TimeLine(AdhocView):
         def grab_focus(widget, event=None, *p):
             widget.grab_focus()
             return False
-        e.connect('enter-notify-event', grab_focus)
 
         e.show()
 
@@ -1705,15 +1807,15 @@ class TimeLine(AdhocView):
             # We have just create the annotation widget. Its child
             # properties wrt. layout are not yet updated. Simply
             # compute them again.
-            button.parent.put(e, self.unit2pixel(annotation.fragment.begin, absolute=True), self.layer_position[annotation.type])
+            button.get_parent().put(e, self.unit2pixel(annotation.fragment.begin, absolute=True), self.layer_position[annotation.type])
         else:
-            button.parent.put(e, al.x, al.y)
+            button.get_parent().put(e, al.x, al.y)
         e.connect('size-allocate', grab_focus)
         # Keep the inspector window open on the annotation
         self.set_annotation(annotation)
         if move_cursor:
-            d=gtk.gdk.display_get_default()
-            x,y=button.window.get_deskrelative_origin()
+            d=Gdk.Display.get_default()
+            x,y=button.get_window().get_deskrelative_origin()
             d.warp_pointer(d.get_default_screen(), x + 2, y + 2)
         return e
 
@@ -1723,36 +1825,33 @@ class TimeLine(AdhocView):
         if widget.keypress(widget, event, annotation):
             return True
 
-        if event.keyval == gtk.keysyms.Return and event.state & gtk.gdk.CONTROL_MASK:
+        if event.keyval == Gdk.KEY_Return and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             # Control-return: split at current player position
             self.controller.split_annotation(annotation, self.controller.player.current_position_value)
             return True
-        elif event.keyval == gtk.keysyms.a:
+        elif event.keyval == Gdk.KEY_a:
             self.controller.gui.adjust_annotation_bound(annotation, 'begin')
-        elif event.keyval == gtk.keysyms.A:
+        elif event.keyval == Gdk.KEY_A:
             self.controller.gui.adjust_annotation_bound(annotation, 'end')
-        elif event.keyval == gtk.keysyms.p:
+        elif event.keyval == Gdk.KEY_p:
             # Play
             f=self.annotation_fraction(widget)
             x, y = widget.get_pointer()
             if (x < 0 or y < 0
-                or x > widget.allocation.width
-                or y > widget.allocation.height):
+                or x > widget.get_allocation().width
+                or y > widget.get_allocation().height):
                 # We are outside the widget. Let the key_pressed_cb
                 # callback from layout handle the key
                 return False
             if f > .5:
-                position=annotation.fragment.end
+                position = annotation.fragment.end
             else:
-                position=annotation.fragment.begin
+                position = annotation.fragment.begin
             c=self.controller
-            pos = c.create_position (value=position,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-            c.update_status (status="set", position=pos)
+            c.update_status(status="seek", position=position)
             c.gui.set_current_annotation(annotation)
             return True
-        elif event.keyval == gtk.keysyms.Return:
+        elif event.keyval == Gdk.KEY_Return:
             # Quick edit
             self.quick_edit(annotation, button=widget)
             return True
@@ -1826,8 +1925,8 @@ class TimeLine(AdhocView):
                 self.controller.player.status != self.controller.player.PlayingStatus):
                 # Check if the annotation is not already visible
                 a = self.adjustment
-                start=a.value
-                finish=a.value + a.page_size
+                start=a.get_value()
+                finish=a.get_value() + a.get_page_size()
                 begin = self.unit2pixel(annotation.fragment.begin, absolute=True)
                 if begin >= start and begin <= finish:
                     return False
@@ -1845,34 +1944,33 @@ class TimeLine(AdhocView):
         b.connect('drag-begin', self.annotation_drag_begin)
         # The button can receive drops (to create relations)
         b.connect('drag-data-received', self.annotation_drag_received)
-        b.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                        gtk.DEST_DEFAULT_HIGHLIGHT |
-                        gtk.DEST_DEFAULT_ALL,
-                        config.data.drag_type['annotation']
-                        + config.data.drag_type['tag']
-                        , gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE | gtk.gdk.ACTION_ASK )
+        b.drag_dest_set(Gtk.DestDefaults.MOTION |
+                        Gtk.DestDefaults.HIGHLIGHT |
+                        Gtk.DestDefaults.ALL,
+                        config.data.get_target_types('annotation', 'tag'),
+                        Gdk.DragAction.LINK | Gdk.DragAction.COPY | Gdk.DragAction.MOVE | Gdk.DragAction.ASK )
 
         def annotation_drag_motion(widget, drag_context, x, y, timestamp):
-            actions=drag_context.actions
+            actions=drag_context.get_actions()
             # Dragging an annotation. Set the default action to ASK.
-            if (config.data.drag_type['annotation'][0][0] in drag_context.targets
-                and not actions in ( gtk.gdk.ACTION_LINK, gtk.gdk.ACTION_COPY, gtk.gdk.ACTION_MOVE )):
+            if (config.data.drag_type['annotation'][0][0] in drag_context.list_targets()
+                and not actions in ( Gdk.DragAction.LINK, Gdk.DragAction.COPY, Gdk.DragAction.MOVE )):
                 # No single action was selected. Force ASK
-                drag_context.drag_status(gtk.gdk.ACTION_ASK, timestamp)
+                Gdk.drag_status(drag_context, Gdk.DragAction.ASK, timestamp)
         b.connect('drag-motion', annotation_drag_motion)
 
         # Handle scroll actions
         def handle_scroll_event(button, event):
-            if not (event.state & gtk.gdk.CONTROL_MASK):
+            if not (event.get_state() & Gdk.ModifierType.CONTROL_MASK):
                 return False
-            if event.state & gtk.gdk.SHIFT_MASK:
+            if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
                 i='second-scroll-increment'
             else:
                 i='scroll-increment'
 
-            if event.direction == gtk.gdk.SCROLL_DOWN or event.direction == gtk.gdk.SCROLL_RIGHT:
+            if event.direction == Gdk.ScrollDirection.DOWN or event.direction == Gdk.ScrollDirection.RIGHT:
                 incr=-config.data.preferences[i]
-            elif event.direction == gtk.gdk.SCROLL_UP or event.direction == gtk.gdk.SCROLL_LEFT:
+            elif event.direction == Gdk.ScrollDirection.UP or event.direction == Gdk.ScrollDirection.LEFT:
                 incr=config.data.preferences[i]
 
             fr=self.annotation_fraction(button)
@@ -1881,7 +1979,7 @@ class TimeLine(AdhocView):
             self.controller.notify('EditSessionStart', element=button.annotation, immediate=True)
 
             newpos = None
-            if event.state & gtk.gdk.SHIFT_MASK:
+            if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
                 f.begin += incr
                 f.end += incr
                 newpos = f.begin
@@ -1925,18 +2023,22 @@ class TimeLine(AdhocView):
         count = 10
         length = len(l)
 
-        #print '----------------------------------------- populate', length
-        #import traceback; traceback.print_stack()
         if l:
-            old_position = self.inspector_pane.get_position()
-            self.inspector_pane.set_position(2)
+            old_inspector_width = self.get_inspector_size()
+
+        def update_layout_size():
+            self.layout.set_size (u2p (self.maximum - self.minimum),
+                                  max(list(self.layer_position.values()) or (0,))
+                                  + self.button_height + config.data.preferences['timeline']['interline-height'])
+            self.scale_layout.set_size(u2p (self.maximum - self.minimum), 40)
+
         def create_annotations(annotations, length):
             i = counter[0]
             if i < length:
                 self.quickview.set_text(_("Displaying %(count)d / %(total)d annotations...") % {
                         'count': min(i + count, length),
                         'total': length },
-                                        1.0 * (i+count) / length)
+                                        1.0 * (i + count) / length)
                 for a in annotations[i:i+count]:
                     self.create_annotation_widget(a)
                 counter[0] += count
@@ -1947,15 +2049,8 @@ class TimeLine(AdhocView):
                     self.quickview.set_text(_("Displaying done."))
                     self.locked_inspector = False
                 self.controller.gui.set_busy_cursor(False)
-                if old_position:
-                    self.inspector_pane.set_position(old_position)
-                else:
-                    # old_position was = 0, because its value was
-                    # obtained before the widget was realized. There
-                    # is a good chance that the value is now
-                    # available.
-                    if self.widget.window:
-                        self.inspector_pane.set_position(max((0, self.widget.window.get_size()[0] - 160)))
+                self.set_inspector_size(old_inspector_width or 20)
+                update_layout_size()
                 if callback:
                     callback()
                 return False
@@ -1968,76 +2063,34 @@ class TimeLine(AdhocView):
                                         1.0 * count / length)
                 self.locked_inspector = True
             self.controller.gui.set_busy_cursor(True)
-            gobject.idle_add(create_annotations, l, length)
+            GObject.idle_add(create_annotations, l, length)
         elif callback:
+            update_layout_size()
             callback()
 
-        self.layout.set_size (u2p (self.maximum - self.minimum),
-                              max(self.layer_position.values() or (0,))
-                              + self.button_height + config.data.preferences['timeline']['interline-height'])
-
-        self.scale_layout.set_size(u2p (self.maximum - self.minimum), 40)
-
-    def draw_current_mark (self):
-        u2p = self.unit2pixel
-
-        red=gtk.gdk.color_parse('red2')
-        a = GenericColorButtonWidget('layout_current_mark', container=self)
-        a.default_size=(1, max(self.layer_position.values() or (0,)) + self.button_height)
-        a.local_color=red
-        a.alpha=.5
-        self.current_marker = a
-        a.mark = self.current_position
-        a.pos = 0
-        self.layout.put(a, u2p(a.mark, absolute=True), a.pos)
-        a.show ()
-
-        a = GenericColorButtonWidget('scale_layout_current_mark', container=self)
-        a.default_size=(1, self.button_height)
-        a.local_color=red
-        a.alpha=.5
-        self.current_marker_scale = a
-        a.mark = self.current_position
-        a.pos = 0
-        self.scale_layout.put (a, u2p(a.mark, absolute=True), a.pos)
-        a.show ()
-
-    def update_current_mark (self, pos=None):
-        u2p = self.unit2pixel
-        if pos is None:
-            pos = self.current_position
-        else:
-            self.current_position = pos
-        p=u2p(pos, absolute=True)
-        a = self.current_marker
-        a.mark = pos
-        self.layout.move (a, p, a.pos)
-
-        a = self.current_marker_scale
-        a.mark = pos
-        self.scale_layout.move (a, p, a.pos)
-
     def update_position (self, pos):
         if pos is None:
             pos = self.current_position
         p = self.controller.player
         if (self.options['autoscroll'] == 1
-            and (p.status == p.PlayingStatus or p.status == p.PauseStatus)):
+            and p.is_playing()):
             self.center_on_position(pos)
         elif (self.options['autoscroll'] == 2
-            and (p.status == p.PlayingStatus or p.status == p.PauseStatus)):
+            and p.is_playing()):
             p=self.unit2pixel(pos, absolute=True)
-            begin=self.adjustment.value
-            end=begin + self.adjustment.page_size
+            begin=self.adjustment.get_value()
+            end=begin + self.adjustment.get_page_size()
             if p > end or p < begin:
                 self.center_on_position(pos)
-        self.update_current_mark (pos)
+        self.layout.queue_draw()
+        self.scale_layout.queue_draw()
         return True
 
     def position_reset(self):
         # The position was reset. Deactive active annotations.
         self.deactivate_all()
-        self.update_current_mark(self.minimum)
+        self.layout.queue_draw()
+        self.scale_layout.queue_draw()
         return True
 
     def update_scale_height(self, *p):
@@ -2066,22 +2119,18 @@ class TimeLine(AdhocView):
         def display_image(widget, event, h, step):
             """Lazy-loading of images
             """
-            ic=self.controller.package.imagecache
-            png=ic.get(widget.mark, epsilon=step/2)
-            if (png == ic.not_yet_available_image
-                and 'async-snapshot' in self.controller.player.player_capabilities):
-                self.controller.update_snapshot(widget.mark)
-            else:
-                widget.timestamp=png.timestamp
+            png = self.controller.get_snapshot(position=widget.mark, precision=step/2)
+            widget.timestamp=png.timestamp
             widget.set_from_pixbuf(png_to_pixbuf (png, height=max(20, h)))
+            widget.valid_screenshot = not png.is_default
             if widget.expose_signal is not None:
                 widget.disconnect(widget.expose_signal)
-                widget.expose_signal=None
+                widget.expose_signal = None
             return False
 
         # Remove previous images
         def remove_image(w):
-            if isinstance(w, gtk.Image):
+            if isinstance(w, Gtk.Image):
                 self.scale_layout.remove(w)
                 return True
         self.scale_layout.foreach(remove_image)
@@ -2101,13 +2150,15 @@ class TimeLine(AdhocView):
             u2p=self.unit2pixel
             while t <= self.maximum:
                 # Draw screenshots
-                i=gtk.Image()
-                i.mark = t
-                i.expose_signal=i.connect('expose-event', display_image, height, step)
+                i = Gtk.Image()
+                # Use round_timestamp so that timestamps will exactly
+                # match positions notified with SnasphotUpdate
+                i.mark = self.controller.round_timestamp(t)
+                i.expose_signal=i.connect('draw', display_image, height, step)
                 i.pos = 20
-                # Real timestamp of the snapshot. If < 0 (and a
-                # large value, since it is after used to get best
-                # approximation through abs(pos - i.timestamp)),
+                # Timestamp of the snapshot currently used. If < 0
+                # (and a large value, since it is after used to get
+                # best approximation through abs(pos - i.timestamp)),
                 # the snapshot is the uninitialized one.
                 i.timestamp=-self.controller.cached_duration
                 i.show()
@@ -2122,13 +2173,13 @@ class TimeLine(AdhocView):
         step = self.pixel2unit (110)
         t = self.minimum
 
-        font = pango.FontDescription("sans 10")
+        font = Pango.FontDescription("sans 10")
 
         while t <= self.maximum:
             x = u2p(t, absolute=True)
 
             # Draw label
-            l = gtk.Label ('|' + helper.format_time (t))
+            l = Gtk.Label(label='|' + helper.format_time (t))
             l.modify_font(font)
             l.mark = t
             l.pos = 1
@@ -2145,7 +2196,7 @@ class TimeLine(AdhocView):
         Return a tuple corresponding to the min and max values of the
         list, in list units.
         """
-        minimum=sys.maxint
+        minimum=sys.maxsize
         maximum=0
         if self.list is None:
             l=self.controller.package.annotations
@@ -2168,39 +2219,35 @@ class TimeLine(AdhocView):
         if event.keyval >= 49 and event.keyval <= 57:
             # 1-9 keys set the zoom factor
             pos=self.get_middle_position()
-            self.fraction_adj.value=1.0/pow(2, event.keyval-49)
+            self.fraction_adj.set_value(1.0/pow(2, event.keyval-49))
             self.set_middle_position(pos)
             return True
-        elif event.keyval == gtk.keysyms.plus and event.state & gtk.gdk.CONTROL_MASK:
+        elif event.keyval == Gdk.KEY_plus and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             # Zoom in
             a=self.fraction_adj
             pos=self.get_middle_position()
-            a.value=min(a.value + a.page_increment, a.upper)
+            a.set_value(min(a.get_value() + a.get_page_increment(), a.get_upper()))
             self.set_middle_position(pos)
-        elif event.keyval == gtk.keysyms.plus and event.state & gtk.gdk.CONTROL_MASK:
+        elif event.keyval == Gdk.KEY_plus and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             # Zoom out
             a=self.fraction_adj
             pos=self.get_middle_position()
-            a.value=max(a.value - a.page_increment, a.lower)
+            a.set_value(max(a.get_value() - a.get_page_increment(), a.get_lower()))
             self.set_middle_position(pos)
-        elif event.keyval == gtk.keysyms.e:
+        elif event.keyval == Gdk.KEY_e:
             if isinstance(self.quickview.annotation, Annotation):
                 self.controller.gui.edit_element(self.quickview.annotation)
                 return True
-        elif event.keyval == gtk.keysyms.c:
+        elif event.keyval == Gdk.KEY_c:
             self.center_on_position(self.current_position)
             return True
-        elif event.keyval == gtk.keysyms.p:
+        elif event.keyval == Gdk.KEY_p:
             # Play at the current position
             x, y = win.get_pointer()
             # Note: x is here relative to the visible portion of the window. Thus we must
-            # add self.adjustment.value
-            position=self.pixel2unit(self.adjustment.value + x, absolute=True)
-            c=self.controller
-            pos = c.create_position (value=position,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-            c.update_status (status="set", position=pos)
+            # add self.adjustment.get_value
+            position=self.pixel2unit(self.adjustment.get_value() + x, absolute=True)
+            self.controller.update_status (status="seek", position=position)
             return True
         return False
 
@@ -2210,40 +2257,40 @@ class TimeLine(AdhocView):
         # We received a drop. Determine the location.
 
         # Correct y value according to scrollbar position
-        y += widget.parent.get_vscrollbar().get_adjustment().get_value()
+        y += widget.get_parent().get_vscrollbar().get_adjustment().get_value()
         drop_types=[ at
-                     for (at, p) in self.layer_position.iteritems()
+                     for (at, p) in self.layer_position.items()
                      if (y >= p and y <= p + self.button_height + config.data.preferences['timeline']['interline-height']) ]
 
         if targetType == config.data.target_type['annotation']:
-            sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+            sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
             if drop_types:
                 # Copy/Move to a[0]
                 if config.data.os == 'win32':
                     # Control/Shift mods for DND is broken on win32. Force ACTION_ASK.
-                    ac=gtk.gdk.ACTION_ASK
+                    ac=Gdk.DragAction.ASK
                 else:
-                    ac=context.actions
-                self.move_or_copy_annotations(sources, drop_types[0], position=self.pixel2unit(self.adjustment.value + x, absolute=True), action=ac)
+                    ac=context.get_actions()
+                self.move_or_copy_annotations(sources, drop_types[0], position=self.pixel2unit(self.adjustment.get_value() + x, absolute=True), action=ac)
             else:
                 # Maybe we should propose to create a new annotation-type ?
                 # Create a type
                 dest=self.create_annotation_type()
                 if dest is None:
                     return True
-                self.move_or_copy_annotations(sources, dest, position=self.pixel2unit(self.adjustment.value + x, absolute=True), action=context.actions)
+                self.move_or_copy_annotations(sources, dest, position=self.pixel2unit(self.adjustment.get_value() + x, absolute=True), action=context.get_actions())
             return True
         elif targetType == config.data.target_type['annotation-type']:
-            source=self.controller.package.annotationTypes.get(unicode(selection.data, 'utf8'))
+            source=self.controller.package.annotationTypes.get(str(selection.get_data(), 'utf8'))
             if drop_types:
                 # Copy/Move to drop_types[0]
                 if source != drop_types[0]:
                     self.copy_annotation_type(source, drop_types[0])
                 else:
                     # Create an annotation in the type.
-                    self.controller.create_annotation(position=self.pixel2unit(self.adjustment.value + x, absolute=True),
+                    self.controller.create_annotation(position=self.pixel2unit(self.adjustment.get_value() + x, absolute=True),
                                                       type=source,
-                                                      duration=self.pixel2unit(context.get_source_widget().get_allocation().width),
+                                                      duration=self.pixel2unit(Gtk.drag_get_source_widget(context).get_allocation().width),
                                                       )
             else:
                 # Maybe we should propose to create a new annotation-type ?
@@ -2260,13 +2307,13 @@ class TimeLine(AdhocView):
             else:
                 typ=self.create_annotation_type()
             if typ is not None:
-                data=decode_drop_parameters(selection.data)
-                begin=long(data['timestamp'])
+                data=decode_drop_parameters(selection.get_data())
+                begin=int(data['timestamp'])
                 content=data.get('comment', None)
                 # Create an annotation of type typ with the timestamp as begin
                 self.controller.create_annotation(begin, typ, content=content)
         else:
-            print "Unknown target type for drop: %d" % targetType
+            logger.warn("Unknown target type for drop: %d" % targetType)
         return False
 
     def scale_layout_button_press_cb(self, widget=None, event=None):
@@ -2278,18 +2325,14 @@ class TimeLine(AdhocView):
         # Convert x, y (relative to the layout allocation) into
         # values relative to the whole layout size
         p=widget.get_parent()
-        x=long(p.get_hadjustment().value + x)
-        y=long(p.get_vadjustment().value + y)
+        x=int(p.get_hadjustment().get_value() + x)
+        y=int(p.get_vadjustment().get_value() + y)
 
         if event.button == 3:
             self.context_cb (timel=self, position=self.pixel2unit(x, absolute=True), height=y)
             return True
         elif event.button == 1:
-            c=self.controller
-            pos = c.create_position (value=self.pixel2unit(x, absolute=True),
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-            c.update_status (status="set", position=pos)
+            self.controller.update_status(status="seek", position=self.pixel2unit(x, absolute=True))
             return True
         return False
 
@@ -2318,18 +2361,18 @@ class TimeLine(AdhocView):
         # Convert x, y (relative to the layout allocation) into
         # values relative to the whole layout size
         p=widget.get_parent()
-        x=long(p.get_hadjustment().value + x)
-        y=long(p.get_vadjustment().value + y)
+        x=int(p.get_hadjustment().get_value() + x)
+        y=int(p.get_vadjustment().get_value() + y)
 
         if event.button == 3:
             self.context_cb (timel=self, position=self.pixel2unit(x, absolute=True), height=y)
             return True
         elif event.button == 1:
-            if event.state & gtk.gdk.CONTROL_MASK:
+            if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
                 # Control-click: create annotation + edit it
                 ats=[ at
-                    for (at, p) in self.layer_position.iteritems()
-                    if (y >= p and y <= p + self.button_height) ]
+                      for (at, pos) in self.layer_position.items()
+                      if (y >= pos and y <= pos + self.button_height) ]
                 if not ats:
                     at = None
                 else:
@@ -2344,13 +2387,9 @@ class TimeLine(AdhocView):
                         self.quick_edit(el, button=b, callback=set_end_time)
                 return True
 
-            if event.type == gtk.gdk._2BUTTON_PRESS:
+            if event.type == Gdk.EventType._2BUTTON_PRESS:
                 # Double click in the layout: in all cases, goto the position
-                c=self.controller
-                pos = c.create_position (value=self.pixel2unit(x, absolute=True),
-                                         key=c.player.MediaTime,
-                                         origin=c.player.AbsolutePosition)
-                c.update_status (status="set", position=pos)
+                self.controller.update_status(status="seek", position=self.pixel2unit(x, absolute=True))
             else:
                 # Store x, y coordinates, to be able to decide upon button release.
                 self.layout_selection=[ [x, y], [None, None] ]
@@ -2375,8 +2414,8 @@ class TimeLine(AdhocView):
             # Convert x, y (relative to the layout allocation) into
             # values relative to the whole layout size
             p=widget.get_parent()
-            x=long(p.get_hadjustment().value + x)
-            y=long(p.get_vadjustment().value + y)
+            x=int(p.get_hadjustment().get_value() + x)
+            y=int(p.get_vadjustment().get_value() + y)
 
             if self.layout_selection[0][0] is None:
                 # Some bug here, should not happen except in the case
@@ -2393,7 +2432,7 @@ class TimeLine(AdhocView):
 
             if (abs(x2-x1) > 10 and abs(y2-y1) > 5):
                 # The cursor has been significantly moved. Consider it is a selection.
-                if not (event.state & gtk.gdk.CONTROL_MASK or event.state & gtk.gdk.SHIFT_MASK):
+                if not (event.get_state() & Gdk.ModifierType.CONTROL_MASK or event.get_state() & Gdk.ModifierType.SHIFT_MASK):
                     # Control or shift was not held: it is a new selection.
                     self.unselect_all()
 
@@ -2404,18 +2443,18 @@ class TimeLine(AdhocView):
                     #x=self.layout.child_get_property(widget, 'x')
                     #y=self.layout.child_get_property(widget, 'y')
                     # memory leak in container.child_get_property
-                    x,y = widget.window.get_position()
-                    w,h = widget.window.get_size()
-                    if ( x >= x1 and x + w <= x2
-                         and y >= y1 and y + h <= y2):
+                    w = widget.get_window()
+                    x, y = w.get_position()
+                    if ( x >= x1 and x + w.get_width() <= x2
+                         and y >= y1 and y + w.get_height() <= y2):
                         self.activate_annotation(widget.annotation, buttons=[ widget ])
                         res.append(widget)
 
                 if not res:
                     # No selected annotations. Propose to create a new one.
                     a=[ at
-                        for (at, p) in self.layer_position.iteritems()
-                        if (y1 >= p and y1 <= p + self.button_height) ]
+                        for (at, pos) in self.layer_position.items()
+                        if (y1 >= pos and y1 <= pos + self.button_height) ]
                     at = None
                     if a:
                         at = a[0]
@@ -2434,7 +2473,7 @@ class TimeLine(AdhocView):
                                            self.pixel2unit(x2, absolute=True))
                         return True
 
-                    menu=gtk.Menu()
+                    menu=Gtk.Menu()
                     for (label, action) in (
                         (_("Create a new annotation"), create),
                         (_("Zoom on region"), zoom),
@@ -2442,25 +2481,27 @@ class TimeLine(AdhocView):
                         ):
                         if at is None and action == create:
                             continue
-                        i=gtk.MenuItem(label)
+                        i=Gtk.MenuItem(label)
                         i.connect('activate', action)
                         menu.append(i)
                     menu.show_all()
-                    menu.popup(None, None, None, 0, gtk.get_current_event_time())
+                    menu.popup_at_pointer(None)
                 return True
         return False
 
     def draw_selection_rectangle(self, invert=False):
-        drawable=self.layout.bin_window
-        gc=drawable.new_gc(line_width=1, line_style=gtk.gdk.LINE_ON_OFF_DASH)
+        drawable=self.layout.get_bin_window()
+        ctx = drawable.cairo_create()
+        ctx.set_line_width(1)
+        ctx.set_dash([ 10 ])
 
         if self.layout_selection[1][0] is not None:
             # Invert the previous selection
             #col=pixmap.get_colormap().alloc_color(self.color)
             if invert:
-                gc.set_function(gtk.gdk.INVERT)
+                ctx.set_operator(cairo.OPERATOR_XOR)
             else:
-                gc.set_function(gtk.gdk.COPY)
+                ctx.set_operator(cairo.OPERATOR_OVER)
 
             x1=min(self.layout_selection[0][0], self.layout_selection[1][0])
             x2=max(self.layout_selection[0][0], self.layout_selection[1][0])
@@ -2468,21 +2509,23 @@ class TimeLine(AdhocView):
             y2=max(self.layout_selection[0][1], self.layout_selection[1][1])
 
             # Display the starting mark
-            drawable.draw_rectangle(gc, False, x1, y1, x2-x1, y2-y1)
+            ctx.rectangle(x1, y1, x2-x1, y2-y1)
+        ctx.stroke()
         return True
 
     # Draw rectangle during mouse movement
     def layout_motion_notify_cb(self, widget, event):
         if event.is_hint:
-            x, y, state = event.window.get_pointer()
+            pointer = event.get_window().get_pointer()
+            x, y, state = pointer[1], pointer[2], pointer[3]
         else:
             x = event.x
             y = event.y
-            state = event.state
+            state = event.get_state()
 
-        if state & gtk.gdk.BUTTON1_MASK:
+        if state & Gdk.ModifierType.BUTTON1_MASK:
             # Display current time
-            self.set_annotation(self.pixel2unit(self.adjustment.value + x, absolute=True))
+            self.set_annotation(self.pixel2unit(self.adjustment.get_value() + x, absolute=True))
             if self.layout_selection[0][0] is None:
                 return False
             if self.layout_selection[1][0] is not None:
@@ -2495,23 +2538,23 @@ class TimeLine(AdhocView):
         return True
 
     def layout_drag_motion_cb(self, widget, drag_context, x, y, timestamp):
-        t=self.pixel2unit(self.adjustment.value +  x, absolute=True)
-        w=drag_context.get_source_widget()
+        t=self.pixel2unit(self.adjustment.get_value() +  x, absolute=True)
+        w=Gtk.drag_get_source_widget(drag_context)
         precision=max(20, self.pixel2unit(1, absolute=False))
         try:
             w._icon.set_cursor(t, precision)
         except AttributeError:
             pass
-        actions=drag_context.actions
+        actions=drag_context.get_actions()
         # Dragging an annotation. Set the default action to ASK.
-        if (config.data.drag_type['annotation'][0][0] in drag_context.targets
-            and not actions in ( gtk.gdk.ACTION_LINK, gtk.gdk.ACTION_COPY, gtk.gdk.ACTION_MOVE )):
+        if (config.data.drag_type['annotation'][0][0] in drag_context.list_targets()
+            and not actions in ( Gdk.DragAction.LINK, Gdk.DragAction.COPY, Gdk.DragAction.MOVE )):
             # No single action was selected. Force ASK
-            drag_context.drag_status(gtk.gdk.ACTION_ASK, timestamp)
+            Gdk.drag_status(drag_context, Gdk.DragAction.ASK, timestamp)
         return True
 
     def layout_drag_leave_cb(self, widget, drag_context, timestamp):
-        w=drag_context.get_source_widget()
+        w=Gtk.drag_get_source_widget(drag_context)
         try:
             w._icon.set_cursor()
         except AttributeError:
@@ -2524,21 +2567,17 @@ class TimeLine(AdhocView):
         # This callback is called on a right-mouse-button press
         # in the timeline display. It is called with the
         # current position (in ms)
-        menu = gtk.Menu()
+        menu = Gtk.Menu()
 
         def popup_goto (win, position):
-            c=self.controller
-            pos = c.create_position (value=position,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-            self.controller.update_status (status="set", position=pos)
+            self.controller.update_status(status="seek", position=position)
             return True
 
         def create_annotation(win, position):
             # Determine annotation type
             at=None
-            h=long(height)
-            for a, p in self.layer_position.iteritems():
+            h=int(height)
+            for a, p in self.layer_position.items():
                 if h >= p and h < p + self.button_height:
                     at=a
                     break
@@ -2547,25 +2586,25 @@ class TimeLine(AdhocView):
             self.controller.create_annotation(position, at)
             return True
 
-        item = gtk.MenuItem(_("Position %s") % helper.format_time(position))
+        item = Gtk.MenuItem(_("Position %s") % helper.format_time(position))
         menu.append(item)
 
-        item = gtk.SeparatorMenuItem()
+        item = Gtk.SeparatorMenuItem()
         menu.append(item)
 
-        item = gtk.MenuItem(_("Go to..."))
+        item = Gtk.MenuItem(_("Go to..."))
         item.connect('activate', popup_goto, position)
         menu.append(item)
 
-        item = gtk.MenuItem(_("New annotation at player time"))
+        item = Gtk.MenuItem(_("New annotation at player time"))
         item.connect('activate', create_annotation, self.controller.player.current_position_value)
         menu.append(item)
 
-        item = gtk.MenuItem(_("New annotation at mouse position"))
+        item = Gtk.MenuItem(_("New annotation at mouse position"))
         item.connect('activate', create_annotation, position)
         menu.append(item)
 
-        item = gtk.MenuItem(_("Selection"))
+        item = Gtk.MenuItem(_("Selection"))
         if self.get_selected_annotation_widgets():
             item.set_submenu(self.selection_menu(popup=False))
         else:
@@ -2573,7 +2612,7 @@ class TimeLine(AdhocView):
         menu.append(item)
 
         menu.show_all()
-        menu.popup(None, None, None, 0, gtk.get_current_event_time())
+        menu.popup_at_pointer(None)
         return True
 
     def update_adjustment (self):
@@ -2584,27 +2623,25 @@ class TimeLine(AdhocView):
 
         width = self.maximum - self.minimum
 
-        #a.value=u2p(minimum)
-        a.lower=float(u2p(self.minimum, absolute=True))
-        a.upper=float(u2p(self.maximum, absolute=True))
-        a.step_increment=min(float(u2p(width / 100)), 10)
-        a.page_increment=float(u2p(width / 10))
-        a.page_size=min(a.upper, self.layout.get_allocation().width)
-        #print "Update: from %.2f to %.2f" % (a.lower, a.upper)
+        #a.set_value(u2p(minimum))
+        a.set_lower(float(u2p(self.minimum, absolute=True)))
+        a.set_upper(float(u2p(self.maximum, absolute=True)))
+        a.set_step_increment(min(float(u2p(width / 100)), 10))
+        a.set_page_increment(float(u2p(width / 10)))
+        a.set_page_size(min(a.get_upper(), self.layout.get_allocation().width))
+        #print "Update: from %.2f to %.2f" % (a.get_lower(), a.get_upper())
         a.changed ()
 
     def scale_event (self, widget=None, data=None):
-        if not self.update_lock.acquire(False) or self.layout.window is None:
+        if not self.update_lock.acquire(False) or self.layout.get_window() is None:
             # An update is pending. Ignore the scale event.
             return True
         self.update_adjustment ()
 
         # Update the layout and scale_layout dimensions
         width = self.unit2pixel(self.maximum - self.minimum)
-        (w, h) = self.layout.get_size ()
-        self.layout.set_size (width, h)
-        (w, h) = self.scale_layout.get_size ()
-        self.scale_layout.set_size (width, h)
+        self.layout.set_size (width, self.layout.get_size()[1])
+        self.scale_layout.set_size (width, self.scale_layout.get_size()[1])
 
         # Update the scale legend
         if config.data.preferences['expert-mode']:
@@ -2618,39 +2655,35 @@ class TimeLine(AdhocView):
     def layout_resize_event(self, widget=None, event=None, *p):
         """Recompute fraction_adj value when the layout size changes
         """
-        parent = self.layout.window
-        if not parent:
+        if not self.layout.get_window():
             return False
-        (w, h) = parent.get_size ()
         if self.maximum != self.minimum:
-            fraction=self.scale.value * float(w) / (self.maximum - self.minimum)
-            #print "Layout resize, reset fraction_adj to ", fraction, w
-            self.fraction_adj.value=fraction
-            self.zoom_combobox.child.set_text('%d%%' % long(100 * fraction))
+            fraction=self.scale.get_value() * float(self.layout.get_clip().width) / (self.maximum - self.minimum)
+            self.fraction_adj.set_value(fraction)
+            self.zoom_combobox.get_child().set_text('%d%%' % int(100 * fraction))
         return False
 
     def zoom_on_region(self, begin, end):
         # Deactivate autoscroll...
         self.set_autoscroll_mode(0)
 
-        (w, h) = self.layout.window.get_size ()
-        self.scale.value=1.3 * (end - begin) / w
+        self.scale.set_value(1.3 * (end - begin) / self.layout.get_clip().width or 100)
 
         # Center on annotation
-        self.center_on_position( (begin + end) / 2 )
+        self.center_on_position( int((begin + end) / 2) )
         return True
 
     def limit_display(self, minimum=None, maximum=None):
         """Limit the timeline to the specified or currently displayed area.
         """
         if minimum is None:
-            minimum=self.pixel2unit(self.adjustment.value, absolute=True)
-            maximum=self.pixel2unit(self.adjustment.value + self.adjustment.page_size, absolute=True)
+            minimum=self.pixel2unit(self.adjustment.get_value(), absolute=True)
+            maximum=self.pixel2unit(self.adjustment.get_value() + self.adjustment.get_page_size(), absolute=True)
         # Cannot do the assignment immediately, since unit2pixel uses self.minimum
         self.minimum = minimum
         self.maximum = maximum
         self.update_model(partial_update=True)
-        self.fraction_adj.value=1.0
+        self.fraction_adj.set_value(1.0)
         self.limit_navtools.show()
         return True
 
@@ -2664,7 +2697,7 @@ class TimeLine(AdhocView):
             # Not valid data either. Use a default value.
             self.maximum=42000
         self.update_model(partial_update=True)
-        self.fraction_adj.value=1.0
+        self.fraction_adj.set_value(1.0)
         self.limit_navtools.hide()
         return True
 
@@ -2673,45 +2706,44 @@ class TimeLine(AdhocView):
 
         fraction is > 0 and <= 1.
         """
-        parent = self.layout.window
-        if not parent:
+        if not self.layout.get_window():
             return True
-        (w, h) = parent.get_size ()
-        if forced_window_width != 0:
+        if forced_window_width > 0:
             w = forced_window_width
-
-        if w < 10:
+        else:
+            w = self.layout.get_clip().width
+        if w < 50:
             return True
 
         if self.minimum == self.maximum:
             return True
 
-        fraction = self.fraction_adj.value
-
+        fraction = self.fraction_adj.get_value()
         v = (self.maximum - self.minimum) / float(w) * fraction
+
+        logger.debug("fraction_event %f width %d forced %d -> 1 pixel = %d ms", fraction, w, forced_window_width, v)
+
         # New width in pixel
-        if v < 5 or (self.maximum - self.minimum) / v > 65535:
-            self.log(_("Cannot zoom more"))
+        if v < 2 or (self.maximum - self.minimum) / v > GObject.G_MAXINT:
+            self.log(_("Cannot zoom more %f") % v)
             return True
 
-        # Is it worth redrawing the whole timeline ?
-        if abs(v - self.scale.value) / float(self.scale.value) > 0.01:
-            self.scale.set_value(v)
-        self.zoom_combobox.child.set_text('%d%%' % long(100 * fraction))
+        self.scale.set_value(v)
+        self.zoom_combobox.get_child().set_text('%d%%' % int(100 * fraction))
 
         return True
 
     def layout_scroll_cb(self, widget=None, event=None):
         """Handle mouse scrollwheel events.
         """
-        if event.direction == gtk.gdk.SCROLL_RIGHT or event.direction == gtk.gdk.SCROLL_LEFT:
+        if event.direction == Gdk.ScrollDirection.RIGHT or event.direction == Gdk.ScrollDirection.LEFT:
             self.can_do_horizontal_scroll = True
 
-        zoom=event.state & gtk.gdk.CONTROL_MASK
+        zoom=event.get_state() & Gdk.ModifierType.CONTROL_MASK
         if zoom:
             # Control+scroll: zoom in/out
             a = self.fraction_adj
-            incr = a.page_increment
+            incr = a.get_page_increment()
             # Memorize mouse position (in units)
             # Get x, y (relative to the layout allocation)
             x,y=widget.get_pointer()
@@ -2719,32 +2751,27 @@ class TimeLine(AdhocView):
         else:
             # Plain scroll: scroll the timeline
             if (self.can_do_horizontal_scroll
-                and (event.direction == gtk.gdk.SCROLL_UP
-                     or event.direction == gtk.gdk.SCROLL_DOWN)):
+                and (event.direction == Gdk.ScrollDirection.UP
+                     or event.direction == Gdk.ScrollDirection.DOWN)):
                 # Vertical scroll with a device that knows how to do horizontal. Let's scroll vertically
                 a = self.vadjustment
-                incr = a.step_increment
+                incr = a.get_step_increment()
             else:
                 a = self.adjustment
-                incr = a.step_increment
-
-        if event.direction == gtk.gdk.SCROLL_DOWN or event.direction == gtk.gdk.SCROLL_RIGHT:
-            val = a.value + incr
-            if val > a.upper - a.page_size:
-                val = a.upper - a.page_size
-            if val != a.value:
-                a.value = val
-
-        elif event.direction == gtk.gdk.SCROLL_UP or event.direction == gtk.gdk.SCROLL_LEFT:
-            val = a.value - incr
-            if val < a.lower:
-                val = a.lower
-            if val != a.value:
-                a.value = val
+                incr = a.get_step_increment()
+
+        if event.direction == Gdk.ScrollDirection.DOWN or event.direction == Gdk.ScrollDirection.RIGHT:
+            a.set_value(helper.clamp(a.get_value() + incr,
+                                     a.get_lower(),
+                                     a.get_upper() - a.get_page_size()))
+        elif event.direction == Gdk.ScrollDirection.UP or event.direction == Gdk.ScrollDirection.LEFT:
+            a.set_value(helper.clamp(a.get_value() - incr,
+                                     a.get_lower(),
+                                     a.get_upper() - a.get_page_size()))
 
         # Try to preserve the mouse position when zooming
         if zoom:
-            self.adjustment.value=self.unit2pixel(mouse_position, absolute=True) - x
+            self.adjustment.set_value(self.unit2pixel(mouse_position, absolute=True) - x)
         return True
 
     def redraw_event(self, widget=None, data=None):
@@ -2760,25 +2787,25 @@ class TimeLine(AdhocView):
                                   self.layer_position[w.annotation.type])
             return True
 
-        if self.old_scale_value != self.scale.value:
-            self.old_scale_value = self.scale.value
+        if self.old_scale_value != self.scale.get_value():
+            self.old_scale_value = self.scale.get_value()
             # Reposition all buttons
             self.layout.foreach(move_widget)
-            self.layout.remove(self.current_marker)
             # Redraw marks
             self.scale_layout.foreach(self.scale_layout.remove)
             self.draw_marks ()
-            # Redraw current mark
-            self.draw_current_mark ()
-            return True
+            # Notify the layout (and its children) that size has
+            # changed.
+            self.layout.queue_resize()
+            self.scale_layout.queue_resize()
         return False
 
     def resize_legend_widget(self, layout):
-        width=0
+        width=120
         for c in layout.get_children():
             if not isinstance(c, AnnotationTypeWidget):
                 continue
-            width=max(width, c.width)
+            width=max(width, c.width or 5)
 
         def resize(b, w):
             if isinstance(b, AnnotationTypeWidget):
@@ -2805,7 +2832,7 @@ class TimeLine(AdhocView):
         if layout.get_parent() is not None:
             p = layout.get_parent().get_parent()
             if p is not None:
-                layout.get_parent().get_parent().set_position (width + 60)
+                p.set_position (width + 60)
 
     def restrict_playing(self, at, widget=None):
         """Restrict playing to the given annotation-type.
@@ -2836,7 +2863,6 @@ class TimeLine(AdhocView):
 
         Its content may have changed.
         """
-        width=0
         height=0
 
         def navigate(b, event, direction, typ):
@@ -2854,7 +2880,7 @@ class TimeLine(AdhocView):
                 l.sort(key=lambda a: a.fragment.begin, reverse=True)
             if l:
                 a=l[0]
-                self.controller.update_status("set", position=a.fragment.begin)
+                self.controller.update_status("seek", position=a.fragment.begin)
                 self.set_annotation(a)
             return True
 
@@ -2865,10 +2891,10 @@ class TimeLine(AdhocView):
         def annotationtype_keypress_handler(widget, event, at):
             if widget.keypress(widget, event, at):
                 return True
-            elif event.keyval == gtk.keysyms.a:
+            elif event.keyval == Gdk.KEY_a:
                 # Adjust bounds
                 self.controller.gui.adjust_annotationtype_bounds(at)
-            elif event.keyval == gtk.keysyms.Return:
+            elif event.keyval == Gdk.KEY_Return:
                 def set_end_time(action, an):
                     if action == 'validate':
                         v = self.controller.player.current_position_value
@@ -2885,18 +2911,17 @@ class TimeLine(AdhocView):
                         self.controller.notify('AnnotationDelete', annotation=an)
                     return True
 
-                if (self.controller.player.status != self.controller.player.PlayingStatus
-                    and self.controller.player.status != self.controller.player.PauseStatus):
+                if self.controller.player.is_playing():
                     return True
                 # Create a new annotation
-                el=self.controller.create_annotation(position=long(self.controller.player.current_position_value),
+                el=self.controller.create_annotation(position=int(self.controller.player.current_position_value),
                                                      type=widget.annotationtype)
                 if el is not None:
                     b=self.create_annotation_widget(el)
                     b.show()
                     self.quick_edit(el, button=b, callback=set_end_time)
                 return True
-            elif event.keyval == gtk.keysyms.space:
+            elif event.keyval == Gdk.KEY_space:
                 self.restrict_playing(at, widget)
                 return True
             return False
@@ -2904,7 +2929,7 @@ class TimeLine(AdhocView):
         def annotationtype_buttonpress_handler(widget, event, t):
             """Display the popup menu when right-clicking on annotation type.
             """
-            if event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS:
+            if event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
                 menu=advene.gui.popup.Menu(t, controller=self.controller)
                 menu.popup()
                 return True
@@ -2927,10 +2952,10 @@ class TimeLine(AdhocView):
 
                 a=self.legend.get_vadjustment()
                 y=self.legend.child_get_property(button, 'y')
-                if y < a.value:
-                    pos=max(a.lower, y)
-                elif y > a.value + a.page_size:
-                    pos=min(a.upper - a.page_size, y)
+                if y < a.get_value():
+                    pos=max(a.get_lower(), y)
+                elif y > a.get_value() + a.get_page_size():
+                    pos=min(a.get_upper() - a.get_page_size(), y)
                 else:
                     pos=None
                 if pos is not None:
@@ -2948,14 +2973,14 @@ class TimeLine(AdhocView):
 
             # The button can receive drops (to transmute annotations)
             b.connect('drag-data-received', self.annotation_type_drag_received_cb)
-            b.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                            gtk.DEST_DEFAULT_HIGHLIGHT |
-                            gtk.DEST_DEFAULT_ALL,
-                            config.data.drag_type['annotation'] +
-                            config.data.drag_type['annotation-type'] +
-                            config.data.drag_type['timestamp'] +
-                            config.data.drag_type['color'],
-                            gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_MOVE)
+            b.drag_dest_set(Gtk.DestDefaults.MOTION |
+                            Gtk.DestDefaults.HIGHLIGHT |
+                            Gtk.DestDefaults.ALL,
+                            config.data.get_target_types('annotation',
+                                                         'annotation-type',
+                                                         'timestamp',
+                                                         'color'),
+                            Gdk.DragAction.COPY | Gdk.DragAction.LINK | Gdk.DragAction.MOVE)
             # The button can generate drags (to change annotation type order)
             enable_drag_source(b, t, self.controller)
 
@@ -2971,6 +2996,7 @@ class TimeLine(AdhocView):
 
             # At the left of the annotation type : restrict_playing button
             p=get_pixmap_button('play.png', restrict_playing, t, b)
+            p.get_style_context().add_class('restrict_playing_button')
             p.set_playing = set_playing.__get__(p)
             p.annotationtype=t
             p.set_size_request(20, self.button_height)
@@ -2978,22 +3004,22 @@ class TimeLine(AdhocView):
             layout.put (p, 0, self.layer_position[t])
 
             # At the right of the annotation type : prev/next buttons
-            nav=gtk.Arrow(gtk.ARROW_LEFT, gtk.SHADOW_IN)
+            nav=Gtk.Arrow(Gtk.ArrowType.LEFT, Gtk.ShadowType.IN)
             nav.set_size_request(16, self.button_height)
             nav.annotationtype=t
             nav.set_tooltip_text(_('Goto previous annotation'))
-            eb=gtk.EventBox()
+            eb=Gtk.EventBox()
             eb.connect('button-press-event', navigate, 'prev', t)
             eb.add(nav)
             eb.prev=True
             # Put it in an arbitrary location. It will be moved by resize_legend_widget
             layout.put (eb, 102, self.layer_position[t])
 
-            nav=gtk.Arrow(gtk.ARROW_RIGHT, gtk.SHADOW_IN)
+            nav=Gtk.Arrow(Gtk.ArrowType.RIGHT, Gtk.ShadowType.IN)
             nav.set_size_request(16, self.button_height)
             nav.annotationtype=t
             nav.set_tooltip_text(_('Goto next annotation'))
-            eb=gtk.EventBox()
+            eb=Gtk.EventBox()
             eb.connect('button-press-event', navigate, 'next', t)
             eb.add(nav)
             eb.next=True
@@ -3001,8 +3027,8 @@ class TimeLine(AdhocView):
             layout.put (eb, 112, self.layer_position[t])
 
         # Add the 'New type' button at the end
-        b=gtk.Button()
-        l=gtk.Label()
+        b=Gtk.Button()
+        l=Gtk.Label()
         l.set_markup('<b><span style="normal">%s</span></b>' % _('+'))
         l.modify_font(self.annotation_type_font)
         b.add(l)
@@ -3015,24 +3041,25 @@ class TimeLine(AdhocView):
         b.connect('clicked', self.create_annotation_type)
         # The button can receive drops (to create type and transmute annotations)
         b.connect('drag-data-received', self.new_annotation_type_drag_received_cb)
-        b.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                        gtk.DEST_DEFAULT_HIGHLIGHT |
-                        gtk.DEST_DEFAULT_ALL,
-                        config.data.drag_type['annotation']
-                        + config.data.drag_type['timestamp'],
-                        gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_MOVE)
-
-        layout.set_size (width + 20, height)
+        b.drag_dest_set(Gtk.DestDefaults.MOTION |
+                        Gtk.DestDefaults.HIGHLIGHT |
+                        Gtk.DestDefaults.ALL,
+                        config.data.get_target_types('annotation', 'timestamp'),
+                        Gdk.DragAction.LINK | Gdk.DragAction.MOVE)
+
+        # Set a default size. We will resize it anyway.
+        layout.set_size(200, height)
+        layout.show()
         self.resize_legend_widget(layout)
         return
 
     def get_full_widget(self):
         """Return the layout with its controllers.
         """
-        vbox = gtk.VBox()
+        vbox = Gtk.VBox()
         vbox.connect('key-press-event', self.layout_key_press_cb)
 
-        hb=gtk.HBox()
+        hb=Gtk.HBox()
         toolbar = self.get_toolbar()
         hb.add(toolbar)
 
@@ -3042,8 +3069,8 @@ class TimeLine(AdhocView):
         # but this prevents DND from working correctly.
         def drag_sent(widget, context, selection, targetType, eventTime, name):
             if targetType == config.data.target_type['adhoc-view']:
-                selection.set(selection.target, 8,
-                              urllib.urlencode( {
+                selection.set(selection.get_target(), 8,
+                              urllib.parse.urlencode( {
                             'name': name,
                             'master': self.controller.gui.get_adhoc_view_instance_id(self),
                             } ).encode('utf8'))
@@ -3060,29 +3087,29 @@ class TimeLine(AdhocView):
             v.set_master_view(self)
             return True
 
-        b=get_small_stock_button(gtk.STOCK_FIND, open_annotation_display)
+        b=get_small_stock_button(Gtk.STOCK_FIND, open_annotation_display)
         b.set_tooltip_text(_('Open an annotation display view'))
         b.connect('drag-data-get', drag_sent, 'annotationdisplay')
-        b.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                          config.data.drag_type['adhoc-view'], gtk.gdk.ACTION_COPY)
-        hb.pack_start(b, expand=False)
+        b.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                          config.data.get_target_types('adhoc-view'), Gdk.DragAction.COPY)
+        hb.pack_start(b, False, True, 0)
 
         b=get_pixmap_button('montage.png', open_slave_montage)
         b.set_tooltip_text(_('Open a slave montage view (coordinated zoom level)'))
         b.connect('drag-data-get', drag_sent, 'montage')
-        b.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                          config.data.drag_type['adhoc-view'], gtk.gdk.ACTION_COPY)
-        hb.pack_start(b, expand=False)
+        b.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                          config.data.get_target_types('adhoc-view'), Gdk.DragAction.COPY)
+        hb.pack_start(b, False, True, 0)
 
         if self.controller.gui:
             self.player_toolbar=self.controller.gui.get_player_control_toolbar()
             hb.add(self.player_toolbar)
 
-        vbox.pack_start(hb, expand=False)
+        vbox.pack_start(hb, False, True, 0)
 
         vbox.add (self.get_packed_widget())
 
-        vbox.pack_start(self.quickview, expand=False)
+        vbox.pack_start(self.quickview, False, True, 0)
 
         return vbox
 
@@ -3106,18 +3133,34 @@ class TimeLine(AdhocView):
                                                    label=_("<b>Statistics about current selection</b>\n\n"))
             return True
 
-        m=gtk.Menu()
+        def select_range(m, sel, same_type=True):
+            """Select annotations in the same range
+            """
+            begin=min( [ w.annotation.fragment.begin for w in sel ] )
+            end=max( [ w.annotation.fragment.end for w in sel ] )
+            current = set(w.annotation for w in sel)
+            if same_type:
+                source = sel[0].annotation.type.annotations
+            else:
+                source = sel[0].annotation.ownerPackage.annotations
+            for a in source:
+                if (a.fragment.begin >= begin
+                    and a.fragment.end <= end
+                    and a not in current):
+                    self.activate_annotation(a)
+
+        m=Gtk.Menu()
         l=self.get_selected_annotation_widgets()
         n=len(l)
         if n == 0:
-            i=gtk.MenuItem(_('No selected annotation'))
+            i=Gtk.MenuItem(_('No selected annotation'))
             m.append(i)
             i.set_sensitive(False)
         else:
-            i=gtk.MenuItem(_('%d selected annotation(s)') % n)
+            i=Gtk.MenuItem(_('%d selected annotation(s)') % n)
             m.append(i)
             i.set_sensitive(False)
-            i=gtk.SeparatorMenuItem()
+            i=Gtk.SeparatorMenuItem()
             m.append(i)
 
             for (label, action) in (
@@ -3132,69 +3175,73 @@ class TimeLine(AdhocView):
                 (_('Merge annotations'), self.selection_merge),
                 (_('Display statistics'), display_stats),
                 ):
-                i=gtk.MenuItem(label)
+                i=Gtk.MenuItem(label)
                 i.connect('activate', action, l)
                 m.append(i)
 
+        if n >= 2:
+            i = Gtk.MenuItem(_('Select all annotations of the same type in this time range'))
+            i.connect('activate', select_range, l, True)
+            m.insert(i, 3)
+            i = Gtk.MenuItem(_('Select all annotations in this time range'))
+            i.connect('activate', select_range, l, False)
+            m.insert(i, 3)
+
         m.show_all()
         if popup:
-            m.popup(None, None, None, 0, gtk.get_current_event_time())
+            m.popup_at_pointer(None)
         return m
 
     def get_packed_widget (self):
         """Return the widget packed into a scrolledwindow."""
-        vbox = gtk.VBox ()
+        vbox = Gtk.VBox ()
 
-        content_pane = gtk.HPaned ()
+        content_pane = Gtk.Paned()
+        content_pane.set_name('content_pane')
 
         # The layout can receive drops
         self.legend.connect('drag-data-received', self.legend_drag_received)
-        self.legend.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                  gtk.DEST_DEFAULT_HIGHLIGHT |
-                                  gtk.DEST_DEFAULT_ALL,
-                                  config.data.drag_type['annotation-type'],
-                                  gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK)
-
-        sw_legend = gtk.ScrolledWindow ()
-        sw_legend.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS)
-        sw_legend.set_placement(gtk.CORNER_TOP_RIGHT)
-        sw_legend.add (self.legend)
-        content_pane.add1 (sw_legend)
+        self.legend.drag_dest_set(Gtk.DestDefaults.MOTION |
+                                  Gtk.DestDefaults.HIGHLIGHT |
+                                  Gtk.DestDefaults.ALL,
+                                  config.data.get_target_types('annotation-type'),
+                                  Gdk.DragAction.COPY | Gdk.DragAction.LINK)
+
+        sw_legend = Gtk.ScrolledWindow ()
+        sw_legend.set_name('sw_legend')
+        sw_legend.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.ALWAYS)
+        sw_legend.set_placement(Gtk.CornerType.TOP_RIGHT)
+        sw_legend.add(self.legend)
+        content_pane.add1(sw_legend)
 
         # Vertical auto-scroll when DNDing
         def scroll_on_drag(widget, drag_context, x, y, timestamp, vertical=True):
             adj=widget.get_adjustment()
-            v=adj.value
+            v=adj.get_value()
             if vertical:
                 pointer=y
-                ref=widget.get_allocation().height / 2
+                ref=int(widget.get_allocation().height / 2)
             else:
                 pointer=x
-                ref=widget.get_allocation().width / 2
+                ref=int(widget.get_allocation().width / 2)
             if pointer > ref:
                 # Try to scroll down
-                v += max(adj.step_increment, adj.page_increment / 3)
+                v += max(adj.get_step_increment(), int(adj.get_page_increment() / 3))
             else:
-                v -= max(adj.step_increment, adj.page_increment / 3)
-            if v < 0:
-                v = 0
-            elif v > adj.upper - adj.page_size:
-                v=adj.upper - adj.page_size
-            adj.value=v
+                v -= max(adj.get_step_increment(), int(adj.get_page_increment() / 3))
+            adj.set_value(helper.clamp(v, 0, adj.get_upper() - adj.get_page_size()))
             return True
         sb=sw_legend.get_vscrollbar()
-        sb.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                         gtk.DEST_DEFAULT_HIGHLIGHT |
-                         gtk.DEST_DEFAULT_ALL,
-                         config.data.drag_type['annotation']
-                         + config.data.drag_type['timestamp']
-                         + config.data.drag_type['annotation-type']
-                         ,
-                         gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
+        sb.drag_dest_set(Gtk.DestDefaults.MOTION |
+                         Gtk.DestDefaults.HIGHLIGHT |
+                         Gtk.DestDefaults.ALL,
+                         config.data.get_target_types('annotation', 'timestamp', 'annotation-type'),
+                         Gdk.DragAction.COPY | Gdk.DragAction.MOVE)
         sb.connect('drag-motion', scroll_on_drag, True)
 
-        sw_layout = gtk.ScrolledWindow ()
-        sw_layout.set_policy (gtk.POLICY_ALWAYS, gtk.POLICY_AUTOMATIC)
+        sw_layout = Gtk.ScrolledWindow ()
+        sw_layout.set_name('sw_layout')
+        sw_layout.set_policy (Gtk.PolicyType.ALWAYS, Gtk.PolicyType.AUTOMATIC)
         sw_layout.set_hadjustment (self.adjustment)
         self.vadjustment = sw_legend.get_vadjustment()
         sw_layout.set_vadjustment (self.vadjustment)
@@ -3205,42 +3252,37 @@ class TimeLine(AdhocView):
         sw_layout.get_vadjustment().step_increment=10
 
         sb=sw_layout.get_hscrollbar()
-        sb.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                         gtk.DEST_DEFAULT_HIGHLIGHT |
-                         gtk.DEST_DEFAULT_ALL,
-                         config.data.drag_type['annotation']
-                         + config.data.drag_type['timestamp']
-                         + config.data.drag_type['annotation-type']
-                         ,
-                         gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
+        sb.drag_dest_set(Gtk.DestDefaults.MOTION |
+                         Gtk.DestDefaults.HIGHLIGHT |
+                         Gtk.DestDefaults.ALL,
+                         config.data.get_target_types('annotation', 'timestamp', 'annotation-type'),
+                         Gdk.DragAction.COPY | Gdk.DragAction.MOVE)
         sb.connect('drag-motion', scroll_on_drag, False)
 
         sb=sw_layout.get_vscrollbar()
-        sb.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                         gtk.DEST_DEFAULT_HIGHLIGHT |
-                         gtk.DEST_DEFAULT_ALL,
-                         config.data.drag_type['annotation']
-                         + config.data.drag_type['timestamp']
-                         + config.data.drag_type['annotation-type']
-                         ,
-                         gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE)
+        sb.drag_dest_set(Gtk.DestDefaults.MOTION |
+                         Gtk.DestDefaults.HIGHLIGHT |
+                         Gtk.DestDefaults.ALL,
+                         config.data.get_target_types('annotation', 'timestamp', 'annotation-type'),
+                         Gdk.DragAction.COPY | Gdk.DragAction.MOVE)
         sb.connect('drag-motion', scroll_on_drag)
 
         # Now build the scale_pane
-        scale_pane = gtk.HPaned()
+        scale_pane = Gtk.Paned()
+        scale_pane.set_name('scale_pane')
 
-        vb=gtk.VBox()
-        self.scale_label = gtk.Label('Scale')
-        vb.pack_start(self.scale_label, expand=False)
+        vb=Gtk.VBox()
+        self.scale_label = Gtk.Label(label='Scale')
+        vb.pack_start(self.scale_label, False, True, 0)
         if not config.data.preferences['expert-mode']:
             self.scale_label.hide()
             self.scale_label.set_no_show_all(True)
 
-        self.limit_navtools = gtk.HBox()
+        self.limit_navtools = Gtk.HBox()
 
         def navigate(button, event, direction):
             # Navigate to the previous/next page, when display is limited
-            page_duration=self.pixel2unit(self.adjustment.page_size, absolute=False)
+            page_duration=self.pixel2unit(self.adjustment.get_page_size(), absolute=False)
             if direction == -1:
                 # Previous page
                 mi = max(self.minimum - page_duration, 0)
@@ -3253,25 +3295,25 @@ class TimeLine(AdhocView):
             return True
 
         # At the right of the annotation type : prev/next buttons
-        nav=gtk.Arrow(gtk.ARROW_LEFT, gtk.SHADOW_IN)
+        nav=Gtk.Arrow(Gtk.ArrowType.LEFT, Gtk.ShadowType.IN)
         nav.set_size_request(16, 16)
         nav.set_tooltip_text(_('Goto previous page'))
-        eb=gtk.EventBox()
+        eb=Gtk.EventBox()
         eb.connect('button-press-event', navigate, -1)
         eb.add(nav)
-        self.limit_navtools.pack_start(eb, expand=False)
+        self.limit_navtools.pack_start(eb, False, True, 0)
 
-        b=get_small_stock_button(gtk.STOCK_ZOOM_100, self.unlimit_display)
+        b=get_small_stock_button(Gtk.STOCK_ZOOM_100, self.unlimit_display)
         b.set_tooltip_text(_("Display whole movie"))
-        self.limit_navtools.pack_start(b, expand=False)
+        self.limit_navtools.pack_start(b, False, True, 0)
 
-        nav=gtk.Arrow(gtk.ARROW_RIGHT, gtk.SHADOW_IN)
+        nav=Gtk.Arrow(Gtk.ArrowType.RIGHT, Gtk.ShadowType.IN)
         nav.set_size_request(16, 16)
         nav.set_tooltip_text(_('Goto next page'))
-        eb=gtk.EventBox()
+        eb=Gtk.EventBox()
         eb.connect('button-press-event', navigate, +1)
         eb.add(nav)
-        self.limit_navtools.pack_start(eb, expand=False)
+        self.limit_navtools.pack_start(eb, False, True, 0)
 
         # Show contained widgets
         self.limit_navtools.show_all()
@@ -3282,8 +3324,9 @@ class TimeLine(AdhocView):
 
         scale_pane.add1(vb)
 
-        sw_scale=gtk.ScrolledWindow()
-        sw_scale.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER)
+        sw_scale=Gtk.ScrolledWindow()
+        sw_scale.set_name('sw_scale')
+        sw_scale.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER)
         sw_scale.set_hadjustment (sw_layout.get_hadjustment())
         sw_scale.add(self.scale_layout)
         scale_pane.add2(sw_scale)
@@ -3297,7 +3340,8 @@ class TimeLine(AdhocView):
         scale_pane.connect('button-press-event', ignore)
         scale_pane.connect('button-release-event', ignore)
 
-        self.global_pane=gtk.VPaned()
+        self.global_pane=Gtk.Paned.new(Gtk.Orientation.VERTICAL)
+        self.global_pane.set_name('global_pane')
 
         self.global_pane.add1(scale_pane)
         self.global_pane.add2(content_pane)
@@ -3307,15 +3351,15 @@ class TimeLine(AdhocView):
 
         vbox.add (self.global_pane)
 
-        (w, h) = self.legend.get_size ()
-        content_pane.set_position (max(w, 100))
+        content_pane.set_position (max(self.legend.get_size()[0], 100))
 
-        self.inspector_pane=gtk.HPaned()
+        self.inspector_pane=Gtk.Paned()
+        self.inspector_pane.set_name('inspector_pane')
         self.inspector_pane.pack1(vbox, resize=True, shrink=True)
         a=AnnotationDisplay(controller=self.controller)
-        self.inspector_frame=gtk.Frame()
-        hbox = gtk.HBox()
-        hbox.pack_start(gtk.Label(_('Inspector')), expand=False)
+        self.inspector_frame=Gtk.Frame()
+        hbox = Gtk.HBox()
+        hbox.pack_start(Gtk.Label(_('Inspector')), False, False, 0)
         def unlock(b):
             b.hide()
             self.locked_inspector = False
@@ -3323,7 +3367,7 @@ class TimeLine(AdhocView):
         self.locked_icon = get_pixmap_button('small_locked.png', unlock)
         self.locked_icon.set_tooltip_text(_("Inspector locked. Click here or in the timeline background to unlock."))
         self.locked_icon.set_no_show_all(True)
-        hbox.pack_start(self.locked_icon, expand=False)
+        hbox.pack_start(self.locked_icon, False, True, 0)
         self.inspector_frame.set_label_widget(hbox)
 
         self.inspector_frame.add(a.widget)
@@ -3331,16 +3375,15 @@ class TimeLine(AdhocView):
         self.controller.gui.register_view (a)
         a.set_master_view(self)
         a.widget.show_all()
-
         return self.inspector_pane
 
     def get_toolbar(self):
-        tb=gtk.Toolbar()
-        tb.set_style(gtk.TOOLBAR_ICONS)
+        tb=Gtk.Toolbar()
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
 
         def remove_drag_received(widget, context, x, y, selection, targetType, time):
             if targetType == config.data.target_type['annotation']:
-                sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+                sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
                 if sources:
                     batch_id=object()
                     for a in sources:
@@ -3348,13 +3391,13 @@ class TimeLine(AdhocView):
                 return True
             return False
 
-        b=gtk.ToolButton(stock_id=gtk.STOCK_DELETE)
+        b=Gtk.ToolButton(stock_id=Gtk.STOCK_DELETE)
         b.set_tooltip_text(_('Delete the selected annotations or drop an annotation here to delete it.'))
-        b.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                        gtk.DEST_DEFAULT_HIGHLIGHT |
-                        gtk.DEST_DEFAULT_ALL,
-                        config.data.drag_type['annotation'],
-                        gtk.gdk.ACTION_MOVE )
+        b.drag_dest_set(Gtk.DestDefaults.MOTION |
+                        Gtk.DestDefaults.HIGHLIGHT |
+                        Gtk.DestDefaults.ALL,
+                        config.data.get_target_types('annotation'),
+                        Gdk.DragAction.MOVE )
         b.connect('drag-data-received', remove_drag_received)
         b.connect('clicked', self.selection_delete)
         tb.insert(b, -1)
@@ -3362,23 +3405,24 @@ class TimeLine(AdhocView):
         # Annotation-type selection button
         def annotationtype_selection_drag_received(widget, context, x, y, selection, targetType, time):
             if targetType == config.data.target_type['annotation-type']:
-                source=self.controller.package.annotationTypes.get(unicode(selection.data, 'utf8'))
+                source=self.controller.package.annotationTypes.get(str(selection.get_data(), 'utf8'))
                 if source in self.annotationtypes:
                     self.annotationtypes.remove(source)
+                    self.annotationtypes_selection = self.annotationtypes
                     self.update_model(partial_update=True)
             else:
-                print 'Unknown target type for drop: %d' % targetType
+                logger.warn('Unknown target type for drop: %d' % targetType)
             return True
 
-        b=gtk.ToolButton(stock_id=gtk.STOCK_SELECT_COLOR)
+        b=Gtk.ToolButton(stock_id=Gtk.STOCK_SELECT_COLOR)
         b.set_tooltip_text(_('Drag an annotation type here to remove it from display.\nClick to edit all displayed types'))
         b.connect('clicked', self.edit_annotation_types)
         b.connect('drag-data-received', annotationtype_selection_drag_received)
-        b.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                        gtk.DEST_DEFAULT_HIGHLIGHT |
-                        gtk.DEST_DEFAULT_ALL,
-                        config.data.drag_type['annotation-type'],
-                        gtk.gdk.ACTION_MOVE | gtk.gdk.ACTION_COPY)
+        b.drag_dest_set(Gtk.DestDefaults.MOTION |
+                        Gtk.DestDefaults.HIGHLIGHT |
+                        Gtk.DestDefaults.ALL,
+                        config.data.get_target_types('annotation-type'),
+                        Gdk.DragAction.MOVE | Gdk.DragAction.COPY)
         tb.insert(b, -1)
 
         # Selection menu
@@ -3391,29 +3435,25 @@ class TimeLine(AdhocView):
         # Relation display toggle
         def handle_toggle(b, option):
             self.options[option]=b.get_active()
-            if option == 'display-all-relations':
-                region = self.layout.window.get_clip_region()
-                if region:
-                    self.layout.window.invalidate_region(region, True)
             return True
 
-        self.display_relations_toggle=gtk.ToggleToolButton(stock_id=gtk.STOCK_REDO)
+        self.display_relations_toggle=Gtk.ToggleToolButton(stock_id=Gtk.STOCK_REDO)
         self.display_relations_toggle.set_tooltip_text(_('Display relations'))
         self.display_relations_toggle.set_active(self.options['display-relations'])
         self.display_relations_toggle.connect('toggled', handle_toggle, 'display-relations')
         tb.insert(self.display_relations_toggle, -1)
 
-        self.display_all_relations_toggle=gtk.ToggleToolButton(stock_id=gtk.STOCK_INFO)
+        self.display_all_relations_toggle=Gtk.ToggleToolButton(stock_id=Gtk.STOCK_INFO)
         self.display_all_relations_toggle.set_tooltip_text(_('Display all relations'))
         self.display_all_relations_toggle.set_active(self.options['display-all-relations'])
         self.display_all_relations_toggle.connect('toggled', handle_toggle, 'display-all-relations')
         tb.insert(self.display_all_relations_toggle, -1)
 
         # Separator
-        tb.insert(gtk.SeparatorToolItem(), -1)
+        tb.insert(Gtk.SeparatorToolItem(), -1)
 
         def zoom_entry(entry):
-            f=unicode(entry.get_text())
+            f=entry.get_text()
 
             i=re.findall(r'\d+', f)
             if i:
@@ -3421,7 +3461,7 @@ class TimeLine(AdhocView):
             else:
                 return True
             pos=self.get_middle_position()
-            self.fraction_adj.value=f
+            self.fraction_adj.set_value(f)
             self.set_middle_position(pos)
             return True
 
@@ -3429,61 +3469,60 @@ class TimeLine(AdhocView):
             v=combo.get_current_element()
             if isinstance(v, float):
                 pos=self.get_middle_position()
-                self.fraction_adj.value=v
+                self.fraction_adj.set_value(v)
                 self.set_middle_position(pos)
             return True
 
         def zoom(i, factor):
             pos=self.get_middle_position()
-            self.fraction_adj.set_value(self.fraction_adj.value * factor)
+            self.fraction_adj.set_value(self.fraction_adj.get_value() * factor)
             self.set_middle_position(pos)
             return True
 
-        i=gtk.ToolButton(stock_id=gtk.STOCK_ZOOM_OUT)
+        i=Gtk.ToolButton(stock_id=Gtk.STOCK_ZOOM_OUT)
         i.connect('clicked', zoom, 1.3)
         i.set_tooltip_text(_('Zoom out'))
         tb.insert(i, -1)
 
-        i=gtk.ToolButton(stock_id=gtk.STOCK_ZOOM_IN)
+        i=Gtk.ToolButton(stock_id=Gtk.STOCK_ZOOM_IN)
         i.connect('clicked', zoom, .7)
         i.set_tooltip_text(_('Zoom in'))
         tb.insert(i, -1)
 
         self.zoom_combobox=dialog.list_selector_widget(members=[
-                ( f, '%d%%' % long(100*f) )
+                ( f, '%d%%' % int(100*f) )
                 for f in [
                     (1.0 / pow(1.5, n)) for n in range(0, 10)
                     ]
                 ],
                                                        entry=True,
                                                        callback=zoom_change)
-        self.zoom_combobox.child.connect('activate', zoom_entry)
-        self.zoom_combobox.child.set_width_chars(4)
-        i=gtk.ToolItem()
+        self.zoom_combobox.get_child().connect('activate', zoom_entry)
+        self.zoom_combobox.get_child().set_width_chars(4)
+        i=Gtk.ToolItem()
         i.add(self.zoom_combobox)
         tb.insert(i, -1)
 
-        i=gtk.ToolButton(stock_id=gtk.STOCK_ZOOM_100)
+        i=Gtk.ToolButton(stock_id=Gtk.STOCK_ZOOM_100)
         i.connect('clicked', lambda i: self.fraction_adj.set_value(1.0))
         tb.insert(i, -1)
 
-        tb.insert(gtk.SeparatorToolItem(), -1)
+        tb.insert(Gtk.SeparatorToolItem(), -1)
 
-        i=gtk.ToolItem()
+        i=Gtk.ToolItem()
         i.add(self.autoscroll_choice)
         tb.insert(i, -1)
 
         def center_on_current_position(*p):
-            if (self.controller.player.status == self.controller.player.PlayingStatus
-                or self.controller.player.status == self.controller.player.PauseStatus):
+            if self.controller.player.is_playing():
                 self.center_on_position(self.current_position)
             return True
 
         for tooltip, icon, callback in (
-            (_('Preferences'), gtk.STOCK_PREFERENCES, self.edit_preferences),
-            (_('Center on current player position.'), gtk.STOCK_JUSTIFY_CENTER, center_on_current_position),
+            (_('Preferences'), Gtk.STOCK_PREFERENCES, self.edit_preferences),
+            (_('Center on current player position.'), Gtk.STOCK_JUSTIFY_CENTER, center_on_current_position),
             ):
-            b=gtk.ToolButton(stock_id=icon)
+            b=Gtk.ToolButton(stock_id=icon)
             b.set_tooltip_text(tooltip)
             b.connect('clicked', callback)
             tb.insert(b, -1)
@@ -3495,12 +3534,12 @@ class TimeLine(AdhocView):
                 self.controller.gui.player_toolbar.buttons['loop'].set_active(False)
             return True
 
-        self.loop_toggle_button=gtk.ToggleToolButton(stock_id=gtk.STOCK_REFRESH)
+        self.loop_toggle_button=Gtk.ToggleToolButton(stock_id=Gtk.STOCK_REFRESH)
         self.loop_toggle_button.connect('toggled', loop_toggle_cb)
         self.loop_toggle_button.set_tooltip_text(_('Automatically activate loop when clicking on an annotation'))
         tb.insert(self.loop_toggle_button, -1)
 
-        ti=gtk.SeparatorToolItem()
+        ti=Gtk.SeparatorToolItem()
         ti.set_expand(True)
         ti.set_property('draw', False)
         tb.insert(ti, -1)
@@ -3518,23 +3557,22 @@ class TimeLine(AdhocView):
         notselected_store, it = dialog.generate_list_model(
             [ (at, self.controller.get_title(at)) for at in notselected ])
 
-        hbox = gtk.HBox()
-        selectedtree = gtk.TreeView(model=selected_store)
-        cell = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(_('Displayed'), cell, text=0)
+        hbox = Gtk.HBox()
+        selectedtree = Gtk.TreeView(model=selected_store)
+        cell = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn(_('Displayed'), cell, text=0)
         selectedtree.append_column(column)
 
         selectedtree.set_reorderable(True)
-        selectedtree.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
+        selectedtree.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)
 
-        notselectedtree = gtk.TreeView(model=notselected_store)
-        cell = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(_('Not displayed'), cell, text=0)
+        notselectedtree = Gtk.TreeView(model=notselected_store)
+        cell = Gtk.CellRendererText()
+        column = Gtk.TreeViewColumn(_('Not displayed'), cell, text=0)
         notselectedtree.append_column(column)
-        notselectedtree.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
+        notselectedtree.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE)
 
-        hbox.add(selectedtree)
-        actions = gtk.VBox()
+        actions = Gtk.VBox()
 
         def transfer(b, source, dest):
             selection = source.get_selection ()
@@ -3542,18 +3580,20 @@ class TimeLine(AdhocView):
                 return True
             store, paths = selection.get_selected_rows()
 
-            rows = [ gtk.TreeRowReference(store, path) for path in paths ]
+            # Keep a stable reference of the selected rows, since we
+            # will remove them iteratively from the source model
+            rows = [ Gtk.TreeRowReference(store, path) for path in paths ]
 
             m=dest.get_model()
             for r in rows:
                 path=r.get_path()
                 if path is None:
                     # Should not happen...
-                    print 'Strange...'
+                    logger.warn('Strange state in selection transfer...')
                     continue
                 it=store.get_iter(path)
                 # Add el to dest
-                m.append(store[path])
+                m.append(list(store[path]))
                 store.remove(it)
             return True
 
@@ -3564,7 +3604,7 @@ class TimeLine(AdhocView):
                 it=s.get_iter_first()
                 if it is None:
                     break
-                d.append(s[it])
+                d.append(list(s[it]))
                 s.remove(it)
             return True
 
@@ -3572,46 +3612,59 @@ class TimeLine(AdhocView):
             transfer(None, source, dest)
             return True
 
-        b=gtk.Button('<<<')
+        b=Gtk.Button('<<<')
         b.connect('clicked', transfer, notselectedtree, selectedtree)
         notselectedtree.connect('row_activated', row_activated, notselectedtree, selectedtree)
         actions.add(b)
 
-        b=gtk.Button(_('< All <'))
+        b=Gtk.Button(_('< All <'))
         b.connect('clicked', transferall, notselectedtree, selectedtree)
         actions.add(b)
 
-        b=gtk.Button(_('> All >'))
+        b=Gtk.Button(_('> All >'))
         b.connect('clicked', transferall, selectedtree, notselectedtree)
         actions.add(b)
 
-        b=gtk.Button('>>>')
+        b=Gtk.Button('>>>')
         b.connect('clicked', transfer, selectedtree, notselectedtree)
         selectedtree.connect('row-activated', row_activated, selectedtree, notselectedtree)
         actions.add(b)
 
-        hbox.add(actions)
+        sw1 = Gtk.ScrolledWindow()
+        sw1.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
+        sw1.add(selectedtree)
+        hbox.add(sw1)
+
+        hbox.pack_start(actions, False, False, 0)
 
-        hbox.add(notselectedtree)
+        sw2 = Gtk.ScrolledWindow()
+        sw2.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
+        sw2.add(notselectedtree)
+        hbox.add(sw2)
 
         hbox.show_all()
 
         # The widget is built. Put it in the dialog.
-        d = gtk.Dialog(title=_('Displayed annotation types'),
-                       parent=None,
-                       flags=gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_MODAL,
-                       buttons=( gtk.STOCK_OK, gtk.RESPONSE_OK,
-                                 gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL ))
-
-        d.vbox.add(hbox)
-
+        d = Gtk.Dialog(title=_('Displayed annotation types'),
+                       parent=self.controller.gui.gui.win,
+                       flags=Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.MODAL,
+                       buttons=( Gtk.STOCK_OK, Gtk.ResponseType.OK,
+                                 Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL ))
+
+        d.vbox.pack_start(hbox, True, True, 0)
+        hbox.set_size_request(600, 400)
         d.connect('key-press-event', dialog.dialog_keypressed_cb)
 
         d.show()
         dialog.center_on_mouse(d)
         res=d.run()
-        if res == gtk.RESPONSE_OK:
+        if res == Gtk.ResponseType.OK:
             self.annotationtypes = [ at[1] for at in selected_store ]
+            self.annotationtypes_selection = self.annotationtypes
+            if len(self.annotationtypes) == len(self.controller.package.annotationTypes):
+                # All types selected
+                self.annotationtypes_selection = None
+            self.package_from_init = None
             self.update_model(partial_update=True)
         d.destroy()
 
@@ -3635,7 +3688,7 @@ class TimeLine(AdhocView):
         """Return the current middle position, in ms.
         """
         a=self.adjustment
-        return self.pixel2unit( a.value + a.page_size / 2, absolute=True )
+        return self.pixel2unit( a.get_value() + a.get_page_size() / 2, absolute=True )
 
     def set_middle_position(self, pos):
         """Set the current middle position, in ms.
@@ -3718,7 +3771,7 @@ class TimeLine(AdhocView):
             return True
         if not re.match('^[\w\d_]+$', tag):
             dialog.message_dialog(_('The tag contains invalid characters'),
-                                  icon=gtk.MESSAGE_ERROR)
+                                  icon=Gtk.MessageType.ERROR)
             return True
         batch_id=object()
         for w in selection:
diff --git a/lib/advene/gui/views/transcription.py b/lib/advene/gui/views/transcription.py
index 2b5afc1..ada35d5 100755
--- a/lib/advene/gui/views/transcription.py
+++ b/lib/advene/gui/views/transcription.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,11 +18,14 @@
 #
 """Transcription view.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import re
 
-import gtk
-import pango
+from gi.repository import Gdk
+from gi.repository import Gtk
+from gi.repository import Pango
 
 import advene.core.config as config
 
@@ -39,7 +42,7 @@ import advene.gui.popup
 
 name="Transcription view plugin"
 
-ZERO_WIDTH_NOBREAK_SPACE = u"\uFEFF"
+ZERO_WIDTH_NOBREAK_SPACE = "\uFEFF"
 
 def register(controller):
     controller.register_viewclass(TranscriptionView)
@@ -75,10 +78,10 @@ class TranscriptionView(AdhocView):
         opt, arg = self.load_parameters(parameters)
         self.options.update(opt)
         a=dict(arg)
-        if source is None and a.has_key('source'):
+        if source is None and 'source' in a:
             source=a['source']
 
-        if source is None and elements is None:
+        if not source and not elements is None:
             # Use whole package
             source="here/annotations"
 
@@ -112,7 +115,7 @@ class TranscriptionView(AdhocView):
 
         # Try to determine a default representation
         try:
-            t=set([ a.type for a in self.model ])
+            t=set([ an.type for an in self.model ])
         except:
             t=[]
         if len(t) == 1:
@@ -136,18 +139,10 @@ class TranscriptionView(AdhocView):
         return self.options, arguments
 
     def regenerate_model(self):
-        if self.source is None:
+        if not self.source:
             self.model=self.elements[:]
-            return
-        c=self.controller.build_context()
-        try:
-            self.model=c.evaluateValue(self.source)
-        except Exception, e:
-            self.log(_("Error in source evaluation %(source)s: %(error)s") % {
-                    'source': self.source,
-                    'error': unicode(e) })
-            self.model=[]
-        return
+        else:
+            self.model = self.get_elements_from_source(self.source)
 
     def edit_options(self, button):
         user_defined=object()
@@ -202,7 +197,7 @@ class TranscriptionView(AdhocView):
             try:
                 beginiter=b.get_iter_at_mark(b.get_mark("b_%s" % a.id))
                 enditer  =b.get_iter_at_mark(b.get_mark("e_%s" % a.id))
-                if unicode(b.get_text(beginiter, enditer)).strip(ZERO_WIDTH_NOBREAK_SPACE) != self.representation(a):
+                if b.get_text(beginiter, enditer, False).strip(ZERO_WIDTH_NOBREAK_SPACE) != self.representation(a):
                     modified.append(a)
             except TypeError:
                 # Some missing annotations
@@ -222,8 +217,8 @@ class TranscriptionView(AdhocView):
             if not m:
                 break
             enditer  = b.get_iter_at_mark(m)
-            new_content = helper.title2content(unicode(b.get_text(beginiter, enditer)).strip(ZERO_WIDTH_NOBREAK_SPACE),
-                                               a.content.data,
+            new_content = helper.title2content(b.get_text(beginiter, enditer, False).strip(ZERO_WIDTH_NOBREAK_SPACE),
+                                               a.content,
                                                a.type.getMetaData(config.data.namespace, 'representation') if self.options['default-representation'] else self.options['representation'])
             if new_content is None:
                 impossible.append(a)
@@ -259,47 +254,43 @@ class TranscriptionView(AdhocView):
     def quick_options_toggle(self, *p):
         """Quickly toggle between different presentation options.
         """
-        self.options['separator'], self.options['display-time']=self.quick_options.next()
+        self.options['separator'], self.options['display-time']=next(self.quick_options)
         self.refresh()
         return True
 
     def build_widget(self):
-        mainbox = gtk.VBox()
+        mainbox = Gtk.VBox()
 
-        tb=gtk.Toolbar()
-        tb.set_style(gtk.TOOLBAR_ICONS)
+        tb=Gtk.Toolbar()
+        tb.set_style(Gtk.ToolbarStyle.ICONS)
 
         for icon, action, tip in (
-            (gtk.STOCK_SAVE, self.save_transcription, _("Save transcription to a text file")),
-            (gtk.STOCK_APPLY, self.validate, _("Apply the modifications")),
-            (gtk.STOCK_FIND, self.show_searchbox, _("Find text")),
-            (gtk.STOCK_REDO, self.quick_options_toggle, _("Quickly switch display options")),
-            (gtk.STOCK_REFRESH, self.refresh, _("Refresh the transcription")),
-            (gtk.STOCK_PREFERENCES, self.edit_options, _("Edit preferences")),
+            (Gtk.STOCK_SAVE, self.save_transcription, _("Save transcription to a text file")),
+            (Gtk.STOCK_APPLY, self.validate, _("Apply the modifications")),
+            (Gtk.STOCK_FIND, self.show_searchbox, _("Find text")),
+            (Gtk.STOCK_REDO, self.quick_options_toggle, _("Quickly switch display options")),
+            (Gtk.STOCK_REFRESH, self.refresh, _("Refresh the transcription")),
+            (Gtk.STOCK_PREFERENCES, self.edit_options, _("Edit preferences")),
             ):
-            b=gtk.ToolButton(stock_id=icon)
+            b=Gtk.ToolButton(stock_id=icon)
             b.set_tooltip_text(tip)
             b.connect('clicked', action)
             tb.insert(b, -1)
-        mainbox.pack_start(tb, expand=False)
-
-        #if self.controller.gui:
-        #    self.player_toolbar=self.controller.gui.get_player_control_toolbar()
-        #    mainbox.pack_start(self.player_toolbar, expand=False)
+        mainbox.pack_start(tb, False, True, 0)
 
-        sw = gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-        sw.set_resize_mode(gtk.RESIZE_PARENT)
+        sw = Gtk.ScrolledWindow()
+        sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
+        sw.set_resize_mode(Gtk.ResizeMode.PARENT)
         mainbox.add (sw)
 
-        self.textview = gtk.TextView()
+        self.textview = Gtk.TextView()
         # We could make it editable and modify the annotation
         self.textview.set_editable(True)
-        self.textview.set_wrap_mode (gtk.WRAP_WORD)
+        self.textview.set_wrap_mode (Gtk.WrapMode.WORD)
         b=self.textview.get_buffer()
 
         # Create useful tags
-        b.create_tag("activated", weight=pango.WEIGHT_BOLD)
+        b.create_tag("activated", weight=Pango.Weight.BOLD)
         b.create_tag("current", background="lightblue")
         b.create_tag("searched_string", background="green")
         b.create_tag("bound", editable=False)
@@ -314,7 +305,7 @@ class TranscriptionView(AdhocView):
 
         sw.add(self.textview)
 
-        self.searchbox=gtk.HBox()
+        self.searchbox=Gtk.HBox()
 
         def hide_searchbox(*p):
             # Clear the searched_string tags
@@ -324,41 +315,40 @@ class TranscriptionView(AdhocView):
             return True
 
         close_button=get_pixmap_button('small_close.png', hide_searchbox)
-        close_button.set_relief(gtk.RELIEF_NONE)
-        self.searchbox.pack_start(close_button, expand=False, fill=False)
+        close_button.set_relief(Gtk.ReliefStyle.NONE)
+        self.searchbox.pack_start(close_button, False, False, 0)
 
         def search_entry_cb(e):
-            self.highlight_search_forward(unicode(e.get_text()))
+            self.highlight_search_forward(e.get_text())
             return True
 
         def search_entry_key_press_cb(e, event):
-            if event.keyval == gtk.keysyms.Escape:
+            if event.keyval == Gdk.KEY_Escape:
                 hide_searchbox()
                 return True
             return False
 
-        self.searchbox.entry=gtk.Entry()
+        self.searchbox.entry=Gtk.Entry()
         self.searchbox.entry.connect('activate', search_entry_cb)
-        self.searchbox.pack_start(self.searchbox.entry, expand=False, fill=False)
+        self.searchbox.pack_start(self.searchbox.entry, False, False, 0)
         self.searchbox.entry.connect('key-press-event', search_entry_key_press_cb)
 
 #        def find_next(b):
 #            # FIXME
 #            return True
 #
-#        b=get_small_stock_button(gtk.STOCK_GO_FORWARD, find_next)
-#        b.set_relief(gtk.RELIEF_NONE)
+#        b=get_small_stock_button(Gtk.STOCK_GO_FORWARD, find_next)
+#        b.set_relief(Gtk.ReliefStyle.NONE)
 #        b.set_tooltip_text(_("Find next occurrence"))
-#        self.searchbox.pack_start(b, expand=False, fill=False)
+#        self.searchbox.pack_start(b, False, False, 0)
 
-        fill=gtk.HBox()
-        self.searchbox.pack_start(fill, expand=True, fill=True)
+        fill=Gtk.HBox()
+        self.searchbox.pack_start(fill, True, True, 0)
 
-        mainbox.pack_start(self.searchbox, expand=False)
+        mainbox.pack_start(self.searchbox, False, True, 0)
 
-        self.statusbar=gtk.Statusbar()
-        self.statusbar.set_has_resize_grip(False)
-        mainbox.pack_start(self.statusbar, expand=False)
+        self.statusbar=Gtk.Statusbar()
+        mainbox.pack_start(self.statusbar, False, True, 0)
 
         mainbox.show_all()
 
@@ -394,7 +384,7 @@ class TranscriptionView(AdhocView):
                                        text, *tags)
 
         l=list(self.model)
-        #l.sort(lambda a,b: cmp(a.fragment.begin, b.fragment.begin))
+        l.sort(key=lambda a: a.fragment.begin)
         for a in l:
             if self.options['display-time']:
                 insert_at_cursor_with_tags_by_name("[%s]" % helper.format_time(a.fragment.begin),
@@ -407,7 +397,7 @@ class TranscriptionView(AdhocView):
 
             # Put a 0-width char to make it easier to edit annotations
             insert_at_cursor_with_tags_by_name(ZERO_WIDTH_NOBREAK_SPACE, "bound")
-            b.insert_at_cursor(unicode(self.representation(a)))
+            b.insert_at_cursor(str(self.representation(a)))
             insert_at_cursor_with_tags_by_name(ZERO_WIDTH_NOBREAK_SPACE, "bound")
             mark = b.create_mark("e_%s" % a.id,
                                  b.get_iter_at_mark(b.get_insert()),
@@ -432,7 +422,7 @@ class TranscriptionView(AdhocView):
         finished=False
 
         while not finished:
-            res=begin.forward_search(searched, gtk.TEXT_SEARCH_TEXT_ONLY)
+            res=begin.forward_search(searched, Gtk.TextSearchFlags.TEXT_ONLY)
             if not res:
                 finished=True
             else:
@@ -442,10 +432,7 @@ class TranscriptionView(AdhocView):
 
     def play_annotation(self, a):
         c=self.controller
-        pos = c.create_position (value=a.fragment.begin,
-                                 key=c.player.MediaTime,
-                                 origin=c.player.AbsolutePosition)
-        c.update_status (status="set", position=pos)
+        c.update_status("seek", a.fragment.begin)
         c.gui.set_current_annotation(a)
         return True
 
@@ -454,11 +441,11 @@ class TranscriptionView(AdhocView):
             return False
         menu.foreach(menu.remove)
 
-        item=gtk.SeparatorMenuItem()
+        item=Gtk.SeparatorMenuItem()
         item.show()
         menu.append(item)
 
-        item = gtk.MenuItem(_("Annotation %s") % self.currentannotation.id, use_underline=False)
+        item = Gtk.MenuItem(_("Annotation %s") % self.currentannotation.id, use_underline=False)
         menuc=advene.gui.popup.Menu(self.currentannotation,
                                     controller=self.controller)
         item.set_submenu(menuc.menu)
@@ -469,7 +456,7 @@ class TranscriptionView(AdhocView):
             self.play_annotation(a)
             return True
 
-        item = gtk.MenuItem(_("Play"))
+        item = Gtk.MenuItem(_("Play"))
         item.connect('activate', play_annotation, self.currentannotation)
         item.show()
         menu.append(item)
@@ -477,10 +464,10 @@ class TranscriptionView(AdhocView):
         return False
 
     def key_press_event_cb (self, textview, event):
-        if event.keyval == gtk.keysyms.F3:
+        if event.keyval == Gdk.KEY_F3:
             self.searchbox.show_all()
             return True
-        elif event.keyval == gtk.keysyms.Return and event.state & gtk.gdk.CONTROL_MASK:
+        elif event.keyval == Gdk.KEY_Return and event.get_state() & Gdk.ModifierType.CONTROL_MASK:
             # Control-return: goto annotation
             if self.currentannotation is not None:
                 self.play_annotation(self.currentannotation)
@@ -490,21 +477,21 @@ class TranscriptionView(AdhocView):
     def button_press_event_cb(self, textview, event):
         if event.button != 1:
             return False
-        textwin=textview.get_window(gtk.TEXT_WINDOW_TEXT)
-        if event.window != textwin:
+        textwin=textview.get_window(Gtk.TextWindowType.TEXT)
+        if event.get_window() != textwin:
             return False
 
-        (x, y) = textview.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT,
+        (x, y) = textview.window_to_buffer_coords(Gtk.TextWindowType.TEXT,
                                                   int(event.x),
                                                   int(event.y))
         it=textview.get_iter_at_location(x, y)
         if it is None:
-            print "Error in get_iter_at_location"
+            logger.error("Error in get_iter_at_location")
             return False
-        textview.get_buffer().move_mark_by_name('insert', it)
-        textview.get_buffer().move_mark_by_name('selection_bound', it)
+        textview.get_buffer().move_mark_by_name('insert', it.iter)
+        textview.get_buffer().move_mark_by_name('selection_bound', it.iter)
         self.update_current_annotation()
-        if self.currentannotation is not None and event.type == gtk.gdk._2BUTTON_PRESS:
+        if self.currentannotation is not None and event.type == Gdk.EventType._2BUTTON_PRESS:
             # Double click -> goto annotation
             self.play_annotation(self.currentannotation)
         return False
@@ -609,7 +596,7 @@ class TranscriptionView(AdhocView):
 
             b.delete(beginiter, enditer)
             b.insert_with_tags_by_name(beginiter, ZERO_WIDTH_NOBREAK_SPACE, "bound")
-            b.insert(beginiter, unicode(self.representation(annotation)))
+            b.insert(beginiter, str(self.representation(annotation)))
             b.insert_with_tags_by_name(beginiter, ZERO_WIDTH_NOBREAK_SPACE, "bound")
             # After insert, beginiter is updated to point to the end
             # of the invalidated text.
@@ -626,27 +613,35 @@ class TranscriptionView(AdhocView):
             b.delete_mark(beginmark)
             b.delete_mark(endmark)
         else:
-            print "Unknown event %s" % event
+            logger.error("Unknown event %s", event)
         return True
 
     def tag_annotation(self, a, tagname):
         b=self.textview.get_buffer()
-        beginiter=b.get_iter_at_mark(b.get_mark("b_%s" % a.id))
-        enditer  =b.get_iter_at_mark(b.get_mark("e_%s" % a.id))
-        b.apply_tag_by_name(tagname, beginiter, enditer)
+        m = b.get_mark("b_%s" % a.id)
+        if m:
+            beginiter=b.get_iter_at_mark(m)
+            enditer  =b.get_iter_at_mark(b.get_mark("e_%s" % a.id))
+            b.apply_tag_by_name(tagname, beginiter, enditer)
+        else:
+            logger.warn("No mark for annotation %s", a.id)
 
     def untag_annotation(self, a, tagname):
         b=self.textview.get_buffer()
-        beginiter=b.get_iter_at_mark(b.get_mark("b_%s" % a.id))
-        enditer  =b.get_iter_at_mark(b.get_mark("e_%s" % a.id))
-        b.remove_tag_by_name(tagname, beginiter, enditer)
+        m = b.get_mark("b_%s" % a.id)
+        if m:
+            beginiter=b.get_iter_at_mark(m)
+            enditer  =b.get_iter_at_mark(b.get_mark("e_%s" % a.id))
+            b.remove_tag_by_name(tagname, beginiter, enditer)
+        else:
+            logger.warn("No mark for annotation %s", a.id)
 
     def activate_annotation(self, a):
         if self.options['autoscroll']:
             # Make sure that the annotation is visible
             m=self.textview.get_buffer().get_mark("b_%s" % a.id)
             if m:
-                self.textview.scroll_to_mark(m, 0.2)
+                self.textview.scroll_to_mark(m, 0.2, False, 0, 0)
 
         self.tag_annotation(a, "activated")
         return True
@@ -680,8 +675,8 @@ class TranscriptionView(AdhocView):
 
     def save_transcription(self, button=None):
         fname=dialog.get_filename(title= ("Save transcription to..."),
-                                           action=gtk.FILE_CHOOSER_ACTION_SAVE,
-                                           button=gtk.STOCK_SAVE)
+                                           action=Gtk.FileChooserAction.SAVE,
+                                           button=Gtk.STOCK_SAVE)
         if fname is not None:
             self.save_output(filename=fname)
             return True
@@ -689,14 +684,14 @@ class TranscriptionView(AdhocView):
 
     def save_output(self, filename=None):
         b=self.textview.get_buffer()
-        begin,end=b.get_bounds()
-        out=unicode(b.get_text(begin, end)).replace(ZERO_WIDTH_NOBREAK_SPACE, '')
+        begin, end=b.get_bounds()
+        out=b.get_text(begin, end, False).replace(ZERO_WIDTH_NOBREAK_SPACE, '')
         try:
-            f=open(filename, "w")
-        except Exception, e:
+            f=open(filename, "w", encoding='utf-8')
+        except Exception as e:
             self.message(_("Cannot write to %(filename)s: %(error)s:") %
                      {'filename': filename,
-                      'error': unicode(e)})
+                      'error': str(e)})
             return True
         f.write(out)
         f.close()
diff --git a/lib/advene/gui/views/tree.py b/lib/advene/gui/views/tree.py
deleted file mode 100755
index d12296e..0000000
--- a/lib/advene/gui/views/tree.py
+++ /dev/null
@@ -1,860 +0,0 @@
-#
-# Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-#
-# Advene is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# Advene is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Advene; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-
-from gettext import gettext as _
-import gtk
-
-import advene.core.config as config
-
-from advene.model.package import Package
-from advene.model.annotation import Annotation, Relation
-from advene.model.schema import Schema, AnnotationType, RelationType
-from advene.model.bundle import AbstractBundle
-from advene.model.resources import Resources, ResourceData
-from advene.model.query import Query
-from advene.model.view import View
-from advene.gui.views import AdhocView
-from advene.gui.util import drag_data_get_cb, get_target_types, contextual_drag_begin, dialog
-
-import advene.gui.edit.elements
-import advene.gui.popup
-
-import advene.util.helper as helper
-
-name="Tree view plugin"
-
-def register(controller):
-    controller.register_viewclass(TreeWidget)
-
-class AdveneTreeModel(gtk.GenericTreeModel, gtk.TreeDragSource, gtk.TreeDragDest):
-    COLUMN_TITLE=0
-    COLUMN_ELEMENT=1
-    COLUMN_COLOR=2
-
-    def nodeParent (self, node):
-        raise Exception("This has to be implemented in subclasses.")
-
-    def nodeChildren (self, node):
-        raise Exception("This has to be implemented in subclasses.")
-
-    def nodeHasChildren (self, node):
-        raise Exception("This has to be implemented in subclasses.")
-
-    def __init__(self, controller=None, package=None):
-        gtk.GenericTreeModel.__init__(self)
-        self.clear_cache ()
-        self.controller=controller
-        if package is None and controller is not None:
-            package=controller.package
-        self.__package=package
-
-    def get_package(self):
-        return self.__package
-
-    def clear_cache (self):
-        self.childrencache = {}
-
-    def remove_element (self, e):
-        """Remove an element from the model.
-
-        The problem is that we do not know its previous path.
-        """
-        # FIXME: there is still a bug with ImportBundles (that are
-        # mutable and thus cannot be dict keys
-        #print "Removing element ", e.id
-
-        if isinstance(e, View):
-            # Remove the element from the list view and refresh list view
-            parent=self.nodeParent(e)
-            #parent=self.get_package().views
-            path=self.on_get_path(parent)
-            #print "before row changed"
-            self.row_changed(path, self.get_iter(path))
-            #print "after row changed"
-            return
-
-        parent=None
-        for p in self.childrencache:
-            if e in self.childrencache[p]:
-                parent=p
-                #print "Found parent ", str(parent)
-                break
-        if parent is None:
-            # Could not find the element in the cache.
-            # It was not yet displayed
-            pass
-        else:
-            # We can determine its path. Get the index for the deleted
-            # element from the childrencache.
-            path=self.on_get_path(parent)
-            if path is not None:
-                #print "Parent path", path
-                #print "cache", self.childrencache[parent]
-                try:
-                    idx=self.childrencache[parent].index(e)
-                except ValueError:
-                    # The children was not in the cache. Should not
-                    # normally happen, but who knows...
-                    idx=None
-                if idx is not None:
-                    path=path + (idx, )
-                    # Now that we have the old path for the deleted
-                    # element, we can notify the row_deleted signal.
-                    self.row_deleted(path)
-            del (self.childrencache[parent])
-        return True
-
-    def update_element(self, e, created=False):
-        """Update an element.
-
-        This is called when a element has been modified or created.
-        """
-        parent=self.nodeParent(e)
-        try:
-            del (self.childrencache[parent])
-        except KeyError:
-            pass
-        path=self.on_get_path(e)
-        if path is not None:
-            if created:
-                self.row_inserted(path, self.get_iter(path))
-            else:
-                self.row_changed(path, self.get_iter(path))
-        return path
-
-    def on_get_flags(self):
-        return 0
-
-    def on_get_n_columns(self):
-        return 3
-
-    def on_get_column_type(self, index):
-        types=(str, object, str)
-        return types[index]
-
-    # FIXME: maybe we could use TALES expressions as path
-    def on_get_path(self, node): # FIXME
-        # print "on_get_path()"
-        # print "node: " + str(node)
-        # node is either an Annotation or an AnnotationType
-        parent = self.nodeParent (node)
-        child = node
-        idx = []
-        while parent is not None:
-            children = self.nodeChildren(parent)
-            try:
-                i = children.index (child)
-            except ValueError:
-                # The element is not in the list
-                return None
-            idx.append (i)
-            child = parent
-            parent = self.nodeParent(parent)
-        idx.append(0)
-        idx.reverse()
-        return tuple(idx)
-
-    def on_get_iter(self, path):
-        """Return the node corresponding to the given path.
-        """
-        node = self.__package
-        for i in xrange(1, len(path)):
-            idx = path[i]
-            children = self.nodeChildren(node)
-            try:
-                node = children[idx]
-            except IndexError:
-                node=None
-        return node
-
-    def on_get_tree_path(self, node):
-        return self.on_get_path(node)
-
-    def title (self, node):
-        title=None
-        if self.controller:
-            title=self.controller.get_title(node)
-        if not title:
-            title = "???"
-            try:
-                title=node.id
-            except AttributeError:
-                pass
-        # FIXME: bad hardcoded value
-        #if len(title) > 50:
-        #    title=title[:50]
-        if isinstance(node, Annotation):
-            title="%s (%s, %s)" % (title,
-                                   helper.format_time(node.fragment.begin),
-                                   helper.format_time(node.fragment.end))
-        if ((hasattr(node, 'isImported') and node.isImported())
-            or (hasattr(node, 'schema') and node.schema.isImported())):
-            title += " (*)"
-        return title
-
-    def on_get_value(self, node, column):
-        def get_color(e):
-            if (isinstance(e, Annotation) or isinstance(e, Relation)
-                or isinstance(e, AnnotationType) or isinstance(e, RelationType)):
-                return self.controller.get_element_color(e)
-            else:
-                return None
-        if column == AdveneTreeModel.COLUMN_TITLE:
-            return self.title(node)
-        elif column == AdveneTreeModel.COLUMN_COLOR:
-            return get_color(node)
-        else:
-            return node
-
-    def on_iter_next(self, node):
-        """Return the next node at this level of the tree"""
-        parent = self.nodeParent(node)
-        next = None
-        if parent is not None:
-            children = self.nodeChildren(parent)
-            count = len(children)
-            idx = None
-            for i in xrange(len(children)):
-                child = children[i]
-                if child is node:
-                    idx = i + 1
-                    break
-            if idx is not None and idx < count:
-                next = children[idx]
-        return next
-
-    def on_iter_children(self, node):
-        """Return the first child of this node"""
-        children = self.nodeChildren(node)
-        if not children:
-            return None
-        else:
-            assert len(children), _("No children in on_iter_children()!")
-            return children[0]
-
-    def on_iter_has_child(self, node):
-        """returns true if this node has children"""
-        return self.nodeHasChildren(node)
-
-    def on_iter_n_children(self, node):
-        '''returns the number of children of this node'''
-        return len(self.nodeChildren(node))
-
-    def on_iter_nth_child(self, node, n):
-        """Returns the nth child of this node"""
-        child = None
-        children = self.nodeChildren(node)
-        assert len(children), _("No children in on_iter_nth_child()")
-        child = children[n]
-        return child
-
-    def on_iter_parent(self, node):
-        """Returns the parent of this node"""
-        return self.nodeParent(node)
-
-    def row_draggable(self, path):
-        print "row draggable %s" % str(path)
-        return True
-#         node = self.on_get_iter(path)
-#         if isinstance(node, Annotation):
-#             return True
-#         else:
-#             return False
-
-    def drag_data_delete(self, path):
-        print "drag delete %s" % str(path)
-        return False
-
-    def drag_data_received (self, *p, **kw):
-        print "drag data received: %s %s" % (str(p), str(kw))
-        return True
-
-    def drag_data_get(self, path, selection):
-        print "drag data get %s %s" % (str(path), str(selection))
-        node = self.on_get_iter(path)
-        print "Got selection:\ntype=%s\ntarget=%s" % (str(selection.type),
-                                                      str(selection.target))
-        selection.set(selection.target, 8, node.uri.encode('utf8'))
-        return True
-
-class VirtualNode:
-    """Virtual node.
-    """
-    def __init__(self, name, package, viewableType=None):
-        self.title=name
-        self.rootPackage=package
-        self.viewableType=viewableType
-
-class DetailedTreeModel(AdveneTreeModel):
-    """Detailed Tree Model.
-
-    In this model,
-       - Annotations and Relations depend on their types.
-       - Types depend on their schema
-       - Schemas depend on their package list of schemas
-       - Views depend on their package list of views
-       - Resources depend on the Resource node
-    """
-    def __init__(self, controller=None, package=None):
-        AdveneTreeModel.__init__(self, controller=controller, package=package)
-        self.virtual={}
-        self.virtual['views']=VirtualNode(_("List of views"), package, viewableType='view-list')
-        self.virtual['static']=VirtualNode(_("Static views"), package, viewableType='view-list')
-        self.virtual['dynamic']=VirtualNode(_("Dynamic views"), package, viewableType='view-list')
-        self.virtual['admin']=VirtualNode(_("Admin views"), package, viewableType='view-list')
-        self.virtual['adhoc']=VirtualNode(_("Adhoc views"), package)
-
-    def nodeParent (self, node):
-        #print "nodeparent %s" % node
-        if isinstance (node, Annotation):
-            parent = node.type
-        elif isinstance (node, Relation):
-            parent = node.type
-        elif isinstance (node, RelationType):
-            parent = node.schema
-        elif isinstance (node, AnnotationType):
-            parent = node.schema
-        elif isinstance (node, Schema):
-            parent = node.rootPackage.schemas
-        elif isinstance (node, View):
-            if node.id.startswith('_'):
-                parent=self.virtual['admin']
-            else:
-                t=helper.get_view_type(node)
-                parent=self.virtual[t]
-        elif isinstance (node, Query):
-            parent = node.rootPackage.queries
-        elif isinstance (node, Package):
-            parent = None
-        elif isinstance (node, AbstractBundle):
-            parent = node.rootPackage
-        elif isinstance (node, Resources):
-            parent = node.parent
-        elif isinstance (node, ResourceData):
-            parent = node.parent
-        elif node in (self.virtual['static'], self.virtual['dynamic'], self.virtual['adhoc'], self.virtual['admin']):
-            parent = self.virtual['views']
-        elif node == self.virtual['views']:
-            parent=node.rootPackage
-        else:
-            parent = None
-        return parent
-
-    def nodeChildren (self, node):
-        #print "nodechildren %s" % node
-        if isinstance (node, Annotation):
-            children = None
-        elif isinstance (node, Relation):
-            children = None
-        elif isinstance (node, AnnotationType):
-            if not node in self.childrencache:
-                self.childrencache[node] = node.annotations
-            children = self.childrencache[node]
-        elif isinstance (node, RelationType):
-            if not node in self.childrencache:
-                self.childrencache[node] = node.relations
-            children = self.childrencache[node]
-        elif isinstance (node, Schema):
-            # Do not cache these elements
-            l=list(node.annotationTypes)
-            l.extend(node.relationTypes)
-            children = l
-        elif isinstance (node, View):
-            children = None
-        elif isinstance (node, Query):
-            children = None
-        elif isinstance (node, Package):
-            if not node in self.childrencache:
-                self.childrencache[node] = [node.schemas, self.virtual['views'], node.queries, node.resources ]
-            children = self.childrencache[node]
-        elif isinstance (node, AbstractBundle):
-            children = node
-        elif isinstance (node, Resources):
-            if not node in self.childrencache:
-                self.childrencache[node] = node.children()
-            children = self.childrencache[node]
-        elif isinstance (node, ResourceData):
-            children = None
-        elif node == self.virtual['views']:
-            children=[ self.virtual['static'], self.virtual['dynamic'], self.virtual['adhoc'], self.virtual['admin'] ]
-        elif node is None:
-            children = [ self.get_package() ]
-        else:
-            children = None
-            if node == self.virtual['admin']:
-                children=sorted([ v
-                                  for v in node.rootPackage.views
-                                  if v.id.startswith('_') ],
-                                key=lambda e: (e.title or e.id).lower())
-            else:
-                for t in ('static', 'dynamic', 'adhoc'):
-                    if node == self.virtual[t]:
-                        children=sorted([ v
-                                          for v in node.rootPackage.views
-                                          if not v.id.startswith('_')
-                                          and helper.get_view_type(v) == t ],
-                                        key=lambda e: (e.title or e.id).lower())
-                        break
-        return children
-
-    def nodeHasChildren (self, node):
-        children = self.nodeChildren(node)
-        return (children is not None and children)
-
-class TreeWidget(AdhocView):
-    view_name = _("Tree view")
-    view_id = 'tree'
-    tooltip=("Display the package's content as a tree")
-    def __init__(self, controller=None, parameters=None, package=None, modelclass=DetailedTreeModel):
-        super(TreeWidget, self).__init__(controller=controller)
-        self.close_on_package_load = False
-        self.contextual_actions = (
-            (_("Refresh"), self.refresh),
-            )
-        self.controller=controller
-        self.options={}
-
-        if package is None:
-            package=controller.package
-        self.package = package
-        self.modelclass=modelclass
-
-        self.model = modelclass(controller=controller, package=package)
-
-        self.widget = self.build_widget()
-
-    def build_widget(self):
-        tree_view = gtk.TreeView(self.model)
-
-        select = tree_view.get_selection()
-        select.set_mode(gtk.SELECTION_SINGLE)
-
-        tree_view.connect('button-press-event', self.tree_view_button_cb)
-        tree_view.connect('row-activated', self.row_activated_cb)
-        tree_view.set_search_column(AdveneTreeModel.COLUMN_TITLE)
-
-        cell = gtk.CellRendererText()
-        column = gtk.TreeViewColumn(_("Package View"), cell,
-                                    text=AdveneTreeModel.COLUMN_TITLE,
-                                    cell_background=AdveneTreeModel.COLUMN_COLOR,
-                                    )
-        tree_view.append_column(column)
-
-        # Drag and drop for annotations
-        # Handle DND by ourselves to be able to determine the
-        # appropriate targetType from the selected item
-        self.drag_context=None
-        # drag_data contains (x, y, event) information when the button is pressed.
-        self.drag_data=None
-        tree_view.connect('button-press-event', self.on_treeview_button_press_event)
-        tree_view.connect('button-release-event', self.on_treeview_button_release_event)
-        tree_view.connect('motion-notify-event', self.on_treeview_motion_notify_event)
-
-        tree_view.connect('drag-data-get', drag_data_get_cb, self.controller)
-
-        tree_view.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                gtk.DEST_DEFAULT_HIGHLIGHT |
-                                gtk.DEST_DEFAULT_ALL,
-                                config.data.drag_type['annotation']
-                                + config.data.drag_type['annotation-type']
-                                + config.data.drag_type['timestamp'],
-                                gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_MOVE | gtk.gdk.ACTION_ASK )
-        tree_view.connect('drag-data-received', self.drag_received)
-
-        try:
-            # set_enable_tree_lines is available in gtk >= 2.10
-            tree_view.set_enable_tree_lines(True)
-        except AttributeError:
-            pass
-
-        sw = gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-        sw.add(tree_view)
-
-        sw.treeview = tree_view
-
-        return sw
-
-    def on_treeview_button_press_event(self, treeview, event):
-        if event.button == 1:
-            x, y = treeview.get_pointer()
-            row = treeview.get_dest_row_at_pos(int(x), int(y))
-            if row is None:
-                element=None
-            else:
-                element = treeview.get_model()[row[0]][AdveneTreeModel.COLUMN_ELEMENT]
-            self.drag_data=(int(x), int(y), event, element)
-
-    def on_treeview_button_release_event(self, treeview, event):
-        self.drag_data=None
-        self.drag_context=None
-
-    def on_treeview_motion_notify_event(self, treeview, event):
-        if (event.state == gtk.gdk.BUTTON1_MASK
-            and self.drag_context is None
-            and self.drag_data is not None
-            and self.drag_data[3] is not None):
-            x, y = treeview.get_pointer()
-            threshold = treeview.drag_check_threshold(
-                    self.drag_data[0], self.drag_data[1],
-                    int(x), int(y))
-            if threshold:
-                # A drag was started. Setup the appropriate target.
-                element=self.drag_data[3]
-                targets=get_target_types(element)
-                actions = gtk.gdk.ACTION_MOVE | gtk.gdk.ACTION_LINK | gtk.gdk.ACTION_COPY
-                button = 1
-                self.drag_context = treeview.drag_begin(targets, actions, button, self.drag_data[2])
-                # This call does not affect the icon:
-                self.drag_context._element=element
-                contextual_drag_begin(treeview, self.drag_context, element, self.controller)
-
-
-    def get_selected_node (self, tree_view):
-        """Return the currently selected node.
-
-        None if no node is selected.
-        """
-        selection = tree_view.get_selection ()
-        if not selection:
-            return None
-        store, it = selection.get_selected()
-        node = None
-        if it is not None:
-            node = tree_view.get_model().get_value (it,
-                                                    AdveneTreeModel.COLUMN_ELEMENT)
-        return node
-
-    def debug_cb (self, *p, **kw):
-        print "Debug cb:\n"
-        print "Parameters: %s" % str(p)
-        print "KW: %s" % str(kw)
-
-    def row_activated_cb(self, widget, path, view_column):
-        """Edit the element on Return or double click
-        """
-        node = self.get_selected_node (widget)
-        if node is not None:
-            # If node is an adhoc-view, then open it.
-            if isinstance(node, View) and helper.get_view_type(node) == 'adhoc':
-                self.controller.gui.open_adhoc_view(node)
-            else:
-                self.controller.gui.edit_element(node)
-            return True
-        return False
-
-    def tree_view_button_cb(self, widget=None, event=None):
-        retval = False
-        button = event.button
-        x = int(event.x)
-        y = int(event.y)
-
-        if button == 3 or button == 2:
-            if event.window is widget.get_bin_window():
-                model = self.model
-                t = widget.get_path_at_pos(x, y)
-                if t is not None:
-                    path, col, cx, cy = t
-                    it = model.get_iter(path)
-                    node = model.get_value(it,
-                                           AdveneTreeModel.COLUMN_ELEMENT)
-                    widget.get_selection().select_path (path)
-                    if button == 3:
-                        menu = advene.gui.popup.Menu(node, controller=self.controller)
-                        menu.popup()
-                        retval = True
-                    elif button == 2:
-                        # Expand all children
-                        widget.expand_row(path, True)
-                        retval=True
-        return retval
-
-    def refresh(self, *p):
-        self.update_model(self.package)
-        return True
-
-    def update_element(self, element=None, event=None):
-        #print "Update element ", str(element), str(event)
-        if event.endswith('Create'):
-            self.model.update_element(element, created=True)
-        elif event.endswith('EditEnd'):
-            self.model.update_element(element, created=False)
-        elif event.endswith('Delete'):
-            # FIXME: remove_element is incorrect for the moment
-            #        so do a global update
-            #print "Remove element"
-            #self.model.remove_element (element)
-            self.update_model(element.rootPackage)
-        else:
-            return "Unknown event %s" % event
-        return
-
-    def update_annotation(self, annotation=None, event=None):
-        """Update the annotation.
-        """
-        if event.endswith('EditEnd'):
-            # Possibly update other annotations in the same time, in the
-            # case that only the order changed.
-            for a in annotation.type.annotations:
-                self.update_element(a, event)
-        else:
-            self.update_element(annotation, event)
-        return
-
-    def update_relation(self, relation=None, event=None):
-        """Update the relation.
-        """
-        self.update_element(relation, event)
-        return
-
-    def update_view(self, view=None, event=None):
-        self.update_element(view, event)
-        return
-
-    def update_query(self, query=None, event=None):
-        self.update_element(query, event)
-        return
-
-    def update_schema(self, schema=None, event=None):
-        self.update_element(schema, event)
-        return
-
-    def update_annotationtype(self, annotationtype=None, event=None):
-        self.update_element(annotationtype, event)
-        return
-
-    def update_relationtype(self, relationtype=None, event=None):
-        """Update the relationtype
-        """
-        self.update_element(relationtype, event)
-        return
-
-    def update_resource(self, resource=None, event=None):
-        self.update_element(resource, event)
-        return
-
-    def update_model(self, package):
-        """Update the model with a new package."""
-        #print "Treeview: update model %s" % str(package)
-        # Get current path
-        oldpath=self.widget.treeview.get_cursor()[0]
-        self.model = self.modelclass(controller=self.controller,
-                                     package=package)
-        self.widget.treeview.set_model(self.model)
-        # Return to old path if possible
-        if oldpath is not None:
-            self.widget.treeview.expand_to_path(oldpath)
-            self.widget.treeview.set_cursor(oldpath)
-        return
-
-    def drag_sent(self, widget, context, selection, targetType, eventTime):
-        #print "drag_sent event from %s" % widget.annotation.content.data
-        if targetType == config.data.target_type['annotation']:
-            selection.set(selection.target, 8, widget.annotation.uri.encode('utf8'))
-        else:
-            print "Unknown target type for drag: %d" % targetType
-        return True
-
-    def create_relation(self, source, dest, rt):
-        """Create the reation of type rt between source and dest.
-        """
-        # Get the id from the idgenerator
-        p=self.controller.package
-        id_=self.controller.package._idgenerator.get_id(Relation)
-        relation=p.createRelation(ident=id_,
-                                 members=(source, dest),
-                                 type=rt)
-        p.relations.append(relation)
-        self.controller.notify("RelationCreate", relation=relation)
-        return True
-
-    def move_or_copy_annotations(self, sources, dest, action=gtk.gdk.ACTION_ASK):
-        """Display a popup menu to move or copy the sources annotation to the dest annotation type.
-
-        If action is specified, then the popup menu will be shortcircuited.
-        """
-        # FIXME: this method should be factorized with the original
-        # one (from timeline.py) and used in other views (finder...)
-        if not sources:
-            return True
-        source=sources[0]
-
-        def move_annotation(i, an, typ, position=None):
-            if an.relations and an.type != typ:
-                dialog.message_dialog(_("Cannot delete the annotation : it has relations."),
-                                      icon=gtk.MESSAGE_WARNING)
-                return True
-
-            self.transmuted_annotation=self.controller.transmute_annotation(an,
-                                                                            typ,
-                                                                            delete=True)
-            return self.transmuted_annotation
-
-        def copy_annotation(i, an, typ, position=None, relationtype=None):
-            self.transmuted_annotation=self.controller.transmute_annotation(an,
-                                                                            typ,
-                                                                            delete=False)
-            if relationtype is not None:
-                # Directly create a relation
-                self.create_relation(an, self.transmuted_annotation, relationtype)
-            return self.transmuted_annotation
-
-        def copy_selection(i, sel, typ, delete=False):
-            for an in sel:
-                if an.typ != typ:
-                    self.transmuted_annotation=self.controller.transmute_annotation(an,
-                                                                                    typ,
-                                                                                    delete=delete)
-            return self.transmuted_annotation
-
-        # If there are compatible relation-types, propose to directly create a relation
-        relationtypes = helper.matching_relationtypes(self.controller.package,
-                                                      source.type,
-                                                      dest)
-
-        if action == gtk.gdk.ACTION_COPY:
-            # Direct copy
-            if len(sources) > 1:
-                if source.type == dest:
-                    return True
-                copy_selection(None, sources, dest)
-            else:
-                copy_annotation(None, source, dest)
-            return True
-        elif action == gtk.gdk.ACTION_MOVE:
-            if len(sources) > 1:
-                if source.type == dest:
-                    return True
-                copy_selection(None, sources, dest, delete=True)
-            else:
-                move_annotation(None, source, dest)
-            return True
-
-        # ACTION_ASK: Popup a menu to propose the drop options
-        menu=gtk.Menu()
-
-        dest_title=self.controller.get_title(dest)
-
-        if len(sources) > 1:
-            if source.type == dest:
-                return True
-            item=gtk.MenuItem(_("Duplicate selection to type %s") % dest_title, use_underline=False)
-            item.connect('activate', copy_selection, sources, dest)
-            menu.append(item)
-            item=gtk.MenuItem(_("Move selection to type %s") % dest_title, use_underline=False)
-            item.connect('activate', copy_selection, sources, dest, True)
-            menu.append(item)
-
-            menu.show_all()
-            menu.popup(None, None, None, 0, gtk.get_current_event_time())
-            return True
-
-        if source.type != dest:
-            item=gtk.MenuItem(_("Duplicate annotation to type %s") % dest_title, use_underline=False)
-            item.connect('activate', copy_annotation, source, dest)
-            menu.append(item)
-
-            item=gtk.MenuItem(_("Move annotation to type %s") % dest_title, use_underline=False)
-            item.connect('activate', move_annotation, source, dest)
-            menu.append(item)
-            if source.relations:
-                item.set_sensitive(False)
-
-        relationtypes=helper.matching_relationtypes(self.controller.package,
-                                                    source.type,
-                                                    dest)
-        if relationtypes:
-            if source.type != dest:
-                item=gtk.MenuItem(_("Duplicate and create a relation"), use_underline=False)
-                # build a submenu
-                sm=gtk.Menu()
-                for rt in relationtypes:
-                    sitem=gtk.MenuItem(self.controller.get_title(rt), use_underline=False)
-                    sitem.connect('activate', copy_annotation, source, dest, None, rt)
-                    sm.append(sitem)
-                menu.append(item)
-                item.set_submenu(sm)
-
-        menu.show_all()
-        menu.popup(None, None, None, 0, gtk.get_current_event_time())
-
-    def create_relation_popup(self, source, dest):
-        # FIXME: Idem as above: should be factorized with the original of timeline.py
-        # Popup a menu to propose the drop options
-        menu=gtk.Menu()
-
-        def create_relation(item, s, d, t):
-            self.create_relation(s, d, t)
-            return True
-
-        def create_relation_type_and_relation(item, s, d):
-            if self.controller.gui:
-                sc=self.controller.gui.ask_for_schema(text=_("Select the schema where you want to\ncreate the new relation type."), create=True)
-                if sc is None:
-                    return None
-                cr=self.controller.gui.create_element_popup(type_=RelationType,
-                                                            parent=sc,
-                                                            controller=self.controller)
-                rt=cr.popup(modal=True)
-                self.create_relation(s, d, rt)
-            return True
-
-        relationtypes=helper.matching_relationtypes(self.controller.package,
-                                                    source.type,
-                                                    dest.type)
-        item=gtk.MenuItem(_("Create a relation"))
-        menu.append(item)
-
-        sm=gtk.Menu()
-        for rt in relationtypes:
-            sitem=gtk.MenuItem(self.controller.get_title(rt), use_underline=False)
-            sitem.connect('activate', create_relation, source, dest, rt)
-            sm.append(sitem)
-        if True:
-            # Propose to create a new one
-            sitem=gtk.MenuItem(_("Create a new relation-type."), use_underline=False)
-            sitem.connect('activate', create_relation_type_and_relation, source, dest)
-            sm.append(sitem)
-        item.set_submenu(sm)
-
-        menu.show_all()
-        menu.popup(None, None, None, 0, gtk.get_current_event_time())
-
-    def drag_received(self, widget, context, x, y, selection, targetType, time):
-        widget.stop_emission("drag-data-received")
-        t = widget.get_path_at_pos(x, y)
-        if t is not None:
-            path, col, cx, cy = t
-            it = self.model.get_iter(path)
-            node = self.model.get_value(it,
-                                        AdveneTreeModel.COLUMN_ELEMENT)
-            if not node:
-                return True
-            if isinstance(node, Annotation):
-                # Drop on an Annotation
-                if targetType == config.data.target_type['annotation']:
-                    source = self.controller.package.annotations.get(unicode(selection.data, 'utf8').split('\n')[0])
-                    self.create_relation_popup(source, node)
-            elif isinstance(node, AnnotationType):
-                if targetType == config.data.target_type['annotation']:
-                    sources = [ self.controller.package.annotations.get(u) for u in unicode(selection.data, 'utf8').split('\n') ]
-                    if sources:
-                        self.move_or_copy_annotations(sources, node)
-            return True
-        return True
diff --git a/lib/advene/gui/views/viewbook.py b/lib/advene/gui/views/viewbook.py
index 9f519cd..98f83f4 100644
--- a/lib/advene/gui/views/viewbook.py
+++ b/lib/advene/gui/views/viewbook.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,10 +18,13 @@
 #
 """Notebook containing multiple views
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import advene.core.config as config
 
-import gtk
+from gi.repository import Gdk
+from gi.repository import Gtk
 
 from gettext import gettext as _
 from advene.gui.views import AdhocView
@@ -103,7 +106,6 @@ class ViewBook(AdhocView):
 
         def relocate_view(item, v, d):
             # Reference the widget so that it is not destroyed
-            wid=v.widget
             if not self.detach_view(v):
                 return True
             if d == 'popup':
@@ -113,12 +115,16 @@ class ViewBook(AdhocView):
                 self.controller.gui.viewbook[d].add_view(v, name=v._label)
             return True
 
+        def handle_contextual_action(menuitem, action):
+            action()
+            return True
+
         def popup_menu(button, event, view):
             if event.button == 3:
-                menu = gtk.Menu()
+                menu = Gtk.Menu()
                 if not permanent:
                     # Relocation submenu
-                    submenu=gtk.Menu()
+                    submenu=Gtk.Menu()
 
                     for (label, destination) in (
                         (_("...in its own window"), 'popup'),
@@ -128,32 +134,31 @@ class ViewBook(AdhocView):
                         (_("...embedded at the right of the window"), 'fareast')):
                         if destination == self.location:
                             continue
-                        item = gtk.MenuItem(label)
+                        item = Gtk.MenuItem(label)
                         item.connect('activate', relocate_view,  view, destination)
                         submenu.append(item)
 
-                    item=gtk.MenuItem(_("Detach"))
+                    item=Gtk.MenuItem(_("Detach"))
                     item.set_submenu(submenu)
                     menu.append(item)
 
-                    item = gtk.MenuItem(_("Close"))
+                    item = Gtk.MenuItem(_("Close"))
                     item.connect('activate', close_view, view)
                     menu.append(item)
 
                 try:
                     for label, action in view.contextual_actions:
-                        item = gtk.MenuItem(label, use_underline=False)
-                        item.connect('activate', action, view)
+                        item = Gtk.MenuItem(label, use_underline=False)
+                        item.connect('activate', handle_contextual_action, action)
                         menu.append(item)
                 except AttributeError:
                     pass
 
                 menu.show_all()
-                menu.popup(None, None, None, 0, gtk.get_current_event_time())
+                menu.popup_at_pointer(None)
                 return True
-            elif event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+            elif event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
                 # Double click: propose to rename the view
-                label_widget=button.get_children()[0]
                 lab=dialog.entry_dialog(title=_("Rename the view"),
                                         text=_("Please enter the new name of the view"),
                                         default=view._label)
@@ -165,19 +170,19 @@ class ViewBook(AdhocView):
         def label_drag_sent(widget, context, selection, targetType, eventTime, v):
             if targetType == config.data.target_type['adhoc-view-instance']:
                 # This is not very robust, but allows to transmit a view instance reference
-                selection.set(selection.target, 8, self.controller.gui.get_adhoc_view_instance_id(v))
+                selection.set(selection.get_target(), 8, self.controller.gui.get_adhoc_view_instance_id(v).encode('utf-8'))
                 self.detach_view(v)
                 return True
             return False
 
-        e=gtk.EventBox()
-        e.set_visible_window(False)
+        e=Gtk.EventBox()
+        e.set_visible_window(False)
         e.set_above_child(True)
         if len(name) > 13:
-            shortname=unicode(name)[:12] + u'\u2026'
+            shortname=str(name)[:12] + helper.chars.ellipsis
         else:
             shortname=name
-        l=gtk.Label()
+        l=Gtk.Label()
         l.set_markup("<small>%s</small>" % shortname)
         if self.controller.gui:
             e.set_tooltip_text(name)
@@ -187,31 +192,31 @@ class ViewBook(AdhocView):
         if not permanent:
             e.connect('drag-data-get', label_drag_sent, v)
             # The widget can generate drags
-            e.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                              config.data.drag_type['adhoc-view-instance'],
-                              gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK)
-        hb=gtk.HBox()
+            e.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                              config.data.get_target_types('adhoc-view-instance'),
+                              Gdk.DragAction.COPY | Gdk.DragAction.LINK)
+        hb=Gtk.HBox()
 
         if not permanent:
             b=get_pixmap_button('small_detach.png')
             b.set_tooltip_text(_("Detach view in its own window, or drag-and-drop to another zone"))
-            b.set_relief(gtk.RELIEF_NONE)
+            b.set_relief(Gtk.ReliefStyle.NONE)
             b.connect('clicked', relocate_view, v, 'popup')
             b.connect('drag-data-get', label_drag_sent, v)
             # The widget can generate drags
-            b.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                              config.data.drag_type['adhoc-view-instance'],
-                              gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK)
-            hb.pack_start(b, expand=False, fill=False)
+            b.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                              config.data.get_target_types('adhoc-view-instance'),
+                              Gdk.DragAction.COPY | Gdk.DragAction.LINK)
+            hb.pack_start(b, False, False, 0)
 
-        hb.pack_start(e, expand=False, fill=False)
+        hb.pack_start(e, False, False, 0)
 
         if not permanent:
             b=get_pixmap_button('small_close.png')
             b.set_tooltip_text(_("Close view"))
-            b.set_relief(gtk.RELIEF_NONE)
+            b.set_relief(Gtk.ReliefStyle.NONE)
             b.connect('clicked', close_view, v)
-            hb.pack_start(b, expand=False, fill=False)
+            hb.pack_start(b, False, False, 0)
         hb.show_all()
 
         self.widget.append_page(v.widget, hb)
@@ -251,7 +256,7 @@ class ViewBook(AdhocView):
             return True
 
         if targetType == config.data.target_type['adhoc-view']:
-            data=decode_drop_parameters(selection.data)
+            data=decode_drop_parameters(selection.get_data())
             label=None
             view=None
             if 'id' in data:
@@ -281,23 +286,23 @@ class ViewBook(AdhocView):
                             if v.content.mimetype == 'application/x-advene-adhoc-view'
                             and ET.parse(v.content.stream).getroot().attrib['id'] == name ]
 
-                if name == 'transcription':
-                    menu=gtk.Menu()
-                    i=gtk.MenuItem(_("Open a new transcription for..."))
+                if name == 'transcription' or name == 'table':
+                    menu=Gtk.Menu()
+                    i=Gtk.MenuItem(_("Open a new %s for...") % _(name))
                     menu.append(i)
-                    sm=gtk.Menu()
+                    sm=Gtk.Menu()
                     i.set_submenu(sm)
                     for at in self.controller.package.annotationTypes:
                         title=self.controller.get_title(at, max_size=40)
-                        i=gtk.MenuItem(title, use_underline=False)
+                        i=Gtk.MenuItem(title, use_underline=False)
                         i.connect('activate', lambda i, s, t: self.controller.gui.open_adhoc_view(name, source=s, label=t, destination=self.location), "here/annotationTypes/%s/annotations/sorted" % at.id, title)
                         sm.append(i)
                 elif saved:
-                    menu=gtk.Menu()
+                    menu=Gtk.Menu()
                     if name == 'comment':
-                        i=gtk.MenuItem(_("Create a new comment view"))
+                        i=Gtk.MenuItem(_("Create a new comment view"))
                     else:
-                        i=gtk.MenuItem(_("Open a new view"))
+                        i=Gtk.MenuItem(_("Open a new view"))
                     i.connect('activate', lambda i: self.controller.gui.open_adhoc_view(name, label=label, destination=self.location))
                     menu.append(i)
                 else:
@@ -305,19 +310,19 @@ class ViewBook(AdhocView):
 
                 if menu is not None:
                     if saved:
-                        i=gtk.MenuItem(_("Open a saved view"))
+                        i=Gtk.MenuItem(_("Open a saved view"))
                         menu.append(i)
-                        sm=gtk.Menu()
+                        sm=Gtk.Menu()
                         i.set_submenu(sm)
                         for v in saved:
-                            i=gtk.MenuItem(v.title, use_underline=False)
+                            i=Gtk.MenuItem(v.title, use_underline=False)
                             if name == 'comment':
                                 i.connect('activate', lambda i, vv: self.controller.gui.open_adhoc_view('edit', element=vv, destination=self.location), v)
                             else:
                                 i.connect('activate', lambda i, vv: self.controller.gui.open_adhoc_view(vv, label=vv.title, destination=self.location), v)
                             sm.append(i)
                     menu.show_all()
-                    menu.popup(None, None, None, 0, gtk.get_current_event_time())
+                    menu.popup_at_pointer(None)
                 else:
                     view=self.controller.gui.open_adhoc_view(name, label=label, destination=None)
                     if view is not None:
@@ -335,70 +340,79 @@ class ViewBook(AdhocView):
                 view.set_master_view(master)
             return True
         elif targetType == config.data.target_type['adhoc-view-instance']:
-            v=self.controller.gui.get_adhoc_view_instance_from_id(selection.data)
+            v=self.controller.gui.get_adhoc_view_instance_from_id(selection.get_data().decode('utf-8'))
             if v is not None:
-                wid=v.widget
                 self.add_view(v, name=v._label)
                 if hasattr(v, 'reparent_done'):
                     v.reparent_done()
             else:
-                print "Cannot find view ", selection.data
+                logger.error("Cannot find view %s", selection.get_data())
             return True
         elif targetType == config.data.target_type['view']:
-            v=self.controller.package.views.get(unicode(selection.data, 'utf8'))
+            v=self.controller.package.views.get(str(selection.get_data(), 'utf8'))
             if helper.get_view_type(v) in ('static', 'dynamic'):
                 # Edit the view.
                 self.controller.gui.open_adhoc_view('edit', element=v, destination=self.location)
             else:
-                print "Unhandled case in viewbook: targetType=view"
+                logger.error("Unhandled case in viewbook (targetType=view) for %s", v.id)
             return True
         elif targetType == config.data.target_type['query']:
-            v=self.controller.package.queries.get(unicode(selection.data, 'utf8'))
+            v=self.controller.package.queries.get(str(selection.get_data(), 'utf8'))
             if v is not None:
                 self.controller.gui.open_adhoc_view('edit', element=v, destination=self.location)
+            else:
+                logger.error("Unhandled case in viewbook (targetType=query) for %s", v.id)
             return True
         elif targetType == config.data.target_type['schema']:
-            v=self.controller.package.schemas.get(unicode(selection.data, 'utf8'))
+            v=self.controller.package.schemas.get(str(selection.get_data(), 'utf8'))
             if v is not None:
                 self.controller.gui.open_adhoc_view('edit', element=v, destination=self.location)
+            else:
+                logger.error("Unhandled case in viewbook (targetType=schema) for %s", v.id)
             return True
         elif targetType == config.data.target_type['relation']:
-            v=self.controller.package.relations.get(unicode(selection.data, 'utf8'))
+            v=self.controller.package.relations.get(str(selection.get_data(), 'utf8'))
             if v is not None:
                 self.controller.gui.open_adhoc_view('edit', element=v, destination=self.location)
+            else:
+                logger.error("Unhandled case in viewbook (targetType=relation) for %s", v.id)
             return True
         elif targetType == config.data.target_type['annotation-type']:
-            at=self.controller.package.annotationTypes.get(unicode(selection.data, 'utf8'))
+            at=self.controller.package.annotationTypes.get(str(selection.get_data(), 'utf8'))
+            if at is None:
+                logger.error("Unhandled case in viewbook (targetType=relation) for %s", v.id)
+                return True
             # Propose a menu to open various views for the annotation-type:
-            menu=gtk.Menu()
+            menu=Gtk.Menu()
             title=self.controller.get_title(at, max_size=40)
-            i=gtk.MenuItem(_("Use annotation-type %s :") % title, use_underline=False)
+            i=Gtk.MenuItem(_("Use annotation-type %s :") % title, use_underline=False)
+            talespath = 'here/annotationTypes/%s' % at.id
             menu.append(i)
             for label, action in (
                 (_("to edit it"), lambda i :self.controller.gui.open_adhoc_view('edit', element=at, destination=self.location)),
                 (_("to create a new static view"), lambda i: create_and_open_view([ at ])),
-                (_("as a transcription"), lambda i: self.controller.gui.open_adhoc_view('transcription', source='here/annotationTypes/%s/annotations/sorted' % at.id, destination=self.location, label=title)),
+                (_("as a transcription"), lambda i: self.controller.gui.open_adhoc_view('transcription', source='%s/annotations/sorted' % talespath, destination=self.location, label=title)),
                 (_("in a timeline"), lambda i: self.controller.gui.open_adhoc_view('timeline', elements=at.annotations, annotationtypes=[ at ], destination=self.location, label=title)),
                 (_("as a montage"), lambda i: self.controller.gui.open_adhoc_view('montage', elements=at.annotations, destination=self.location, label=title)),
-                (_("in a table"), lambda i: self.controller.gui.open_adhoc_view('table', elements=at.annotations, destination=self.location, label=title)),
+                (_("in a table"), lambda i: self.controller.gui.open_adhoc_view('table', source='%s/annotations' % talespath, destination=self.location, label=title)),
                 (_("in a query"), lambda i: self.controller.gui.open_adhoc_view('interactivequery', here=at, destination=self.location, label=_("Query %s") % title)),
                 (_("in the TALES browser"), lambda i: self.controller.gui.open_adhoc_view('browser', element=at, destination=self.location, label=_("Browsing %s") % title)),
                 ):
-                i=gtk.MenuItem(u"    " + label, use_underline=False)
+                i=Gtk.MenuItem("    " + label, use_underline=False)
                 i.connect('activate', action)
                 menu.append(i)
             menu.show_all()
-            menu.popup(None, None, None, 0, gtk.get_current_event_time())
+            menu.popup_at_pointer(None)
             return True
         elif targetType == config.data.target_type['annotation']:
-            sources=[ self.controller.package.annotations.get(uri) for uri in unicode(selection.data, 'utf8').split('\n') ]
+            sources=[ self.controller.package.annotations.get(uri) for uri in str(selection.get_data(), 'utf8').split('\n') ]
             # Propose a menu to open various views for the annotation:
-            menu=gtk.Menu()
+            menu=Gtk.Menu()
 
             if len(sources) == 1:
                 a=sources[0]
                 title=self.controller.get_title(a, max_size=40)
-                i=gtk.MenuItem(_("Use annotation %s :") % title, use_underline=False)
+                i=Gtk.MenuItem(_("Use annotation %s :") % title, use_underline=False)
                 menu.append(i)
                 for label, action in (
                     (_("to edit it"), lambda i: edit_annotation(a)),
@@ -408,7 +422,7 @@ class ViewBook(AdhocView):
                     (_("to display its contents"), lambda i: self.controller.gui.open_adhoc_view('annotationdisplay', annotation=a, destination=self.location, label=_("%s") % title)) ,
                     (_("as a bookmark"), lambda i: self.controller.gui.open_adhoc_view('activebookmarks', elements=[ a.fragment.begin ], destination=self.location)),
                     ):
-                    i=gtk.MenuItem(u"    " + label, use_underline=False)
+                    i=Gtk.MenuItem("    " + label, use_underline=False)
                     i.connect('activate', action)
                     menu.append(i)
 
@@ -419,59 +433,75 @@ class ViewBook(AdhocView):
                     return True
 
                 if self.controller.package.queries:
-                    sm=gtk.Menu()
+                    sm=Gtk.Menu()
                     for q in self.controller.package.queries:
-                        i=gtk.MenuItem(self.controller.get_title(q, max_size=40), use_underline=False)
+                        i=Gtk.MenuItem(self.controller.get_title(q, max_size=40), use_underline=False)
                         i.connect('activate', apply_query, q)
                         sm.append(i)
-                    i=gtk.MenuItem(u"    " + _("as the context for the query..."), use_underline=False)
+                    i=Gtk.MenuItem("    " + _("as the context for the query..."), use_underline=False)
                     i.set_submenu(sm)
                     menu.append(i)
             else:
                 title=_("Set of annotations")
-                i=gtk.MenuItem(_("Use annotations:"), use_underline=False)
+                i=Gtk.MenuItem(_("Use annotations:"), use_underline=False)
                 menu.append(i)
                 for label, action in (
                     (_("to edit them"), lambda i: edit_selection(sources)),
-                    (_("in a table"), lambda i: self.controller.gui.open_adhoc_view('table', elements=sources)),
+                    (_("in a table"), lambda i: self.controller.gui.open_adhoc_view('table', elements=sources, destination=self.location)),
                     (_("to create a new static view"), lambda i: create_and_open_view(sources)),
                     (_("as bookmarks"), lambda i: self.controller.gui.open_adhoc_view('activebookmarks', elements=[ a.fragment.begin for a in sources ], destination=self.location)),
                     ):
-                    i=gtk.MenuItem(u"    " + label, use_underline=False)
+                    i=Gtk.MenuItem("    " + label, use_underline=False)
                     i.connect('activate', action)
                     menu.append(i)
             menu.show_all()
-            menu.popup(None, None, None, 0, gtk.get_current_event_time())
+            menu.popup_at_pointer(None)
             return True
         elif targetType == config.data.target_type['timestamp']:
-            data=decode_drop_parameters(selection.data)
+            data=decode_drop_parameters(selection.get_data())
             v=self.controller.gui.open_adhoc_view('activebookmarks', destination=self.location)
-            v.append(long(data['timestamp']), comment=data.get('comment', ''))
+            v.append(int(data['timestamp']), comment=data.get('comment', ''))
             return True
         else:
-            print "Unknown drag target received ", targetType
+            logger.error("Unknown drag target received %s", targetType)
+        return False
+
+    def on_key_press_event(self, widget, event):
+        """Keypress handling.
+        """
+        if event.get_state() & Gdk.ModifierType.CONTROL_MASK:
+            # The Control-key is held. Special actions :
+            if event.keyval == Gdk.KEY_Page_Up:
+                # Popup the evaluator window
+                self.widget.prev_page()
+                return True
+            elif event.keyval == Gdk.KEY_Page_Down:
+                # Popup the evaluator window
+                self.widget.next_page()
+                return True
         return False
 
     def build_widget(self):
-        notebook=gtk.Notebook()
-        notebook.set_tab_pos(gtk.POS_TOP)
+        notebook=Gtk.Notebook()
+        notebook.set_tab_pos(Gtk.PositionType.TOP)
         notebook.popup_disable()
         notebook.set_scrollable(True)
 
+        notebook.connect('key-press-event', self.on_key_press_event)
         notebook.connect('drag-data-received', self.drag_received)
-        notebook.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                               gtk.DEST_DEFAULT_HIGHLIGHT |
-                               gtk.DEST_DEFAULT_DROP |
-                               gtk.DEST_DEFAULT_ALL,
-                               config.data.drag_type['adhoc-view'] +
-                               config.data.drag_type['adhoc-view-instance'] +
-                               config.data.drag_type['view'] +
-                               config.data.drag_type['query'] +
-                               config.data.drag_type['schema'] +
-                               config.data.drag_type['annotation-type'] +
-                               config.data.drag_type['annotation'] +
-                               config.data.drag_type['relation'] +
-                               config.data.drag_type['timestamp'],
-                               gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_MOVE | gtk.gdk.ACTION_LINK)
+        notebook.drag_dest_set(Gtk.DestDefaults.MOTION |
+                               Gtk.DestDefaults.HIGHLIGHT |
+                               Gtk.DestDefaults.DROP |
+                               Gtk.DestDefaults.ALL,
+                               config.data.get_target_types('adhoc-view',
+                                                            'adhoc-view-instance',
+                                                            'view',
+                                                            'query',
+                                                            'schema',
+                                                            'annotation-type',
+                                                            'annotation',
+                                                            'relation',
+                                                            'timestamp'),
+                               Gdk.DragAction.COPY | Gdk.DragAction.MOVE | Gdk.DragAction.LINK)
 
         return notebook
diff --git a/lib/advene/gui/views/viewplugin.py b/lib/advene/gui/views/viewplugin.py
index 2d7c216..d8cd499 100644
--- a/lib/advene/gui/views/viewplugin.py
+++ b/lib/advene/gui/views/viewplugin.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/gui/widget.py b/lib/advene/gui/widget.py
index a7e509e..c51255f 100644
--- a/lib/advene/gui/widget.py
+++ b/lib/advene/gui/widget.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,55 +20,52 @@
 
 Note that, contrary to a common pattern found in the Advene sources
 (where the real widget is stored as the self.widget attribute), each
-of the widgets defined in this module is a gtk.Widget.
+of the widgets defined in this module is a Gtk.Widget.
 
-Documentation:
-http://www.tortall.net/mu/wiki/CairoTutorial
-
-http://www.pygtk.org/pygtk2reference/class-pangocairocairocontext.html
-http://www.nabble.com/Image-Manipulation-under-pyGTK-t3484319.html
-http://lists.freedesktop.org/archives/cairo/2007-February/009810.html
-http://www.tortall.net/mu/wiki/CairoTutorial#understanding-text
-http://nzlinux.virtuozzo.co.nz/blogs/2005/08/18/using-pangocairo/
-http://laszlok2.blogspot.com/2006/05/prince-of-cairo_28.html
+Updated tutorial for gtk3:
+http://zetcode.com/gfx/pycairo/basicdrawing/
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import struct
 import os
 
 from gettext import gettext as _
 
-import gtk
+import gi
 import cairo
-import pango
-import gobject
+from gi.repository import GObject
+from gi.repository import GdkPixbuf
+from gi.repository import Gdk
+from gi.repository import Gtk
+from gi.repository import Pango
 
 try:
-    import rsvg
+    gi.require_version('Rsvg', '2.0')
+    from gi.repository import Rsvg
 except ImportError:
-    import advene.util.ctypesrsvg as rsvg
+    import advene.util.ctypesrsvg as Rsvg
 
 # Advene part
 import advene.core.config as config
-from advene.core.imagecache import ImageCache
 
 from advene.gui.util import png_to_pixbuf, enable_drag_source, name2color
-from advene.gui.util import get_color_style
 import advene.util.helper as helper
 from advene.model.annotation import Annotation
 import advene.gui.popup
 
 active_color=name2color('#fdfd4b')
 
-class GenericColorButtonWidget(gtk.DrawingArea):
+class GenericColorButtonWidget(Gtk.DrawingArea):
     """ Widget emulating a color button widget
     """
     def __init__(self, element=None, container=None):
-        gtk.DrawingArea.__init__(self)
-        self.set_flags(self.flags() | gtk.CAN_FOCUS)
+        GObject.GObject.__init__(self)
+        self.set_can_focus(True)
         self.element=element
 
-        # If not None, it should contain a gtk.gdk.Color
+        # If not None, it should contain a Gdk.Color
         # which will override the normal color
         self.local_color=None
         # Alpha will be used to draw features
@@ -82,42 +79,43 @@ class GenericColorButtonWidget(gtk.DrawingArea):
             self.controller=container.controller
         else:
             self.controller=None
-        self.set_events(gtk.gdk.POINTER_MOTION_MASK |
-                        gtk.gdk.POINTER_MOTION_HINT_MASK |
-                        gtk.gdk.BUTTON_PRESS_MASK |
-                        gtk.gdk.BUTTON_RELEASE_MASK |
-                        gtk.gdk.BUTTON1_MOTION_MASK |
-                        gtk.gdk.KEY_PRESS_MASK |
-                        gtk.gdk.KEY_RELEASE_MASK |
-                        gtk.gdk.FOCUS_CHANGE_MASK |
-                        gtk.gdk.ENTER_NOTIFY_MASK |
-                        gtk.gdk.LEAVE_NOTIFY_MASK |
-                        gtk.gdk.SCROLL_MASK)
-
-        self.connect('expose-event', self.expose_cb)
+        self.set_events(Gdk.EventMask.POINTER_MOTION_MASK |
+                        Gdk.EventMask.POINTER_MOTION_HINT_MASK |
+                        Gdk.EventMask.BUTTON_PRESS_MASK |
+                        Gdk.EventMask.BUTTON_RELEASE_MASK |
+                        Gdk.EventMask.BUTTON1_MOTION_MASK |
+                        Gdk.EventMask.KEY_PRESS_MASK |
+                        Gdk.EventMask.KEY_RELEASE_MASK |
+                        Gdk.EventMask.FOCUS_CHANGE_MASK |
+                        Gdk.EventMask.ENTER_NOTIFY_MASK |
+                        Gdk.EventMask.LEAVE_NOTIFY_MASK |
+                        Gdk.EventMask.SCROLL_MASK)
+
+        self.connect('draw', self.draw_cb)
         self.connect('realize', self.realize_cb)
-        self.connect_after('size-request', self.size_request_cb)
+        self.connect_after('size-allocate', self.size_request_cb)
         self.connect('focus-in-event', self.update_widget)
         self.connect('focus-out-event', self.update_widget)
 
         #self.connect('event', self.debug_cb, "Event")
         #self.connect_after('event', self.debug_cb, "After")
 
-        self.cached_surface = None
-        self.cached_context = None
-
         self.default_size = (40, 10)
         # Initialize the size
         self.set_size_request(*self.needed_size())
 
     def _drag_begin(self, widget, context):
-        cm=gtk.gdk.colormap_get_system()
-        w,h=self.needed_size()
-        pixmap=gtk.gdk.Pixmap(None, w, h, cm.get_visual().depth)
-        cr=pixmap.cairo_create()
+        # see https://developer.gnome.org/gtk3/stable/ch26s02.html
+        w,h = self.needed_size()
+        pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, w, h)
+        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, pixbuf.get_width(),
+                                     pixbuf.get_height())
+        cr = cairo.Context(surface)
         self.draw(cr, w, h)
-        cr.paint_with_alpha(0.0)
-        widget.drag_source_set_icon(cm, pixmap)
+        Gdk.cairo_set_source_pixbuf(cr, pixbuf, 0, 0)
+        cr.paint()
+        # FIXME3: use drag_source_set_icon_pixbuf
+        widget.drag_source_set_icon_pixbuf(pixbuf)
         def set_cursor(wid, t=None, precision=None):
             try:
                 self.container.set_annotation(t)
@@ -125,30 +123,24 @@ class GenericColorButtonWidget(gtk.DrawingArea):
                 # The container does not implement the set_annotation method.
                 return False
             return True
-        pixmap.set_cursor = set_cursor.__get__(w)
+        pixbuf.set_cursor = set_cursor.__get__(w)
         return True
 
     def reset_surface_size(self, width=None, height=None):
-        """Redimension the cached widget content.
+        """Redimension the widget content.
         """
-        if not self.window:
+        w = self.get_window()
+        if not w:
             return False
-        s=self.window.get_size()
         if width is None:
-            width=s[0]
+            width = w.get_width()
         if height is None:
-            height=s[1]
+            height = w.get_height()
         if width <= 0:
-            print "Error: width ", width, " <= 0 for ", self.element.id
+            logger.warn("Error: width %d <= 0 for %s", width, self.element.id)
             width=5
-        if (self.cached_surface
-            and self.cached_surface.get_width() == width
-            and self.cached_surface.get_height() == height):
-            return True
-        self.cached_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
-        self.cached_context = cairo.Context(self.cached_surface)
         self.set_size_request(width, height)
-        self.window.lower()
+        #self.get_window().lower()
         return True
 
     def realize_cb(self, widget):
@@ -199,50 +191,24 @@ class GenericColorButtonWidget(gtk.DrawingArea):
     def update_widget(self, *p):
         """Update the widget.
         """
-        if not self.window:
+        if not self.get_window():
             return False
-        if self.cached_context is None:
-            return False
-
-        # First check width
-        w=self.needed_size()[0]
-        if w != self.cached_surface.get_width():
-            self.reset_surface_size(w, self.needed_size()[1])
-
-        bwidth=self.cached_surface.get_width()
-        bheight=self.cached_surface.get_height()
-
-        self.draw(self.cached_context, bwidth, bheight)
-
         self.refresh()
         return False
 
     def refresh(self):
         """Refresh the widget.
         """
-        if self.window and self.cached_surface:
-            self.window.invalidate_rect(gtk.gdk.Rectangle(self.allocation.x, self.allocation.y,
-                                                          self.allocation.width, self.allocation.height), False)
+        self.reset_surface_size(*self.needed_size())
+        self.queue_draw()
 
-    def expose_cb(self, widget, event):
-        """Handle the expose event.
+    def draw_cb(self, widget, context):
+        """Handle the draw event.
         """
-        if self.cached_surface is None:
-            return False
-
-        context = widget.window.cairo_create()
-
-        # Set a clip region for the expose event
-        context.rectangle(event.area.x, event.area.y,
-                          event.area.width, event.area.height)
-        context.clip()
-
-        # copy the annotation_surface onto this context
-        context.set_source_surface(self.cached_surface, 0, 0)
         context.paint_with_alpha(self.expose_alpha)
-        #self.draw(context, *widget.window.get_size())
+        self.draw(context, widget.get_window().get_width(), widget.get_window().get_height())
         return False
-gobject.type_register(GenericColorButtonWidget)
+GObject.type_register(GenericColorButtonWidget)
 
 class AnnotationWidget(GenericColorButtonWidget):
     """ Widget representing an annotation
@@ -274,53 +240,55 @@ class AnnotationWidget(GenericColorButtonWidget):
             widgets=self.container.get_selected_annotation_widgets()
             if not widget in widgets:
                 widgets=[]
-        except AttributeError:
+        except (AttributeError, RuntimeError):
             widgets=[]
 
-        w=gtk.Window(gtk.WINDOW_POPUP)
+        w=Gtk.Window(Gtk.WindowType.POPUP)
         w.set_decorated(False)
         # Set white on black background
-        style=get_color_style(w, 'black', 'white')
-        w.set_style(style)
-
-        v=gtk.VBox()
-        v.set_style(style)
-        h=gtk.HBox()
-        h.set_style(style)
-        begin=gtk.Image()
-        h.pack_start(begin, expand=False)
-        padding=gtk.HBox()
+        w.get_style_context().add_class('advene_drag_icon')
+
+        v=Gtk.VBox()
+        v.get_style_context().add_class('advene_drag_icon')
+        h=Gtk.HBox()
+        h.get_style_context().add_class('advene_drag_icon')
+        begin=Gtk.Image()
+        h.pack_start(begin, False, True, 0)
+        padding=Gtk.HBox()
         # Padding
-        h.pack_start(padding, expand=True)
-        end=gtk.Image()
-        h.pack_start(end, expand=False)
-        v.pack_start(h, expand=False)
-        l=gtk.Label()
-        l.set_ellipsize(pango.ELLIPSIZE_END)
-        l.set_style(style)
-        v.pack_start(l, expand=False)
+        h.pack_start(padding, True, True, 0)
+        end=Gtk.Image()
+        h.pack_start(end, False, True, 0)
+        v.pack_start(h, False, True, 0)
+        l=Gtk.Label()
+        l.set_ellipsize(Pango.EllipsizeMode.END)
+        l.get_style_context().add_class('advene_drag_icon')
+        v.pack_start(l, False, True, 0)
 
         def set_cursor(wid, t=None, precision=None):
             if t is None:
-                t=self.annotation
+                t = self.annotation
             if precision is None:
-                precision=config.data.preferences['bookmark-snapshot-precision']
-            cache=self.controller.package.imagecache
+                precision = config.data.preferences['bookmark-snapshot-precision']
             if self.no_image_pixbuf is None:
-                self.no_image_pixbuf=png_to_pixbuf(ImageCache.not_yet_available_image, width=config.data.preferences['drag-snapshot-width'])
+                self.no_image_pixbuf = png_to_pixbuf(self.controller.get_snapshot(position=-1), width=config.data.preferences['drag-snapshot-width'])
             if not t == w._current:
-                if isinstance(t, long) or isinstance(t, int):
-                    if cache.is_initialized(t, epsilon=precision):
-                        begin.set_from_pixbuf(png_to_pixbuf (cache.get(t, epsilon=precision), width=config.data.preferences['drag-snapshot-width']))
-                    elif begin.get_pixbuf() != self.no_image_pixbuf:
-                        begin.set_from_pixbuf(self.no_image_pixbuf)
+                if isinstance(t, int):
+                    snap = self.controller.get_snapshot(position=t, annotation=self.annotation, precision=precision)
+                    if snap.is_default:
+                        pixbuf = self.no_image_pixbuf
+                    else:
+                        pixbuf = png_to_pixbuf(snap, width=config.data.preferences['drag-snapshot-width'])
+                    begin.set_from_pixbuf(pixbuf)
                     end.hide()
                     padding.hide()
                     l.set_text(helper.format_time(t))
                 elif isinstance(t, Annotation):
                     # It can be an annotation
-                    begin.set_from_pixbuf(png_to_pixbuf (cache.get(t.fragment.begin), width=config.data.preferences['drag-snapshot-width']))
-                    end.set_from_pixbuf(png_to_pixbuf (cache.get(t.fragment.end), width=config.data.preferences['drag-snapshot-width']))
+                    begin.set_from_pixbuf(png_to_pixbuf(self.controller.get_snapshot(annotation=t),
+                                                        width=config.data.preferences['drag-snapshot-width']))
+                    end.set_from_pixbuf(png_to_pixbuf(self.controller.get_snapshot(annotation=t, position=t.fragment.end),
+                                                      width=config.data.preferences['drag-snapshot-width']))
                     end.show()
                     padding.show()
                     if widgets:
@@ -335,9 +303,9 @@ class AnnotationWidget(GenericColorButtonWidget):
         w._current=None
         w.set_cursor = set_cursor.__get__(w)
         w.set_cursor()
-        w.set_size_request(long(2.5 * config.data.preferences['drag-snapshot-width']), -1)
+        w.set_size_request(int(2.5 * config.data.preferences['drag-snapshot-width']), -1)
         widget._icon=w
-        context.set_icon_widget(w, 0, 0)
+        Gtk.drag_set_icon_widget(context, w, 0, 0)
         return True
 
     def set_active(self, b):
@@ -347,12 +315,12 @@ class AnnotationWidget(GenericColorButtonWidget):
     def keypress(self, widget, event, annotation):
         """Handle the key-press event.
         """
-        if event.keyval == gtk.keysyms.e:
+        if event.keyval == Gdk.KEY_e:
             try:
                 widgets=self.container.get_selected_annotation_widgets()
                 if not widget in widgets:
                     widgets=None
-            except AttributeError:
+            except (AttributeError, RuntimeError):
                 widgets=None
             if not widgets:
                 self.controller.gui.edit_element(annotation)
@@ -360,7 +328,7 @@ class AnnotationWidget(GenericColorButtonWidget):
                 for w in widgets:
                     self.controller.gui.edit_element(w.annotation)
             return True
-        elif event.keyval == gtk.keysyms.h:
+        elif event.keyval == Gdk.KEY_h:
             if self.active:
                 event="AnnotationDeactivate"
             else:
@@ -368,26 +336,23 @@ class AnnotationWidget(GenericColorButtonWidget):
             self.active=not self.active
             self.controller.notify(event, annotation=self.annotation)
             return True
-        elif event.keyval == gtk.keysyms.F11:
+        elif event.keyval == Gdk.KEY_F11:
             menu=advene.gui.popup.Menu(annotation, controller=self.controller)
             menu.popup()
             return True
-        elif event.keyval == gtk.keysyms.space:
+        elif event.keyval == Gdk.KEY_space:
             # Play the annotation
             c=self.controller
-            pos = c.create_position (value=annotation.fragment.begin,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-            c.queue_action(c.update_status, status="set", position=pos)
+            c.queue_action(c.update_status, status="seek", position=annotation.fragment.begin)
             c.gui.set_current_annotation(annotation)
             return True
-        elif event.keyval == gtk.keysyms.Delete or event.keyval == gtk.keysyms.BackSpace:
+        elif event.keyval == Gdk.KEY_Delete or event.keyval == Gdk.KEY_BackSpace:
             # Delete annotation or selection
             try:
                 widgets=self.container.get_selected_annotation_widgets()
                 if not widget in widgets:
                     widgets=None
-            except AttributeError:
+            except (AttributeError, RuntimeError):
                 widgets=None
             if not widgets:
                 self.controller.delete_element(annotation)
@@ -422,7 +387,7 @@ class AnnotationWidget(GenericColorButtonWidget):
         try:
             context.rectangle(0, 0, width, height)
         except MemoryError:
-            print "MemoryError when rendering rectangle for annotation ", self.annotation.id
+            logger.error("MemoryError when rendering rectangle for annotation %s", self.annotation.id)
             return
 
         color=None
@@ -456,7 +421,7 @@ class AnnotationWidget(GenericColorButtonWidget):
                 return
             if width < s:
                 # There are more samples than available pixels. Downsample the data
-                l=l[::(s/width)+1]
+                l=l[::int(s/width)+1]
                 s=len(l)
             w=1.0 * width / s
             c = 0
@@ -469,18 +434,17 @@ class AnnotationWidget(GenericColorButtonWidget):
             context.line_to(int(c), height)
             context.fill()
             return
-        elif self.annotation.content.mimetype == 'image/svg+xml' and rsvg is not None:
+        elif self.annotation.content.mimetype == 'image/svg+xml' and Rsvg is not None:
             if width < 6:
                 return
             if self.annotation.content.data:
                 try:
-                    s=rsvg.Handle(data=self.annotation.content.data)
-                    scale = 1.0 * height / s.get_dimension_data()[1]
+                    s = Rsvg.Handle.new_from_data(self.annotation.content.data.encode('utf-8'))
+                    scale = 1.0 * height / s.get_dimensions().height
                     context.set_matrix(cairo.Matrix( scale, 0, 0, scale, 0, 0 ))
                     s.render_cairo(context)
-                except:
-                    print "Error when rendering SVG timeline component"
-                    pass
+                except Exception:
+                    logger.error("Error when rendering SVG timeline component %s", exc_info=True)
             return
 
         # Draw the border
@@ -507,11 +471,11 @@ class AnnotationWidget(GenericColorButtonWidget):
         context.move_to(2, int(height * 0.7))
 
         context.set_source_rgba(0, 0, 0, self.alpha)
-        title=unicode(self.controller.get_title(self.annotation))
+        title=str(self.controller.get_title(self.annotation))
         try:
-            context.show_text(title.encode('utf8'))
+            context.show_text(title)
         except MemoryError:
-            print "MemoryError while rendering title for annotation ", self.annotation.id
+            logger.error("MemoryError while rendering title for annotation %s", self.annotation.id, exc_info=True)
 
         if self._fraction_marker is not None:
             x=int(self._fraction_marker * width)
@@ -521,7 +485,7 @@ class AnnotationWidget(GenericColorButtonWidget):
             context.line_to(x, height)
             context.stroke()
 
-gobject.type_register(AnnotationWidget)
+GObject.type_register(AnnotationWidget)
 
 class AnnotationTypeWidget(GenericColorButtonWidget):
     """ Widget representing an annotation type
@@ -551,7 +515,7 @@ class AnnotationTypeWidget(GenericColorButtonWidget):
     def keypress(self, widget, event, annotationtype):
         """Handle the key-press event.
         """
-        if event.keyval == gtk.keysyms.e:
+        if event.keyval == Gdk.KEY_e:
             self.controller.gui.edit_element(annotationtype)
             return True
         return False
@@ -561,7 +525,7 @@ class AnnotationTypeWidget(GenericColorButtonWidget):
 
         Method to be implemented by subclasses
         """
-        w=self.width or 60
+        w=self.width or 120
         return (w, self.container.button_height)
 
     def draw(self, context, width, height):
@@ -599,9 +563,9 @@ class AnnotationTypeWidget(GenericColorButtonWidget):
             # Draw a highlight mark
             context.set_source_rgba(0, 0, 0, .5)
             context.set_line_width(1)
-            context.move_to(width / 2, 0)
-            context.line_to(width / 2 + 10, height / 2)
-            context.line_to(width / 2, height)
+            context.move_to(int(width / 2, 0))
+            context.line_to(int(width / 2) + 10, int(height / 2))
+            context.line_to(int(width / 2), height)
             context.fill()
             context.stroke()
 
@@ -614,14 +578,14 @@ class AnnotationTypeWidget(GenericColorButtonWidget):
         context.move_to(2, int(height * 0.7))
 
         context.set_source_rgba(0, 0, 0, 1)
-        title=unicode(self.controller.get_title(self.annotationtype))
-        context.show_text(title.encode('utf8'))
+        title=str(self.controller.get_title(self.annotationtype))
+        context.show_text(title)
         if self.width is None:
             ext=context.text_extents(title)
             if ext[2] != self.width:
-                self.width=long(ext[2]) + 5
+                self.width=int(ext[2]) + 5
                 self.reset_surface_size(self.width, self.container.button_height)
-gobject.type_register(AnnotationTypeWidget)
+GObject.type_register(AnnotationTypeWidget)
 
 class TagWidget(GenericColorButtonWidget):
     """ Widget representing a tag
@@ -633,24 +597,25 @@ class TagWidget(GenericColorButtonWidget):
         # drag_set_icon_cursor does not work on native Gtk on MacOS X
         if not (config.data.os == 'darwin' and not os.environ.get('DISPLAY')):
             self.connect('drag-begin', self._drag_begin)
-        self.drag_source_set(gtk.gdk.BUTTON1_MASK,
-                             config.data.drag_type['tag'],
-                             gtk.gdk.ACTION_LINK)
+        self.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
+                             config.data.get_target_types('tag'),
+                             Gdk.DragAction.LINK)
         # The button can generate drags
         self.connect('drag-data-get', self.drag_sent)
 
         # Allow the entry to get drops of type application/x-color
         self.connect('drag-data-received', self.drag_received)
-        self.drag_dest_set(gtk.DEST_DEFAULT_MOTION |
-                                 gtk.DEST_DEFAULT_HIGHLIGHT |
-                                 gtk.DEST_DEFAULT_ALL,
-                                 config.data.drag_type['color'], gtk.gdk.ACTION_COPY)
+        self.drag_dest_set(Gtk.DestDefaults.MOTION |
+                           Gtk.DestDefaults.HIGHLIGHT |
+                           Gtk.DestDefaults.ALL,
+                           config.data.get_target_types('color'),
+                           Gdk.DragAction.COPY)
 
     def drag_sent(self, widget, context, selection, targetType, eventTime):
         if targetType == config.data.target_type['tag']:
-            selection.set(selection.target, 8, unicode(self.tag).encode('utf8'))
+            selection.set(selection.get_target(), 8, self.tag.encode('utf-8'))
         else:
-            self.log("Unknown target type for drag: %d" % targetType)
+            logger.warn("Unknown target type for drag: %d" % targetType)
         return True
 
     def drag_received(self, widget, context, x, y, selection, targetType, time):
@@ -658,7 +623,7 @@ class TagWidget(GenericColorButtonWidget):
         """
         if targetType == config.data.target_type['color']:
             # The structure consists in 4 unsigned shorts: r, g, b, opacity
-            (r, g, b, opacity)=struct.unpack('HHHH', selection.data)
+            (r, g, b, opacity)=struct.unpack('HHHH', selection.get_data())
             if self.container is not None and hasattr(self.container, 'controller'):
                 c=self.container.controller
                 c.package._tag_colors[self.tag]="#%04x%04x%04x" % (r, g, b)
@@ -701,13 +666,13 @@ class TagWidget(GenericColorButtonWidget):
         context.move_to(2, int(height * 0.7))
 
         context.set_source_rgba(0, 0, 0, 1)
-        context.show_text(unicode(self.tag).encode('utf8'))
+        context.show_text(str(self.tag))
         ext=context.text_extents(self.tag)
-        w=long(ext[2]) + 5
+        w=int(ext[2]) + 5
         if self.width != w:
             self.reset_surface_size(self.width, self.container.button_height)
-            #print "Resetting width", self.width
-gobject.type_register(TagWidget)
+            logger.debug("Resetting width %d", self.width)
+GObject.type_register(TagWidget)
 
 class TimestampMarkWidget(GenericColorButtonWidget):
     """ Widget representing an timestamp mark (for note-taking view)
@@ -732,13 +697,13 @@ class TimestampMarkWidget(GenericColorButtonWidget):
         context.set_source_rgba(0, 0, 0, .5)
         context.set_line_width(1)
         context.move_to(2, 0)
-        context.line_to(width - 2, height / 2)
+        context.line_to(width - 2, int(height / 2))
         context.line_to(2, height)
         context.fill()
         context.stroke()
-gobject.type_register(TimestampMarkWidget)
+GObject.type_register(TimestampMarkWidget)
 
-class AnnotationRepresentation(gtk.Button):
+class AnnotationRepresentation(Gtk.Button):
     """Representation for an annotation.
     """
     def __init__(self, annotation, controller):
@@ -754,30 +719,30 @@ class AnnotationRepresentation(gtk.Button):
         enable_drag_source(self, self.annotation, self.controller)
 
     def button_press_handler(self, widget, event, annotation):
-        if event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS:
+        if event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
             menu=advene.gui.popup.Menu(annotation, controller=self.controller)
             menu.popup()
             return True
-        elif event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+        elif event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
             self.controller.gui.edit_element(annotation)
             return True
         return False
-gobject.type_register(AnnotationRepresentation)
+GObject.type_register(AnnotationRepresentation)
 
-class RelationRepresentation(gtk.Button):
+class RelationRepresentation(Gtk.Button):
     """Representation for a relation.
     """
     if config.data.os == 'linux':
-        arrow={ 'to': u'\u2192', 'from': u'\u2190' }
+        arrow={ 'to': helper.chars.arrow_to, 'from': helper.chars.arrow_from }
     else:
-        arrow={ 'to': u'->', 'from': u'<-' }
+        arrow={ 'to': '->', 'from': '<-' }
 
     def __init__(self, relation, controller, direction='to'):
         self.relation=relation
         self.controller=controller
         self.direction=direction
         super(RelationRepresentation, self).__init__()
-        l=gtk.Label()
+        l=Gtk.Label()
         self.add(l)
         l.show()
         self.refresh()
@@ -786,7 +751,7 @@ class RelationRepresentation(gtk.Button):
 
     def refresh(self):
         l=self.get_children()[0]
-        t=u'%s %s %s' % (self.arrow[self.direction],
+        t='%s %s %s' % (self.arrow[self.direction],
                          self.controller.get_title(self.relation),
                          self.arrow[self.direction])
         color=self.controller.get_element_color(self.relation)
@@ -796,27 +761,27 @@ class RelationRepresentation(gtk.Button):
             l.set_text(t)
 
     def button_press_handler(self, widget, event, relation):
-        if event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS:
+        if event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS:
             menu=advene.gui.popup.Menu(relation, controller=self.controller)
             menu.popup()
             return True
-        elif event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+        elif event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
             self.controller.gui.edit_element(relation)
             return True
         return False
-gobject.type_register(RelationRepresentation)
+GObject.type_register(RelationRepresentation)
 
-class TimestampRepresentation(gtk.Button):
+class TimestampRepresentation(Gtk.Button):
     """Representation of a timestamp.
 
     It is a button with a representative image and the timestamp displayed under it.
 
     @ivar image: the image widget
-    @type image: gtk.Image
+    @type image: Gtk.Image
     @ivar label: the label (timestamp) widget
-    @type label: gtk.Label
+    @type label: Gtk.Label
     """
-    def __init__(self, value, controller, width=None, epsilon=None, comment_getter=None, visible_label=True, bgcolor=None, callback=None):
+    def __init__(self, value, media, controller, width=None, precision=None, comment_getter=None, visible_label=True, callback=None):
         """Instanciate a new TimestampRepresentation.
 
         @param value: the timestamp value
@@ -825,24 +790,26 @@ class TimestampRepresentation(gtk.Button):
         @type controller: advene.core.Controller
         @param width: the snapshot width
         @type width: int
-        @param epsilon: the precision (for snapshot display)
-        @type epsilon: int (ms)
+        @param precision: the precision (for snapshot display)
+        @type precision: int (ms)
         @param comment_getter: method returning the associated comment
         @type comment_getter: method
         @param visible_label: should the timestamp label be displayed?
         @type visible_label: boolean
-        @param bgcolor: background color
-        @type bgcolor: string
         @value callback: a callback that will be called before value modification
         @type callback: method. If it returns False, then the modification will be cancelled
         """
         super(TimestampRepresentation, self).__init__()
-        self._value=value
+        self._value = value
+        self._rounded_value = controller.round_timestamp(value)
+        if media is None:
+            media = controller.package.media
+        self._media = media
         self.controller=controller
         self._width=width or config.data.preferences['bookmark-snapshot-width']
-        if epsilon is None:
-            epsilon=config.data.preferences['bookmark-snapshot-precision']
-        self.epsilon=epsilon
+        if precision is None:
+            precision=config.data.preferences['bookmark-snapshot-precision']
+        self.precision=precision
         self.visible_label=visible_label
         # comment_getter is a method which returns the comment
         # associated to this timestamp
@@ -851,24 +818,22 @@ class TimestampRepresentation(gtk.Button):
         # element as parameter, and adds appropriate menu items.
         self.extend_popup_menu=None
         self.highlight=False
-        self._bgcolor = None
         # Displayed text.
-        self._text = '<span size="xx-small">%(timestamp)s</span>'
+        self._text = '%(timestamp)s'
         self.callback = callback
 
-        box=gtk.VBox()
-        self.image=gtk.Image()
-        self.label=gtk.Label()
-        box.pack_start(self.image, expand=False)
-        box.pack_start(self.label, expand=False)
+        box=Gtk.VBox()
+        self.image=Gtk.Image()
+        self.valid_screenshot = False
+        self.label=Gtk.Label()
+        box.pack_start(self.image, False, True, 0)
+        box.pack_start(self.label, False, True, 0)
         if not self.visible_label:
             self.label.set_no_show_all(True)
             self.label.hide()
         self.add(box)
         self.box=box
 
-        self._bgcolor = bgcolor
-
         self.refresh()
 
         self.connect('button-press-event', self._button_press_handler)
@@ -876,35 +841,29 @@ class TimestampRepresentation(gtk.Button):
         enable_drag_source(self, self.get_value, self.controller)
 
         def enter_bookmark(widget, event):
-            self.controller.notify('BookmarkHighlight', timestamp=self.value, immediate=True)
+            self.controller.notify('BookmarkHighlight', timestamp=self.value, media=self._media, immediate=True)
             self.highlight=True
             return False
         def leave_bookmark(widget, event):
-            self.controller.notify('BookmarkUnhighlight', timestamp=self.value, immediate=True)
+            self.controller.notify('BookmarkUnhighlight', timestamp=self.value, media=self._media, immediate=True)
             self.highlight=False
             return False
         self.connect('enter-notify-event', enter_bookmark)
         self.connect('leave-notify-event', leave_bookmark)
 
         self._rules=[]
-        # React to UpdateSnapshot events
+        # React to SnapshotUpdate events
         self._rules.append(self.controller.event_handler.internal_rule (event='SnapshotUpdate',
                                                                         method=self.snapshot_update_cb))
         self.connect('destroy', self.remove_rules)
 
-    def get_bgcolor(self):
-        return self._bgcolor
-    def set_bgcolor(self, color):
-        if color is None:
-            color='black'
-        if color != self._bgcolor:
-            style = get_color_style(self, color, 'white')
-            self.set_style(style)
-            self.box.set_style(style)
-            self.image.set_style(style)
-            self.label.set_style(style)
-            self._bgcolor = color
-    bgcolor = property(get_bgcolor, set_bgcolor)
+    def add_class(self, cl):
+        for w in (self, self.box, self.image):
+            w.get_style_context().add_class(cl)
+
+    def remove_class(self, cl):
+        for w in (self, self.box, self.image):
+            w.get_style_context().remove_class(cl)
 
     def set_width(self, w):
         self._width = w
@@ -921,7 +880,8 @@ class TimestampRepresentation(gtk.Button):
     text = property(get_text, set_text)
 
     def snapshot_update_cb(self, context, target):
-        if abs(context.globals['position'] - self._value) <= self.epsilon:
+        if (context.globals['media'] == self._media
+            and abs(context.globals['position'] - self._rounded_value) <= self.precision):
             # Update the representation
             self.refresh()
         return True
@@ -941,9 +901,10 @@ class TimestampRepresentation(gtk.Button):
                 # None), then cancel the value setting.
                 return False
         if self.highlight:
-            self.controller.notify('BookmarkUnhighlight', timestamp=self._value, immediate=True)
+            self.controller.notify('BookmarkUnhighlight', timestamp=self._value, media=self._media, immediate=True)
             self.highlight=False
-        self._value=v
+        self._value = v
+        self._rounded_value = self.controller.round_timestamp(v)
         self.refresh()
     value=property(get_value, set_value, doc="Timestamp value")
 
@@ -952,27 +913,22 @@ class TimestampRepresentation(gtk.Button):
         """
         if self._value is None:
             return True
-        cache=self.controller.package.imagecache
-        # We have to check for is_initialized before doing the
-        # update_status, since the snapshot may be updated by the update_status
-        do_refresh=not cache.is_initialized(self._value, epsilon=self.epsilon)
-        self.controller.update_status("set", self._value)
-        if do_refresh:
-            # The image was invalidated (or not initialized). Use
-            # a timer to update it after some time.
+        self.controller.update_status("seek", self._value)
+        if not self.valid_screenshot:
+            # The image is not (yet) available. Use a timer to update
+            # it after some time.
             def refresh_timeout():
-                if cache.is_initialized(self._value, epsilon=self.epsilon):
-                    # The image was updated. Refresh the display.
-                    self.refresh()
+                # The image was maybe updated. Refresh the display.
+                self.refresh()
                 return False
-            gobject.timeout_add (100, refresh_timeout)
+            GObject.timeout_add (300, refresh_timeout)
         return True
 
     def _button_press_handler(self, widget, event):
-        if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS and self._value is not None:
+        if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS and self._value is not None:
             self.goto_and_refresh()
             return True
-        elif event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS and self.popup_menu is not None:
+        elif event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS and self.popup_menu is not None:
             self.popup_menu()
             return True
         return False
@@ -988,16 +944,15 @@ class TimestampRepresentation(gtk.Button):
             self.image.hide()
             self.set_size_request(6, 12)
         else:
-            ic=self.controller.package.imagecache
-            png = ic.get(v, epsilon=self.epsilon)
-            if png == ic.not_yet_available_image and 'async-snapshot' in self.controller.player.player_capabilities:
-                self.controller.queue_action(self.controller.update_snapshot, v)
-            self.image.set_from_pixbuf(png_to_pixbuf(png, width=self.width))
+            png = self.controller.get_snapshot(v, media=self._media, precision=self.precision)
+            self.valid_screenshot = not png.is_default
+            self.image.set_from_pixbuf(png_to_pixbuf(bytes(png), width=self.width))
             self.set_size_request(-1, -1)
             self.image.show()
         ts=helper.format_time(self._value)
         self.label.set_markup(self._text % { 'timestamp': ts })
-        if self.visible_label and self.label.get_child_requisition()[0] <= 1.2 * self.image.get_child_requisition()[0]:
+        self.label.get_style_context().add_class("timestamp_label")
+        if self.visible_label and self.label.get_child_requisition().width <= 1.2 * self.image.get_child_requisition().width:
             self.label.show()
         else:
             self.label.hide()
@@ -1019,13 +974,8 @@ class TimestampRepresentation(gtk.Button):
     def refresh_snapshot(self, *p):
         """Refresh the snapshot image.
         """
-        ic=self.controller.package.imagecache
-        if ic.is_initialized(self.value, self.epsilon):
-            # Invalidate current snapshot
-            ic.invalidate(self.value, self.epsilon)
-            self.controller.notify('SnapshotUpdate', position=self.value)
         # Ask for refresh
-        self.controller.update_snapshot(self.value)
+        self.controller.update_snapshot(self.value, media=self._media, force=True)
         self.refresh()
         return True
 
@@ -1042,40 +992,37 @@ class TimestampRepresentation(gtk.Button):
         """
         p=self.controller.player
 
-        menu = gtk.Menu()
+        menu = Gtk.Menu()
 
         def goto(it, t):
             c=self.controller
-            pos = c.create_position (value=t,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.AbsolutePosition)
-            c.update_status (status="set", position=pos)
+            c.update_status(status="seek", position=t)
             return True
 
         def save_as(it):
             self.controller.gui.save_snapshot_as(self.value)
             return True
 
-        item = gtk.MenuItem(_("Play"))
+        item = Gtk.MenuItem(_("Play"))
         item.connect('activate', goto, self.value)
         menu.append(item)
 
-        item = gtk.MenuItem(_("Refresh snapshot"))
+        item = Gtk.MenuItem(_("Refresh snapshot"))
         item.connect('activate', self.refresh_snapshot)
         menu.append(item)
 
-        item = gtk.MenuItem(_("Save as..."))
+        item = Gtk.MenuItem(_("Save as..."))
         item.connect('activate', save_as)
         menu.append(item)
 
         if self.callback is not None:
-            item = gtk.MenuItem(_("Use current player position"))
+            item = Gtk.MenuItem(_("Use current player position"))
             item.connect('activate', lambda i: self.set_value(p.current_position_value))
-            if p.status != p.PauseStatus and p.status != p.PlayingStatus:
+            if p.is_playing():
                 item.set_sensitive(False)
             menu.append(item)
 
-            item = gtk.MenuItem(_("Adjust timestamp"))
+            item = Gtk.MenuItem(_("Adjust timestamp"))
             item.connect('activate', lambda i: self.set_value(self.controller.gui.adjust_timestamp(self.get_value())))
             menu.append(item)
 
@@ -1085,10 +1032,10 @@ class TimestampRepresentation(gtk.Button):
         menu.show_all()
 
         if popup:
-            menu.popup(None, None, None, 0, gtk.get_current_event_time())
+            menu.popup_at_pointer(None)
         return menu
 
     def set_color(self, color):
         self.bgcolor = color
 
-gobject.type_register(TimestampRepresentation)
+GObject.type_register(TimestampRepresentation)
diff --git a/lib/advene/model/__init__.py b/lib/advene/model/__init__.py
index dc5e3f5..dc19bba 100644
--- a/lib/advene/model/__init__.py
+++ b/lib/advene/model/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/model/_impl.py b/lib/advene/model/_impl.py
index 6a30726..2dd036e 100644
--- a/lib/advene/model/_impl.py
+++ b/lib/advene/model/_impl.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -17,9 +17,9 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
 import xml.dom
-import urllib
+import urllib.request, urllib.parse, urllib.error
 
-from cStringIO import StringIO
+from io import StringIO
 
 import advene.model.util.uri
 
@@ -78,7 +78,7 @@ class Metaed(object):
         """
         r = StringIO()
         advene.model.util.dom.printElementText(dom_element, r)
-        return r.getvalue().decode('utf-8')
+        return r.getvalue()
 
     def getMetaData(self, namespace_uri, name):
         """Return the text content of metadata with given NS and name
@@ -188,7 +188,7 @@ class Authored(Metaed):
 
             textnode = doc.createTextNode(author)
             eltnode.appendChild(textnode)
-            eltnode.setAttributeNS(xlinkNS, "xlink:href", unicode(authorUrl))
+            eltnode.setAttributeNS(xlinkNS, "xlink:href", str(authorUrl))
   #
   # public methods
   #
@@ -268,7 +268,7 @@ class Tagged(Metaed):
         if tagmeta is None:
             return []
         else:
-            return [ urllib.unquote(t) for t in tagmeta.split(',') ]
+            return [ urllib.parse.unquote(t) for t in tagmeta.split(',') ]
 
     def _updateTagsMeta(self, tagset, ns=None):
         """Update the tags metadata.
@@ -278,7 +278,7 @@ class Tagged(Metaed):
         if ns is None:
             ns=adveneNS
         if tagset:
-            self.setMetaData (ns, "tags", ','.join( [ urllib.quote(t) for t in tagset ] ))
+            self.setMetaData (ns, "tags", ','.join( [ urllib.parse.quote(t) for t in tagset ] ))
         else:
             if self.getMetaData (ns, "tags"):
                 self.setMetaData (ns, "tags", None)
@@ -340,7 +340,7 @@ class Dated(Metaed):
            You would probably rather use the date property.
         """
         if value is not None:
-            self._getModel().setAttributeNS(dcNS, "dc:date", unicode(value))
+            self._getModel().setAttributeNS(dcNS, "dc:date", str(value))
         else:
             self._getModel().removeAttributeNS(dcNS, "date")
 
@@ -374,9 +374,9 @@ class Titled(Metaed):
         if value is not None:
             if self._getModel().hasAttributeNS(dcNS, "title"):
                 self._getModel().setAttributeNS(dcNS, "dc:title",
-                                                unicode(value))
+                                                str(value))
             else:
-                self.setMetaData(dcNS, "title", unicode(value))
+                self.setMetaData(dcNS, "title", str(value))
         else:
             if self._getModel().hasAttributeNS(dcNS, "title"):
                 self._getModel().removeAttributeNS(dcNS, "title")
@@ -417,7 +417,7 @@ class Ided(object):
     id = property(getId, setId)
 
     def _set_id (element, value):
-        element.setAttributeNS(None, "id", unicode(value))
+        element.setAttributeNS(None, "id", str(value))
     _set_id = staticmethod (_set_id)
 
 class Uried(Ided):
@@ -494,7 +494,7 @@ class Aliased(object):
            You would probably rather use the 'alias' property.
         """
         if value:
-            self._getModel().setAttributeNS(None, "as", unicode(value))
+            self._getModel().setAttributeNS(None, "as", str(value))
         else:
             self._getModel().removeAttributeNS(None, "as")
 
@@ -523,7 +523,7 @@ class Hrefed(object):
            You would probably rather use the 'href' property.
         """
         if value:
-            self._getModel().setAttributeNS(xlinkNS, "xlink:href", unicode(value))
+            self._getModel().setAttributeNS(xlinkNS, "xlink:href", str(value))
         else:
             raise AttributeError("href is a required attribute")
 
diff --git a/lib/advene/model/annotation.py b/lib/advene/model/annotation.py
index 4208da9..ca3d0dd 100644
--- a/lib/advene/model/annotation.py
+++ b/lib/advene/model/annotation.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,28 +18,26 @@
 #
 import time
 
-import util.uri
+from .util.uri import urljoin
 
-from util.auto_properties import auto_properties
+from .util.auto_properties import auto_properties
 
-import _impl
-import bundle
-import content
-import modeled
-import viewable
+from . import _impl
+from . import bundle
+from . import content
+from . import modeled
+from . import viewable
 
 from advene.model.constants import adveneNS
 
-from exception import AdveneException
-from fragment import fragmentFactory, unknownFragment
+from .exception import AdveneException
+from .fragment import fragmentFactory, unknownFragment
 
 from advene.model.util.defaultdict import DefaultDict
 
 class Annotation(modeled.Importable, content.WithContent,
                  viewable.Viewable.withClass('annotation','_get_type_uri'),
-                 _impl.Authored, _impl.Dated, _impl.Uried, _impl.Tagged):
-
-    __metaclass__ = auto_properties
+                 _impl.Authored, _impl.Dated, _impl.Uried, _impl.Tagged, metaclass=auto_properties):
 
     def getNamespaceUri(): return adveneNS
     getNamespaceUri = staticmethod(getNamespaceUri)
@@ -123,7 +121,7 @@ class Annotation(modeled.Importable, content.WithContent,
                 # FIXME: cf thread
                 # Weird use of hash() -- will this work?
                 # http://mail.python.org/pipermail/python-dev/2001-January/011794.html
-                ident = u"a" + unicode(id(self)) + unicode(time.clock()).replace('.','')
+                ident = "a" + str(id(self)) + str(time.clock()).replace('.','')
             self.setId(ident)
 
             if date is not None: self.setDate(date)
@@ -138,6 +136,17 @@ class Annotation(modeled.Importable, content.WithContent,
         return "Annotation %s:\"%s\"" % (self.getFragment(),
                                           self.getContent().getData())
 
+    def __lt__(self, other):
+        """Compare 2 annotations or 2 fragments
+        """
+        if type(self) == type(other):
+            return self.getFragment() < other.getFragment()
+        elif hasattr(other, 'getBegin'):
+            # Assume we are comparing to a fragment
+            return self.getFragment() < other
+        else:
+            raise TypeError("Invalid comparison")
+
     def __getFragmentElement(self):
         """Return the fragment element linked to this annotation"""
         return self._getChild(after=self._getMeta())
@@ -146,12 +155,15 @@ class Annotation(modeled.Importable, content.WithContent,
         """Return the type URI - used to retrieve the viewable-type"""
         return self.getType().getUri(absolute)
 
+    def getMedia(self):
+        return self.getOwnerPackage().getMedia()
+
     def getType(self):
         """Return the type of this annotation"""
         if self._cached_type is None:
             type_uri = self._getModel().getAttributeNS(None, "type")
             pkg_uri = self.getOwnerPackage ().getUri (absolute=True)
-            type_uri = util.uri.urljoin (pkg_uri, type_uri)
+            type_uri = urljoin (pkg_uri, type_uri)
             self._cached_type=self.getOwnerPackage().getAnnotationTypes()[type_uri]
         return self._cached_type
 
@@ -328,9 +340,8 @@ class Annotation(modeled.Importable, content.WithContent,
 
 class Relation(modeled.Importable, content.WithContent,
                viewable.Viewable.withClass('relation', '_get_type_uri'),
-               _impl.Authored, _impl.Dated, _impl.Uried, _impl.Tagged):
+               _impl.Authored, _impl.Dated, _impl.Uried, _impl.Tagged, metaclass=auto_properties):
     """Relation between annotations"""
-    __metaclass__ = auto_properties
 
     def __init__(self,                 # mode 1 & 2
                  parent,               # mode 1 & 2
@@ -412,7 +423,7 @@ class Relation(modeled.Importable, content.WithContent,
                 # FIXME: cf thread
                 # Weird use of hash() -- will this work?
                 # http://mail.python.org/pipermail/python-dev/2001-January/011794.html
-                ident = u"r" + unicode(id(self)) + unicode(time.clock()).replace('.','')
+                ident = "r" + str(id(self)) + str(time.clock()).replace('.','')
             self.setId(ident)
 
             if date is not None: self.setDate(date)
@@ -441,7 +452,7 @@ class Relation(modeled.Importable, content.WithContent,
         """Return the type of this relation"""
         type_uri = self._getModel().getAttributeNS(None, "type")
         pkg_uri = self.getOwnerPackage ().getUri (absolute=True)
-        type_uri = util.uri.urljoin (pkg_uri, type_uri)
+        type_uri = urljoin (pkg_uri, type_uri)
         return self.getOwnerPackage().getRelationTypes()[type_uri]
 
     def setType(self, type):
diff --git a/lib/advene/model/bundle.py b/lib/advene/model/bundle.py
index b3137f9..0865972 100644
--- a/lib/advene/model/bundle.py
+++ b/lib/advene/model/bundle.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -43,7 +43,7 @@ Permitted list operations are
 Permitted dict operations are
  - b.clear
  - b.get
- - b.has_key
+ - in b
  - b.items
  - b.iteritems
  - b.iterkeys
@@ -57,7 +57,6 @@ Permitted dict operations are
 
 Note also that iter(b) iterates over its values (as for lists). Iterating over keys required the _iterkeys_ method.
 """
-
 import advene.model.util.uri
 
 import advene.model.modeled as modeled
@@ -82,7 +81,7 @@ class AbstractBundle (object):
         Note that items in the bundle are indexed by their keys. Hence, this
         method is equivalent to _keys_.
         """
-        return self._dict.keys ()
+        return list(self._dict.keys ())
 
     def getQName (self, key, namespaces, default=None):
         """
@@ -120,7 +119,7 @@ class AbstractBundle (object):
              or v in self._dict)
 
     def __getitem__ (self, index):
-        if isinstance (index, int):
+        if isinstance (index, (int, slice)):
             return self._list[index]
         else:
             return self._dict[index]
@@ -148,23 +147,20 @@ class AbstractBundle (object):
     def get (self, id_, default=None):
         return self._dict.get (id_, default)
 
-    def has_key (self, key):
-        return self._dict.has_key (key)
-
     def items (self):
-        return self._dict.items ()
+        return list(self._dict.items ())
 
     def iteritems (self):
-        return self._dict.iteritems ()
+        return iter(self._dict.items ())
 
     def iterkeys (self):
-        return self._dict.iterkeys ()
+        return iter(self._dict.keys ())
 
     def itervalues (self):
-        return self._dict.itervalues ()
+        return iter(self._dict.values ())
 
     def ids (self):
-        return [ e.id for e in self._dict.itervalues() ]
+        return [ e.id for e in self._dict.values() ]
 
     def keys (self):
         """
@@ -173,10 +169,10 @@ class AbstractBundle (object):
         Note that items in the bundle are indexed by their keys. Hence, this
         method is equivalent to _uris_.
         """
-        return self._dict.keys ()
+        return list(self._dict.keys ())
 
     def values (self):
-        return self._dict.values ()
+        return list(self._dict.values ())
 
     #
     # helper method
@@ -185,7 +181,7 @@ class AbstractBundle (object):
     def get_by_id(self, id_):
         """Inefficient but helpful method.
         """
-        l=[ e for e in self._dict.itervalues() if e.id == id_ ]
+        l=[ e for e in self._dict.values() if e.id == id_ ]
         if len(l) == 1:
             return l[0]
         else:
@@ -282,7 +278,7 @@ class WritableBundle (AbstractBundle):
 
         length = len(self)
         if not (-length <= index <= length):
-            raise IndexError, (index, self._list)
+            raise IndexError(index, self._list)
 
         self._list.insert(index, item)
         self._dict[item.getUri (absolute=True)] = item
@@ -293,7 +289,7 @@ class WritableBundle (AbstractBundle):
         if check is item:
             del self[uri]
             return
-        raise ValueError, _('%s not in bundle') % item
+        raise ValueError(_('%s not in bundle') % item)
 
     def pop(self, index=0):
         r = self[index]
@@ -546,8 +542,7 @@ class RefBundle (AbstractXmlBundle):
             r = self.__source[uri]
         except KeyError:
             # INTEGRITY CONSTRAINT: xxx
-            raise AdveneException, \
-                  '%s does not belong to the package' % href
+            raise AdveneException('%s does not belong to the package' % href)
         self.__elt_dict[r] = element
         return r
 
diff --git a/lib/advene/model/constants.py b/lib/advene/model/constants.py
index 21b714d..d0e643b 100644
--- a/lib/advene/model/constants.py
+++ b/lib/advene/model/constants.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/model/content.py b/lib/advene/model/content.py
index 3bd45a8..ed0f5a3 100644
--- a/lib/advene/model/content.py
+++ b/lib/advene/model/content.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,8 +16,12 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-from cStringIO import StringIO
-import urllib
+import logging
+logger = logging.getLogger(__name__)
+
+import codecs
+from io import StringIO
+import urllib.request, urllib.parse, urllib.error
 try:
     # In python2.6 stdlib
     import json
@@ -27,6 +31,7 @@ except ImportError:
     except ImportError:
         json = None
 
+import advene.core.config as config
 import advene.model.modeled as modeled
 import advene.model.viewable as viewable
 
@@ -54,7 +59,7 @@ class StructuredContent(dict,object):
     So prefer a more verbose but explicit behaviour.
     """
     def __init__(self, *p, **kw):
-        if p and isinstance(p[0], basestring):
+        if p and isinstance(p[0], str):
             # Initialize with a content.
             self.parse(p[0])
         else:
@@ -71,10 +76,10 @@ class StructuredContent(dict,object):
                 continue
             if '=' in l:
                 (k, v) = l.split('=', 1)
-                self[k] = urllib.unquote(v)
+                self[k] = urllib.parse.unquote(v)
             else:
                 self['_error']=l
-                print "Syntax error in content: >%s<" % l.encode('utf8')
+                logger.warn("Syntax error in content: >%s<", l)
 
     def unparse(self):
         """Return the encoded version of the dictionary.
@@ -88,11 +93,11 @@ class StructuredContent(dict,object):
             return v.replace('\n', '%0A').replace('=', '%3D').replace('%', '%25')
 
         return "\n".join( ("%s=%s" % (k, quote(v)))
-                          for (k, v) in self.iteritems()
+                          for (k, v) in self.items()
                           if not k.startswith('_') )
 
 class Content(modeled.Modeled,
-              viewable.Viewable.withClass('content', 'getMimetype')):
+              viewable.Viewable.withClass('content', 'getMimetype'), metaclass=auto_properties):
     """
     Represents the Content of an element (mainly of Annotation and
     Relation elements)
@@ -100,8 +105,6 @@ class Content(modeled.Modeled,
     TODO: handle content types more complex than TEXT_NODE
     """
 
-    __metaclass__ = auto_properties
-
     def __init__(self, parent, element):
         modeled.Modeled.__init__(self, element, parent)
 
@@ -114,18 +117,29 @@ class Content(modeled.Modeled,
         """Check if the data is textual, according to mimetype
         """
         mt = self.mimetype
-        return (mt.startswith('text') or 'x-advene' in mt or 'xml' in mt or 'javascript' in mt)
+        return mt is not None and (mt.startswith('text')
+                                   or 'x-advene' in mt
+                                   or 'xml' in mt
+                                   or 'javascript' in mt
+                                   or mt in config.data.text_mimetypes)
 
     def getData(self):
         """Return the data associated to the Content"""
-        data = StringIO()
-        advene.model.util.dom.printElementText(self._getModel(), data)
+        nodes = self._getModel().childNodes
+        if len(nodes) == 1 and nodes[0].nodeType == nodes[0].TEXT_NODE:
+            d = nodes[0].wholeText
+        else:
+            data = StringIO()
+            advene.model.util.dom.printElementText(self._getModel(), data)
+            d = data.getvalue()
         if self._getModel().hasAttributeNS(None, 'encoding'):
             encoding = self._getModel().getAttributeNS(None, 'encoding')
         else:
             encoding = 'utf-8'
-        d=data.getvalue().decode(encoding)
-        return d
+        if isinstance(d, bytes):
+            return d.decode(encoding)
+        else:
+            return d
 
     def setData(self, data):
         """Set the content's data"""
@@ -137,10 +151,13 @@ class Content(modeled.Modeled,
             self.delUri()
             if not self.isTextual():
                 encoding = 'base64'
+                data = codecs.encode(bytes(data, 'utf-8'), encoding)
             else:
                 encoding = 'utf-8'
+                if isinstance(data, bytes):
+                    data = data.decode('utf-8')
             self._getModel().setAttributeNS(None, 'encoding', encoding)
-            new = self._getDocument().createTextNode(data.encode(encoding))
+            new = self._getDocument().createTextNode(data)
             self._getModel().appendChild(new)
 
     def delData(self):
@@ -195,7 +212,7 @@ class Content(modeled.Modeled,
         uri = self.getUri(absolute=True)
         if not uri:
             # TODO: maybe find a better way to get a stream from the DOM
-            return StringIO(self.getData().encode('utf-8'))
+            return StringIO(self.getData())
         return advene.model.util.uri.open(uri)
 
     def getMimetype(self):
@@ -215,8 +232,7 @@ class Content(modeled.Modeled,
         if value is None and self._getModel().hasAttributeNS(None, 'mime-type'):
             self._getModel().removeAttributeNS(None, 'mime-type')
         else:
-            MimeType (value)
-            self._getModel().setAttributeNS(None, 'mime-type', unicode(value))
+            self._getModel().setAttributeNS(None, 'mime-type', value)
 
     def getPlugin (self):
         """
@@ -256,6 +272,11 @@ class Content(modeled.Modeled,
         It returns a Node object whose attributes are the different
         attributes and children of the node.
 
+        JSON data
+        =========
+
+        It returns the structure corresponding to the JSON data.
+
         @return: a data structure
         """
         # FIXME: the right way to implement this would be to subclass the Content
@@ -271,7 +292,11 @@ class Content(modeled.Modeled,
             return StructuredContent(self.data)
         elif self.mimetype == 'application/json':
             if json is not None:
-                return json.loads(self.data)
+                try:
+                    return json.loads(self.data)
+                except ValueError:
+                    logger.error("Cannot interpret content as json: %s", self.data)
+                    return self.data
             else:
                 return {'data': self.data}
         elif self.mimetype == 'application/x-advene-values':
@@ -298,14 +323,12 @@ class Content(modeled.Modeled,
         # Last fallback:
         return self.data
 
-class WithContent(object):
+class WithContent(object, metaclass=auto_properties):
     """An implementation for the 'content' property and related properties.
        Inheriting classes must have a _getModel method returning a DOM element
        (inheriting the modeled.Modeled class looks like a good idea).
     """
 
-    __metaclass__ = auto_properties
-
     __content = None
 
     def _createContent(self):
@@ -362,7 +385,7 @@ class ContentPlugin (object):
         found = None
         found_type = None
 
-        for p in _content_plugin_registry.itervalues ():
+        for p in _content_plugin_registry.values ():
             plugin_type = MimeType(p.getMimetype())
             if plugin_type >= mimetype:
                 if found is None or found_type >= plugin_type:
@@ -394,4 +417,4 @@ class TestPlugin (ContentPlugin.withType ('text/*')):
     def hello(self):
         return "TEST (%s)" % self.__content.data
 
-ContentPlugin.register (TestPlugin, 'http://advene.liris.cnrs.fr/plugins/test')
+ContentPlugin.register (TestPlugin, 'http://advene.org/plugins/test')
diff --git a/lib/advene/model/context.py b/lib/advene/model/context.py
index 475632f..abe1968 100644
--- a/lib/advene/model/context.py
+++ b/lib/advene/model/context.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/model/exception.py b/lib/advene/model/exception.py
index 7ed2a9c..94d1f99 100644
--- a/lib/advene/model/exception.py
+++ b/lib/advene/model/exception.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/model/fragment.py b/lib/advene/model/fragment.py
index fb6f505..95d619b 100644
--- a/lib/advene/model/fragment.py
+++ b/lib/advene/model/fragment.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -57,14 +57,14 @@ class AbstractFragment(viewable.Viewable.withClass('fragment')):
             """
             return self
 
-        def next (self):
+        def __next__ (self):
             """
             Iterator implementation
             """
             cls = self.__cls
             it = self.__iter
             while (True):
-                a = it.next ()
+                a = next(it)
                 if isinstance (a.getFragment (), cls):
                     return a
 
@@ -74,15 +74,13 @@ class AbstractFragment(viewable.Viewable.withClass('fragment')):
     def __init__(self):
         object.__init__(self)
 
-class AbstractNbeFragment (AbstractFragment, modeled.Modeled):
+class AbstractNbeFragment (AbstractFragment, modeled.Modeled, metaclass=auto_properties):
     """Abstract Numerical Begin-End fragment class.
 
        Implements operators '==' and 'in' (for other ByteCountFragments and
        numbers).
     """
 
-    __metaclass__ = auto_properties
-
     #
     # Instance methods
     #
@@ -107,7 +105,7 @@ class AbstractNbeFragment (AbstractFragment, modeled.Modeled):
             if end is not None:
                 self.setEnd(end)
             elif duration is not None:
-                self.setEnd(self.getBegin() + long(duration))
+                self.setEnd(self.getBegin() + int(duration))
             else:
                 self.setEnd(self.getBegin())
 
@@ -122,16 +120,16 @@ class AbstractNbeFragment (AbstractFragment, modeled.Modeled):
         return "Begin-End (%d,%d)" % (self.getBegin(), self.getEnd())
 
     def getBegin(self):
-        return long(self._getModel().getAttributeNS(None, 'begin'))
+        return int(self._getModel().getAttributeNS(None, 'begin'))
 
     def setBegin(self, value):
-        return self._getModel().setAttributeNS(None, 'begin', unicode(long(value)))
+        return self._getModel().setAttributeNS(None, 'begin', str(int(value)))
 
     def getEnd(self):
-        return long(self._getModel().getAttributeNS(None, 'end'))
+        return int(self._getModel().getAttributeNS(None, 'end'))
 
     def setEnd(self, value):
-        return self._getModel().setAttributeNS(None, 'end', unicode(long(value)))
+        return self._getModel().setAttributeNS(None, 'end', str(int(value)))
 
     def getDuration(self):
         return self.getEnd() - self.getBegin()
@@ -143,14 +141,28 @@ class AbstractNbeFragment (AbstractFragment, modeled.Modeled):
         else:
             return False
 
+    def __lt__(self, other):
+        if type(self) == type(other):
+            return self.getBegin() < other.getBegin()
+        elif hasattr(other, 'fragment'):
+            return self.getBegin() < other.fragment.getBegin()
+        else:
+            raise TypeError("Invalid comparison")
+
     def __contains__(self, other):
         if type(self) == type(other):
             return self.getBegin() <= other.getBegin() \
                    and other.getEnd() <= self.getEnd()
         else:
-            o = long(other)
+            o = int(other)
             return self.getBegin() <= o and o <= self.getEnd()
 
+    def isOverlapping(self, other):
+        if type(self) == type(other):
+            return self.getBegin() in other or other.getBegin() in self
+        else:
+            raise TypeError("Invalid test")
+
     def isBounded(self):
         """ Return whether this fragment is bounded, i.e. represents a document
             element.
@@ -233,7 +245,7 @@ class MillisecondFragment(AbstractNbeFragment):
         @return: the formatted string
         @rtype: string
         """
-        (s, ms) = divmod(long(val), 1000)
+        (s, ms) = divmod(int(val), 1000)
         # Format: HH:MM:SS.mmm
         return "%s.%03d" % (time.strftime("%H:%M:%S", time.gmtime(s)), ms)
 
diff --git a/lib/advene/model/modeled.py b/lib/advene/model/modeled.py
index 9a3bd7a..9c506dd 100644
--- a/lib/advene/model/modeled.py
+++ b/lib/advene/model/modeled.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,17 +18,17 @@
 #
 import xml.dom
 
-import util.uri
+from .util.uri import urljoin, no_fragment
 
-import _impl
+from . import _impl
 
 from advene.model.constants import xlinkNS, ELEMENT_NODE
 
-from exception import AdveneException
+from .exception import AdveneException
 
-from util.auto_properties import auto_properties
+from .util.auto_properties import auto_properties
 
-class Modeled(object):
+class Modeled(object, metaclass=auto_properties):
     """An implementation for objects being _views_ of a DOM element.
 
        This DOM element is called the _model_ of the object.
@@ -36,8 +36,6 @@ class Modeled(object):
        a Modeled instance whose model is the parent element of 'element'.
     """
 
-    __metaclass__ = auto_properties
-
     def __init__(self, element, parent):
         """The parameter element is the DOM model of this object.
         """
@@ -138,13 +136,10 @@ class Modeled(object):
         return self._getParent().getAccessPath()
 
 
-class Importable(Modeled, _impl.Ided):
+class Importable(Modeled, _impl.Ided, metaclass=auto_properties):
     """Common superclass of for every element which can be imported in a
        package.
     """
-    # TODO: manage read-only'ness for imported elements
-
-    __metaclass__ = auto_properties
 
     def __init__(self, element, parent, locator=None):
         if hasattr(parent, 'getAccessPath'):
@@ -161,11 +156,11 @@ class Importable(Modeled, _impl.Ided):
 
             href = self.__importator.getHref()
             base_uri= parent.getOwnerPackage ().getUri (absolute=True)
-            uri = util.uri.urljoin(base_uri, href)
-            pkg_uri = util.uri.no_fragment(uri)
+            uri = urljoin(base_uri, href)
+            pkg_uri = no_fragment(uri)
 
             imports = parent.getOwnerPackage().getImports()
-            if not imports.has_key(pkg_uri):
+            if pkg_uri not in imports:
                 raise AdveneException(
                          "Tried to use element from non imported package: %s" %
                          pkg_uri)
@@ -219,9 +214,8 @@ class Importable(Modeled, _impl.Ided):
 
 
 
-class Importator(Modeled, _impl.Hrefed):
+class Importator(Modeled, _impl.Hrefed, metaclass=auto_properties):
     """ FIXME """
-    __metaclass__ = auto_properties
 
     def __init__(self, parent, element, target):
         Modeled.__init__(self, element, parent)
@@ -276,11 +270,10 @@ class Factory:
         copying an instance.
         """
         e1 = modeled._getModel ()
-        canCopy = ('newOwner' in e1.cloneNode.im_func.func_code.co_varnames)
+        canCopy = ('newOwner' in e1.cloneNode.__func__.__code__.co_varnames)
         if not canCopy:
             # FIXME: find a way to do it
-            raise AdveneException, \
-                      'Can not copy %s in this implementation of DOM' % modeled
+            raise AdveneException('Can not copy %s in this implementation of DOM' % modeled)
         return e1.cloneNode (deep=True, newOwner=e1.ownerDocument)
 
     def of (theClass):
@@ -294,7 +287,7 @@ class Factory:
                 automatically parameter _parent_).
                 """
                 if args:
-                    raise AdveneException, ('createX factory methods only accept keyword arguments')
+                    raise AdveneException(('createX factory methods only accept keyword arguments'))
                 return theClass (parent=self, **kw)
             setattr(_create, '__doc__', theClass.__init__.__doc__)
 
@@ -303,7 +296,7 @@ class Factory:
                 FIXME
                 """
                 if not isinstance (instance, theClass):
-                    raise AdveneException, ("%s is not an instance of %s" %
+                    raise AdveneException("%s is not an instance of %s" %
                                             (instance, theClass.__name__))
                 e = self._make_import_element (instance)
                 return theClass (parent=self, element=e)
@@ -314,7 +307,7 @@ class Factory:
                 """
                 # TODO: implement default id
                 if not isinstance (instance, theClass):
-                    raise AdveneException, ("%s is not an instance of %s" %
+                    raise AdveneException("%s is not an instance of %s" %
                                             (instance, theClass.__name__))
                 e = self._make_copy_element (instance)
                 e.setAttributeNS (None, 'id', id)
diff --git a/lib/advene/model/package.py b/lib/advene/model/package.py
index a69509e..37806cd 100644
--- a/lib/advene/model/package.py
+++ b/lib/advene/model/package.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,21 +18,23 @@
 #
 """A package to manipulate elements from the Advene model.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import os
+from pathlib import Path
 import sys
-import urllib
+import urllib.request, urllib.parse, urllib.error
+from urllib.parse import urljoin, urlparse
 import re
 
 import xml.sax
 import xml.dom
 
-import util.uri
-
-from util.auto_properties import auto_properties
+from .util.auto_properties import auto_properties
 
 import advene.core.config as config
-import _impl
+from . import _impl
 import advene.model.annotation as annotation
 import advene.model.modeled as modeled
 import advene.model.query as query
@@ -58,15 +60,13 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
              annotation.RelationFactory,
              schema.SchemaFactory,
              query.QueryFactory,
-             view.ViewFactory,
+             view.ViewFactory, metaclass=auto_properties
              ):
 
     """A package is the container of all the elements of an annotation
     (schemas, types, annotations, relations, views, queries). It
     provides factory methods to create attached annotations, views, ..."""
 
-    __metaclass__ = auto_properties
-
     def __init__(self, uri, source=_get_from_uri, importer=None):
         """Calling the constructor with just a URI tries to read the package
            from this URI. This can be overidden by providing explicitly the
@@ -74,12 +74,6 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
            Providing None for the source parameter creates a new Package.
         """
         self.meta_cache={}
-        if isinstance(uri, unicode):
-            uri=uri.encode(sys.getfilesystemencoding())
-        if re.match('[a-zA-Z]:', uri):
-            # Windows drive: notation. Convert it to
-            # a more URI-compatible syntax
-            uri=urllib.pathname2url(uri)
         self.__uri = uri
         self.__importer = importer
         # Possible container
@@ -95,6 +89,7 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
         element = None
         if source is None:
             element = self._make_model()
+            logger.debug("Instanciating package from %s", uri)
         else:
             reader = PyExpat.Reader()
             if source is _get_from_uri:
@@ -103,7 +98,7 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
                 if abs_uri.lower().endswith('.azp') or abs_uri.endswith('/'):
                     # Advene Zip Package. Do some magic.
                     self.__zip = ZipPackage(abs_uri)
-                    f=urllib.pathname2url(self.__zip.getContentsFile())
+                    f=urllib.request.pathname2url(self.__zip.getContentsFile())
                     element = reader.fromUri("file://" + f).documentElement
                 else:
                     element = reader.fromUri(abs_uri).documentElement
@@ -113,22 +108,21 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
                 if re.match('[a-zA-Z]:', source):
                     # Windows drive: notation. Convert it to
                     # a more URI-compatible syntax
-                    source=urllib.pathname2url(source)
-                source_uri = util.uri.urljoin (
-                    'file:%s/' % urllib.pathname2url (os.getcwd ()),
+                    source=urllib.request.pathname2url(source)
+                source_uri = urljoin (
+                    'file:%s/' % urllib.request.pathname2url (os.getcwd ()),
                      str(source)
                 )
 
                 if source_uri.lower().endswith('.azp') or source_uri.endswith('/'):
                     # Advene Zip Package. Do some magic.
                     self.__zip = ZipPackage(source_uri)
-                    f=urllib.pathname2url(self.__zip.getContentsFile())
+                    f=urllib.request.pathname2url(self.__zip.getContentsFile())
                     element = reader.fromUri("file://" + f).documentElement
                 else:
                     element = reader.fromUri(source_uri).documentElement
 
         modeled.Modeled.__init__(self, element, None)
-
         self.__imports = None
         self.__annotations = None
         self.__queries = None
@@ -151,7 +145,7 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
         doc = di.createDocument(adveneNS, "package", None)
 
         elt = doc.documentElement
-        elt.setAttributeNS(xmlNS,   "xml:base", unicode(self.__uri))
+        elt.setAttributeNS(xmlNS,   "xml:base", self.__uri)
         elt.setAttributeNS(xmlnsNS, "xmlns", adveneNS)
         elt.setAttributeNS(xmlnsNS, "xmlns:xlink", xlinkNS)
         elt.setAttributeNS(xmlnsNS, "xmlns:dc", dcNS)
@@ -187,8 +181,7 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
             return self
 
     def getUri(self, absolute=True, context=None):
-        """
-        Return the URI of the package.
+        """Return the URI of the package.
 
         Parameter if _absolute_ is _True_, the URI will be forced absolute.
         If not, and if _context_ is _None_, the URI will be resolved with
@@ -201,21 +194,31 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
         You would probably rather use the uri read-only property, unless you
         want to set the parameter _absolute_.
         """
-        uri = self.__uri
+        uri = self.__uri or ""
 
         if not absolute and context is self:
             return ''
 
+        elements = urlparse(uri)
+        if elements.scheme == 'file' or elements.scheme == '':
+            # This is a file. Keep only the local path.
+            # Note: this is where the magic works on win32.
+            if absolute:
+                uri = Path(elements.path).absolute().as_uri()
+            else:
+                uri = Path(elements.path).as_uri()
         importer = self.__importer
         if importer is not None:
-            uri = util.uri.urljoin (importer.getUri (absolute, context), uri)
-
-        if absolute:
-            base_uri = 'file:%s/' % urllib.pathname2url (os.getcwd ())
-            uri = util.uri.urljoin(base_uri, uri)
+            uri = urljoin (importer.getUri (absolute, context), uri)
 
         return uri
 
+    def getMedia(self):
+        return self.getMetaData(config.data.namespace, 'mediafile') or ""
+
+    def setMedia(self, media):
+        return self.setMetaData(config.data.namespace, 'mediafile', media)
+
     def getImports (self):
         """Return a collection of this package's imports"""
         if self.__imports is None:
@@ -296,12 +299,12 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
     def generate_statistics(self):
         """Generate the statistics.xml file.
         """
-        out=u"""<?xml version="1.0" encoding="UTF-8"?>
+        out="""<?xml version="1.0" encoding="UTF-8"?>
     <statistics:statistics xmlns:statistics="urn:advene:names:tc:opendocument:xmlns:manifest:1.0">
     """
         # Note: we do not use urllib.quote, since it chokes on non-ASCII characters (unicode)
-        out += u"""<statistics:title value="%s" />""" % ((self.title or '').replace('"', '%22') or "")
-        out += u"""<statistics:description value="%s" />""" % ((self.getMetaData(config.data.namespace_prefix['dc'], 'description') or "").replace('"', '%22') or "")
+        out += """<statistics:title value="%s" />""" % ((self.title or '').replace('"', '%22') or "")
+        out += """<statistics:description value="%s" />""" % ((self.getMetaData(dcNS, 'description') or "").replace('"', '%22') or "")
         for n, l in ( ('schema', len(self.schemas)),
                       ('annotation', len(self.annotations)),
                       ('annotation_type', len(self.annotationTypes)),
@@ -309,26 +312,28 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
                       ('relation_type', len(self.relationTypes)),
                       ('query', len(self.queries)),
                       ('view', len(self.views)) ):
-            out += u"""<statistics:item name="%s" value="%d" />""" % (n, l)
-        out += u"""</statistics:statistics>"""
+            out += """<statistics:item name="%s" value="%d" />""" % (n, l)
+        out += """</statistics:statistics>"""
         return out
 
     def serialize(self, stream=sys.stdout):
-        """Serialize the Package on the specified stream"""
+        """Serialize the Package on the specified stream.
+
+        Note that it returns a utf-8 encoded serialization, that must
+        be written as binary afterwards.
+        """
         stream.write(self._getModel().toxml(encoding='utf8'))
 
     def save(self, name=None):
-        """Save the Package in the specified file"""
+        """Save the Package in the specified file.
+
+        We expect that the name is a unicode string.
+        """
         if name is None:
             name=self.__uri
+
         if name.startswith('file:///'):
             name = name[7:]
-
-        if re.match('|/', name):
-            # Windows drive: notation. Convert it from
-            # a more URI-compatible syntax
-            name=urllib.url2pathname(name)
-
         # handle .azp files.
         if name.lower().endswith('.azp') or name.endswith('/'):
             # AZP format
@@ -338,8 +343,8 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
                 z.new()
                 self.__zip = z
 
-            # Save the content.xml
-            stream = open (self.__zip.getContentsFile(), "w")
+            # Save the content.xml (using binary mode since serialize is handling encoding)
+            stream = open (self.__zip.getContentsFile(), "wb")
             self.serialize(stream)
             stream.close ()
 
@@ -350,7 +355,7 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
             self.__zip.save(name)
         else:
             # Assuming plain XML format
-            stream = open (name, "w")
+            stream = open (name, "wb")
             self.serialize(stream)
             stream.close ()
 
@@ -374,9 +379,8 @@ class Package(modeled.Modeled, viewable.Viewable.withClass('package'),
             return self.getQnamePrefix(item._getParent())
 
 
-class Import(modeled.Modeled, _impl.Aliased):
+class Import(modeled.Modeled, _impl.Aliased, metaclass=auto_properties):
     """Import represents the different imported elements"""
-    __metaclass__ = auto_properties
 
     def getNamespaceUri(): return adveneNS
     getNamespaceUri = staticmethod(getNamespaceUri)
@@ -395,7 +399,7 @@ class Import(modeled.Modeled, _impl.Aliased):
             if re.match('[a-zA-Z]:', uri):
                 # Windows drive: notation. Convert it to
                 # a more URI-compatible syntax
-                uri=urllib.pathname2url(uri)
+                uri=urllib.request.pathname2url(uri)
 
             # doc = self._getParent()._getDocument()
             doc = parent._getDocument()
@@ -420,7 +424,7 @@ class Import(modeled.Modeled, _impl.Aliased):
         rel_uri =  self._getModel().getAttributeNS(xlinkNS, 'href')
         if absolute:
             base_uri = self.getOwnerPackage().getUri(absolute=True)
-            return util.uri.urljoin(base_uri, rel_uri)
+            return urljoin(base_uri, rel_uri)
         else:
             return rel_uri
 
@@ -429,7 +433,7 @@ class Import(modeled.Modeled, _impl.Aliased):
         if re.match('[a-zA-Z]:', uri):
             # Windows drive: notation. Convert it to
             # a more URI-compatible syntax
-            uri=urllib.pathname2url(uri)
+            uri=urllib.request.pathname2url(uri)
         return self._getModel().setAttributeNS(xlinkNS, 'xlink:href', uri)
 
     def getSources(self):
@@ -456,7 +460,7 @@ class Import(modeled.Modeled, _impl.Aliased):
             for url in self.getSources():
                 try:
                     base_url = self._getParent ().getUri (absolute=True)
-                    url = util.uri.urljoin (base_url, url)
+                    url = urljoin (base_url, url)
                     cached = Package(uri, source=url,
                                      importer=self._getParent())
                     break
@@ -486,9 +490,9 @@ class StatisticsHandler(xml.sax.handler.ContentHandler):
 
     def startElement(self, name, attributes):
         if name == "statistics:title":
-            self.data['title']=urllib.unquote(attributes['value'])
+            self.data['title']=urllib.parse.unquote(attributes['value'])
         elif name == 'statistics:description':
-            self.data['description']=urllib.unquote(attributes['value'])
+            self.data['description']=urllib.parse.unquote(attributes['value'])
         elif name == 'statistics:item':
             self.data[attributes['name']]=int(attributes['value'])
 
diff --git a/lib/advene/model/query.py b/lib/advene/model/query.py
index c0b15b6..87353ea 100644
--- a/lib/advene/model/query.py
+++ b/lib/advene/model/query.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -29,28 +29,27 @@ from advene.model.util.auto_properties import auto_properties
 
 class Query(modeled.Importable, viewable.Viewable.withClass('query'),
             content.WithContent,
-            _impl.Uried, _impl.Authored, _impl.Dated, _impl.Titled):
+            _impl.Uried, _impl.Authored, _impl.Dated, _impl.Titled, metaclass=auto_properties):
     """Query object offering query capabilities on the model"""
-    __metaclass__ = auto_properties
 
     def __init__(self, parent=None, element=None, ident=None, author=None):
         _impl.Uried.__init__(self, parent=parent)
         if element is not None:
             modeled.Importable.__init__(self, element, parent,
-                                        parent.getQueries.im_func)
+                                        parent.getQueries.__func__)
             _impl.Uried.__init__(self, parent=self.getOwnerPackage())
         else:
             doc = parent._getDocument()
             element = doc.createElementNS(self.getNamespaceUri(),
                                           self.getLocalName())
             modeled.Importable.__init__(self, element, parent,
-                                        parent.getQueries.im_func)
+                                        parent.getQueries.__func__)
 
             if ident is None:
                 # FIXME: cf thread
                 # Weird use of hash() -- will this work?
                 # http://mail.python.org/pipermail/python-dev/2001-January/011794.html
-                ident = u"q" + unicode(id(self)) + unicode(time.clock()).replace('.','')
+                ident = "q" + str(id(self)) + str(time.clock()).replace('.','')
             self.setId(ident)
             if author is not None:
                 self.setAuthor(author)
diff --git a/lib/advene/model/resources.py b/lib/advene/model/resources.py
index bd58dae..578d472 100644
--- a/lib/advene/model/resources.py
+++ b/lib/advene/model/resources.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -27,20 +27,20 @@
 """
 import os
 import mimetypes
-import urllib
+import urllib.request, urllib.parse, urllib.error
 import base64
 
+import advene.core.config as config
 from advene.util.expat import PyExpat
 
 from advene.model.util.auto_properties import auto_properties
 import advene.model.viewable as viewable
 
-class ResourceData(viewable.Viewable.withClass('data', 'getMimetype')):
+class ResourceData(viewable.Viewable.withClass('data', 'getMimetype'), metaclass=auto_properties):
     """Class accessing a resource data (file).
 
     FIXME: should fully implement advene.model.content.Content API
     """
-    __metaclass__ = auto_properties
 
     def __init__(self, package, resourcepath, parent=None):
         self.package = package
@@ -63,12 +63,20 @@ class ResourceData(viewable.Viewable.withClass('data', 'getMimetype')):
         return self.resourcepath.split('/')[-1]
 
     def getData(self):
-        return open(self.file_, 'rb').read()
+        data=open(self.file_, 'rb').read()
+        mimetype=self.getMimetype()
+        if mimetype.startswith('text/') or mimetype in config.data.text_mimetypes:
+            # Textual data, return a string
+            data = data.decode()
+        return data
 
     def setData(self, data):
-        f=open(self.file_, 'wb')
-        f.write(data)
-        f.close()
+        if isinstance(data, str):
+            mode = 'w'
+        else:
+            mode = 'wb'
+        with open(self.file_, mode, encoding='utf-8') as f:
+            f.write(data)
 
     def getMimetype(self):
         if self._mimetype is None:
@@ -88,7 +96,7 @@ class ResourceData(viewable.Viewable.withClass('data', 'getMimetype')):
     def getUri (self):
         """Return the URI of the element.
         """
-        p=urllib.quote(self.resourcepath, safe='')
+        p=urllib.parse.quote(self.resourcepath, safe='')
         return "%s#data_%s" % (self.package.uri, p)
 
     def getStream(self):
@@ -99,10 +107,9 @@ class ResourceData(viewable.Viewable.withClass('data', 'getMimetype')):
         data = base64.encodestring(data)
         return data
 
-class Resources:
+class Resources(metaclass=auto_properties):
     """Class accessing a resource dir.
     """
-    __metaclass__ = auto_properties
 
     DIRECTORY_TYPE=object()
 
@@ -136,9 +143,9 @@ class Resources:
             return "ResourceFolder %s" % self.resourcepath
 
     def children (self):
-        return [ self[n] for n in self.keys() ]
+        return [ self[n] for n in list(self.keys()) ]
 
-    def has_key(self, key):
+    def __contains__(self, key):
         self.init_filenames()
         return (key in self.filenames)
 
@@ -189,11 +196,13 @@ class Resources:
             else:
                 os.mkdir(fname)
         else:
-            # Some content
-            f=open(fname, 'wb')
-            f.write(item)
-            f.close()
-
+            if isinstance(item, str):
+                mode = 'w'
+            else:
+                mode = 'wb'
+            with open(fname, mode, encoding='utf-8') as f:
+                # Some content
+                f.write(item)
 
     def __delitem__(self, key):
 
@@ -216,7 +225,7 @@ class Resources:
     def getUri (self):
         """Return the URI of the element.
         """
-        p=urllib.quote(self.resourcepath, safe='')
+        p=urllib.parse.quote(self.resourcepath, safe='')
         return "%s#data_%s" % (self.package.uri, p)
 
     def getId(self):
diff --git a/lib/advene/model/schema.py b/lib/advene/model/schema.py
index 9df2ea5..9372de1 100644
--- a/lib/advene/model/schema.py
+++ b/lib/advene/model/schema.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -32,9 +32,7 @@ import xml.dom
 ELEMENT_NODE = xml.dom.Node.ELEMENT_NODE
 
 class AbstractType(modeled.Importable,
-                   _impl.Uried, _impl.Authored, _impl.Dated, _impl.Titled):
-
-    __metaclass__ = auto_properties
+                   _impl.Uried, _impl.Authored, _impl.Dated, _impl.Titled, metaclass=auto_properties):
 
     def __init__(self, parent, element, locator):
         modeled.Importable.__init__(self, element, parent, locator)
@@ -83,7 +81,7 @@ class AbstractType(modeled.Importable,
             if cte is None:
                 cte = self._getDocument ().createElementNS (adveneNS, "content-type")
                 self._getModel ().appendChild (cte)
-            cte.setAttributeNS (None, 'mime-type', unicode (value))
+            cte.setAttributeNS (None, 'mime-type', str (value))
         else:
             if cte is not None:
                 self._getModel ().removeChild (cte)
@@ -154,7 +152,7 @@ class AnnotationType(AbstractType,
                 raise TypeError("incompatible parameter 'ident'")
             # mode 1 initialization
             AbstractType.__init__(self, parent, element,
-                            parent.getOwnerPackage().getAnnotationTypes.im_func)
+                            parent.getOwnerPackage().getAnnotationTypes.__func__)
 
         else:
             # should be mode 2, checling parameter consistency
@@ -166,7 +164,7 @@ class AnnotationType(AbstractType,
             element = doc.createElementNS(self.getNamespaceUri(),
                                           self.getLocalName())
             AbstractType.__init__(self, parent, element,
-                            parent.getOwnerPackage().getAnnotationTypes.im_func)
+                            parent.getOwnerPackage().getAnnotationTypes.__func__)
             self.setId(ident)
 
 
@@ -218,7 +216,7 @@ class RelationType(AbstractType,
                 raise TypeError("incompatible parameter 'ident'")
             # mode 1 initialization
             AbstractType.__init__(self, parent, element,
-                            parent.getOwnerPackage().getRelationTypes.im_func)
+                            parent.getOwnerPackage().getRelationTypes.__func__)
 
         else:
             # should be mode 2, checling parameter consistency
@@ -230,7 +228,7 @@ class RelationType(AbstractType,
             element = doc.createElementNS(self.getNamespaceUri(),
                                           self.getLocalName())
             AbstractType.__init__(self, parent, element,
-                            parent.getOwnerPackage().getRelationTypes.im_func)
+                            parent.getOwnerPackage().getRelationTypes.__func__)
             self.setId(ident)
 
     def __str__(self):
@@ -292,7 +290,7 @@ class RelationType(AbstractType,
         for m in membertypes:
             c = self._getDocument ().createElementNS (adveneNS, "member-type")
             if m is not None:
-                c.setAttributeNS (xlinkNS, 'xlink:href', unicode(m))
+                c.setAttributeNS (xlinkNS, 'xlink:href', str(m))
             e.appendChild (c)
         return True
 
@@ -326,9 +324,8 @@ class RelationTypeFactory (modeled.Factory.of (RelationType)):
 class Schema(modeled.Importable,
              viewable.Viewable.withClass('schema'),
              _impl.Uried, _impl.Authored, _impl.Dated, _impl.Titled,
-             AnnotationTypeFactory, RelationTypeFactory):
+             AnnotationTypeFactory, RelationTypeFactory, metaclass=auto_properties):
     """A Schema defines Annotation types and Relation types."""
-    __metaclass__ = auto_properties
 
     def __init__(self, parent, element=None, ident=None):
         """
@@ -358,7 +355,7 @@ class Schema(modeled.Importable,
 
         # common to mode 1 and mode 2
         modeled.Importable.__init__(self, element, parent,
-                                    locator=parent.getSchemas.im_func)
+                                    locator=parent.getSchemas.__func__)
 
         _impl.Uried.__init__(self, parent=self._getParent())
 
diff --git a/lib/advene/model/tal/__init__.py b/lib/advene/model/tal/__init__.py
index dc5e3f5..dc19bba 100644
--- a/lib/advene/model/tal/__init__.py
+++ b/lib/advene/model/tal/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/model/tal/context.py b/lib/advene/model/tal/context.py
index b20e203..2fc127b 100644
--- a/lib/advene/model/tal/context.py
+++ b/lib/advene/model/tal/context.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,44 +16,44 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+import logging
+logger = logging.getLogger(__name__)
+
+import copy
 import sys
 
-from cStringIO import StringIO
+from io import StringIO
 
 from simpletal import simpleTAL
 from simpletal import simpleTALES
 
 from advene.model.exception import AdveneException
 
-import global_methods
+from . import global_methods
 
 class AdveneTalesException(AdveneException): pass
 
 class AdveneTalesPathException(AdveneTalesException): pass
 
 class DebugLogger:
-
         verbosity = 3
 
         def debug (self, *args):
-            if self.verbosity > 3:
-                print >>sys.stderr, "TAL: Debug:   ", args
+            logger.debug(args)
 
         def info (self, *args):
-            if self.verbosity > 3:
-                print >>sys.stderr, "TAL: Info :   ", args
+            logger.info(args)
 
         def warn (self, *args):
-            if self.verbosity > 2:
-                print >>sys.stderr, "TAL: Warning: ", args
+            logger.warn(args)
 
         def error (self, *args):
-            if self.verbosity > 1:
-                print >>sys.stderr, "TAL: Error:   ", args
+            logger.error(args)
 
         def critical (self, *args):
-            if self.verbosity > 0:
-                print >>sys.stderr, "TAL: Critical:", args
+            logger.error(args)
+
+debuglogger_singleton = DebugLogger()
 
 class NoCallVariable(simpleTALES.ContextVariable):
         """Not callable variable.
@@ -99,7 +99,7 @@ class _advene_context (simpleTALES.Context):
 
         val = None
 
-        if self.methods.has_key(path):
+        if path in self.methods:
             #print "Evaluating %s on %s" % (path, obj)
             val = self.methods[path](obj, self)
             # If the result is None, the method is not appliable
@@ -107,13 +107,13 @@ class _advene_context (simpleTALES.Context):
             # object
 
         if val is None and hasattr (obj, 'getQName'):
-            if self.locals.has_key('view'):
+            if 'view' in self.locals:
                 ref = self.locals['view']
-            elif self.globals.has_key('view'):
+            elif 'view' in self.globals:
                 ref = self.globals['view']
-            elif self.locals.has_key('here'):
+            elif 'here' in self.locals:
                 ref = self.locals['here']
-            elif self.globals.has_key('here'):
+            elif 'here' in self.globals:
                 ref = self.globals['here']
             else:
                 ref = None
@@ -141,23 +141,23 @@ class _advene_context (simpleTALES.Context):
                 path = pathList[0]
                 if path.startswith ('?'):
                         path = path[1:]
-                        if self.locals.has_key(path):
+                        if path in self.locals:
                                 path = self.locals[path]
                                 if (isinstance (path, simpleTALES.ContextVariable)): path = path.value()
-                                elif (callable (path)):path = apply (path, ())
+                                elif (callable (path)):path = path(*())
 
-                        elif self.globals.has_key(path):
+                        elif path in self.globals:
                                 path = self.globals[path]
                                 if (isinstance (path, simpleTALES.ContextVariable)): path = path.value()
-                                elif (callable (path)):path = apply (path, ())
+                                elif (callable (path)):path = path(*())
                                 #self.log.debug ("Dereferenced to %s" % path)
-                if self.locals.has_key(path):
+                if path in self.locals:
                         val = self.locals[path]
-                elif self.globals.has_key(path):
+                elif path in self.globals:
                         val = self.globals[path]
                 else:
                         # If we can't find it then raise an exception
-                        raise simpleTALES.PATHNOTFOUNDEXCEPTION
+                        raise simpleTALES.PathNotFoundException() from None
 
                 # Advene hook: store the resolved_stack
                 resolved_stack = [ (path, val) ]
@@ -169,20 +169,20 @@ class _advene_context (simpleTALES.Context):
                         #self.log.debug ("Looking for path element %s" % path)
                         if path.startswith ('?'):
                                 path = path[1:]
-                                if self.locals.has_key(path):
+                                if path in self.locals:
                                         path = self.locals[path]
                                         if (isinstance (path, simpleTALES.ContextVariable)): path = path.value()
-                                        elif (callable (path)):path = apply (path, ())
-                                elif self.globals.has_key(path):
+                                        elif (callable (path)):path = path(*())
+                                elif path in self.globals:
                                         path = self.globals[path]
                                         if (isinstance (path, simpleTALES.ContextVariable)): path = path.value()
-                                        elif (callable (path)):path = apply (path, ())
+                                        elif (callable (path)):path = path(*())
                                 #self.log.debug ("Dereferenced to %s" % path)
                         try:
                                 if (isinstance (val, simpleTALES.ContextVariable)): temp = val.value((index, pathList))
-                                elif (callable (val)):temp = apply (val, ())
+                                elif (callable (val)):temp = val(*())
                                 else: temp = val
-                        except simpleTALES.ContextVariable, e:
+                        except simpleTALES.ContextVariable as e:
                                 # Fast path for those functions that return values
                                 self.popLocals()
                                 return e.value()
@@ -195,14 +195,13 @@ class _advene_context (simpleTALES.Context):
                                 val = getattr (temp, path)
                         else:
                                 try:
+                                        val = temp[path]
+                                except (TypeError, KeyError):
                                         try:
-                                                val = temp[path]
-                                        except TypeError:
                                                 val = temp[int(path)]
-                                except:
-                                        #self.log.debug ("Not found.")
-                                        raise simpleTALES.PATHNOTFOUNDEXCEPTION
-
+                                        except:
+                                                #self.log.debug ("Not found.")
+                                                raise simpleTALES.PathNotFoundException() from None
                         # Advene hook: stack resolution
                         resolved_stack.insert(0, (path, val) )
 
@@ -216,10 +215,10 @@ class _advene_context (simpleTALES.Context):
                                         result = val.value((index,pathList))
                                         # Advene hook: introduced by the NoCallVariable
                                         if callable(result):
-                                                result = apply(val.value((index, pathList)),())
-                                elif (callable (val)):result = apply (val, ())
+                                                result = val.value((index, pathList))(*())
+                                elif (callable (val)):result = val(*())
                                 else: result = val
-                        except simpleTALES.ContextVariable, e:
+                        except simpleTALES.ContextVariable as e:
                                 # Fast path for those functions that return values
                                 return e.value()
                 else:
@@ -238,12 +237,24 @@ class AdveneContext(_advene_context):
 
     defaultMethods = staticmethod(defaultMethods)
 
+    def checkpoint(self):
+        """Checkpoint locals/globals variables to preserve state
+        """
+        self._cached_locals = copy.copy(self.locals)
+        self._cached_globals = copy.copy(self.globals)
+
+    def restore(self):
+        """Restore locals/globals from a previous checkpoint state.
+        """
+        self.locals = copy.copy(self._cached_locals)
+        self.globals = copy.copy(self._cached_globals)
+
     def __str__ (self):
-        return u"<pre>AdveneContext\nGlobals:\n\t%s\nLocals:\n\t%s</pre>" % (
-                "\n\t".join([ "%s: %s" % (k, unicode(v).replace("<", "<"))
-                              for k, v in self.globals.iteritems() ]),
-                "\n\t".join([ "%s: %s" % (k, unicode(v).replace("<", "<"))
-                              for k, v in self.locals.iteritems() ]))
+        return "<pre>AdveneContext\nGlobals:\n\t%s\nLocals:\n\t%s</pre>" % (
+                "\n\t".join([ "%s: %s" % (k, str(v).replace("<", "<"))
+                              for k, v in self.globals.items() ]),
+                "\n\t".join([ "%s: %s" % (k, str(v).replace("<", "<"))
+                              for k, v in self.locals.items() ]))
 
 
     def __init__(self, here, options=None):
@@ -260,7 +271,7 @@ class AdveneContext(_advene_context):
         for dm_name in self.defaultMethods():
             self.addMethod(dm_name, global_methods.__dict__[dm_name])
         # FIXME: debug
-        self.log = DebugLogger()
+        self.log = debuglogger_singleton
 
     def addMethod (self, name, function):
         """Add a new method to this context."""
@@ -281,8 +292,8 @@ class AdveneContext(_advene_context):
         if stream is None:
             stream = StringIO ()
 
-        if isinstance (view_source, str) or isinstance (view_source, unicode):
-            view_source = StringIO (unicode(view_source))
+        if isinstance (view_source, str) or isinstance (view_source, str):
+            view_source = StringIO (str(view_source))
 
         kw = {}
         if mimetype is None or mimetype.startswith('text/'):
@@ -304,10 +315,13 @@ class AdveneContext(_advene_context):
         will be used directly. If it is another instance, a new AdveneContext
         will be created with this instance as global symbol 'here'.
         """
+        r = None
         try:
                 r = self.evaluate (expr)
-        except simpleTALES.PathNotFoundException, e:
+        except simpleTALES.PathNotFoundException:
                 raise AdveneTalesException(
                         'TALES expression %s returned None in context %s' %
-                        (e, self))
+                        (expr, self)) from None
+        except:
+                logger.error("Unhandled exception - please report", exc_info=True)
         return r
diff --git a/lib/advene/model/tal/global_methods.py b/lib/advene/model/tal/global_methods.py
index f297b56..e7fe5d4 100644
--- a/lib/advene/model/tal/global_methods.py
+++ b/lib/advene/model/tal/global_methods.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -24,6 +24,9 @@ order to prevent cyclic references.
 
 If called on an invalid target, the method should return None.
 """
+import logging
+logger = logging.getLogger(__name__)
+
 def absolute_url(target, context):
     """Return the absolute URL of the element.
     """
@@ -83,7 +86,7 @@ def absolute_url(target, context):
 
     if path is not None and context is not None:
         options = context.globals['options']
-        if options.has_key('package_url'):
+        if 'package_url' in options:
             path = '%s%s' % (options['package_url'], path)
     return path
 
@@ -108,20 +111,20 @@ def isa (target, context):
             dict.__init__(self)
             self.__default = default
             if values:
-                for k, v in values.iteritems():
+                for k, v in values.items():
                     self[k]=v
 
-        def has_key (self, key):
+        def __contains__(self, key):
             return True
 
         def __getitem__ (self, key):
-            if dict.has_key (self, key):
+            if key in dict:
                 return dict.__getitem__ (self, key)
             else:
                 return self.__default
 
         def merge (self, dico):
-            for k, v in dico.iteritems():
+            for k, v in dico.items():
                 self[k]=v
 
     try:
@@ -172,7 +175,7 @@ def meta(target, context):
             self.__target = target
             self.__namespace_uri = namespace_uri
 
-        def has_key(self, key):
+        def __contains__(self, key):
             return (self[key] is not None)
 
         def __getitem__(self, key):
@@ -184,17 +187,17 @@ def meta(target, context):
             options = context.globals['options']
             self.__ns_dict = options.get('namespace_prefix', {})
 
-        def has_key(self, key):
+        def __contains__(self, key):
             return key in self.__ns_dict
 
         def __getitem__(self, key):
-            if self.has_key(key):
+            if key in self.__ns_dict:
                 return MetaNameWrapper(self.__target, self.__ns_dict[key])
             else:
                 return None
 
         def keys(self):
-            return self.__ns_dict.keys()
+            return list(self.__ns_dict.keys())
 
     if isinstance (target, advene.model._impl.Metaed):
         r = MetaNSWrapper (target, context)
@@ -232,7 +235,7 @@ def view(target, context):
         def __call__ (self):
             return self._target.view (context=self._context)
 
-        def has_key (self, key):
+        def __contains__ (self, key):
             v = self._target._find_named_view (key, self._context)
             return v is not None
 
@@ -283,7 +286,7 @@ def snapshot_url (target, context):
     elif isinstance(target, advene.model.fragment.MillisecondFragment):
         begin = target.begin
         p=target.rootPackage
-    elif isinstance(target, int) or isinstance(target, long):
+    elif isinstance(target, int):
         begin=target
         # Use the current package
         p=context.evaluateValue('package')
@@ -302,7 +305,7 @@ def player_url (target, context):
     """
     import advene.model.annotation
     import advene.model.fragment
-    import urllib
+    import urllib.request, urllib.parse, urllib.error
 
     begin=""
     end=None
@@ -315,7 +318,7 @@ def player_url (target, context):
         begin = target.begin
         end = target.end
         p=target.rootPackage
-    elif isinstance(target, int) or isinstance(target, long):
+    elif isinstance(target, int):
         begin=target
     else:
         return None
@@ -329,7 +332,7 @@ def player_url (target, context):
         return base_url
     else:
         c=context.evaluateValue('options/controller')
-        return base_url + "?" + urllib.urlencode( {'filename': c.get_default_media(p)} )
+        return base_url + "?" + urllib.parse.urlencode( {'filename': c.get_default_media(p)} )
 
 def formatted (target, context):
     """Return a formatted timestamp as hh:mm:ss.mmmm
@@ -340,22 +343,23 @@ def formatted (target, context):
     """
     import advene.model.fragment
     from advene.util.helper import format_time
-    import time
 
-    if isinstance(target, int) or isinstance(target, long):
+    if isinstance(target, int):
         return format_time(target)
 
     if not isinstance(target, advene.model.fragment.MillisecondFragment):
         return None
 
     res = {
-        'begin': u'--:--:--.---',
-        'end'  : u'--:--:--.---',
-        'duration': u'--:--:--.---'
+        'begin': '--:--:--.---',
+        'end'  : '--:--:--.---',
+        'duration': '--:--:--.---'
         }
-    for k in res.keys():
+    for k in res:
         t=getattr(target, k)
         res[k] = format_time(t)
+    res['begin_s'] = target.begin / 1000.
+    res['end_s'] = target.end / 1000.
     return res
 
 def first (target, context):
@@ -438,7 +442,7 @@ def query(target, context):
             else:
                 return None
 
-        def has_key (self, key):
+        def __contains__(self, key):
             return self._get_query_by_id(key)
 
         def __getitem__ (self, key):
@@ -487,12 +491,12 @@ def sorted (target, context):
         isinstance(target, list) and len(target) > 0 and hasattr(target[0], 'fragment')):
         l=list(target[:])
         l.sort(key=lambda e: e.fragment.begin)
-    elif (hasattr(target, '__getslice__') and len(target) > 0 and hasattr(target[0], '__cmp__')):
+    elif (hasattr(target, '__getslice__') and len(target) > 0 and hasattr(target[0], '__lt__')):
         l=list(target[:])
         l.sort()
     elif (hasattr(target, '__getslice__') and len(target) > 0 and hasattr(target[0], 'title')):
         l=list(target[:])
-        l.sort(key=lambda e: e.title)
+        l.sort(key=lambda e: e.title or e.id)
     else:
         l=target
     return l
@@ -537,20 +541,8 @@ def old_related(target, context):
 def tag_color(target, context):
     """Return a color matching one of the tags.
     """
-    try:
-        tags=target.tags
-    except AttributeError:
-        return None
-    try:
-        d=target.rootPackage._tag_colors
-    except AttributeError:
-        return None
-    for t in tags:
-        try:
-            return d[t]
-        except KeyError:
-            pass
-    return None
+    c=context.globals['options']['controller']
+    return c.get_tag_color_for_element(target)
 
 def representation(target, context):
     """Return a concise representation for the element.
@@ -590,8 +582,11 @@ def transition_fix_ns(target, context):
 
     This method is used by the Advene1->Advene2 export filter.
     """
-    return target.replace("http://experience.univ-lyon1.fr/advene/ns/advenetool",
-                          "http://advene.org/ns/advene-application/2.0")
+    if isinstance(target, str):
+        return target.replace("http://experience.univ-lyon1.fr/advene/ns/advenetool",
+                              "http://advene.org/ns/advene-application/2.0")
+    else:
+        return str
 
 def transition_fix_date(target, context):
     """Reformat dates into iso8601 format.
@@ -602,15 +597,15 @@ def transition_fix_date(target, context):
     import datetime
     m=re.search('(\d\d\d\d)-(\d\d?)-(\d\d)', target)
     if m:
-        return datetime.datetime(long(m.group(1)), long(m.group(2)), long(m.group(3))).isoformat()
+        return datetime.datetime(int(m.group(1)), int(m.group(2)), int(m.group(3))).isoformat()
     else:
         return target
 
 def urlquote(target, context):
     """Percent-encode the given string.
     """
-    import urllib
-    return urllib.quote(unicode(target).encode('utf-8'))
+    import urllib.request, urllib.parse, urllib.error
+    return urllib.parse.quote(str(target).encode('utf-8'))
 
 def json(target, context):
     """JSON-encode the parameter.
diff --git a/lib/advene/model/test.py b/lib/advene/model/test.py
index ee4ffbc..a23afb8 100644
--- a/lib/advene/model/test.py
+++ b/lib/advene/model/test.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -23,11 +23,11 @@ sys.path.insert(0, ".")
 
 from advene.util.expat import PyExpat
 
-from modeled import Modeled
+from .modeled import Modeled
 
 class ModeledTestCase(unittest.TestCase):
 
-    xml = u"""<?xml version="1.0" encoding="utf-8"?>
+    xml = """<?xml version="1.0" encoding="utf-8"?>
 <test>
   <a/>
   <b/>
@@ -43,7 +43,7 @@ class ModeledTestCase(unittest.TestCase):
 
     fooNS = "http://foo.com/"
 
-    xml_w_ns = u"""<?xml version="1.0" encoding="utf-8"?>
+    xml_w_ns = """<?xml version="1.0" encoding="utf-8"?>
 <test xmlns="%s">
   <a/>
   <b/>
@@ -73,12 +73,12 @@ class ModeledTestCase(unittest.TestCase):
 
     def test_getChild__no_arg(self):
         e = self.modeled._getChild()
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"a")
 
     def test_getChild__match_alone__qname(self):
         e = self.modeled._getChild((None,"d"))
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"d")
         e = self.modeled._getChild((None,"g"))
         self.assertEqual(e, None)
@@ -86,14 +86,14 @@ class ModeledTestCase(unittest.TestCase):
     def test_getChild__match_alone__element(self):
         elt = self.modeled._getChild((None,"d"))
         e = self.modeled._getChild(elt)
-        self.assert_(e)
-        self.assert_(e==elt)
+        self.assertTrue(e)
+        self.assertTrue(e==elt)
         e = self.modeled._getChild(self.element)
         self.assertEqual(e, None)
 
     def test_getChild__before_alone__qname(self):
         e = self.modeled._getChild(before=(None,"b"))
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"a")
         e = self.modeled._getChild(before=(None,"a"))
         self.assertEqual(e, None)
@@ -101,7 +101,7 @@ class ModeledTestCase(unittest.TestCase):
     def test_getChild__before_alone__element(self):
         elt = self.modeled._getChild((None,"b"))
         e = self.modeled._getChild(before=elt)
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"a")
         elt = e
         e = self.modeled._getChild(before=elt)
@@ -109,7 +109,7 @@ class ModeledTestCase(unittest.TestCase):
 
     def test_getChild__after_alone__qname(self):
         e = self.modeled._getChild(after=(None,"e"))
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"f")
         e = self.modeled._getChild(after=(None,"f"))
         self.assertEqual(e, None)
@@ -117,7 +117,7 @@ class ModeledTestCase(unittest.TestCase):
     def test_getChild__after_alone__element(self):
         elt = self.modeled._getChild((None,"e"))
         e = self.modeled._getChild(after=elt)
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"f")
         elt = e
         e = self.modeled._getChild(after=elt)
@@ -125,21 +125,21 @@ class ModeledTestCase(unittest.TestCase):
 
     def test_getChild__before_and_match(self):
         e = self.modeled._getChild((None, "e"), before=(None,"f"))
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName, "e")
         e = self.modeled._getChild((None, "d"), before=(None,"f"))
         self.assertEqual(e,None)
 
     def test_getChild__before_and_after(self):
         e = self.modeled._getChild(after=(None,"d"),before=(None,"f"))
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"e")
         e = self.modeled._getChild(after=(None,"e"),before=(None,"f"))
         self.assertEqual(e,None)
 
     def test_getChild__match_and_after(self):
         e = self.modeled._getChild(after=(None,"d"),match=(None,"e"))
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"e")
         e = self.modeled._getChild(after=(None,"d"),match=(None,"f"))
         self.assertEqual(e,None)
@@ -148,7 +148,7 @@ class ModeledTestCase(unittest.TestCase):
         e = self.modeled._getChild(after=(None,"d"),
                                    match=(None,"e"),
                                    before=(None,"f"))
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"e")
         e = self.modeled._getChild(after=(None,"a"),
                                    match=(None,"e"),
@@ -164,27 +164,27 @@ class ModeledTestCase(unittest.TestCase):
         e = self.modeled._getChild(after=(None,"c"),
                                    match=(None,"c"),
                                    before=(None,"c"))
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"c")
         self.assertEqual(e.getAttribute("id"),"2")
         e = self.modeled._getChild((None,"c"))
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"c")
         self.assertEqual(e.getAttribute("id"),"1")
         elt = e
         e = self.modeled._getChild(after=elt)
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"c")
         self.assertEqual(e.getAttribute("id"),"2")
         elt = e
         e = self.modeled._getChild(after=elt)
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"c")
         self.assertEqual(e.getAttribute("id"),"3")
 
     def test_getChild__match_alone__qname_ns(self):
         e = self.modeled_w_ns._getChild((self.fooNS,"b"))
-        self.assert_(e)
+        self.assertTrue(e)
         self.assertEqual(e.localName,"b")
         e = self.modeled_w_ns._getChild((self.fooNS,"d"))
         self.assertEqual(e,None)
diff --git a/lib/advene/model/util/__init__.py b/lib/advene/model/util/__init__.py
index dc5e3f5..dc19bba 100644
--- a/lib/advene/model/util/__init__.py
+++ b/lib/advene/model/util/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/model/util/auto_properties.py b/lib/advene/model/util/auto_properties.py
index 1b58752..7f621fd 100644
--- a/lib/advene/model/util/auto_properties.py
+++ b/lib/advene/model/util/auto_properties.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -36,10 +36,10 @@ class auto_properties(type):
         cls=self
         super(auto_properties, cls).__init__(name, bases, dic)
         props = {}
-        for name, f in dic.iteritems():
+        for name, f in dic.items():
             try:
-                nb_args = (f.func_code.co_argcount
-                           - len (f.func_defaults or ()))
+                nb_args = (f.__code__.co_argcount
+                           - len (f.__defaults__ or ()))
             except AttributeError:
                 continue
             propname = None
@@ -52,7 +52,7 @@ class auto_properties(type):
             if propname:
                 props[propname] = 1
 
-        for propname in props.iterkeys ():
+        for propname in props.keys ():
             fget = getattr(cls, "get%s" % upperFirstChar(propname), None)
             fset = getattr(cls, "set%s" % upperFirstChar(propname), None)
             fdel = getattr(cls, "del%s" % upperFirstChar(propname), None)
@@ -60,9 +60,7 @@ class auto_properties(type):
 
 
 if __name__ == "__main__":
-    class Test(object):
-        __metaclass__ = auto_properties
-
+    class Test(object, metaclass=auto_properties):
         def getTheA(self): return self._a
 
         def setTheB(self, v): self._b = v
diff --git a/lib/advene/model/util/choice_tree.py b/lib/advene/model/util/choice_tree.py
index 1588d9a..d328cda 100644
--- a/lib/advene/model/util/choice_tree.py
+++ b/lib/advene/model/util/choice_tree.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -77,10 +77,9 @@ class ChoiceTree (object):
                         self.children = None
 
     def dump (self, _prefix = ()):
-        print _prefix, self.instance
         children = self.children
         if children is not None:
-            for k, subtree in children.iteritems ():
+            for k, subtree in children.items ():
                 subtree.dump (_prefix = _prefix + (k,))
 
     def getSubtree (self, seq):
@@ -111,7 +110,7 @@ class ChoiceTree (object):
             else:
                 # this ChoiceTree is not empty, so at least one subtree must
                 # have a value
-                for k, subtree in children.iteritems ():
+                for k, subtree in children.items ():
                     r = subtree.getAny (_whereami + (k,))
                     if r[1] is not None:
                         return r
diff --git a/lib/advene/model/util/dom.py b/lib/advene/model/util/dom.py
index 8238a2f..bbb77d3 100644
--- a/lib/advene/model/util/dom.py
+++ b/lib/advene/model/util/dom.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -27,11 +27,7 @@ def printElementSource(element, stream):
 
 def printElementText(element, stream):
     if element.nodeType is TEXT_NODE:
-        # Note: element.data returns a unicode object
-        # that happens to be in the default encoding (iso-8859-1
-        # currently on my system). We encode it to utf-8 to
-        # be sure to deal only with this encoding afterwards.
-        stream.write(element.data.encode('utf-8'))
+        stream.write(element.data)
     elif element.nodeType is ELEMENT_NODE:
         for e in element.childNodes:
             printElementText(e, stream)
diff --git a/lib/advene/model/util/locale_cmp.py b/lib/advene/model/util/locale_cmp.py
index b0f133c..18a863f 100644
--- a/lib/advene/model/util/locale_cmp.py
+++ b/lib/advene/model/util/locale_cmp.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,7 +18,7 @@
 #
 import locale
 
-from choice_tree import ChoiceTree
+from .choice_tree import ChoiceTree
 
 try:
     import xml.dom
diff --git a/lib/advene/model/util/mimetype.py b/lib/advene/model/util/mimetype.py
index 33ae1af..b478359 100644
--- a/lib/advene/model/util/mimetype.py
+++ b/lib/advene/model/util/mimetype.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/model/util/uri.py b/lib/advene/model/util/uri.py
index 3e158a7..4c53536 100644
--- a/lib/advene/model/util/uri.py
+++ b/lib/advene/model/util/uri.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,9 +16,14 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+import logging
+logger = logging.getLogger(__name__)
 
-from urlparse import urljoin
-from urllib2 import urlopen
+import urllib.request, urllib.parse, urllib.error
+from urllib.request import urlopen
+import urllib.parse
+
+urljoin = urllib.parse.urljoin
 
 def push(uri, id_):
     return "%s#%s" % (uri, id_)
@@ -40,5 +45,4 @@ def no_fragment(uri):
     else: return uri
 
 def open(uri):
-
     return urlopen(uri)
diff --git a/lib/advene/model/view.py b/lib/advene/model/view.py
index f26b74d..82d0445 100644
--- a/lib/advene/model/view.py
+++ b/lib/advene/model/view.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,21 +18,21 @@
 #
 import time
 
-import util.uri
+from .util.uri import urljoin
 
-from util.auto_properties import auto_properties
+from .util.auto_properties import auto_properties
 
-import _impl
-import content
-import modeled
-import viewable
+from . import _impl
+from . import content
+from . import modeled
+from . import viewable
 
-from exception import AdveneException, AdveneValueError
+from .exception import AdveneException, AdveneValueError
 
-from constants import *
+from .constants import *
 
 
-class _match_filter_dict (dict):
+class _match_filter_dict (dict, metaclass=auto_properties):
     """
     A specific dictionnary meant to reflect the state of both attributes
     'viewable-class' and 'viewable-type' of a 'view' element. The corresponding
@@ -41,8 +41,6 @@ class _match_filter_dict (dict):
     It also has a _class_ and a _type_ property.
     """
 
-    __metaclass__ = auto_properties
-
     __slots__ = ['view']
 
     __classes_w_uri_types = ('annotation', 'relation')
@@ -65,7 +63,7 @@ class _match_filter_dict (dict):
             #if (v_type not in ('', '*')
             #and v_class in self.__classes_w_uri_types):
             #    pkg_uri = view.getOwnerPackage ().getUri (absolute=True)
-            #    v_type = util.uri.urljoin (pkg_uri, v_type)
+            #    v_type = urljoin (pkg_uri, v_type)
             setitem ('type', v_type)
             self.__manage_values ()
 
@@ -125,7 +123,7 @@ class _match_filter_dict (dict):
             # resolve relative URIs
             elif v_type != '*' and v_class in self.__classes_w_uri_types:
                 pkg_uri =self.view.getOwnerPackage ().getUri (absolute=True)
-                v_type = util.uri.urljoin (pkg_uri, v_type)
+                v_type = urljoin (pkg_uri, v_type)
                 super (_match_filter_dict, self).__setitem__ ('type', v_type)
 
     def getClass (self):
@@ -144,13 +142,11 @@ class _match_filter_dict (dict):
 
 class View(modeled.Importable, content.WithContent,
            viewable.Viewable.withClass('view'),
-           _impl.Uried, _impl.Authored, _impl.Dated, _impl.Titled):
+           _impl.Uried, _impl.Authored, _impl.Dated, _impl.Titled, metaclass=auto_properties):
     """
     An advene View.
     """
 
-    __metaclass__ = auto_properties
-
     def __init__(self,                   # mode 1 & 2
                  parent,                 # mode 1 & 2
                  element = None,         # mode 1, required
@@ -199,7 +195,7 @@ class View(modeled.Importable, content.WithContent,
                 raise TypeError("incompatible parameter 'content_mimetype'")
 
             modeled.Importable.__init__(self, element, parent,
-                                        parent.getViews.im_func)
+                                        parent.getViews.__func__)
 
             _impl.Uried.__init__(self, parent=self._getParent())
 
@@ -207,13 +203,13 @@ class View(modeled.Importable, content.WithContent,
             if clazz is None:
                 raise TypeError("parameter 'clazz' required")
             if len(kw):
-                raise TypeError ('Unkown parameters: %s' % kw.keys ())
+                raise TypeError ('Unkown parameters: %s' % list(kw.keys ()))
 
             doc = parent._getDocument()
             element = doc.createElementNS(self.getNamespaceUri(),
                                                self.getLocalName())
             modeled.Importable.__init__(self, element, parent,
-                                        parent.getViews.im_func)
+                                        parent.getViews.__func__)
 
             mf = self.getMatchFilter ()
             mf.setClass (clazz)
@@ -224,7 +220,7 @@ class View(modeled.Importable, content.WithContent,
                 # FIXME: cf thread
                 # Weird use of hash() -- will this work?
                 # http://mail.python.org/pipermail/python-dev/2001-January/011794.html
-                ident = u"v" + unicode(id(self)) + unicode(time.clock()).replace('.','')
+                ident = "v" + str(id(self)) + str(time.clock()).replace('.','')
             self.setId(ident)
 
             if title is not None: self.setTitle(date)
diff --git a/lib/advene/model/viewable.py b/lib/advene/model/viewable.py
index 6c49005..678880b 100644
--- a/lib/advene/model/viewable.py
+++ b/lib/advene/model/viewable.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-import cStringIO
+import io
 
 import advene.model.modeled as modeled
 import advene.model.tal.context
@@ -24,25 +24,25 @@ import advene.model.tal.context
 from advene.model.exception import AdveneException
 
 import advene.model.util as util
-from util.auto_properties import auto_properties
+from .util.auto_properties import auto_properties
 
-class TypedUnicode(unicode):
+class TypedUnicode(str):
     """Unicode string with a mimetype attribute.
     """
     def __new__(cls, value=""):
-        s=unicode.__new__(cls, value)
+        s=str.__new__(cls, value)
         s.contenttype='text/plain'
         return s
 
-class TypedString(str):
-    """String with a mimetype attribute.
+class TypedBytes(bytes):
+    """Bytes with a mimetype attribute.
     """
     def __new__(cls, value=""):
-        s=str.__new__(cls, value)
-        s.contenttype='text/plain'
+        s=bytes.__new__(cls, value)
+        s.contenttype='application/binary'
         return s
 
-class Viewable(object):
+class Viewable(object, metaclass=auto_properties):
     """
     A viewable is an object on which advene Views can be applied. A viewable has
     a viewable-class (boldly corresponding to its python class), and can have a
@@ -57,8 +57,6 @@ class Viewable(object):
     Subclassing Viewable directly may have unpredictable results.
     """
 
-    __metaclass__ = auto_properties
-
     def __init__(self):
         object.__init__(self)
 
@@ -105,7 +103,7 @@ class Viewable(object):
         Return all the declared viewable classes
         """
         r = []
-        for subcls in Viewable.__subclasses.values():
+        for subcls in list(Viewable.__subclasses.values()):
             r.append(subcls.getViewableClass())
         return tuple(r)
 
@@ -133,7 +131,7 @@ class Viewable(object):
             if self.getMimetype().startswith('text'):
                 s=TypedUnicode(self.data)
             else:
-                s=TypedString(self.data)
+                s=TypedBytes(self.data)
             s.contenttype=self.getMimetype()
             return s
         elif view is None:
@@ -146,7 +144,7 @@ class Viewable(object):
         view_source = view.getContent().getStream()
         mimetype = view.getContent().getMimetype()
 
-        result = cStringIO.StringIO()
+        result = io.StringIO()
         #result.write((u"<!-- view %s applied to %s -->\n"
         #              % (unicode(view), unicode(self))).encode('utf-8'))
         #context.addLocals( (('here', self), ('view', view)) )
@@ -155,7 +153,10 @@ class Viewable(object):
         context.setLocal('view', view)
         context.interpret(view_source, mimetype, result)
         context.popLocals ()
-        s=TypedUnicode(result.getvalue())
+        v = result.getvalue()
+        if isinstance(v, bytes):
+            v = v.decode('utf-8')
+        s=TypedUnicode(v)
         s.contenttype=view.getContent().getMimetype()
         return s
 
@@ -262,7 +263,7 @@ class GenericViewable(Viewable.withClass('generic')):
         #print "getattr", name
         try:
             return object.__getattribute__ (self, name)
-        except AttributeError, e:
+        except AttributeError as e:
             return object.__getattribute__ (self, '_o').__getattribute__ (name)
 
 class GenericViewableList(Viewable.withClass('list'), GenericViewable):
@@ -275,8 +276,8 @@ class GenericViewableList(Viewable.withClass('list'), GenericViewable):
     def __getitem__(self, n):
         return object.__getattribute__(self, '_o').__getitem__(n)
 
-__system_default_view = cStringIO.StringIO("""<!-- ADVENE DEFAULT VIEW-->
-<span tal:replace='here'>the object</span>""".encode('utf-8'))
+__system_default_view = io.StringIO("""<!-- ADVENE DEFAULT VIEW-->
+<span tal:replace='here'>the object</span>""")
 
 def getSystemDefaultView():
     global __system_default_view
diff --git a/lib/advene/model/zippackage.py b/lib/advene/model/zippackage.py
index 5a19579..d39b4cf 100644
--- a/lib/advene/model/zippackage.py
+++ b/lib/advene/model/zippackage.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -46,14 +46,14 @@
     meta.xml: metadata (cf OpenDocument specification)
     META-INF/manifest.xml : Manifest (package contents)
   """
+import logging
+logger = logging.getLogger(__name__)
 
 import zipfile
 import os
-import sys
 import tempfile
-import re
 import shutil
-import urllib
+import urllib.request, urllib.parse, urllib.error
 from advene.model.exception import AdveneException
 from advene.model.resources import Resources
 import mimetypes
@@ -62,13 +62,6 @@ import xml.etree.ElementTree as ET
 
 from gettext import gettext as _
 
-_fs_encoding = sys.getfilesystemencoding()
-# In some cases, sys.getfilesystemencoding returns None. And if the
-# system is misconfigured, it will return ANSI_X3.4-1968
-# (apparently). In these cases, fallback to a sensible default value
-if _fs_encoding in ('ascii', 'ANSI_X3.4-1968', None):
-    _fs_encoding='utf8'
-
 # Some constants
 MIMETYPE='application/x-advene-zip-package'
 # OpenDocument manifest file
@@ -89,8 +82,8 @@ class ZipPackage:
         for d in ZipPackage.tempdir_list:
             # FIXME: there should be a way to determine wether it
             # is still used or not.
-            print "Cleaning up %s" % d
-            if os.path.isdir(d.encode(_fs_encoding)):
+            logger.info("Cleaning up %s", d)
+            if os.path.isdir(d):
                 shutil.rmtree(d, ignore_errors=True)
 
     cleanup = staticmethod(cleanup)
@@ -102,33 +95,17 @@ class ZipPackage:
         self.file_ = None
 
         if uri:
-            # os.stat seems to not grok unicode pathnames with
-            # accents. Pass it an encoded string.
-            uri=uri.encode(_fs_encoding)
-            if uri.startswith('file:///'):
-                n=uri[7:]
-            else:
-                n=uri
-            if os.path.exists(n):
+            if os.path.exists(uri.replace('file://', '')):
                 # It is a real filename
                 self.uri = uri
-                self.file_ = n
-            elif re.match('^[a-zA-Z]:', n):
-                # Windows drive: notation. Convert it to
-                # a more URI-compatible syntax
-                self.uri=uri
-                self.file_ = urllib.pathname2url(n)
-            elif re.search('/[a-zA-Z]|', n):
-                # It is a pathname2url encoded path
-                self.uri = uri
-                self.file_ = urllib.url2pathname(n)
+                self.file_ = uri
             else:
-                u=urllib.urlopen(uri)
+                u = urllib.request.urlopen(uri)
 
                 # Use the same extension
                 self.uri = uri
                 (n, e) = os.path.splitext(uri)
-                print "Making a local copy of %s" % uri
+                logger.warn("Making a local copy of %s", uri)
                 f, self.file_ = tempfile.mkstemp(e, 'adv')
                 os.write(f, u.read())
                 os.close(f)
@@ -143,29 +120,26 @@ class ZipPackage:
         @return: the XML filename
         @rtype: string
         """
-        return self.tempfile(u'content.xml')
+        return self.tempfile('content.xml')
 
     def tempfile(self, *names):
-        """Return a tempfile name in the filesystem encoding.
-
-        Try to deal appropriately with filesystem encodings:
+        """Return a tempfile name.
 
         self._tempdir is a unicode string.
 
-        tempfile takes unicode parameters, and returns a path encoded
-        in sys.getfilesystemencoding()
+        tempfile takes unicode parameters and returns a path.
         """
-        return os.path.join(self._tempdir, *names).encode(_fs_encoding)
+        return os.path.join(self._tempdir, *names)
 
     def new(self):
         """Prepare a new AZP expanded package.
         """
-        self._tempdir=unicode(tempfile.mkdtemp('', 'adv'), _fs_encoding)
+        self._tempdir=tempfile.mkdtemp('', 'adv')
         self.tempdir_list.append(self._tempdir)
 
-        open(self.tempfile(u'mimetype'), 'w').write(MIMETYPE)
+        open(self.tempfile('mimetype'), 'w', encoding='utf-8').write(MIMETYPE)
 
-        os.mkdir(self.tempfile(u'resources'))
+        os.mkdir(self.tempfile('resources'))
 
     def extract(self, fname):
         """Extract the zip file to a temporary directory.
@@ -182,7 +156,7 @@ class ZipPackage:
 
         # Check the validity of mimetype
         try:
-            typ = z.read('mimetype')
+            typ = z.read('mimetype').decode('utf-8')
         except KeyError:
             raise AdveneException(_("File %s is not an Advene zip package.") % self.file_)
         if typ != MIMETYPE:
@@ -190,8 +164,8 @@ class ZipPackage:
 
         # The file is an advene zip package. We can extract its contents
         # to a temporary directory
-        self._tempdir=unicode(tempfile.mkdtemp('', 'adv'), _fs_encoding)
-        os.mkdir(self.tempfile(u'resources'))
+        self._tempdir=tempfile.mkdtemp('', 'adv')
+        os.mkdir(self.tempfile('resources'))
         self.tempdir_list.append(self._tempdir)
 
         # FIXME: check the portability (convert / to os.path.sep ?)
@@ -215,7 +189,7 @@ class ZipPackage:
         z.close()
 
         # Create the resources directory if necessary
-        resource_dir = self.tempfile(u'resources' )
+        resource_dir = self.tempfile('resources' )
         if not os.path.exists(resource_dir):
             os.mkdir(resource_dir)
         return self._tempdir
@@ -231,12 +205,14 @@ class ZipPackage:
         if fname is None:
             fname=self.file_
 
+        fname = fname.replace('file://', '')
+
         if os.path.isdir(fname):
             # Do not append the dir to tempdir_list, since we do not
             # want it to be removed upon application exit.
             self._tempdir=fname
             try:
-                typ=open(self.tempfile(u'mimetype'), 'r').read()
+                typ=open(self.tempfile('mimetype'), 'r', encoding='utf-8').read()
             except IOError:
                 typ=None
             if typ != MIMETYPE:
@@ -245,12 +221,12 @@ class ZipPackage:
             self._tempdir=self.extract(fname)
 
         # FIXME: Check against the MANIFEST file
-        for (name, mimetype) in self.manifest_to_list(self.tempfile(u'META-INF', u'manifest.xml')):
-            if name == u'/':
+        for (name, mimetype) in self.manifest_to_list(self.tempfile('META-INF', 'manifest.xml')):
+            if name == '/':
                 pass
             n=name.replace('/', os.path.sep)
             if not os.path.exists( self.tempfile(n) ):
-                print "Warning: missing file : %s" % name
+                logger.info("Warning: missing file : %s", name)
 
         # FIXME: Make some validity checks (resources/ dir, etc)
         self.file_ = fname
@@ -275,7 +251,7 @@ class ZipPackage:
 
         for (dirpath, dirnames, filenames) in os.walk(self._tempdir):
             # Ignore RCS directory paths
-            for d in ('.svn', 'CVS', '_darcs', '.bzr'):
+            for d in ('.svn', 'CVS', '_darcs', '.bzr', '.git'):
                 if d in dirnames:
                     dirnames.remove(d)
 
@@ -296,17 +272,14 @@ class ZipPackage:
                     name='/'.join( (zpath, f) )
                 else:
                     name=f
-                if isinstance(name, str):
-                    name=unicode(name, _fs_encoding)
                 manifest.append(name)
                 if z is not None:
-                    z.write( os.path.join(dirpath, f),
-                             name.encode('utf-8') )
+                    z.write( os.path.join(dirpath, f), name )
 
         # Generation of the manifest file
-        fname=self.tempfile(u"META-INF", u"manifest.xml")
+        fname=self.tempfile("META-INF", "manifest.xml")
         tree=ET.ElementTree(self.list_to_manifest(manifest))
-        tree.write(fname, encoding='utf-8')
+        tree.write(fname)
         if z is not None:
             # Generation of the manifest file
             z.write( fname,
@@ -316,11 +289,11 @@ class ZipPackage:
     def update_statistics(self, p):
         """Update the META-INF/statistics.xml file
         """
-        d=self.tempfile(u'META-INF')
+        d=self.tempfile('META-INF')
         if not os.path.isdir(d):
             os.mkdir(d)
-        f=open(self.tempfile(u'META-INF', u'statistics.xml'), 'w')
-        f.write(p.generate_statistics().encode('utf-8'))
+        f=open(self.tempfile('META-INF', 'statistics.xml'), 'w', encoding='utf-8')
+        f.write(p.generate_statistics())
         f.close()
         return True
 
@@ -344,8 +317,8 @@ class ZipPackage:
             if mimetype is None:
                 mimetype = 'text/plain'
             ET.SubElement(root, ET.QName(MANIFEST, 'file-entry'),  {
-                    ET.QName(MANIFEST, 'full-path'): unicode(f),
-                    ET.QName(MANIFEST, 'media-type'): unicode(mimetype),
+                    ET.QName(MANIFEST, 'full-path'): str(f),
+                    ET.QName(MANIFEST, 'media-type'): str(mimetype),
                     })
         return root
 
@@ -369,7 +342,7 @@ class ZipPackage:
     def close(self):
         """Close the package and remove temporary files.
         """
-        shutil.rmtree(self._tempdir.encode(_fs_encoding), ignore_errors=True)
+        shutil.rmtree(self._tempdir, ignore_errors=True)
         self.tempdir_list.remove(self._tempdir)
         return True
 
diff --git a/lib/advene/player/__init__.py b/lib/advene/player/__init__.py
index dc5e3f5..dc19bba 100644
--- a/lib/advene/player/__init__.py
+++ b/lib/advene/player/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/player/dummy.py b/lib/advene/player/dummy.py
index b017224..1c78921 100644
--- a/lib/advene/player/dummy.py
+++ b/lib/advene/player/dummy.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -23,9 +23,14 @@ This dummy player can be used to test the Advene GUI without any player dependen
 It also presents the API that should be implemented by alternative players.
 """
 
+name="Dummy video player"
+
+import logging
+logger = logging.getLogger(__name__)
+
 from time import time
 
-name="Dummy video player"
+import advene.core.config as config
 
 def register(controller):
     controller.register_player(Player)
@@ -33,45 +38,20 @@ def register(controller):
 
 class StreamInformation:
     def __init__(self):
-        self.streamstatus=None
+        self.status=None
         self.url=""
         self.position=0
         self.length=0
 
-class Position:
-    def __init__(self, value=0):
-        self.value=value
-        # See Player attributes below...
-        self.origin=0
-        self.key=2
-
-class PositionKeyNotSupported(Exception):
-    pass
-
-class PositionOrigin(Exception):
-    pass
-
-class InvalidPosition(Exception):
-    pass
-
-class PlaylistException(Exception):
-    pass
-
-class InternalException(Exception):
-    pass
+def debug(f):
+    def wrapper(*param, **kwd):
+        logger.debug("%s %s %s", f.__name__, " ".join(str(p) for p in param), " ".join("%s=%s" % (k, str(v)) for (k, v) in kwd.items()))
+        return f(*param, **kwd)
+    return wrapper
 
 class Player:
     player_id='dummy'
-    player_capabilities=[ 'seek', 'pause', 'caption', 'svg', 'frame-by-frame' ]
-
-    # Class attributes
-    AbsolutePosition=0
-    RelativePosition=1
-    ModuloPosition=2
-
-    ByteCount=0
-    SampleCount=1
-    MediaTime=2
+    player_capabilities=[ 'seek', 'pause', 'caption', 'svg', 'frame-by-frame', 'set-rate', 'svg' ]
 
     # Status
     PlayingStatus=0
@@ -80,37 +60,17 @@ class Player:
     EndStatus=3
     UndefinedStatus=4
 
-    PositionKeyNotSupported=Exception()
-    PositionOriginNotSupported=Exception()
-    InvalidPosition=Exception()
-    PlaylistException=Exception()
-    InternalException=Exception()
-
     def __init__(self):
-        self.playlist=[]
-        self.relative_position=0
+        self.videofile = None
+        self.relative_position = 0
         self.status=Player.UndefinedStatus
-        self.basetime=None
-        self.pausetime=None
-        self.volume=12
-        self.mute_volume=None
+        self.basetime = None
+        self.pausetime = None
+        self.volume = 50
+        self.mute_volume = None
         self.stream_duration = 0
         self.position_update()
 
-    def position2value(self, p):
-        if isinstance(p, Position):
-            v=p.value
-            if p.key != self.MediaTime:
-                self.log("unsupported key ", p.key)
-                return 0
-            if p.origin == self.AbsolutePosition:
-                v=p.value
-            else:
-                v=self.current_position() + p.value
-        else:
-            v=long(p)
-        return v
-
     def current_position(self):
         if self.pausetime is not None:
             return self.pausetime
@@ -123,116 +83,108 @@ class Player:
         return "dvd@%s:%s" % (str(title),
                               str(chapter))
 
+    def is_playing(self):
+        """Is the player in Playing or Paused status?
+        """
+        s = self.get_stream_information ()
+        return s.status == self.PlayingStatus or s.status == self.PauseStatus
+
     def log(self, *m):
-        print "dummy plugin:", " ".join([str(i) for i in m])
+        logger.warn(" ".join(str(i) for i in m))
 
-    def get_media_position(self, origin=None, key=None):
-        self.log("get_media_position")
+    def get_position(self, origin=None, key=None):
         return self.current_position()
 
-    def set_media_position(self, position=0):
-        position = self.position2value(position)
-        self.log("set_media_position %s" % str(position))
+    @debug
+    def set_position(self, position=0):
         self.basetime = time() * 1000 - position
         if self.pausetime is not None:
             self.pausetime = time() * 1000 - self.basetime
         return
 
-    def start(self, position=0):
-        self.log("start %s" % str(position))
-        self.status=Player.PlayingStatus
-        self.basetime=time() * 1000 - position
-        self.pausetime=None
+    @debug
+    def start(self, position = 0):
+        self.status = Player.PlayingStatus
+        self.basetime = time() * 1000 - position
+        self.pausetime = None
 
+    @debug
     def pause(self, position=0):
-        self.log("pause %s" % str(position))
         if self.status == Player.PlayingStatus:
-            self.pausetime=time() * 1000 - self.basetime
-            self.status=Player.PauseStatus
+            self.pausetime = time() * 1000 - self.basetime
+            self.status = Player.PauseStatus
         else:
-            self.status=Player.PlayingStatus
-            self.basetime=time() * 1000 - (self.pausetime or 0)
-            self.pausetime=None
+            self.status = Player.PlayingStatus
+            self.basetime = time() * 1000 - (self.pausetime or 0)
+            self.pausetime = None
 
+    @debug
     def resume(self, position=0):
-        self.log("resume %s" % str(position))
         if self.status == Player.PlayingStatus:
-            self.pausetime=time() * 1000 - self.basetime
-            self.status=Player.PauseStatus
+            self.pausetime = time() * 1000 - self.basetime
+            self.status = Player.PauseStatus
         else:
             self.status=Player.PlayingStatus
-            self.basetime=time() * 1000 - (self.pausetime or 0)
-            self.pausetime=None
+            self.basetime = time() * 1000 - (self.pausetime or 0)
+            self.pausetime = None
 
+    @debug
     def stop(self, position=0):
-        self.log("stop %s" % str(position))
-        self.status=Player.UndefinedStatus
-        self.basetime=None
-        self.pausetime=None
+        self.status = Player.UndefinedStatus
+        self.basetime = None
+        self.pausetime = None
 
+    @debug
     def exit(self):
         self.log("exit")
 
-    def playlist_add_item(self, item):
-        self.playlist.append(item)
+    @debug
+    def set_uri(self, item):
+        self.videofile = item
         # Simulate a 30 minutes movie
         self.stream_duration = 30 * 60000
+        return self.get_video_info()
 
-    def playlist_clear(self):
-        del self.playlist[:]
-        self.stream_duration = 0
-
-    def playlist_get_list(self):
-        return self.playlist[:]
+    def get_uri(self):
+        return self.videofile
 
-    def snapshot(self, position):
-        self.log("snapshot %s" % str(position))
+    @debug
+    def get_video_info(self):
+        """Return information about the current video.
+        """
+        return {
+            'uri': self.get_uri(),
+            'framerate_denom': 1,
+            'framerate_num': config.data.preferences['default-fps'],
+            'width': 640,
+            'height': 480,
+            'duration': self.stream_duration,
+        }
+
+    @debug
+    def snapshot(self):
         return None
 
-    def all_snapshots(self):
-        self.log("all_snapshots")
-        return [ None ]
-
+    @debug
     def display_text (self, message, begin, end):
-        self.log("display_text %s" % str(message))
+        pass
 
     def get_stream_information(self):
-        s=StreamInformation()
-        s.url=''
-        if self.playlist:
-            s.url=self.playlist[0]
-        s.length=self.stream_duration
-        if self.pausetime:
-            s.position=self.pausetime
-        elif self.basetime:
-            s.position=time() * 1000 - self.basetime
-        else:
-            s.position=0
-        s.streamstatus=self.status
+        s = StreamInformation()
+        s.url = self.get_uri()
+        s.length = self.stream_duration
+        s.position = self.get_position()
+        s.status = self.status
         return s
 
     def sound_get_volume(self):
         return self.volume
 
+    @debug
     def sound_set_volume(self, v):
-        self.log("sound_set_volume %s" % str(v))
         self.volume = v
 
-    # Helper methods
-    def create_position (self, value=0, key=None, origin=None):
-        """Create a Position.
-        """
-        if key is None:
-            key=self.MediaTime
-        if origin is None:
-            origin=self.AbsolutePosition
-
-        p=Position()
-        p.value = value
-        p.origin = origin
-        p.key = key
-        return p
-
+    @debug
     def update_status (self, status=None, position=None):
         """Update the player status.
 
@@ -241,32 +193,29 @@ class Player:
            - C{pause}
            - C{resume}
            - C{stop}
-           - C{set}
+           - C{seek}
+           - C{seek_relative}
 
         If no status is given, it only updates the value of self.status
 
-        If C{position} is None, it will be considered as zero for the
-        "start" action, and as the current relative position for other
-        actions.
+        If C{position} is None, it will be considered as the current
+         position.
 
         @param status: the new status
         @type status: string
         @param position: the position
-        @type position: long
+        @type position: int
         """
-        self.log("update_status %s" % status)
-
         if position is None:
-            position=0
-        else:
-            position=self.position2value(position)
+            position = 0
 
-        if status == "start" or status == "set":
+        if status == "start" or status == "seek" or status == "seek_relative":
             self.position_update()
+            if status == "seek_relative":
+                position = self.current_position() + position
             if self.status in (self.EndStatus, self.UndefinedStatus):
                 self.start(position)
-            else:
-                self.set_media_position(position)
+            self.set_position(position)
         else:
             if status == "pause":
                 self.position_update()
@@ -284,36 +233,35 @@ class Player:
                 self.log("******* Error : unknown status %s")
         self.position_update ()
 
-    def is_active(self):
-        return True
-
+    @debug
     def check_player(self):
-        self.log("check player")
         return True
 
     def position_update(self):
         s = self.get_stream_information ()
-        self.status = s.streamstatus
+        self.status = s.status
         self.stream_duration = s.length
         self.current_position_value = s.position
 
+    @debug
     def set_visual(self, xid):
         """Set the window id for the video output.
 
-        It is widget.window.xid on X, widget.window.handle on Win32.
+        It is widget.get_window().xid on X, widget.get_window().handle on Win32.
         """
         return True
 
     def restart_player(self):
-        self.log("restart player")
         return True
 
+    @debug
     def sound_mute(self):
         if self.mute_volume is None:
             self.mute_volume=self.sound_get_volume()
             self.sound_set_volume(0)
         return
 
+    @debug
     def sound_unmute(self):
         if self.mute_volume is not None:
             self.sound_set_volume(self.mute_volume)
diff --git a/lib/advene/player/gstreamer.py b/lib/advene/player/gstreamer.py
index be5cf7c..3963d40 100644
--- a/lib/advene/player/gstreamer.py
+++ b/lib/advene/player/gstreamer.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,13 +18,10 @@
 #
 """Gstreamer player interface.
 
-Based on gst >= 0.10 API.
-
-See http://pygstdocs.berlios.de/pygst-reference/index.html for API
-
-Use appsink to get data out of a pipeline:
-https://thomas.apestaart.org/thomas/trac/browser/tests/gst/crc/crc.py
+Based on gst >= 1.0 API.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 from gettext import gettext as _
 
@@ -32,59 +29,58 @@ import advene.core.config as config
 from advene.util.helper import format_time
 import os
 import time
-
-import gobject
-gobject.threads_init()
-
-import gtk
-import sys
+import urllib.request, urllib.parse, urllib.error
 
 if config.data.os == 'win32':
     #try to determine if gstreamer is already installed
-    fsenc = sys.getfilesystemencoding()
-    ppath = unicode(os.getenv('GST_PLUGIN_PATH', ""), fsenc)
+    ppath = os.getenv('GST_PLUGIN_PATH', "")
     if not ppath or not os.path.exists(ppath):
-        os.environ['GST_PLUGIN_PATH'] = os.path.join(config.data.path['advene'], 'gst', 'lib', 'gstreamer-0.10').encode(fsenc)
-        gstpath = unicode(os.getenv('PATH', ""), fsenc)
-        os.environ['PATH'] = os.pathsep.join( ( os.path.join(config.data.path['advene'], 'gst', 'bin'), gstpath) ).encode(fsenc)
+        os.environ['GST_PLUGIN_PATH'] = os.path.join(config.data.path['advene'], 'gst', 'lib', 'gstreamer-0.10')
+        gstpath = os.getenv('PATH', "")
+        os.environ['PATH'] = os.pathsep.join( ( os.path.join(config.data.path['advene'], 'gst', 'bin'), gstpath) )
     else:
         #even if gstpluginpath is defined, gst still may not be in path
-        gstpath = unicode(os.getenv('PATH', ""), fsenc)
+        gstpath = os.getenv('PATH', "")
         h,t = os.path.split(ppath)
         binpath,t = os.path.split(h)
-        os.environ['PATH'] = os.pathsep.join( (os.path.join( binpath, 'bin'), gstpath) ).encode(fsenc)
+        os.environ['PATH'] = os.pathsep.join( (os.path.join( binpath, 'bin'), gstpath) )
 
 try:
-    import pygst
-    pygst.require('0.10')
-    import gst
+    import gi
+    gi.require_version('Gst', '1.0')
+    gi.require_version('GstVideo', '1.0')
+    gi.require_version('GstPbutils', '1.0')
+    from gi.repository import GObject, Gst
+    from gi.repository import GstVideo
+    from gi.repository import GstPbutils
+    if config.data.os == 'linux':
+        from gi.repository import GdkX11
+    elif config.data.os == 'win32':
+        gi.require_version('GdkWin32', '3.0')
+        from gi.repository import GdkWin32
+    from gi.repository import Gdk
+    from gi.repository import Gtk
     from advene.util.snapshotter import Snapshotter
-    svgelement = None
-    # First try rsvgoverlay
-    if gst.element_factory_find('rsvgoverlay'):
-        svgelement = 'rsvgoverlay'
-    else:
-        # Not compiled. Try to fallback on the python version.
-        try:
-            import advene.util.svgoverlay
-            svgelement = 'pysvgoverlay'
-        except ImportError:
-            print "SVG overlay support not present"
-    print "SVG: Using %s element" % (svgelement or "None")
+    svgelement = 'rsvgoverlay'
+    GObject.threads_init()
+    Gst.init(None)
+    if True or not hasattr(Gst.Structure, '__getitem__'):
+        # Monkey patch __getitem__
+        Gst.Structure.__getitem__ = Gst.Structure.get_value
 except ImportError:
-    gst=None
+    Gst=None
 
 name="GStreamer video player"
 
 def register(controller):
-    if gst is None:
+    if Gst is None:
         return False
     controller.register_player(Player)
     return True
 
 class StreamInformation:
     def __init__(self):
-        self.streamstatus=None
+        self.status=None
         self.url=""
         self.position=0
         self.length=0
@@ -92,53 +88,19 @@ class StreamInformation:
 class Snapshot:
     def __init__(self, d=None):
         if d is not None:
-            for k in ('width', 'height', 'data', 'type', 'date'):
+            for k in ('width', 'height', 'data', 'type', 'date', 'media'):
                 try:
                     setattr(self, k, d[k])
                 except KeyError:
                     setattr(self, k, None)
 
-class Position:
-    def __init__(self, value=0):
-        self.value=value
-        # See Player attributes below...
-        self.origin=0
-        self.key=2
-
-    def __str__(self):
-        return "Position " + str(self.value)
-
-class PositionKeyNotSupported(Exception):
-    pass
-
-class PositionOrigin(Exception):
-    pass
-
-class InvalidPosition(Exception):
-    pass
-
-class PlaylistException(Exception):
-    pass
-
-class InternalException(Exception):
-    pass
-
 # Placeholder
 class Caption:
     pass
 
 class Player:
     player_id='gstreamer'
-    player_capabilities=[ 'seek', 'pause', 'caption', 'frame-by-frame', 'async-snapshot', 'set-rate' ]
-
-    # Class attributes
-    AbsolutePosition=0
-    RelativePosition=1
-    ModuloPosition=2
-
-    ByteCount=0
-    SampleCount=1
-    MediaTime=2
+    player_capabilities=[ 'seek', 'pause', 'caption', 'frame-by-frame', 'async-snapshot', 'set-rate', 'svg' ]
 
     # Status
     PlayingStatus=0
@@ -147,19 +109,12 @@ class Player:
     EndStatus=3
     UndefinedStatus=4
 
-    PositionKeyNotSupported=Exception("Position key not supported")
-    PositionOriginNotSupported=Exception("Position origin not supported")
-    InvalidPosition=Exception("Invalid position")
-    PlaylistException=Exception("Playlist error")
-    InternalException=Exception("Internal player error")
-
     def __init__(self):
-
         self.xid = None
         self.mute_volume=None
         self.rate = 1.0
         # fullscreen gtk.Window
-        self.fullscreen_window=None
+        self.fullscreen_window = None
 
         # Fullscreen timestamp display - cache data
         self.last_timestamp = 0
@@ -167,8 +122,8 @@ class Player:
 
         try:
             self.snapshotter = Snapshotter(self.snapshot_taken, width=config.data.player['snapshot-width'])
-        except Exception, e:
-            self.log(u"Could not initialize snapshotter:" +  unicode(e))
+        except Exception as e:
+            self.log("Could not initialize snapshotter:" +  str(e))
             self.snapshotter = None
 
         self.fullres_snapshotter = None
@@ -193,19 +148,16 @@ class Player:
         self.overlay.begin=-1
         self.overlay.end=-1
 
-        self.videofile=None
-        self.status=Player.UndefinedStatus
+        self.videofile = None
+        self.status = Player.UndefinedStatus
         self.current_position_value = 0
         self.stream_duration = 0
-        self.relative_position=self.create_position(0,
-                                                    origin=self.RelativePosition)
-
         self.position_update()
 
     def log (self, msg):
         """Display a message.
         """
-        print "gstreamer:", unicode(msg).encode('utf-8')
+        logger.warn(msg)
 
     def build_pipeline(self):
         sink='xvimagesink'
@@ -214,15 +166,15 @@ class Player:
         elif config.data.player['vout'] == 'gl':
             sink='glimagesink'
         if config.data.os == 'win32':
-            sink='directdrawsink'
+            sink='d3dvideosink'
 
-        self.player = gst.element_factory_make("playbin", "player")
+        self.player = Gst.ElementFactory.make("playbin", "player")
 
-        self.video_sink = gst.Bin()
+        self.video_sink = Gst.Bin()
 
         # TextOverlay does not seem to be present in win32 installer. Do without it.
         try:
-            self.captioner=gst.element_factory_make('textoverlay', 'captioner')
+            self.captioner=Gst.ElementFactory.make('textoverlay', 'captioner')
             # FIXME: move to config.data
             self.captioner.props.font_desc='Sans 24'
             #self.caption.props.text="Foobar"
@@ -232,42 +184,41 @@ class Player:
         self.imageoverlay=None
         if config.data.player['svg'] and svgelement:
             try:
-                self.imageoverlay=gst.element_factory_make(svgelement, 'overlay')
+                self.imageoverlay=Gst.ElementFactory.make(svgelement, 'overlay')
                 self.imageoverlay.props.fit_to_frame = True
             except:
                 pass
 
-        self.imagesink = gst.element_factory_make(sink, 'sink')
+        self.imagesink = Gst.ElementFactory.make(sink, 'sink')
 
         elements=[]
         if self.captioner is not None:
             elements.append(self.captioner)
         if self.imageoverlay is not None:
-            elements.append(gst.element_factory_make('queue'))
-            elements.append(gst.element_factory_make('ffmpegcolorspace'))
+            elements.append(Gst.ElementFactory.make('queue', None))
+            elements.append(Gst.ElementFactory.make('videoconvert', None))
             elements.append(self.imageoverlay)
-            # Note: do not remove the (seemingly superfluous)
-            # ffmpegcolorspace here, else it blocks the pipeline for
-            # some unknown reason.
-            elements.append(gst.element_factory_make('ffmpegcolorspace'))
+            elements.append(Gst.ElementFactory.make('videoconvert', None))
 
         if sink == 'xvimagesink':
             # Imagesink accepts both rgb/yuv and is able to do scaling itself.
             elements.append( self.imagesink )
         else:
-            csp=gst.element_factory_make('ffmpegcolorspace')
+            csp=Gst.ElementFactory.make('videoconvert', None)
             elements.extend( (csp, self.imagesink) )
 
-        self.video_sink.add(*elements)
+        for el in elements:
+            self.video_sink.add(el)
         if len(elements) >= 2:
-            gst.element_link_many(*elements)
+            for src, dst in zip(elements, elements[1:]):
+                src.link(dst)
 
-        self.log("gstreamer: using " + sink)
+        self.log("using " + sink)
 
         # Note: it is crucial to make ghostpad an attribute, so that
         # it is not garbage-collected at the end of the build_pipeline
         # method.
-        self._video_ghostpad = gst.GhostPad('sink', elements[0].get_pad('video_sink') or elements[0].get_pad('sink'))
+        self._video_ghostpad = Gst.GhostPad.new('sink', elements[0].get_static_pad('video_sink') or elements[0].get_static_pad('sink'))
         # Idem for elements
         self._video_elements = elements
 
@@ -275,46 +226,22 @@ class Player:
 
         self.player.props.video_sink=self.video_sink
 
-        if gst.element_factory_find('scaletempo'):
-            # The scaletempo element is present. Use it.
-            self.audio_sink = gst.Bin()
-            elements = [
-                gst.element_factory_make('scaletempo'),
-                gst.element_factory_make('autoaudiosink'),
-                ]
-            self.audio_sink.add(*elements)
-            if len(elements) >= 2:
-                gst.element_link_many(*elements)
-            self.player.props.audio_sink = self.audio_sink
-            # Keep a ref. on elements
-            self._audio_elements = elements
-            self._audio_ghostpad = gst.GhostPad('sink', elements[0].get_pad('audio_sink') or elements[0].get_pad('sink'))
-            self.audio_sink.add_pad(self._audio_ghostpad)
-
+        self.audio_sink = Gst.parse_launch('scaletempo name=scaletempo ! audioconvert ! audioresample ! autoaudiosink')
+        self.audio_sink.add_pad(Gst.GhostPad.new('sink', self.audio_sink.get_child_by_name('scaletempo').get_static_pad('sink')))
+        self.player.props.audio_sink=self.audio_sink
 
         bus = self.player.get_bus()
         bus.enable_sync_message_emission()
         bus.connect('sync-message::element', self.on_sync_message)
-
-    def position2value(self, p):
-        """Returns a position in ms.
-        """
-        if isinstance(p, Position):
-            v=p.value
-            if p.key != self.MediaTime:
-                self.log("unsupported key " + p.key)
-                return 0
-            if p.origin != self.AbsolutePosition:
-                v += self.current_position()
-        else:
-            v=p
-        return long(v)
+        bus.add_signal_watch()
+        bus.connect('message::error', self.on_bus_message_error)
+        bus.connect('message::warning', self.on_bus_message_warning)
 
     def current_status(self):
-        st=self.player.get_state()[1]
-        if st == gst.STATE_PLAYING:
+        st = self.player.get_state(100)[1]
+        if st == Gst.State.PLAYING:
             return self.PlayingStatus
-        elif st == gst.STATE_PAUSED:
+        elif st == Gst.State.PAUSED:
             return self.PauseStatus
         else:
             return self.UndefinedStatus
@@ -323,11 +250,12 @@ class Player:
         """Returns the current position in ms.
         """
         try:
-            pos, format = self.player.query_position(gst.FORMAT_TIME)
-        except:
+            pos = self.player.query_position(Gst.Format.TIME)[1]
+        except Exception:
+            logger.error("Current position exception", exc_info=True)
             position = 0
         else:
-            position = pos * 1.0 / gst.MSECOND
+            position = pos * 1.0 / Gst.MSECOND
         return position
 
     def dvd_uri(self, title=None, chapter=None):
@@ -335,45 +263,100 @@ class Player:
         # resindvd does not allow to specify it in the URI
         return "dvd://"
 
+    def set_uri(self, item):
+        self.videofile = item
+        if config.data.os == 'win32':
+            #item is a str, os.path needs to work with unicode obj to accept unicode path
+            item = os.path.abspath(str(item))
+            if os.path.exists(item):
+                item="file://" + urllib.parse.quote(item)
+        elif os.path.exists(item):
+            item="file://" + urllib.parse.quote(os.path.abspath(item))
+        self.player.set_property('uri', item)
+        if self.snapshotter:
+            self.snapshotter.set_uri(item)
+        if self.fullres_snapshotter:
+            self.fullres_snapshotter.set_uri(item)
+        return self.get_video_info()
+
+    def get_uri(self):
+        return self.player.get_property('current-uri') or self.player.get_property('uri') or ""
+
+    def get_video_info(self):
+        """Return information about the current video.
+        """
+        uri = self.get_uri()
+        default = {
+            'uri': uri,
+            'framerate_denom': 1,
+            'framerate_num': config.data.preferences['default-fps'],
+            'width': 640,
+            'height': 480,
+            'duration': 0,
+        }
+        if not uri:
+            return default
+
+        d = GstPbutils.Discoverer()
+        try:
+            info = d.discover_uri(uri)
+        except:
+            logger.error("Cannot find video info", exc_info=True)
+            info = None
+        if info is None:
+            # Return default data.
+            logger.warn("Could not find information about video, using absurd defaults.")
+            return default
+        if not info.get_video_streams():
+            # Could be an audio file.
+            default['duration'] = info.get_duration() / Gst.MSECOND
+            return default
+
+        stream = info.get_video_streams()[0]
+        return {
+            'uri': uri,
+            'framerate_denom': stream.get_framerate_denom(),
+            'framerate_num': stream.get_framerate_num(),
+            'width': stream.get_width(),
+            'height': stream.get_height(),
+            'duration': info.get_duration() / Gst.MSECOND,
+        }
+
     def check_uri(self):
-        uri=self.player.get_property('uri')
-        if uri and gst.uri_is_valid(uri):
+        uri = self.get_uri()
+        if uri and Gst.uri_is_valid(uri):
             return True
         else:
-            self.log(u"Invalid URI" + unicode(uri))
+            self.log("Invalid URI " + str(uri))
             return False
 
-    def get_media_position(self, origin, key):
+    def get_position(self):
         return self.current_position()
 
-    def set_media_position(self, position):
+    def set_position(self, position):
         if not self.check_uri():
             return
         if self.current_status() == self.UndefinedStatus:
-            self.player.set_state(gst.STATE_PAUSED)
-        p = long(self.position2value(position) * gst.MSECOND)
-        event = gst.event_new_seek(self.rate, gst.FORMAT_TIME,
-                                   gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
-                                   gst.SEEK_TYPE_SET, p,
-                                   gst.SEEK_TYPE_NONE, 0)
-        res = self.player.send_event(event)
+            self.player.set_state(Gst.State.PAUSED)
+        p = int(position) * Gst.MSECOND
+        res = self.player.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.ACCURATE, p)
         if not res:
-            raise InternalException
+            logger.warn(_("Problem when seeking into media"))
 
     def start(self, position=0):
         if not self.check_uri():
             return
         if position != 0:
-            self.set_media_position(position)
-        self.player.set_state(gst.STATE_PLAYING)
+            self.set_position(position)
+        self.player.set_state(Gst.State.PLAYING)
 
     def pause(self, position=0):
         if not self.check_uri():
             return
         if self.status == self.PlayingStatus:
-            self.player.set_state(gst.STATE_PAUSED)
+            self.player.set_state(Gst.State.PAUSED)
         else:
-            self.player.set_state(gst.STATE_PLAYING)
+            self.player.set_state(Gst.State.PLAYING)
 
     def resume(self, position=0):
         self.pause(position)
@@ -381,46 +364,14 @@ class Player:
     def stop(self, position=0):
         if not self.check_uri():
             return
-        self.player.set_state(gst.STATE_READY)
+        self.player.set_state(Gst.State.READY)
 
     def exit(self):
-        self.player.set_state(gst.STATE_NULL)
-
-    def playlist_add_item(self, item):
-        self.videofile=item
-        if config.data.os == 'win32':
-            #item is a str, os.path needs to work with unicode obj to accept unicode path
-            item = os.path.abspath(unicode(item))
-            if os.path.exists(item):
-                item="file:///" + item
-        elif os.path.exists(item):
-            item="file://" + os.path.abspath(item)
-        self.player.set_property('uri', item)
-        if self.snapshotter:
-            self.snapshotter.set_uri(item)
-        if self.fullres_snapshotter:
-            self.fullres_snapshotter.set_uri(item)
-
-    def playlist_clear(self):
-        self.videofile=None
-        self.player.set_property('uri', '')
-
-    def playlist_get_list(self):
-        if self.videofile:
-            return [ self.videofile ]
-        else:
-            return [ ]
+        self.player.set_state(Gst.State.NULL)
 
-    def fullres_snapshot_taken(self, buffer):
+    def fullres_snapshot_taken(self, data):
         if self.fullres_snapshot_callback:
-            s=Snapshot( { 'data': buffer.data,
-                          'type': 'PNG',
-                          'date': buffer.timestamp / gst.MSECOND,
-                          # Hardcoded size values. They are not used
-                          # by the application, since they are
-                          # encoded in the PNG file anyway.
-                          'width': 160,
-                          'height': 100 } )
+            s = Snapshot(data)
             self.fullres_snapshot_callback(snapshot=s)
             self.fullres_snapshot_callback = None
 
@@ -442,42 +393,22 @@ class Player:
                 self.fullres_snapshotter.start()
         self.fullres_snapshotter.enqueue(position)
 
-    def snapshot_taken(self, buffer):
+    def snapshot_taken(self, data):
+        s = Snapshot(data)
+        logger.debug("-------------------------------- snapshot taken %d %s", s.date, self.snapshot_taken)
         if self.snapshot_notify:
-            s=Snapshot( { 'data': buffer.data,
-                          'type': 'PNG',
-                          'date': buffer.timestamp / gst.MSECOND,
-                          # Hardcoded size values. They are not used
-                          # by the application, since they are
-                          # encoded in the PNG file anyway.
-                          'width': 160,
-                          'height': 100 } )
             self.snapshot_notify(s)
 
-    def async_snapshot(self, position):
-        t = long(self.position2value(position))
+    def async_snapshot(self, position, notify=None):
+        t = int(position)
+        if notify is not None and self.snapshot_notify is None:
+            self.snapshot_notify = notify
         if self.snapshotter:
             if not self.snapshotter.thread_running:
                 self.snapshotter.start()
-            # We enqueue 4 timestamps: the original timestamp, its
-            # value minus 50 and 20ms (the async snapshotter goes to the
-            # specified position then takes the video buffer which may then
-            # be later) and its value aligned to a frame boundary
-            for pos in sorted((t - 50,
-                               t - 20,
-                               t / config.data.preferences['default-fps'] * config.data.preferences['default-fps'],
-                               t)):
-                self.snapshotter.enqueue(pos)
-
-    def snapshot(self, position):
-        if not self.check_uri():
-            return None
-        # Return None in all cases.
-        return None
-
-    def all_snapshots(self):
-        self.log("all_snapshots %s")
-        return [ None ]
+            self.snapshotter.enqueue(t)
+        else:
+            logger.error("snapshotter not present")
 
     def display_text (self, message, begin, end):
         if not self.check_uri():
@@ -486,33 +417,29 @@ class Player:
             if self.imageoverlay is None:
                 self.log("Cannot overlay SVG")
                 return True
-            self.overlay.begin=self.position2value(begin)
-            self.overlay.end=self.position2value(end)
+            self.overlay.begin=begin
+            self.overlay.end=end
             self.overlay.data=message
             self.imageoverlay.props.data=message
             return True
 
         if not self.captioner:
-            self.log(u"Cannot caption " + unicode(message))
+            self.log("Cannot caption " + str(message))
             return
-        self.caption.begin=self.position2value(begin)
-        self.caption.end=self.position2value(end)
+        self.caption.begin=begin
+        self.caption.end=end
         self.caption.text=message
         self.captioner.props.text=message
 
     def get_stream_information(self):
-        s=StreamInformation()
-        if self.videofile:
-            s.url=''
-        else:
-            s.url=self.videofile
-
+        s = StreamInformation()
+        s.uri = self.get_uri()
         try:
-            dur, format = self.player.query_duration(gst.FORMAT_TIME)
+            dur = self.player.query_duration(Gst.Format.TIME)[1]
         except:
             duration = 0
         else:
-            duration = dur * 1.0 / gst.MSECOND
+            duration = dur * 1.0 / Gst.MSECOND
 
         s.length=duration
         s.position=self.current_position()
@@ -525,7 +452,7 @@ class Player:
         The result is a long value in [0, 100]
         """
         v = self.player.get_property('volume') * 100 / 4
-        return long(v)
+        return int(v)
 
     def sound_set_volume(self, v):
         if v > 100:
@@ -535,21 +462,6 @@ class Player:
         v = v * 4.0 / 100
         self.player.set_property('volume', v)
 
-    # Helper methods
-    def create_position (self, value=0, key=None, origin=None):
-        """Create a Position.
-        """
-        if key is None:
-            key=self.MediaTime
-        if origin is None:
-            origin=self.AbsolutePosition
-
-        p=Position()
-        p.value = value
-        p.origin = origin
-        p.key = key
-        return p
-
     def update_status (self, status=None, position=None):
         """Update the player status.
 
@@ -558,36 +470,35 @@ class Player:
            - C{pause}
            - C{resume}
            - C{stop}
-           - C{set}
+           - C{seek}
+           - C{seek_relative}
 
         If no status is given, it only updates the value of self.status
 
-        If C{position} is None, it will be considered as zero for the
-        "start" action, and as the current relative position for other
-        actions.
+        If C{position} is None, it will be considered as the current
+        position.
 
         @param status: the new status
         @type status: string
         @param position: the position
-        @type position: long
+        @type position: int
+
         """
-        #print "gst - update_status ", status, str(position)
+        logger.debug("update_status %s %s ", status, str(position))
         if position is None:
-            position=0
-        else:
-            position=self.position2value(position)
+            position = 0
 
-        if status == "start" or status == "set":
+        if status == "start" or status == "seek" or status == "seek_relative":
             self.position_update()
+            if status == "seek_relative":
+                position = self.current_position() + position
             if status == "start":
                 if self.status == self.PauseStatus:
-                    self.resume (position)
+                    self.resume(position)
                 elif self.status != self.PlayingStatus:
                     self.start(position)
                     time.sleep(0.005)
-#            print "Before s_m_p", position
-            self.set_media_position(position)
-#            print "After s_m_p"
+            self.set_position(position)
         else:
             if status == "pause":
                 self.position_update()
@@ -605,8 +516,11 @@ class Player:
                 self.log("******* Error : unknown status %s in gstreamer player" % status)
         self.position_update ()
 
-    def is_active(self):
-        return True
+    def is_playing(self):
+        """Is the player in Playing or Paused status?
+        """
+        s = self.get_stream_information ()
+        return s.status == self.PlayingStatus or s.status == self.PauseStatus
 
     def check_player(self):
         self.log("check player")
@@ -621,7 +535,7 @@ class Player:
 
         self.status = s.status
         self.stream_duration = s.length
-        self.current_position_value = long(s.position)
+        self.current_position_value = int(s.position)
         if self.caption.text and (s.position < self.caption.begin
                                   or s.position > self.caption.end):
             self.display_text('', -1, -1)
@@ -643,16 +557,16 @@ class Player:
 
     def reparent(self, xid):
         # See https://bugzilla.gnome.org/show_bug.cgi?id=599885
-        #gtk.gdk.threads_enter()
+        Gdk.threads_enter()
         if xid:
             self.log("Reparent " + hex(xid))
 
-            gtk.gdk.display_get_default().sync()
+            Gdk.Display().get_default().sync()
 
-            self.imagesink.set_xwindow_id(xid)
+            self.imagesink.set_window_handle(xid)
         self.imagesink.set_property('force-aspect-ratio', True)
         self.imagesink.expose()
-        #gtk.gdk.threads_leave()
+        Gdk.threads_leave()
 
     def set_visual(self, xid):
         if not xid:
@@ -662,26 +576,45 @@ class Player:
         return True
 
     def set_widget(self, widget):
+        # For win32, see
+        # http://stackoverflow.com/questions/25823541/get-the-window-handle-in-pygi
         self.set_visual( widget.get_id() )
-        #self.set_visual( None )
 
     def restart_player(self):
-        # FIXME: destroy the previous player
-        self.player.set_state(gst.STATE_READY)
+        # FIXME: properly destroy the previous player
+        self.player.set_state(Gst.State.READY)
         # Rebuild the pipeline
         self.build_pipeline()
         if self.videofile is not None:
-            self.playlist_add_item(self.videofile)
+            self.set_uri(self.videofile)
         self.position_update()
         return True
 
     def on_sync_message(self, bus, message):
-        if message.structure is None:
+        s = message.get_structure()
+        logger.debug("sync message %s", s)
+        if s is None:
             return True
-        if message.structure.get_name() == 'prepare-xwindow-id':
+        if s.get_name() == 'prepare-window-handle':
             self.reparent(self.xid)
         return True
 
+    def on_bus_message_error(self, bus, message):
+        s = message.get_structure()
+        if s is None:
+            return True
+        title, message = message.parse_error()
+        logger.error("%s: %s", title, message)
+        return True
+
+    def on_bus_message_warning(self, bus, message):
+        s = message.get_structure()
+        if s is None:
+            return True
+        title, message = message.parse_warning()
+        logger.warn("%s: %s", title, message)
+        return True
+
     def sound_mute(self):
         if self.mute_volume is None:
             self.mute_volume=self.sound_get_volume()
@@ -700,75 +633,67 @@ class Player:
     def set_rate(self, rate=1.0):
         if not self.check_uri():
             return
-        self.rate = rate
         try:
-            p = self.player.query_position(gst.FORMAT_TIME)[0]
-        except gst.QueryError:
+            p = self.player.query_position(Gst.Format.TIME)[1]
+        except Gst.QueryError:
             self.log("Error in set_rate (query position)")
             return
-        event = gst.event_new_seek(self.rate, gst.FORMAT_TIME,
-                                   gst.SEEK_FLAG_FLUSH,
-                                   gst.SEEK_TYPE_SET, long(p),
-                                   gst.SEEK_TYPE_NONE, 0)
+        event = Gst.Event.new_seek(self.rate, Gst.Format.TIME,
+                                   Gst.SeekFlags.FLUSH,
+                                   Gst.SeekType.SET, int(p),
+                                   Gst.SeekType.NONE, 0)
         if event:
             res = self.player.send_event(event)
             if not res:
                 self.log("Could not set rate")
+            else:
+                self.rate = rate
         else:
             self.log("Cannot build set_rate event")
 
     def get_rate(self):
         return self.rate
 
-    def disp(self, e, indent="  "):
-        l=[str(e)]
-        if hasattr(e, 'elements'):
-            i=indent+"  "
-            l.extend( [ self.disp(c, i) for c in e.elements() ])
-        return ("\n"+indent).join(l)
-
     def is_fullscreen(self):
         return self.fullscreen_window and self.fullscreen_window.is_active()
 
     def fullscreen(self, connect=None):
 
         def keypress(widget, event):
-            if event.keyval == gtk.keysyms.Escape:
+            if event.keyval == Gdk.KEY_Escape:
                 self.unfullscreen()
                 return True
             return False
 
         def buttonpress(widget, event):
-            if event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS:
+            if event.button == 1 and event.type == Gdk.EventType._2BUTTON_PRESS:
                 self.unfullscreen()
                 return True
             return False
 
         if self.fullscreen_window is None:
-            self.fullscreen_window=gtk.Window()
-            self.fullscreen_window.add_events(gtk.gdk.BUTTON_PRESS_MASK |
-                                              gtk.gdk.BUTTON_RELEASE_MASK |
-                                              gtk.gdk.KEY_PRESS_MASK |
-                                              gtk.gdk.KEY_RELEASE_MASK |
-                                              gtk.gdk.SCROLL_MASK)
+            self.fullscreen_window=Gtk.Window()
+            self.fullscreen_window.set_name("fullscreen_player")
+            self.fullscreen_window.add_events(Gdk.EventMask.BUTTON_PRESS_MASK |
+                                              Gdk.EventMask.BUTTON_RELEASE_MASK |
+                                              Gdk.EventMask.KEY_PRESS_MASK |
+                                              Gdk.EventMask.KEY_RELEASE_MASK |
+                                              Gdk.EventMask.SCROLL_MASK)
             self.fullscreen_window.connect('key-press-event', keypress)
             self.fullscreen_window.connect('button-press-event', buttonpress)
             self.fullscreen_window.connect('destroy', self.unfullscreen)
             if connect is not None:
                 connect(self.fullscreen_window)
 
-            style=self.fullscreen_window.get_style().copy()
-            black=gtk.gdk.color_parse('black')
-            for state in (gtk.STATE_ACTIVE, gtk.STATE_NORMAL,
-                          gtk.STATE_SELECTED, gtk.STATE_INSENSITIVE,
-                          gtk.STATE_PRELIGHT):
-                style.bg[state]=black
-                style.base[state]=black
-            self.fullscreen_window.set_style(style)
+            # Use black background
+            css_provider = Gtk.CssProvider()
+            css_provider.load_from_data(b"#fullscreen_player { color:#fff; background-color: #000; }")
+            context = Gtk.StyleContext()
+            context.add_provider_for_screen(Gdk.Screen.get_default(), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
 
         if config.data.os == 'darwin':
             # Get geometry of the first monitor
-            r = gtk.gdk.screen_get_default().get_monitor_geometry(0)
+            r = Gdk.screen_get_default().get_monitor_geometry(0)
             self.fullscreen_window.set_decorated(False)
             self.fullscreen_window.set_size_request(r.width, r.height)
             #self.fullscreen_window.move(r.x, r.y)
@@ -776,21 +701,21 @@ class Player:
             self.fullscreen_window.show()
         else:
             self.fullscreen_window.show()
-            self.fullscreen_window.window.fullscreen()
+            self.fullscreen_window.get_window().fullscreen()
 
         self.fullscreen_window.grab_focus()
 
         if config.data.os == 'win32':
-            self.reparent(self.fullscreen_window.window.handle)
+            self.reparent(GdkWin32.Win32Window.get_handle(self.fullscreen_window.get_window()))
         else:
-            self.reparent(self.fullscreen_window.window.xid)
+            self.reparent(self.fullscreen_window.get_window().get_xid())
 
     def unfullscreen(self, *p):
         self.reparent(self.xid)
         if not self.overlay.data and self.imageoverlay:
             # Reset imageoverlay data in any case
             self.imageoverlay.props.data = None
-        if self.fullscreen_window.window:
+        if self.fullscreen_window.get_window():
             self.fullscreen_window.hide()
         else:
             # It has been destroyed
@@ -821,7 +746,7 @@ class Player:
         indentstr = depth * 8 * ' '
 
         # print element path and factory
-        path = e.get_path_string() + (isinstance(e, gst.Bin) and '/' or '')
+        path = e.get_path_string() + (isinstance(e, Gst.Bin) and '/' or '')
         factory = e.get_factory()
         if factory is not None:
             ret.append( '%s%s (%s)' % (indentstr, path, factory.get_name()) )
@@ -833,8 +758,8 @@ class Player:
             name = p.get_name()
 
             # negotiated capabilities
-            caps = p.get_negotiated_caps()
-            if caps: capsname = caps[0].get_name()
+            caps = p.get_current_caps()
+            if caps: capsname = caps.get_structure(0).get_name()
             elif showcaps: capsname = '; '.join(s.to_string() for s in set(p.get_caps()))
             else: capsname = None
 
@@ -844,7 +769,7 @@ class Player:
             if p.is_blocked(): flags.append('BLOCKED')
 
             # direction
-            direc = (p.get_direction() is gst.PAD_SRC) and "=>" or "<="
+            direc = (p.get_direction() is Gst.PadDirection.SRC) and "=>" or "<="
 
             # peer
             peer = p.get_peer()
@@ -852,7 +777,7 @@ class Player:
             else: peerpath = None
 
             # ghost target
-            if isinstance(p, gst.GhostPad):
+            if isinstance(p, Gst.GhostPad):
                 target = p.get_target()
                 if target: ghostpath = target.get_path_string()
                 else: ghostpath = None
@@ -868,7 +793,7 @@ class Player:
 
             #if peerpath and peerpath.find('proxy')!=-1: print peer
             ret.append( ''.join(line) )
-        if recurse and isinstance(e, gst.Bin):
+        if recurse and isinstance(e, Gst.Bin):
             ret.extend( self.dump_bin(e, depth+1, recurse) )
         return ret
 
diff --git a/lib/advene/player/gstrecorder.py b/lib/advene/player/gstrecorder.py
index b799dbc..6697526 100644
--- a/lib/advene/player/gstrecorder.py
+++ b/lib/advene/player/gstrecorder.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,66 +18,54 @@
 #
 """Gstreamer recorder interface.
 
-Based on gst >= 0.10 API.
+Using gstreamer 1.0 API.
 """
+import logging
+logger = logging.getLogger(__name__)
 
+import math
 import tempfile
 import time
 
 import advene.core.config as config
 
-import gobject
-gobject.threads_init()
+import gi
+from gi.repository import GObject
+GObject.threads_init()
+
+if config.data.os == 'linux':
+    from gi.repository import GdkX11
+elif config.data.os == 'win32':
+    gi.require_version('GdkWin32', '3.0')
+    from gi.repository import GdkWin32
+from gi.repository import Gdk
 
 try:
-    import pygst
-    pygst.require('0.10')
-    import gst
+    gi.require_version('Gst', '1.0')
+    gi.require_version('GstPbutils', '1.0')
+    from gi.repository import Gst
+    from gi.repository import GstPbutils
+    Gst.init(None)
 except ImportError:
-    gst=None
+    Gst=None
 
 import os
 
 name="GStreamer video recorder"
 
 def register(controller=None):
-    if gst is None:
+    if Gst is None:
         return False
     controller.register_player(Player)
     return True
 
 class StreamInformation:
     def __init__(self):
-        self.streamstatus=None
+        self.status=None
         self.url=""
         self.position=0
         self.length=0
 
-class Position:
-    def __init__(self, value=0):
-        self.value=value
-        # See Player attributes below...
-        self.origin=0
-        self.key=2
-
-    def __str__(self):
-        return "Position " + str(self.value)
-
-class PositionKeyNotSupported(Exception):
-    pass
-
-class PositionOrigin(Exception):
-    pass
-
-class InvalidPosition(Exception):
-    pass
-
-class PlaylistException(Exception):
-    pass
-
-class InternalException(Exception):
-    pass
-
 # Placeholder
 class Caption:
     pass
@@ -86,15 +74,6 @@ class Player:
     player_id='gstrecorder'
     player_capabilities=[ 'record' ]
 
-    # Class attributes
-    AbsolutePosition=0
-    RelativePosition=1
-    ModuloPosition=2
-
-    ByteCount=0
-    SampleCount=1
-    MediaTime=2
-
     # Status
     PlayingStatus=0
     PauseStatus=1
@@ -102,25 +81,17 @@ class Player:
     EndStatus=3
     UndefinedStatus=4
 
-    PositionKeyNotSupported=Exception("Position key not supported")
-    PositionOriginNotSupported=Exception("Position origin not supported")
-    InvalidPosition=Exception("Invalid position")
-    PlaylistException=Exception("Playlist error")
-    InternalException=Exception("Internal player error")
-
     def __init__(self):
         self.mute_volume=None
 
         self.player=None
         self.pipeline=None
-        self.videofile=time.strftime("/tmp/advene_record-%Y%m%d-%H%M%S.ogg")
+        self.videofile = time.strftime("/tmp/advene_record-%Y%m%d-%H%M%S.ogg")
         self.build_pipeline()
 
         self.status=Player.UndefinedStatus
         self.current_position_value = 0
-        self.stream_duration = 0 # 60 * 60 * 1000
-        self.relative_position=self.create_position(0,
-                                                    origin=self.RelativePosition)
+        self.stream_duration = 0
         self.position_update()
 
     def build_pipeline(self):
@@ -138,7 +109,7 @@ class Player:
             # Generate black image
             videosrc = 'videotestsrc pattern=2'
 
-        self.pipeline=gst.parse_launch('%(videosrc)s name=videosrc ! video/x-raw-yuv,width=352,pixel-aspect-ratio=(fraction)1/1 ! queue ! tee name=tee ! ffmpegcolorspace ! theoraenc drop-frames=1 ! queue ! oggmux name=mux ! filesink location=%(videofile)s  %(audiosrc)s name=audiosrc ! audioconvert ! audiorate ! queue ! vorbisenc quality=0.5 ! mux.  tee. ! queue ! %(videosink)s name=sink sync=false' % locals())
+        self.pipeline=Gst.parse_launch('%(videosrc)s name=videosrc ! video/x-raw,width=352,pixel-aspect-ratio=(fraction)1/1 ! queue ! tee name=tee ! videoconvert ! theoraenc drop-frames=1 ! queue ! oggmux name=mux ! filesink location=%(videofile)s  %(audiosrc)s name=audiosrc ! audioconvert ! audiorate ! queue ! vorbisenc quality=0.5 ! mux.  tee. ! queue ! %(videosink)s name=sink sync=false' % locals())
         self.imagesink=self.pipeline.get_by_name('sink')
         self.videosrc=self.pipeline.get_by_name('videosrc')
         self.audiosrc=self.pipeline.get_by_name('audiosrc')
@@ -148,35 +119,41 @@ class Player:
         bus = self.pipeline.get_bus()
         bus.enable_sync_message_emission()
         def on_sync_message(bus, message):
-            if message.structure is None:
+            s = message.get_structure()
+            if s is None:
                 return
-            if message.structure.get_name() == 'prepare-xwindow-id' and self.xid is not None:
-                message.src.set_xwindow_id(self.xid)
-                if hasattr(message.src.props, 'force-aspect-ratio'):
-                    message.src.set_property("force-aspect-ratio", True)
-        bus.connect('sync-message::element', on_sync_message)
+            logger.debug("sync message %s", s.get_name())
+            if s.get_name() == 'prepare-window-handle':
+                self.set_visual(self.xid, message.src)
+
+        def on_bus_message_error(bus, message):
+            s = message.get_structure()
+            if s is None:
+                return True
+            title, message = message.parse_error()
+            logger.error("%s: %s", title, message)
+            return True
+
+        def on_bus_message_warning(bus, message):
+            s = message.get_structure()
+            if s is None:
+                return True
+            title, message = message.parse_warning()
+            logger.warn("%s: %s", title, message)
+            return True
 
-    def position2value(self, p):
-        """Returns a position in ms.
-        """
-        if isinstance(p, Position):
-            v=p.value
-            if p.key != self.MediaTime:
-                print "gstrecorder: unsupported key ", p.key
-                return 0
-            if p.origin != self.AbsolutePosition:
-                v += self.current_position()
-        else:
-            v=p
-        return long(v)
+        bus.connect('sync-message::element', on_sync_message)
+        bus.add_signal_watch()
+        bus.connect('message::error', on_bus_message_error)
+        bus.connect('message::warning', on_bus_message_warning)
 
     def current_status(self):
         if self.player is None:
             return self.UndefinedStatus
-        st=self.player.get_state()[1]
-        if st == gst.STATE_PLAYING:
+        st = self.player.get_state(100)[1]
+        if st == Gst.State.PLAYING:
             return self.PlayingStatus
-        elif st == gst.STATE_PAUSED:
+        elif st == Gst.State.PAUSED:
             return self.PauseStatus
         else:
             return self.UndefinedStatus
@@ -187,11 +164,11 @@ class Player:
         if self.player is None:
             return 0
         try:
-            pos, format = self.player.query_position(gst.FORMAT_TIME)
-        except:
+            pos = self.player.query_position(Gst.Format.TIME)[1]
+        except Exception:
             position = 0
         else:
-            position = pos * 1.0 / gst.MSECOND
+            position = pos * 1.0 / Gst.MSECOND
         return position
 
     def dvd_uri(self, title=None, chapter=None):
@@ -201,12 +178,12 @@ class Player:
         return True
 
     def log(self, *p):
-        print "gstrecorder player: %s" % p
+        logger.warn("gstrecorder: %s", str(p))
 
-    def get_media_position(self, origin, key):
+    def get_position(self, origin, key):
         return self.current_position()
 
-    def set_media_position(self, position):
+    def set_position(self, position):
         # No navigation
         return
 
@@ -214,11 +191,11 @@ class Player:
         if self.current_status() == self.PlayingStatus:
             # Already started
             return
-        self.videofile=time.strftime("/tmp/advene_record-%Y%m%d-%H%M%S.ogg")
+        self.videofile = time.strftime("/tmp/advene_record-%Y%m%d-%H%M%S.ogg")
         self.build_pipeline()
         if self.player is None:
             return
-        self.player.set_state(gst.STATE_PLAYING)
+        self.player.set_state(Gst.State.PLAYING)
 
     def pause(self, position=None):
         # Ignore
@@ -229,60 +206,85 @@ class Player:
         return
 
     def stop(self, position=None):
-        self.stream_duration=self.current_position
+        self.stream_duration = self.current_position
         if self.player is None:
             return
-        self.player.set_state(gst.STATE_NULL)
+        self.player.set_state(Gst.State.NULL)
 
     def exit(self):
         if self.player is None:
             return
-        self.player.set_state(gst.STATE_NULL)
+        self.player.set_state(Gst.State.NULL)
 
-    def playlist_add_item(self, item):
+    def set_uri(self, item):
         if item is None:
-            self.videofile=tempfile.mktemp('.ogg', 'record_')
+            self.videofile = tempfile.mktemp('.ogg', 'record_')
         elif os.path.exists(item):
             # tempfile.mktemp should not be used for security reasons.
             # But the probability of a tempfile attack against Advene
             # is rather low at the time of writing this comment.
-            self.videofile=tempfile.mktemp('.ogg', 'record_')
-            print "%s already exists. We will not overwrite, so use %s instead " % (item, self.videofile)
+            self.videofile = tempfile.mktemp('.ogg', 'record_')
+            logger.warn("%s already exists. We will not overwrite, so using %s instead ", item, self.videofile)
         else:
-            self.videofile=item
+            self.videofile = item
         self.build_pipeline()
+        return self.get_video_info()
 
-    def playlist_clear(self):
-        self.videofile=None
+    def get_uri(self):
+        return self.player.get_property('current-uri') or self.player.get_property('uri') or ""
 
-    def playlist_get_list(self):
-        if self.videofile is None:
-            return [ ]
-        else:
-            return [ self.videofile  ]
+    def get_video_info(self):
+        """Return information about the current video.
+        """
+        uri = self.get_uri()
+        d = GstPbutils.Discoverer()
+        try:
+            info = d.discover_uri(uri)
+        except:
+            logger.error("Cannot find video info", exc_info=True)
+            info = None
+        default = {
+            'uri': uri,
+            'framerate_denom': 1,
+            'framerate_num': config.data.preferences['default-fps'],
+            'width': 640,
+            'height': 480,
+            'duration': 0,
+        }
+        if info is None:
+            # Return default data.
+            logger.warn("Could not find information about video, using absurd defaults.")
+            return default
+        if not info.get_video_streams():
+            # Could be an audio file.
+            default['duration'] = info.get_duration() / Gst.MSECOND
+            return default
+
+        stream = info.get_video_streams()[0]
+        return {
+            'uri': uri,
+            'framerate_denom': stream.get_framerate_denom(),
+            'framerate_num': stream.get_framerate_num(),
+            'width': stream.get_width(),
+            'height': stream.get_height(),
+            'duration': info.get_duration() / Gst.MSECOND,
+        }
 
     def snapshot(self, position):
         return None
 
-    def all_snapshots(self):
-        self.log("all_snapshots %s")
-        return [ None ]
-
     def display_text (self, message, begin, end):
         self.log("Display text", message)
 
     def get_stream_information(self):
         s=StreamInformation()
-        if self.videofile:
-            s.url=''
-        else:
-            s.url=self.videofile
+        s.url = self.get_uri()
 
-        s.position=self.current_position()
+        s.position = self.current_position()
         # Round length to the nearest second. This way, the timeline
         # should correctly update.
-        s.length=s.position / 1000 * 1000
-        s.status=self.current_status()
+        s.length = math.ceil(s.position / 1000) * 1000
+        s.status = self.current_status()
         return s
 
     def sound_get_volume(self):
@@ -296,21 +298,6 @@ class Player:
     def sound_set_volume(self, v):
         return 50
 
-    # Helper methods
-    def create_position (self, value=0, key=None, origin=None):
-        """Create a Position.
-        """
-        if key is None:
-            key=self.MediaTime
-        if origin is None:
-            origin=self.AbsolutePosition
-
-        p=Position()
-        p.value = value
-        p.origin = origin
-        p.key = key
-        return p
-
     def update_status (self, status=None, position=None):
         """Update the player status.
 
@@ -319,20 +306,20 @@ class Player:
            - C{pause}
            - C{resume}
            - C{stop}
-           - C{set}
+           - C{seek}
+           - C{seek_relative}
 
         If no status is given, it only updates the value of self.status
 
-        If C{position} is None, it will be considered as zero for the
-        "start" action, and as the current relative position for other
-        actions.
+        If C{position} is None, it will be considered as the current
+        position.
 
         @param status: the new status
         @type status: string
         @param position: the position
-        @type position: long
+        @type position: int
         """
-        #print "gstrec - update_status ", status, str(position)
+        logger.debug("update_status %s %s", status, str(position))
 
         # We only handle "start" and "stop".
         if status == "start":
@@ -343,35 +330,43 @@ class Player:
             self.stop ()
         self.position_update ()
 
-    def is_active(self):
-        return True
+    def is_playing(self):
+        """Is the player in Playing or Paused status?
+        """
+        s = self.get_stream_information ()
+        return s.status == self.PlayingStatus or s.status == self.PauseStatus
 
     def check_player(self):
-        print "check player"
+        logger.debug("check player")
         return True
 
     def position_update(self):
         s = self.get_stream_information ()
         self.status = s.status
         self.stream_duration = s.length
-        self.current_position_value = long(s.position)
+        self.current_position_value = int(s.position)
 
-    def set_visual(self, xid):
+    def set_widget(self, widget):
+        self.set_visual( widget.get_id() )
+
+    def set_visual(self, xid, realsink=None):
+        if realsink is None:
+            realsink = self.imagesink
         self.xid = xid
-        if self.imagesink.implements_interface(gst.interfaces.XOverlay):
-            realsink = autovideosink.get_by_interface(gst.interfaces.XOverlay)
-            if realsink:
-                realsink.set_xwindow_id(self.xid)
-                if hasattr(realsink.props, 'force-aspect-ratio'):
-                    realsink.set_property('force-aspect-ratio', True)
+        if xid and hasattr(realsink, 'set_window_handle'):
+            logger.info("Reparent " + hex(xid))
+            Gdk.Display().get_default().sync()
+            realsink.set_window_handle(xid)
+        if hasattr(realsink.props, 'force-aspect-ratio'):
+            realsink.set_property('force-aspect-ratio', True)
         return True
 
     def restart_player(self):
         # FIXME: destroy the previous player
-        self.player.set_state(gst.STATE_READY)
+        self.player.set_state(Gst.State.READY)
         # Rebuilt the pipeline
         self.build_pipeline()
-        self.playlist_add_item(self.videofile)
+        self.set_uri(self.videofile)
         self.position_update()
         return True
 
@@ -400,4 +395,3 @@ class Player:
     def fullscreen(self, *p):
         # Not implemented
         return
-
diff --git a/lib/advene/player/vlc.py b/lib/advene/player/vlc.py
deleted file mode 100644
index b0dcf97..0000000
--- a/lib/advene/player/vlc.py
+++ /dev/null
@@ -1,5579 +0,0 @@
-#! /usr/bin/python
-
-#
-# Python ctypes bindings for VLC
-# Copyright (C) 2009-2012 the VideoLAN team
-# $Id: $
-#
-# Authors: Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
-#
-
-"""This module provides bindings for the
-U{libvlc<http://wiki.videolan.org/ExternalAPI>} and
-U{MediaControl<http://wiki.videolan.org/MediaControlAPI>} APIs.
-
-You can find documentation at U{http://www.advene.org/download/python-ctypes/}.
-
-Basically, the most important class is L{Instance}, which is used to
-create a libvlc Instance. From this instance, you can then create
-L{MediaPlayer} and L{MediaListPlayer} instances.
-"""
-
-import logging
-import ctypes
-import sys
-
-build_date="Thu Jan 28 12:00:04 2010"
-
-# Used for win32 and MacOS X
-detected_plugin_path=None
-
-if sys.platform == 'linux2':
-    dll=ctypes.CDLL('libvlc.so.2')
-elif sys.platform == 'win32':
-    import ctypes.util
-    import os
-    detected_plugin_path=None
-    path=ctypes.util.find_library('libvlc.dll')
-    if path is None:
-        # Try to use registry settings
-        import _winreg
-        detected_plugin_path_found = None
-        subkey, name = 'Software\\VideoLAN\\VLC','InstallDir'
-        for hkey in _winreg.HKEY_LOCAL_MACHINE, _winreg.HKEY_CURRENT_USER:
-            try:
-                reg = _winreg.OpenKey(hkey, subkey)
-                detected_plugin_path_found, type_id = _winreg.QueryValueEx(reg, name)
-                _winreg.CloseKey(reg)
-                break
-            except _winreg.error:
-                pass
-        if detected_plugin_path_found:
-            detected_plugin_path = detected_plugin_path_found
-        else:
-            # Try a standard location.
-            p='c:\\Program Files\\VideoLAN\\VLC\\libvlc.dll'
-            if os.path.exists(p):
-                detected_plugin_path=os.path.dirname(p)
-        if detected_plugin_path is not None:
-            os.chdir(detected_plugin_path)
-        # If chdir failed, this will not work and raise an exception
-        path='libvlc.dll'
-    else:
-        detected_plugin_path=os.path.dirname(path)
-    dll=ctypes.CDLL(path)
-elif sys.platform == 'darwin':
-    # FIXME: should find a means to configure path
-    d='/Applications/VLC.app'
-    import os
-    if os.path.exists(d):
-        dll=ctypes.CDLL(d+'/Contents/MacOS/lib/libvlc.2.dylib')
-        detected_plugin_path=d+'/Contents/MacOS/modules'
-    else:
-        # Hope some default path is set...
-        dll=ctypes.CDLL('libvlc.2.dylib')
-
-#
-# Generated enum types.
-#
-
-class EventType(ctypes.c_ulong):
-    """ libvlc_core
-LibVLC Available Events
-
-
-    """
-    _names={
-        1: 'MediaSubItemAdded',
-        2: 'MediaDurationChanged',
-        3: 'MediaPreparsedChanged',
-        4: 'MediaFreed',
-        5: 'MediaStateChanged',
-        6: 'MediaPlayerNothingSpecial',
-        7: 'MediaPlayerOpening',
-        8: 'MediaPlayerBuffering',
-        9: 'MediaPlayerPlaying',
-        10: 'MediaPlayerPaused',
-        11: 'MediaPlayerStopped',
-        12: 'MediaPlayerForward',
-        13: 'MediaPlayerBackward',
-        14: 'MediaPlayerEndReached',
-        15: 'MediaPlayerEncounteredError',
-        16: 'MediaPlayerTimeChanged',
-        17: 'MediaPlayerPositionChanged',
-        18: 'MediaPlayerSeekableChanged',
-        19: 'MediaPlayerPausableChanged',
-        20: 'MediaListItemAdded',
-        21: 'MediaListWillAddItem',
-        22: 'MediaListItemDeleted',
-        23: 'MediaListWillDeleteItem',
-        24: 'MediaListViewItemAdded',
-        25: 'MediaListViewWillAddItem',
-        26: 'MediaListViewItemDeleted',
-        27: 'MediaListViewWillDeleteItem',
-        28: 'MediaListPlayerPlayed',
-        29: 'MediaListPlayerNextItemSet',
-        30: 'MediaListPlayerStopped',
-        31: 'MediaDiscovererStarted',
-        32: 'MediaDiscovererEnded',
-        33: 'MediaPlayerTitleChanged',
-        34: 'MediaPlayerSnapshotTaken',
-    }
-
-    def __repr__(self):
-        return ".".join((self.__class__.__module__, self.__class__.__name__, self._names[self.value]))
-
-    def __eq__(self, other):
-        return ( (isinstance(other, ctypes.c_ulong) and self.value == other.value)
-                 or (isinstance(other, (int, long)) and self.value == other ) )
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-EventType.MediaSubItemAdded=EventType(1)
-EventType.MediaDurationChanged=EventType(2)
-EventType.MediaPreparsedChanged=EventType(3)
-EventType.MediaFreed=EventType(4)
-EventType.MediaStateChanged=EventType(5)
-EventType.MediaPlayerNothingSpecial=EventType(6)
-EventType.MediaPlayerOpening=EventType(7)
-EventType.MediaPlayerBuffering=EventType(8)
-EventType.MediaPlayerPlaying=EventType(9)
-EventType.MediaPlayerPaused=EventType(10)
-EventType.MediaPlayerStopped=EventType(11)
-EventType.MediaPlayerForward=EventType(12)
-EventType.MediaPlayerBackward=EventType(13)
-EventType.MediaPlayerEndReached=EventType(14)
-EventType.MediaPlayerEncounteredError=EventType(15)
-EventType.MediaPlayerTimeChanged=EventType(16)
-EventType.MediaPlayerPositionChanged=EventType(17)
-EventType.MediaPlayerSeekableChanged=EventType(18)
-EventType.MediaPlayerPausableChanged=EventType(19)
-EventType.MediaListItemAdded=EventType(20)
-EventType.MediaListWillAddItem=EventType(21)
-EventType.MediaListItemDeleted=EventType(22)
-EventType.MediaListWillDeleteItem=EventType(23)
-EventType.MediaListViewItemAdded=EventType(24)
-EventType.MediaListViewWillAddItem=EventType(25)
-EventType.MediaListViewItemDeleted=EventType(26)
-EventType.MediaListViewWillDeleteItem=EventType(27)
-EventType.MediaListPlayerPlayed=EventType(28)
-EventType.MediaListPlayerNextItemSet=EventType(29)
-EventType.MediaListPlayerStopped=EventType(30)
-EventType.MediaDiscovererStarted=EventType(31)
-EventType.MediaDiscovererEnded=EventType(32)
-EventType.MediaPlayerTitleChanged=EventType(33)
-EventType.MediaPlayerSnapshotTaken=EventType(34)
-
-class Meta(ctypes.c_ulong):
-    """ libvlc_media
-LibVLC Media Meta
-
-
-    """
-    _names={
-        0: 'Title',
-        1: 'Artist',
-        2: 'Genre',
-        3: 'Copyright',
-        4: 'Album',
-        5: 'TrackNumber',
-        6: 'Description',
-        7: 'Rating',
-        8: 'Date',
-        9: 'Setting',
-        10: 'URL',
-        11: 'Language',
-        12: 'NowPlaying',
-        13: 'Publisher',
-        14: 'EncodedBy',
-        15: 'ArtworkURL',
-        16: 'TrackID',
-    }
-
-    def __repr__(self):
-        return ".".join((self.__class__.__module__, self.__class__.__name__, self._names[self.value]))
-
-    def __eq__(self, other):
-        return ( (isinstance(other, ctypes.c_ulong) and self.value == other.value)
-                 or (isinstance(other, (int, long)) and self.value == other ) )
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-Meta.Title=Meta(0)
-Meta.Artist=Meta(1)
-Meta.Genre=Meta(2)
-Meta.Copyright=Meta(3)
-Meta.Album=Meta(4)
-Meta.TrackNumber=Meta(5)
-Meta.Description=Meta(6)
-Meta.Rating=Meta(7)
-Meta.Date=Meta(8)
-Meta.Setting=Meta(9)
-Meta.URL=Meta(10)
-Meta.Language=Meta(11)
-Meta.NowPlaying=Meta(12)
-Meta.Publisher=Meta(13)
-Meta.EncodedBy=Meta(14)
-Meta.ArtworkURL=Meta(15)
-Meta.TrackID=Meta(16)
-
-class State(ctypes.c_ulong):
-    """Note the order of libvlc_state_t enum must match exactly the order of
-See mediacontrol_PlayerStatus, See input_state_e enums,
-and VideoLAN.LibVLC.State (at bindings/cil/src/media.cs).
-Expected states by web plugins are:
-IDLE/CLOSE=0, OPENING=1, BUFFERING=2, PLAYING=3, PAUSED=4,
-STOPPING=5, ENDED=6, ERROR=7
-
-    """
-    _names={
-        0: 'NothingSpecial',
-        1: 'Opening',
-        2: 'Buffering',
-        3: 'Playing',
-        4: 'Paused',
-        5: 'Stopped',
-        6: 'Ended',
-        7: 'Error',
-    }
-
-    def __repr__(self):
-        return ".".join((self.__class__.__module__, self.__class__.__name__, self._names[self.value]))
-
-    def __eq__(self, other):
-        return ( (isinstance(other, ctypes.c_ulong) and self.value == other.value)
-                 or (isinstance(other, (int, long)) and self.value == other ) )
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-State.NothingSpecial=State(0)
-State.Opening=State(1)
-State.Buffering=State(2)
-State.Playing=State(3)
-State.Paused=State(4)
-State.Stopped=State(5)
-State.Ended=State(6)
-State.Error=State(7)
-
-class AudioOutputDeviceTypes(ctypes.c_ulong):
-    """Audio device types
-
-    """
-    _names={
-        -1: 'Error',
-        1: 'Mono',
-        2: 'Stereo',
-        4: '_2F2R',
-        5: '_3F2R',
-        6: '_5_1',
-        7: '_6_1',
-        8: '_7_1',
-        10: 'SPDIF',
-    }
-
-    def __repr__(self):
-        return ".".join((self.__class__.__module__, self.__class__.__name__, self._names[self.value]))
-
-    def __eq__(self, other):
-        return ( (isinstance(other, ctypes.c_ulong) and self.value == other.value)
-                 or (isinstance(other, (int, long)) and self.value == other ) )
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-AudioOutputDeviceTypes.Error=AudioOutputDeviceTypes(-1)
-AudioOutputDeviceTypes.Mono=AudioOutputDeviceTypes(1)
-AudioOutputDeviceTypes.Stereo=AudioOutputDeviceTypes(2)
-AudioOutputDeviceTypes._2F2R=AudioOutputDeviceTypes(4)
-AudioOutputDeviceTypes._3F2R=AudioOutputDeviceTypes(5)
-AudioOutputDeviceTypes._5_1=AudioOutputDeviceTypes(6)
-AudioOutputDeviceTypes._6_1=AudioOutputDeviceTypes(7)
-AudioOutputDeviceTypes._7_1=AudioOutputDeviceTypes(8)
-AudioOutputDeviceTypes.SPDIF=AudioOutputDeviceTypes(10)
-
-class AudioOutputChannel(ctypes.c_ulong):
-    """Audio channels
-
-    """
-    _names={
-        -1: 'Error',
-        1: 'Stereo',
-        2: 'RStereo',
-        3: 'Left',
-        4: 'Right',
-        5: 'Dolbys',
-    }
-
-    def __repr__(self):
-        return ".".join((self.__class__.__module__, self.__class__.__name__, self._names[self.value]))
-
-    def __eq__(self, other):
-        return ( (isinstance(other, ctypes.c_ulong) and self.value == other.value)
-                 or (isinstance(other, (int, long)) and self.value == other ) )
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-AudioOutputChannel.Error=AudioOutputChannel(-1)
-AudioOutputChannel.Stereo=AudioOutputChannel(1)
-AudioOutputChannel.RStereo=AudioOutputChannel(2)
-AudioOutputChannel.Left=AudioOutputChannel(3)
-AudioOutputChannel.Right=AudioOutputChannel(4)
-AudioOutputChannel.Dolbys=AudioOutputChannel(5)
-
-class PositionOrigin(ctypes.c_ulong):
-    """A position may have different origins:
- - absolute counts from the movie start
- - relative counts from the current position
- - modulo counts from the current position and wraps at the end of the movie
-
-    """
-    _names={
-        0: 'AbsolutePosition',
-        1: 'RelativePosition',
-        2: 'ModuloPosition',
-    }
-
-    def __repr__(self):
-        return ".".join((self.__class__.__module__, self.__class__.__name__, self._names[self.value]))
-
-    def __eq__(self, other):
-        return ( (isinstance(other, ctypes.c_ulong) and self.value == other.value)
-                 or (isinstance(other, (int, long)) and self.value == other ) )
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-PositionOrigin.AbsolutePosition=PositionOrigin(0)
-PositionOrigin.RelativePosition=PositionOrigin(1)
-PositionOrigin.ModuloPosition=PositionOrigin(2)
-
-class PositionKey(ctypes.c_ulong):
-    """Units available in mediacontrol Positions
- - ByteCount number of bytes
- - SampleCount number of frames
- - MediaTime time in milliseconds
-
-    """
-    _names={
-        0: 'ByteCount',
-        1: 'SampleCount',
-        2: 'MediaTime',
-    }
-
-    def __repr__(self):
-        return ".".join((self.__class__.__module__, self.__class__.__name__, self._names[self.value]))
-
-    def __eq__(self, other):
-        return ( (isinstance(other, ctypes.c_ulong) and self.value == other.value)
-                 or (isinstance(other, (int, long)) and self.value == other ) )
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-PositionKey.ByteCount=PositionKey(0)
-PositionKey.SampleCount=PositionKey(1)
-PositionKey.MediaTime=PositionKey(2)
-
-class PlayerStatus(ctypes.c_ulong):
-    """Possible player status
-Note the order of these enums must match exactly the order of
-libvlc_state_t and input_state_e enums.
-
-    """
-    _names={
-        0: 'UndefinedStatus',
-        1: 'InitStatus',
-        2: 'BufferingStatus',
-        3: 'PlayingStatus',
-        4: 'PauseStatus',
-        5: 'StopStatus',
-        6: 'EndStatus',
-        7: 'ErrorStatus',
-    }
-
-    def __repr__(self):
-        return ".".join((self.__class__.__module__, self.__class__.__name__, self._names[self.value]))
-
-    def __eq__(self, other):
-        return ( (isinstance(other, ctypes.c_ulong) and self.value == other.value)
-                 or (isinstance(other, (int, long)) and self.value == other ) )
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-PlayerStatus.UndefinedStatus=PlayerStatus(0)
-PlayerStatus.InitStatus=PlayerStatus(1)
-PlayerStatus.BufferingStatus=PlayerStatus(2)
-PlayerStatus.PlayingStatus=PlayerStatus(3)
-PlayerStatus.PauseStatus=PlayerStatus(4)
-PlayerStatus.StopStatus=PlayerStatus(5)
-PlayerStatus.EndStatus=PlayerStatus(6)
-PlayerStatus.ErrorStatus=PlayerStatus(7)
-
-
-#
-# End of generated enum types.
-#
-
-class ListPOINTER(object):
-    '''Just like a POINTER but accept a list of ctype as an argument.
-    '''
-    def __init__(self, etype):
-        self.etype = etype
-
-    def from_param(self, param):
-        if isinstance(param, (list, tuple)):
-            return (self.etype * len(param))(*param)
-
-class LibVLCException(Exception):
-    """Python exception raised by libvlc methods.
-    """
-    pass
-
-# From libvlc_structures.h
-
-# This is version-dependent, depending on the presence of libvlc_errmsg
-
-if hasattr(dll, 'libvlc_errmsg'):
-    # New-style message passing
-    class VLCException(ctypes.Structure):
-        """libvlc exception.
-        """
-        _fields_= [
-                    ('raised', ctypes.c_int),
-                    ]
-
-        @property
-        def message(self):
-            return dll.libvlc_errmsg()
-
-        def init(self):
-            libvlc_exception_init(self)
-
-        def clear(self):
-            libvlc_exception_clear(self)
-else:
-    # Old-style exceptions
-    class VLCException(ctypes.Structure):
-        """libvlc exception.
-        """
-        _fields_= [
-                    ('raised', ctypes.c_int),
-                    ('code', ctypes.c_int),
-                    ('message', ctypes.c_char_p),
-                    ]
-        def init(self):
-            libvlc_exception_init(self)
-
-        def clear(self):
-            libvlc_exception_clear(self)
-
-class MediaStats(ctypes.Structure):
-    _fields_= [
-                ('read_bytes',          ctypes.c_int  ),
-                ('input_bitrate',       ctypes.c_float),
-                ('demux_read_bytes',    ctypes.c_int  ),
-                ('demux_bitrate',       ctypes.c_float),
-                ('demux_corrupted',     ctypes.c_int  ),
-                ('demux_discontinuity', ctypes.c_int  ),
-                ('decoded_video',       ctypes.c_int  ),
-                ('decoded_audio',       ctypes.c_int  ),
-                ('displayed_pictures',  ctypes.c_int  ),
-                ('lost_pictures',       ctypes.c_int  ),
-                ('played_abuffers',     ctypes.c_int  ),
-                ('lost_abuffers',       ctypes.c_int  ),
-                ('sent_packets',        ctypes.c_int  ),
-                ('sent_bytes',          ctypes.c_int  ),
-                ('send_bitrate',        ctypes.c_float),
-                ]
-
-    def __str__(self):
-        return "MediaStats\n%s" % "\n".join( "%s:\t%s" % (n, getattr(self, n)) for n in self._fields_ )
-
-if 'EsType' in dir():
-    class MediaES(ctypes.Structure):
-        _fields_= [
-            ('codec'   , ctypes.c_uint32),
-            ('id'      , ctypes.c_int),
-            ('type'    , EsType),
-            ('profile' , ctypes.c_int),
-            ('level'   , ctypes.c_int),
-            ('channels',  ctypes.c_uint),
-            ('rate'    , ctypes.c_uint),
-            ('height'  , ctypes.c_uint),
-            ('width'   , ctypes.c_uint),
-            ]
-
-        def __str__(self):
-            return "MediaES \n%s" % "\n".join( "%s:\t%s" % (n, getattr(self, n)) for n in self._fields_ )
-
-class PlaylistItem(ctypes.Structure):
-    _fields_= [
-                ('id', ctypes.c_int),
-                ('uri', ctypes.c_char_p),
-                ('name', ctypes.c_char_p),
-                ]
-
-    def __str__(self):
-        return "PlaylistItem #%d %s (%uri)" % (self.id, self.name, self.uri)
-
-class LogMessage(ctypes.Structure):
-    _fields_= [
-                ('size', ctypes.c_uint),
-                ('severity', ctypes.c_int),
-                ('type', ctypes.c_char_p),
-                ('name', ctypes.c_char_p),
-                ('header', ctypes.c_char_p),
-                ('message', ctypes.c_char_p),
-                ]
-
-    def __init__(self):
-        super(LogMessage, self).__init__()
-        self.size=ctypes.sizeof(self)
-
-    def __str__(self):
-        return "vlc.LogMessage(%d:%s): %s" % (self.severity, self.type, self.message)
-
-class MediaControlPosition(ctypes.Structure):
-    _fields_= [
-                ('origin', PositionOrigin),
-                ('key', PositionKey),
-                ('value', ctypes.c_longlong),
-                ]
-
-    def __init__(self, value=0, origin=None, key=None):
-        # We override the __init__ method so that instanciating the
-        # class with an int as parameter will create the appropriate
-        # default position (absolute position, media time, with the
-        # int as value).
-        super(MediaControlPosition, self).__init__()
-        self.value=value
-        if origin is None:
-            origin=PositionOrigin.AbsolutePosition
-        if key is None:
-            key=PositionKey.MediaTime
-        self.origin=origin
-        self.key=key
-
-    def __str__(self):
-        return "MediaControlPosition %ld (%s, %s)" % (
-            self.value,
-            str(self.origin),
-            str(self.key)
-            )
-
-    @staticmethod
-    def from_param(arg):
-        if isinstance(arg, (int, long)):
-            return MediaControlPosition(arg)
-        else:
-            return arg
-
-class MediaControlException(ctypes.Structure):
-    _fields_= [
-                ('code', ctypes.c_int),
-                ('message', ctypes.c_char_p),
-                ]
-    def init(self):
-        mediacontrol_exception_init(self)
-
-    def clear(self):
-        mediacontrol_exception_free(self)
-
-class MediaControlStreamInformation(ctypes.Structure):
-    _fields_= [
-                ('status', PlayerStatus),
-                ('url', ctypes.c_char_p),
-                ('position', ctypes.c_longlong),
-                ('length', ctypes.c_longlong),
-                ]
-
-    def __str__(self):
-        return "%s (%s) : %ld / %ld" % (self.url or "<No defined URL>",
-                                        str(self.status),
-                                        self.position,
-                                        self.length)
-
-class RGBPicture(ctypes.Structure):
-    _fields_= [
-                ('width', ctypes.c_int),
-                ('height', ctypes.c_int),
-                ('type', ctypes.c_uint32),
-                ('date', ctypes.c_ulonglong),
-                ('size', ctypes.c_int),
-                ('data_pointer', ctypes.c_void_p),
-                ]
-
-    @property
-    def data(self):
-        return ctypes.string_at(self.data_pointer, self.size)
-
-    def __str__(self):
-        return "RGBPicture (%d, %d) - %ld ms - %d bytes" % (self.width, self.height, self.date, self.size)
-
-    def free(self):
-        mediacontrol_RGBPicture__free(self)
-
-def check_vlc_exception(result, func, args):
-    """Error checking method for functions using an exception in/out parameter.
-    """
-    ex=args[-1]
-    if not isinstance(ex, (VLCException, MediaControlException)):
-        logging.warn("python-vlc: error when processing function %s. Please report this as a bug to vlc-devel at videolan.org" % str(func))
-        return result
-    # Take into account both VLCException and MediacontrolException:
-    c=getattr(ex, 'raised', getattr(ex, 'code', 0))
-    if c:
-        raise LibVLCException(ex.message)
-    return result
-
-### End of header.py ###
-class AudioOutput(object):
-
-    def __new__(cls, pointer=None):
-        '''Internal method used for instanciating wrappers from ctypes.
-        '''
-        if pointer is None:
-            raise Exception("Internal method. Surely this class cannot be instanciated by itself.")
-        if pointer == 0:
-            return None
-        else:
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(pointer)
-            return o
-
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-    if hasattr(dll, 'libvlc_audio_output_list_release'):
-        def list_release(self):
-            """Free the list of available audio outputs
-        """
-            return libvlc_audio_output_list_release(self)
-
-class EventManager(object):
-
-    def __new__(cls, pointer=None):
-        '''Internal method used for instanciating wrappers from ctypes.
-        '''
-        if pointer is None:
-            raise Exception("Internal method. Surely this class cannot be instanciated by itself.")
-        if pointer == 0:
-            return None
-        else:
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(pointer)
-            return o
-
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-    if hasattr(dll, 'libvlc_event_attach'):
-        def event_attach(self, i_event_type, f_callback, user_data):
-            """Register for an event notification.
- at param i_event_type: the desired event to which we want to listen
- at param f_callback: the function to call when i_event_type occurs
- at param user_data: user provided data to carry with the event
-        """
-            e=VLCException()
-            return libvlc_event_attach(self, i_event_type, f_callback, user_data, e)
-
-    if hasattr(dll, 'libvlc_event_detach'):
-        def event_detach(self, i_event_type, f_callback, p_user_data):
-            """Unregister an event notification.
- at param i_event_type: the desired event to which we want to unregister
- at param f_callback: the function to call when i_event_type occurs
- at param p_user_data: user provided data to carry with the event
-        """
-            e=VLCException()
-            return libvlc_event_detach(self, i_event_type, f_callback, p_user_data, e)
-
-class Instance(object):
-    """Create a new Instance instance.
-
-    It may take as parameter either:
-      - a string
-      - a list of strings as first parameters
-      - the parameters given as the constructor parameters (must be strings)
-      - a MediaControl instance
-
-    """
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-
-    def __new__(cls, *p):
-        if p and p[0] == 0:
-            return None
-        elif p and isinstance(p[0], (int, long)):
-            # instance creation from ctypes
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(p[0])
-            return o
-        elif len(p) == 1 and isinstance(p[0], basestring):
-            # Only 1 string parameter: should be a parameter line
-            p=p[0].split(' ')
-        elif len(p) == 1 and isinstance(p[0], (tuple, list)):
-            p=p[0]
-
-        if p and isinstance(p[0], MediaControl):
-            return p[0].get_instance()
-        else:
-            if not p and detected_plugin_path is not None:
-                # No parameters passed. Under win32 and MacOS, specify
-                # the detected_plugin_path if present.
-                p=[ 'vlc', '--plugin-path='+ detected_plugin_path ]
-            e=VLCException()
-            return libvlc_new(len(p), p, e)
-
-    def media_player_new(self, uri=None):
-        """Create a new Media Player object.
-
-        @param uri: an optional URI to play in the player.
-        """
-        e=VLCException()
-        p=libvlc_media_player_new(self, e)
-        if uri:
-            p.set_media(self.media_new(uri))
-        p._instance=self
-        return p
-
-    def media_list_player_new(self):
-        """Create an empty Media Player object
-        """
-        e=VLCException()
-        p=libvlc_media_list_player_new(self, e)
-        p._instance=self
-        return p
-
-    def media_new(self, mrl, *options):
-        """Create an empty Media Player object
-
-        Options can be specified as supplementary string parameters, e.g.
-        m=i.media_new('foo.avi', 'sub-filter=marq{marquee=Hello}', 'vout-filter=invert')
-        """
-        e=VLCException()
-        m=libvlc_media_new(self, mrl, e)
-        for o in options:
-            libvlc_media_add_option(m, o, e)
-        return m
-
-
-    if hasattr(dll, 'libvlc_get_vlc_id'):
-        def get_vlc_id(self):
-            """Return a libvlc instance identifier for legacy APIs. Use of this
-function is discouraged, you should convert your program to use the
-new API.
- at return: the instance identifier
-        """
-            return libvlc_get_vlc_id(self)
-
-    if hasattr(dll, 'libvlc_release'):
-        def release(self):
-            """Decrement the reference count of a libvlc instance, and destroy it
-if it reaches zero.
-        """
-            return libvlc_release(self)
-
-    if hasattr(dll, 'libvlc_retain'):
-        def retain(self):
-            """Increments the reference count of a libvlc instance.
-The initial reference count is 1 after libvlc_new() returns.
-        """
-            return libvlc_retain(self)
-
-    if hasattr(dll, 'libvlc_add_intf'):
-        def add_intf(self, name):
-            """Try to start a user interface for the libvlc instance.
- at param name: interface name, or NULL for default
-        """
-            e=VLCException()
-            return libvlc_add_intf(self, name, e)
-
-    if hasattr(dll, 'libvlc_wait'):
-        def wait(self):
-            """Waits until an interface causes the instance to exit.
-You should start at least one interface first, using libvlc_add_intf().
-        """
-            return libvlc_wait(self)
-
-    if hasattr(dll, 'libvlc_get_log_verbosity'):
-        def get_log_verbosity(self):
-            """Return the VLC messaging verbosity level.
- at return: verbosity level for messages
-        """
-            e=VLCException()
-            return libvlc_get_log_verbosity(self, e)
-
-    if hasattr(dll, 'libvlc_set_log_verbosity'):
-        def set_log_verbosity(self, level):
-            """Set the VLC messaging verbosity level.
- at param level: log level
-        """
-            e=VLCException()
-            return libvlc_set_log_verbosity(self, level, e)
-
-    if hasattr(dll, 'libvlc_log_open'):
-        def log_open(self):
-            """Open a VLC message log instance.
- at return: log message instance
-        """
-            e=VLCException()
-            return libvlc_log_open(self, e)
-
-    if hasattr(dll, 'libvlc_media_new_as_node'):
-        def media_new_as_node(self, psz_name):
-            """Create a media as an empty node with the passed name.
- at param psz_name: the name of the node
- at return: the new empty media
-        """
-            e=VLCException()
-            return libvlc_media_new_as_node(self, psz_name, e)
-
-    if hasattr(dll, 'libvlc_media_discoverer_new_from_name'):
-        def media_discoverer_new_from_name(self, psz_name):
-            """Discover media service by name.
- at param psz_name: service name
- at return: media discover object
-        """
-            e=VLCException()
-            return libvlc_media_discoverer_new_from_name(self, psz_name, e)
-
-    if hasattr(dll, 'libvlc_media_library_new'):
-        def media_library_new(self):
-            """\ingroup libvlc
-LibVLC Media Library
-
-        """
-            e=VLCException()
-            return libvlc_media_library_new(self, e)
-
-    if hasattr(dll, 'libvlc_media_list_new'):
-        def media_list_new(self):
-            """Create an empty media list.
- at return: empty media list
-        """
-            e=VLCException()
-            return libvlc_media_list_new(self, e)
-
-    if hasattr(dll, 'libvlc_audio_output_list_get'):
-        def audio_output_list_get(self):
-            """Get the list of available audio outputs
- at return: list of available audio outputs, at the end free it with
-        """
-            e=VLCException()
-            return libvlc_audio_output_list_get(self, e)
-
-    if hasattr(dll, 'libvlc_audio_output_set'):
-        def audio_output_set(self, psz_name):
-            """Set the audio output.
-Change will be applied after stop and play.
- at return: true if function succeded
-        """
-            return libvlc_audio_output_set(self, psz_name)
-
-    if hasattr(dll, 'libvlc_audio_output_device_count'):
-        def audio_output_device_count(self, psz_audio_output):
-            """Get count of devices for audio output, these devices are hardware oriented
-like analor or digital output of sound card
- at return: number of devices
-        """
-            return libvlc_audio_output_device_count(self, psz_audio_output)
-
-    if hasattr(dll, 'libvlc_audio_output_device_longname'):
-        def audio_output_device_longname(self, psz_audio_output, i_device):
-            """Get long name of device, if not available short name given
- at param psz_audio_output: - name of audio output, \see libvlc_audio_output_t
- at return: long name of device
-        """
-            return libvlc_audio_output_device_longname(self, psz_audio_output, i_device)
-
-    if hasattr(dll, 'libvlc_audio_output_device_id'):
-        def audio_output_device_id(self, psz_audio_output, i_device):
-            """Get id name of device
- at param psz_audio_output: - name of audio output, \see libvlc_audio_output_t
- at return: id name of device, use for setting device, need to be free after use
-        """
-            return libvlc_audio_output_device_id(self, psz_audio_output, i_device)
-
-    if hasattr(dll, 'libvlc_audio_output_device_set'):
-        def audio_output_device_set(self, psz_audio_output, psz_device_id):
-            """Set device for using
- at param psz_audio_output: - name of audio output, \see libvlc_audio_output_t
-        """
-            return libvlc_audio_output_device_set(self, psz_audio_output, psz_device_id)
-
-    if hasattr(dll, 'libvlc_audio_output_get_device_type'):
-        def audio_output_get_device_type(self):
-            """Get current audio device type. Device type describes something like
-character of output sound - stereo sound, 2.1, 5.1 etc
- at return: the audio devices type \see libvlc_audio_output_device_types_t
-        """
-            e=VLCException()
-            return libvlc_audio_output_get_device_type(self, e)
-
-    if hasattr(dll, 'libvlc_audio_output_set_device_type'):
-        def audio_output_set_device_type(self, device_type):
-            """Set current audio device type.
- at param device_type: the audio device type,
-        """
-            e=VLCException()
-            return libvlc_audio_output_set_device_type(self, device_type, e)
-
-    if hasattr(dll, 'libvlc_audio_toggle_mute'):
-        def audio_toggle_mute(self):
-            """Toggle mute status.
-        """
-            e=VLCException()
-            return libvlc_audio_toggle_mute(self, e)
-
-    if hasattr(dll, 'libvlc_audio_get_mute'):
-        def audio_get_mute(self):
-            """Get current mute status.
- at return: the mute status (boolean)
-        """
-            e=VLCException()
-            return libvlc_audio_get_mute(self, e)
-
-    if hasattr(dll, 'libvlc_audio_set_mute'):
-        def audio_set_mute(self, status):
-            """Set mute status.
- at param status: If status is true then mute, otherwise unmute
-        """
-            e=VLCException()
-            return libvlc_audio_set_mute(self, status, e)
-
-    if hasattr(dll, 'libvlc_audio_get_volume'):
-        def audio_get_volume(self):
-            """Get current audio level.
- at return: the audio level (int)
-        """
-            e=VLCException()
-            return libvlc_audio_get_volume(self, e)
-
-    if hasattr(dll, 'libvlc_audio_set_volume'):
-        def audio_set_volume(self, i_volume):
-            """Set current audio level.
- at param i_volume: the volume (int)
-        """
-            e=VLCException()
-            return libvlc_audio_set_volume(self, i_volume, e)
-
-    if hasattr(dll, 'libvlc_audio_get_channel'):
-        def audio_get_channel(self):
-            """Get current audio channel.
- at return: the audio channel \see libvlc_audio_output_channel_t
-        """
-            e=VLCException()
-            return libvlc_audio_get_channel(self, e)
-
-    if hasattr(dll, 'libvlc_audio_set_channel'):
-        def audio_set_channel(self, channel):
-            """Set current audio channel.
- at param channel: the audio channel, \see libvlc_audio_output_channel_t
-        """
-            e=VLCException()
-            return libvlc_audio_set_channel(self, channel, e)
-
-    if hasattr(dll, 'libvlc_vlm_release'):
-        def vlm_release(self):
-            """Release the vlm instance related to the given libvlc_instance_t
-        """
-            e=VLCException()
-            return libvlc_vlm_release(self, e)
-
-    if hasattr(dll, 'libvlc_vlm_add_broadcast'):
-        def vlm_add_broadcast(self, psz_name, psz_input, psz_output, i_options, ppsz_options, b_enabled, b_loop):
-            """Add a broadcast, with one input.
- at param psz_name: the name of the new broadcast
- at param psz_input: the input MRL
- at param psz_output: the output MRL (the parameter to the "sout" variable)
- at param i_options: number of additional options
- at param ppsz_options: additional options
- at param b_enabled: boolean for enabling the new broadcast
- at param b_loop: Should this broadcast be played in loop ?
-        """
-            e=VLCException()
-            return libvlc_vlm_add_broadcast(self, psz_name, psz_input, psz_output, i_options, ppsz_options, b_enabled, b_loop, e)
-
-    if hasattr(dll, 'libvlc_vlm_add_vod'):
-        def vlm_add_vod(self, psz_name, psz_input, i_options, ppsz_options, b_enabled, psz_mux):
-            """Add a vod, with one input.
- at param psz_name: the name of the new vod media
- at param psz_input: the input MRL
- at param i_options: number of additional options
- at param ppsz_options: additional options
- at param b_enabled: boolean for enabling the new vod
- at param psz_mux: the muxer of the vod media
-        """
-            e=VLCException()
-            return libvlc_vlm_add_vod(self, psz_name, psz_input, i_options, ppsz_options, b_enabled, psz_mux, e)
-
-    if hasattr(dll, 'libvlc_vlm_del_media'):
-        def vlm_del_media(self, psz_name):
-            """Delete a media (VOD or broadcast).
- at param psz_name: the media to delete
-        """
-            e=VLCException()
-            return libvlc_vlm_del_media(self, psz_name, e)
-
-    if hasattr(dll, 'libvlc_vlm_set_enabled'):
-        def vlm_set_enabled(self, psz_name, b_enabled):
-            """Enable or disable a media (VOD or broadcast).
- at param psz_name: the media to work on
- at param b_enabled: the new status
-        """
-            e=VLCException()
-            return libvlc_vlm_set_enabled(self, psz_name, b_enabled, e)
-
-    if hasattr(dll, 'libvlc_vlm_set_output'):
-        def vlm_set_output(self, psz_name, psz_output):
-            """Set the output for a media.
- at param psz_name: the media to work on
- at param psz_output: the output MRL (the parameter to the "sout" variable)
-        """
-            e=VLCException()
-            return libvlc_vlm_set_output(self, psz_name, psz_output, e)
-
-    if hasattr(dll, 'libvlc_vlm_set_input'):
-        def vlm_set_input(self, psz_name, psz_input):
-            """Set a media's input MRL. This will delete all existing inputs and
-add the specified one.
- at param psz_name: the media to work on
- at param psz_input: the input MRL
-        """
-            e=VLCException()
-            return libvlc_vlm_set_input(self, psz_name, psz_input, e)
-
-    if hasattr(dll, 'libvlc_vlm_add_input'):
-        def vlm_add_input(self, psz_name, psz_input):
-            """Add a media's input MRL. This will add the specified one.
- at param psz_name: the media to work on
- at param psz_input: the input MRL
-        """
-            e=VLCException()
-            return libvlc_vlm_add_input(self, psz_name, psz_input, e)
-
-    if hasattr(dll, 'libvlc_vlm_set_loop'):
-        def vlm_set_loop(self, psz_name, b_loop):
-            """Set a media's loop status.
- at param psz_name: the media to work on
- at param b_loop: the new status
-        """
-            e=VLCException()
-            return libvlc_vlm_set_loop(self, psz_name, b_loop, e)
-
-    if hasattr(dll, 'libvlc_vlm_set_mux'):
-        def vlm_set_mux(self, psz_name, psz_mux):
-            """Set a media's vod muxer.
- at param psz_name: the media to work on
- at param psz_mux: the new muxer
-        """
-            e=VLCException()
-            return libvlc_vlm_set_mux(self, psz_name, psz_mux, e)
-
-    if hasattr(dll, 'libvlc_vlm_change_media'):
-        def vlm_change_media(self, psz_name, psz_input, psz_output, i_options, ppsz_options, b_enabled, b_loop):
-            """Edit the parameters of a media. This will delete all existing inputs and
-add the specified one.
- at param psz_name: the name of the new broadcast
- at param psz_input: the input MRL
- at param psz_output: the output MRL (the parameter to the "sout" variable)
- at param i_options: number of additional options
- at param ppsz_options: additional options
- at param b_enabled: boolean for enabling the new broadcast
- at param b_loop: Should this broadcast be played in loop ?
-        """
-            e=VLCException()
-            return libvlc_vlm_change_media(self, psz_name, psz_input, psz_output, i_options, ppsz_options, b_enabled, b_loop, e)
-
-    if hasattr(dll, 'libvlc_vlm_play_media'):
-        def vlm_play_media(self, psz_name):
-            """Play the named broadcast.
- at param psz_name: the name of the broadcast
-        """
-            e=VLCException()
-            return libvlc_vlm_play_media(self, psz_name, e)
-
-    if hasattr(dll, 'libvlc_vlm_stop_media'):
-        def vlm_stop_media(self, psz_name):
-            """Stop the named broadcast.
- at param psz_name: the name of the broadcast
-        """
-            e=VLCException()
-            return libvlc_vlm_stop_media(self, psz_name, e)
-
-    if hasattr(dll, 'libvlc_vlm_pause_media'):
-        def vlm_pause_media(self, psz_name):
-            """Pause the named broadcast.
- at param psz_name: the name of the broadcast
-        """
-            e=VLCException()
-            return libvlc_vlm_pause_media(self, psz_name, e)
-
-    if hasattr(dll, 'libvlc_vlm_seek_media'):
-        def vlm_seek_media(self, psz_name, f_percentage):
-            """Seek in the named broadcast.
- at param psz_name: the name of the broadcast
- at param f_percentage: the percentage to seek to
-        """
-            e=VLCException()
-            return libvlc_vlm_seek_media(self, psz_name, f_percentage, e)
-
-    if hasattr(dll, 'libvlc_vlm_show_media'):
-        def vlm_show_media(self, psz_name):
-            """Return information about the named broadcast.
-\bug will always return NULL
- at param psz_name: the name of the broadcast
- at return: string with information about named media
-        """
-            e=VLCException()
-            return libvlc_vlm_show_media(self, psz_name, e)
-
-    if hasattr(dll, 'libvlc_vlm_get_media_instance_position'):
-        def vlm_get_media_instance_position(self, psz_name, i_instance):
-            """Get vlm_media instance position by name or instance id
- at param psz_name: name of vlm media instance
- at param i_instance: instance id
- at return: position as float
-        """
-            e=VLCException()
-            return libvlc_vlm_get_media_instance_position(self, psz_name, i_instance, e)
-
-    if hasattr(dll, 'libvlc_vlm_get_media_instance_time'):
-        def vlm_get_media_instance_time(self, psz_name, i_instance):
-            """Get vlm_media instance time by name or instance id
- at param psz_name: name of vlm media instance
- at param i_instance: instance id
- at return: time as integer
-        """
-            e=VLCException()
-            return libvlc_vlm_get_media_instance_time(self, psz_name, i_instance, e)
-
-    if hasattr(dll, 'libvlc_vlm_get_media_instance_length'):
-        def vlm_get_media_instance_length(self, psz_name, i_instance):
-            """Get vlm_media instance length by name or instance id
- at param psz_name: name of vlm media instance
- at param i_instance: instance id
- at return: length of media item
-        """
-            e=VLCException()
-            return libvlc_vlm_get_media_instance_length(self, psz_name, i_instance, e)
-
-    if hasattr(dll, 'libvlc_vlm_get_media_instance_rate'):
-        def vlm_get_media_instance_rate(self, psz_name, i_instance):
-            """Get vlm_media instance playback rate by name or instance id
- at param psz_name: name of vlm media instance
- at param i_instance: instance id
- at return: playback rate
-        """
-            e=VLCException()
-            return libvlc_vlm_get_media_instance_rate(self, psz_name, i_instance, e)
-
-    if hasattr(dll, 'libvlc_vlm_get_media_instance_title'):
-        def vlm_get_media_instance_title(self, psz_name, i_instance):
-            """Get vlm_media instance title number by name or instance id
-\bug will always return 0
- at param psz_name: name of vlm media instance
- at param i_instance: instance id
- at return: title as number
-        """
-            e=VLCException()
-            return libvlc_vlm_get_media_instance_title(self, psz_name, i_instance, e)
-
-    if hasattr(dll, 'libvlc_vlm_get_media_instance_chapter'):
-        def vlm_get_media_instance_chapter(self, psz_name, i_instance):
-            """Get vlm_media instance chapter number by name or instance id
-\bug will always return 0
- at param psz_name: name of vlm media instance
- at param i_instance: instance id
- at return: chapter as number
-        """
-            e=VLCException()
-            return libvlc_vlm_get_media_instance_chapter(self, psz_name, i_instance, e)
-
-    if hasattr(dll, 'libvlc_vlm_get_media_instance_seekable'):
-        def vlm_get_media_instance_seekable(self, psz_name, i_instance):
-            """Is libvlc instance seekable ?
-\bug will always return 0
- at param psz_name: name of vlm media instance
- at param i_instance: instance id
- at return: 1 if seekable, 0 if not
-        """
-            e=VLCException()
-            return libvlc_vlm_get_media_instance_seekable(self, psz_name, i_instance, e)
-
-    if hasattr(dll, 'mediacontrol_new_from_instance'):
-        def mediacontrol_new_from_instance(self):
-            """Create a MediaControl instance from an existing libvlc instance
- at return: a mediacontrol_Instance
-        """
-            e=MediaControlException()
-            return mediacontrol_new_from_instance(self, e)
-
-class Log(object):
-
-    def __new__(cls, pointer=None):
-        '''Internal method used for instanciating wrappers from ctypes.
-        '''
-        if pointer is None:
-            raise Exception("Internal method. Surely this class cannot be instanciated by itself.")
-        if pointer == 0:
-            return None
-        else:
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(pointer)
-            return o
-
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-    def __iter__(self):
-        return self.get_iterator()
-
-    def dump(self):
-        return [ str(m) for m in self ]
-
-    if hasattr(dll, 'libvlc_log_close'):
-        def close(self):
-            """Close a VLC message log instance.
-        """
-            e=VLCException()
-            return libvlc_log_close(self, e)
-
-    if hasattr(dll, 'libvlc_log_count'):
-        def count(self):
-            """Returns the number of messages in a log instance.
- at return: number of log messages
-        """
-            e=VLCException()
-            return libvlc_log_count(self, e)
-
-    def __len__(self):
-        e=VLCException()
-        return libvlc_log_count(self, e)
-
-    if hasattr(dll, 'libvlc_log_clear'):
-        def clear(self):
-            """Clear a log instance.
-All messages in the log are removed. The log should be cleared on a
-regular basis to avoid clogging.
-        """
-            e=VLCException()
-            return libvlc_log_clear(self, e)
-
-    if hasattr(dll, 'libvlc_log_get_iterator'):
-        def get_iterator(self):
-            """Allocate and returns a new iterator to messages in log.
- at return: log iterator object
-        """
-            e=VLCException()
-            return libvlc_log_get_iterator(self, e)
-
-class LogIterator(object):
-
-    def __new__(cls, pointer=None):
-        '''Internal method used for instanciating wrappers from ctypes.
-        '''
-        if pointer is None:
-            raise Exception("Internal method. Surely this class cannot be instanciated by itself.")
-        if pointer == 0:
-            return None
-        else:
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(pointer)
-            return o
-
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-    def __iter__(self):
-        return self
-
-    def next(self):
-        if not self.has_next():
-            raise StopIteration
-        buf=LogMessage()
-        e=VLCException()
-        ret=libvlc_log_iterator_next(self, buf, e)
-        return ret.contents
-
-
-    if hasattr(dll, 'libvlc_log_iterator_free'):
-        def free(self):
-            """Release a previoulsy allocated iterator.
-        """
-            e=VLCException()
-            return libvlc_log_iterator_free(self, e)
-
-    if hasattr(dll, 'libvlc_log_iterator_has_next'):
-        def has_next(self):
-            """Return whether log iterator has more messages.
- at return: true if iterator has more message objects, else false
-        """
-            e=VLCException()
-            return libvlc_log_iterator_has_next(self, e)
-
-class Media(object):
-
-    def __new__(cls, pointer=None):
-        '''Internal method used for instanciating wrappers from ctypes.
-        '''
-        if pointer is None:
-            raise Exception("Internal method. Surely this class cannot be instanciated by itself.")
-        if pointer == 0:
-            return None
-        else:
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(pointer)
-            return o
-
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-    def add_options(self, *list_of_options):
-        """Add a list of options to the media.
-
-        Options must be written without the double-dash, e.g.:
-        m.add_options('sub-filter=marq at test{marquee=Hello}', 'video-filter=invert')
-
-        Note that you also can directly pass these options in the Instance.media_new method:
-        m=instance.media_new( 'foo.avi', 'sub-filter=marq at test{marquee=Hello}', 'video-filter=invert')
-        """
-        for o in list_of_options:
-            self.add_option(o)
-
-
-    if hasattr(dll, 'libvlc_media_add_option'):
-        def add_option(self, ppsz_options):
-            """Add an option to the media.
-This option will be used to determine how the media_player will
-read the media. This allows to use VLC's advanced
-reading/streaming options on a per-media basis.
-The options are detailed in vlc --long-help, for instance "--sout-all"
- at param ppsz_options: the options (as a string)
-        """
-            e=VLCException()
-            return libvlc_media_add_option(self, ppsz_options, e)
-
-    if hasattr(dll, 'libvlc_media_add_option_untrusted'):
-        def add_option_untrusted(self, ppsz_options):
-            """Add an option to the media from an untrusted source.
-This option will be used to determine how the media_player will
-read the media. This allows to use VLC's advanced
-reading/streaming options on a per-media basis.
-The options are detailed in vlc --long-help, for instance "--sout-all"
- at param ppsz_options: the options (as a string)
-        """
-            e=VLCException()
-            return libvlc_media_add_option_untrusted(self, ppsz_options, e)
-
-    if hasattr(dll, 'libvlc_media_retain'):
-        def retain(self):
-            """Retain a reference to a media descriptor object (libvlc_media_t). Use
-libvlc_media_release() to decrement the reference count of a
-media descriptor object.
-        """
-            return libvlc_media_retain(self)
-
-    if hasattr(dll, 'libvlc_media_release'):
-        def release(self):
-            """Decrement the reference count of a media descriptor object. If the
-reference count is 0, then libvlc_media_release() will release the
-media descriptor object. It will send out an libvlc_MediaFreed event
-to all listeners. If the media descriptor object has been released it
-should not be used again.
-        """
-            return libvlc_media_release(self)
-
-    if hasattr(dll, 'libvlc_media_get_mrl'):
-        def get_mrl(self):
-            """Get the media resource locator (mrl) from a media descriptor object
- at return: string with mrl of media descriptor object
-        """
-            e=VLCException()
-            return libvlc_media_get_mrl(self, e)
-
-    if hasattr(dll, 'libvlc_media_duplicate'):
-        def duplicate(self):
-            """Duplicate a media descriptor object.
-        """
-            return libvlc_media_duplicate(self)
-
-    if hasattr(dll, 'libvlc_media_get_meta'):
-        def get_meta(self, e_meta):
-            """Read the meta of the media.
- at param e_meta: the meta to read
- at return: the media's meta
-        """
-            e=VLCException()
-            return libvlc_media_get_meta(self, e_meta, e)
-
-    if hasattr(dll, 'libvlc_media_get_state'):
-        def get_state(self):
-            """Get current state of media descriptor object. Possible media states
-are defined in libvlc_structures.c ( libvlc_NothingSpecial=0,
-libvlc_Opening, libvlc_Buffering, libvlc_Playing, libvlc_Paused,
-libvlc_Stopped, libvlc_Ended,
-libvlc_Error).
-See libvlc_state_t
- at return: state of media descriptor object
-        """
-            e=VLCException()
-            return libvlc_media_get_state(self, e)
-
-    if hasattr(dll, 'libvlc_media_subitems'):
-        def subitems(self):
-            """Get subitems of media descriptor object. This will increment
-the reference count of supplied media descriptor object. Use
-libvlc_media_list_release() to decrement the reference counting.
- at return: list of media descriptor subitems or NULL
-        """
-            e=VLCException()
-            return libvlc_media_subitems(self, e)
-
-    if hasattr(dll, 'libvlc_media_event_manager'):
-        def event_manager(self):
-            """Get event manager from media descriptor object.
-NOTE: this function doesn't increment reference counting.
- at return: event manager object
-        """
-            e=VLCException()
-            return libvlc_media_event_manager(self, e)
-
-    if hasattr(dll, 'libvlc_media_get_duration'):
-        def get_duration(self):
-            """Get duration of media descriptor object item.
- at return: duration of media item
-        """
-            e=VLCException()
-            return libvlc_media_get_duration(self, e)
-
-    if hasattr(dll, 'libvlc_media_is_preparsed'):
-        def is_preparsed(self):
-            """Get preparsed status for media descriptor object.
- at return: true if media object has been preparsed otherwise it returns false
-        """
-            e=VLCException()
-            return libvlc_media_is_preparsed(self, e)
-
-    if hasattr(dll, 'libvlc_media_set_user_data'):
-        def set_user_data(self, p_new_user_data):
-            """Sets media descriptor's user_data. user_data is specialized data
-accessed by the host application, VLC.framework uses it as a pointer to
-an native object that references a libvlc_media_t pointer
- at param p_new_user_data: pointer to user data
-        """
-            e=VLCException()
-            return libvlc_media_set_user_data(self, p_new_user_data, e)
-
-    if hasattr(dll, 'libvlc_media_get_user_data'):
-        def get_user_data(self):
-            """Get media descriptor's user_data. user_data is specialized data
-accessed by the host application, VLC.framework uses it as a pointer to
-an native object that references a libvlc_media_t pointer
-        """
-            e=VLCException()
-            return libvlc_media_get_user_data(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_new_from_media'):
-        def player_new_from_media(self):
-            """Create a Media Player object from a Media
-        """
-            e=VLCException()
-            return libvlc_media_player_new_from_media(self, e)
-
-class MediaControl(object):
-    """Create a new MediaControl instance
-
-    It may take as parameter either:
-      - a string
-      - a list of strings as first parameters
-      - the parameters given as the constructor parameters (must be strings)
-      - a vlc.Instance
-
-    """
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-
-    def __new__(cls, *p):
-        if p and p[0] == 0:
-            return None
-        elif p and isinstance(p[0], (int, long)):
-            # instance creation from ctypes
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(p[0])
-            return o
-        elif len(p) == 1 and isinstance(p[0], basestring):
-            # Only 1 string parameter: should be a parameter line
-            p=p[0].split(' ')
-        elif len(p) == 1 and isinstance(p[0], (tuple, list)):
-            p=p[0]
-
-        if p and isinstance(p[0], Instance):
-            e=MediaControlException()
-            return mediacontrol_new_from_instance(p[0], e)
-        else:
-            if not p and detected_plugin_path is not None:
-                # No parameters passed. Under win32 and MacOS, specify
-                # the detected_plugin_path if present.
-                p=[ 'vlc', '--plugin-path='+ detected_plugin_path ]
-            e=MediaControlException()
-            return mediacontrol_new(len(p), p, e)
-
-    def get_media_position(self, origin=PositionOrigin.AbsolutePosition, key=PositionKey.MediaTime):
-        e=MediaControlException()
-        p=mediacontrol_get_media_position(self, origin, key, e)
-        if p:
-            return p.contents
-        else:
-            return None
-
-    def set_media_position(self, pos):
-        """Set the media position.
-
-        @param pos: a MediaControlPosition or an integer (in ms)
-        """
-        if not isinstance(pos, MediaControlPosition):
-            pos=MediaControlPosition(long(pos))
-        e=MediaControlException()
-        mediacontrol_set_media_position(self, pos, e)
-
-    def start(self, pos=0):
-        """Start the player at the given position.
-
-        @param pos: a MediaControlPosition or an integer (in ms)
-        """
-        if not isinstance(pos, MediaControlPosition):
-            pos=MediaControlPosition(long(pos))
-        e=MediaControlException()
-        mediacontrol_start(self, pos, e)
-
-    def snapshot(self, pos=0):
-        """Take a snapshot.
-
-        Note: the position parameter is not properly implemented. For
-        the moment, the only valid position is the 0-relative position
-        (i.e. the current position).
-
-        @param pos: a MediaControlPosition or an integer (in ms)
-        """
-        if not isinstance(pos, MediaControlPosition):
-            pos=MediaControlPosition(long(pos))
-        e=MediaControlException()
-        p=mediacontrol_snapshot(self, pos, e)
-        if p:
-            snap=p.contents
-            # FIXME: there is a bug in the current mediacontrol_snapshot
-            # implementation, which sets an incorrect date.
-            # Workaround here:
-            snap.date=self.get_media_position().value
-            return snap
-        else:
-            return None
-
-    def display_text(self, message='', begin=0, end=1000):
-        """Display a caption between begin and end positions.
-
-        @param message: the caption to display
-        @param begin: the begin position
-        @param end: the end position
-        """
-        if not isinstance(begin, MediaControlPosition):
-            begin=self.value2position(begin)
-        if not isinstance(end, MediaControlPosition):
-            end=self.value2position(end)
-        e=MediaControlException()
-        mediacontrol_display_text(self, message, begin, end, e)
-
-    def get_stream_information(self, key=PositionKey.MediaTime):
-        """Return information about the stream.
-        """
-        e=MediaControlException()
-        return mediacontrol_get_stream_information(self, key, e).contents
-
-
-    if hasattr(dll, 'mediacontrol_get_libvlc_instance'):
-        def get_instance(self):
-            """Get the associated libvlc instance
- at return: a libvlc instance
-        """
-            return mediacontrol_get_libvlc_instance(self)
-
-    if hasattr(dll, 'mediacontrol_get_media_player'):
-        def get_media_player(self):
-            """Get the associated libvlc_media_player
- at return: a libvlc_media_player_t instance
-        """
-            return mediacontrol_get_media_player(self)
-
-    if hasattr(dll, 'mediacontrol_pause'):
-        def pause(self):
-            """Pause the movie at a given position
-        """
-            e=MediaControlException()
-            return mediacontrol_pause(self, e)
-
-    if hasattr(dll, 'mediacontrol_resume'):
-        def resume(self):
-            """Resume the movie at a given position
-        """
-            e=MediaControlException()
-            return mediacontrol_resume(self, e)
-
-    if hasattr(dll, 'mediacontrol_stop'):
-        def stop(self):
-            """Stop the movie at a given position
-        """
-            e=MediaControlException()
-            return mediacontrol_stop(self, e)
-
-    if hasattr(dll, 'mediacontrol_exit'):
-        def exit(self):
-            """Exit the player
-        """
-            return mediacontrol_exit(self)
-
-    if hasattr(dll, 'mediacontrol_set_mrl'):
-        def set_mrl(self, psz_file):
-            """Set the MRL to be played.
- at param psz_file: the MRL
-        """
-            e=MediaControlException()
-            return mediacontrol_set_mrl(self, psz_file, e)
-
-    if hasattr(dll, 'mediacontrol_get_mrl'):
-        def get_mrl(self):
-            """Get the MRL to be played.
-        """
-            e=MediaControlException()
-            return mediacontrol_get_mrl(self, e)
-
-    if hasattr(dll, 'mediacontrol_sound_get_volume'):
-        def sound_get_volume(self):
-            """Get the current audio level, normalized in [0..100]
- at return: the volume
-        """
-            e=MediaControlException()
-            return mediacontrol_sound_get_volume(self, e)
-
-    if hasattr(dll, 'mediacontrol_sound_set_volume'):
-        def sound_set_volume(self, volume):
-            """Set the audio level
- at param volume: the volume (normalized in [0..100])
-        """
-            e=MediaControlException()
-            return mediacontrol_sound_set_volume(self, volume, e)
-
-    if hasattr(dll, 'mediacontrol_set_visual'):
-        def set_visual(self, visual_id):
-            """Set the video output window
- at param visual_id: the Xid or HWND, depending on the platform
-        """
-            e=MediaControlException()
-            return mediacontrol_set_visual(self, visual_id, e)
-
-    if hasattr(dll, 'mediacontrol_get_rate'):
-        def get_rate(self):
-            """Get the current playing rate, in percent
- at return: the rate
-        """
-            e=MediaControlException()
-            return mediacontrol_get_rate(self, e)
-
-    if hasattr(dll, 'mediacontrol_set_rate'):
-        def set_rate(self, rate):
-            """Set the playing rate, in percent
- at param rate: the desired rate
-        """
-            e=MediaControlException()
-            return mediacontrol_set_rate(self, rate, e)
-
-    if hasattr(dll, 'mediacontrol_get_fullscreen'):
-        def get_fullscreen(self):
-            """Get current fullscreen status
- at return: the fullscreen status
-        """
-            e=MediaControlException()
-            return mediacontrol_get_fullscreen(self, e)
-
-    if hasattr(dll, 'mediacontrol_set_fullscreen'):
-        def set_fullscreen(self, b_fullscreen):
-            """Set fullscreen status
- at param b_fullscreen: the desired status
-        """
-            e=MediaControlException()
-            return mediacontrol_set_fullscreen(self, b_fullscreen, e)
-
-class MediaDiscoverer(object):
-
-    def __new__(cls, pointer=None):
-        '''Internal method used for instanciating wrappers from ctypes.
-        '''
-        if pointer is None:
-            raise Exception("Internal method. Surely this class cannot be instanciated by itself.")
-        if pointer == 0:
-            return None
-        else:
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(pointer)
-            return o
-
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-    if hasattr(dll, 'libvlc_media_discoverer_release'):
-        def release(self):
-            """Release media discover object. If the reference count reaches 0, then
-the object will be released.
-        """
-            return libvlc_media_discoverer_release(self)
-
-    if hasattr(dll, 'libvlc_media_discoverer_localized_name'):
-        def localized_name(self):
-            """Get media service discover object its localized name.
- at return: localized name
-        """
-            return libvlc_media_discoverer_localized_name(self)
-
-    if hasattr(dll, 'libvlc_media_discoverer_media_list'):
-        def media_list(self):
-            """Get media service discover media list.
- at return: list of media items
-        """
-            return libvlc_media_discoverer_media_list(self)
-
-    if hasattr(dll, 'libvlc_media_discoverer_event_manager'):
-        def event_manager(self):
-            """Get event manager from media service discover object.
- at return: event manager object.
-        """
-            return libvlc_media_discoverer_event_manager(self)
-
-    if hasattr(dll, 'libvlc_media_discoverer_is_running'):
-        def is_running(self):
-            """Query if media service discover object is running.
- at return: true if running, false if not
-        """
-            return libvlc_media_discoverer_is_running(self)
-
-class MediaLibrary(object):
-
-    def __new__(cls, pointer=None):
-        '''Internal method used for instanciating wrappers from ctypes.
-        '''
-        if pointer is None:
-            raise Exception("Internal method. Surely this class cannot be instanciated by itself.")
-        if pointer == 0:
-            return None
-        else:
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(pointer)
-            return o
-
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-    if hasattr(dll, 'libvlc_media_library_release'):
-        def release(self):
-            """Release media library object. This functions decrements the
-reference count of the media library object. If it reaches 0,
-then the object will be released.
-        """
-            return libvlc_media_library_release(self)
-
-    if hasattr(dll, 'libvlc_media_library_retain'):
-        def retain(self):
-            """Retain a reference to a media library object. This function will
-increment the reference counting for this object. Use
-libvlc_media_library_release() to decrement the reference count.
-        """
-            return libvlc_media_library_retain(self)
-
-    if hasattr(dll, 'libvlc_media_library_load'):
-        def load(self):
-            """Load media library.
-        """
-            e=VLCException()
-            return libvlc_media_library_load(self, e)
-
-    if hasattr(dll, 'libvlc_media_library_save'):
-        def save(self):
-            """Save media library.
-        """
-            e=VLCException()
-            return libvlc_media_library_save(self, e)
-
-    if hasattr(dll, 'libvlc_media_library_media_list'):
-        def media_list(self):
-            """Get media library subitems.
- at return: media list subitems
-        """
-            e=VLCException()
-            return libvlc_media_library_media_list(self, e)
-
-class MediaList(object):
-
-    def __new__(cls, pointer=None):
-        '''Internal method used for instanciating wrappers from ctypes.
-        '''
-        if pointer is None:
-            raise Exception("Internal method. Surely this class cannot be instanciated by itself.")
-        if pointer == 0:
-            return None
-        else:
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(pointer)
-            return o
-
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-    if hasattr(dll, 'libvlc_media_list_release'):
-        def release(self):
-            """Release media list created with libvlc_media_list_new().
-        """
-            return libvlc_media_list_release(self)
-
-    if hasattr(dll, 'libvlc_media_list_retain'):
-        def retain(self):
-            """Retain reference to a media list
-        """
-            return libvlc_media_list_retain(self)
-
-    if hasattr(dll, 'libvlc_media_list_set_media'):
-        def set_media(self, p_mi):
-            """Associate media instance with this media list instance.
-If another media instance was present it will be released.
-The libvlc_media_list_lock should NOT be held upon entering this function.
- at param p_mi: media instance to add
-        """
-            e=VLCException()
-            return libvlc_media_list_set_media(self, p_mi, e)
-
-    if hasattr(dll, 'libvlc_media_list_media'):
-        def media(self):
-            """Get media instance from this media list instance. This action will increase
-the refcount on the media instance.
-The libvlc_media_list_lock should NOT be held upon entering this function.
- at return: media instance
-        """
-            e=VLCException()
-            return libvlc_media_list_media(self, e)
-
-    if hasattr(dll, 'libvlc_media_list_add_media'):
-        def add_media(self, p_mi):
-            """Add media instance to media list
-The libvlc_media_list_lock should be held upon entering this function.
- at param p_mi: a media instance
-        """
-            e=VLCException()
-            return libvlc_media_list_add_media(self, p_mi, e)
-
-    if hasattr(dll, 'libvlc_media_list_insert_media'):
-        def insert_media(self, p_mi, i_pos):
-            """Insert media instance in media list on a position
-The libvlc_media_list_lock should be held upon entering this function.
- at param p_mi: a media instance
- at param i_pos: position in array where to insert
-        """
-            e=VLCException()
-            return libvlc_media_list_insert_media(self, p_mi, i_pos, e)
-
-    if hasattr(dll, 'libvlc_media_list_remove_index'):
-        def remove_index(self, i_pos):
-            """Remove media instance from media list on a position
-The libvlc_media_list_lock should be held upon entering this function.
- at param i_pos: position in array where to insert
-        """
-            e=VLCException()
-            return libvlc_media_list_remove_index(self, i_pos, e)
-
-    if hasattr(dll, 'libvlc_media_list_count'):
-        def count(self):
-            """Get count on media list items
-The libvlc_media_list_lock should be held upon entering this function.
- at return: number of items in media list
-        """
-            e=VLCException()
-            return libvlc_media_list_count(self, e)
-
-    def __len__(self):
-        e=VLCException()
-        return libvlc_media_list_count(self, e)
-
-    if hasattr(dll, 'libvlc_media_list_item_at_index'):
-        def item_at_index(self, i_pos):
-            """List media instance in media list at a position
-The libvlc_media_list_lock should be held upon entering this function.
- at param i_pos: position in array where to insert
- at return: media instance at position i_pos and libvlc_media_retain() has been called to increase the refcount on this object.
-        """
-            e=VLCException()
-            return libvlc_media_list_item_at_index(self, i_pos, e)
-
-    def __getitem__(self, i):
-        e=VLCException()
-        return libvlc_media_list_item_at_index(self, i, e)
-
-    def __iter__(self):
-        e=VLCException()
-        for i in xrange(len(self)):
-            yield self[i]
-
-    if hasattr(dll, 'libvlc_media_list_index_of_item'):
-        def index_of_item(self, p_mi):
-            """Find index position of List media instance in media list.
-Warning: the function will return the first matched position.
-The libvlc_media_list_lock should be held upon entering this function.
- at param p_mi: media list instance
- at return: position of media instance
-        """
-            e=VLCException()
-            return libvlc_media_list_index_of_item(self, p_mi, e)
-
-    if hasattr(dll, 'libvlc_media_list_is_readonly'):
-        def is_readonly(self):
-            """This indicates if this media list is read-only from a user point of view
- at return: 0 on readonly, 1 on readwrite
-        """
-            return libvlc_media_list_is_readonly(self)
-
-    if hasattr(dll, 'libvlc_media_list_lock'):
-        def lock(self):
-            """Get lock on media list items
-        """
-            return libvlc_media_list_lock(self)
-
-    if hasattr(dll, 'libvlc_media_list_unlock'):
-        def unlock(self):
-            """Release lock on media list items
-The libvlc_media_list_lock should be held upon entering this function.
-        """
-            return libvlc_media_list_unlock(self)
-
-    if hasattr(dll, 'libvlc_media_list_flat_view'):
-        def flat_view(self):
-            """Get a flat media list view of media list items
- at return: flat media list view instance
-        """
-            e=VLCException()
-            return libvlc_media_list_flat_view(self, e)
-
-    if hasattr(dll, 'libvlc_media_list_hierarchical_view'):
-        def hierarchical_view(self):
-            """Get a hierarchical media list view of media list items
- at return: hierarchical media list view instance
-        """
-            e=VLCException()
-            return libvlc_media_list_hierarchical_view(self, e)
-
-    if hasattr(dll, 'libvlc_media_list_hierarchical_node_view'):
-        def hierarchical_node_view(self):
-            """
-        """
-            e=VLCException()
-            return libvlc_media_list_hierarchical_node_view(self, e)
-
-    if hasattr(dll, 'libvlc_media_list_event_manager'):
-        def event_manager(self):
-            """Get libvlc_event_manager from this media list instance.
-The p_event_manager is immutable, so you don't have to hold the lock
- at return: libvlc_event_manager
-        """
-            e=VLCException()
-            return libvlc_media_list_event_manager(self, e)
-
-class MediaListPlayer(object):
-    """Create a new MediaPlayer instance.
-
-    It may take as parameter either:
-      - a vlc.Instance
-      - nothing
-
-    """
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-
-    def __new__(cls, *p):
-        if p and p[0] == 0:
-            return None
-        elif p and isinstance(p[0], (int, long)):
-            # instance creation from ctypes
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(p[0])
-            return o
-        elif len(p) == 1 and isinstance(p[0], (tuple, list)):
-            p=p[0]
-
-        if p and isinstance(p[0], Instance):
-            return p[0].media_list_player_new()
-        else:
-            i=Instance()
-            o=i.media_list_player_new()
-            return o
-
-    def get_instance(self):
-        """Return the associated vlc.Instance.
-        """
-        return self._instance
-
-
-    if hasattr(dll, 'libvlc_media_list_player_release'):
-        def release(self):
-            """Release media_list_player.
-        """
-            return libvlc_media_list_player_release(self)
-
-    if hasattr(dll, 'libvlc_media_list_player_set_media_player'):
-        def set_media_player(self, p_mi):
-            """Replace media player in media_list_player with this instance.
- at param p_mi: media player instance
-        """
-            e=VLCException()
-            return libvlc_media_list_player_set_media_player(self, p_mi, e)
-
-    if hasattr(dll, 'libvlc_media_list_player_set_media_list'):
-        def set_media_list(self, p_mlist):
-            """
-        """
-            e=VLCException()
-            return libvlc_media_list_player_set_media_list(self, p_mlist, e)
-
-    if hasattr(dll, 'libvlc_media_list_player_play'):
-        def play(self):
-            """Play media list
-        """
-            e=VLCException()
-            return libvlc_media_list_player_play(self, e)
-
-    if hasattr(dll, 'libvlc_media_list_player_pause'):
-        def pause(self):
-            """Pause media list
-        """
-            e=VLCException()
-            return libvlc_media_list_player_pause(self, e)
-
-    if hasattr(dll, 'libvlc_media_list_player_is_playing'):
-        def is_playing(self):
-            """Is media list playing?
- at return: true for playing and false for not playing
-        """
-            e=VLCException()
-            return libvlc_media_list_player_is_playing(self, e)
-
-    if hasattr(dll, 'libvlc_media_list_player_get_state'):
-        def get_state(self):
-            """Get current libvlc_state of media list player
- at return: libvlc_state_t for media list player
-        """
-            e=VLCException()
-            return libvlc_media_list_player_get_state(self, e)
-
-    if hasattr(dll, 'libvlc_media_list_player_play_item_at_index'):
-        def play_item_at_index(self, i_index):
-            """Play media list item at position index
- at param i_index: index in media list to play
-        """
-            e=VLCException()
-            return libvlc_media_list_player_play_item_at_index(self, i_index, e)
-
-    def __getitem__(self, i):
-        e=VLCException()
-        return libvlc_media_list_player_play_item_at_index(self, i, e)
-
-    def __iter__(self):
-        e=VLCException()
-        for i in xrange(len(self)):
-            yield self[i]
-
-    if hasattr(dll, 'libvlc_media_list_player_play_item'):
-        def play_item(self, p_md):
-            """
-        """
-            e=VLCException()
-            return libvlc_media_list_player_play_item(self, p_md, e)
-
-    if hasattr(dll, 'libvlc_media_list_player_stop'):
-        def stop(self):
-            """Stop playing media list
-        """
-            e=VLCException()
-            return libvlc_media_list_player_stop(self, e)
-
-    if hasattr(dll, 'libvlc_media_list_player_next'):
-        def next(self):
-            """Play next item from media list
-        """
-            e=VLCException()
-            return libvlc_media_list_player_next(self, e)
-
-class MediaListView(object):
-
-    def __new__(cls, pointer=None):
-        '''Internal method used for instanciating wrappers from ctypes.
-        '''
-        if pointer is None:
-            raise Exception("Internal method. Surely this class cannot be instanciated by itself.")
-        if pointer == 0:
-            return None
-        else:
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(pointer)
-            return o
-
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-    if hasattr(dll, 'libvlc_media_list_view_retain'):
-        def retain(self):
-            """Retain reference to a media list view
-        """
-            return libvlc_media_list_view_retain(self)
-
-    if hasattr(dll, 'libvlc_media_list_view_release'):
-        def release(self):
-            """Release reference to a media list view. If the refcount reaches 0, then
-the object will be released.
-        """
-            return libvlc_media_list_view_release(self)
-
-    if hasattr(dll, 'libvlc_media_list_view_event_manager'):
-        def event_manager(self):
-            """Get libvlc_event_manager from this media list view instance.
-The p_event_manager is immutable, so you don't have to hold the lock
- at return: libvlc_event_manager
-        """
-            return libvlc_media_list_view_event_manager(self)
-
-    if hasattr(dll, 'libvlc_media_list_view_count'):
-        def count(self):
-            """Get count on media list view items
- at return: number of items in media list view
-        """
-            e=VLCException()
-            return libvlc_media_list_view_count(self, e)
-
-    def __len__(self):
-        e=VLCException()
-        return libvlc_media_list_view_count(self, e)
-
-    if hasattr(dll, 'libvlc_media_list_view_item_at_index'):
-        def item_at_index(self, i_index):
-            """List media instance in media list view at an index position
- at param i_index: index position in array where to insert
- at return: media instance at position i_pos and libvlc_media_retain() has been called to increase the refcount on this object.
-        """
-            e=VLCException()
-            return libvlc_media_list_view_item_at_index(self, i_index, e)
-
-    def __getitem__(self, i):
-        e=VLCException()
-        return libvlc_media_list_view_item_at_index(self, i, e)
-
-    def __iter__(self):
-        e=VLCException()
-        for i in xrange(len(self)):
-            yield self[i]
-
-    if hasattr(dll, 'libvlc_media_list_view_children_at_index'):
-        def children_at_index(self, index):
-            """
-        """
-            e=VLCException()
-            return libvlc_media_list_view_children_at_index(self, index, e)
-
-    if hasattr(dll, 'libvlc_media_list_view_children_for_item'):
-        def children_for_item(self, p_md):
-            """
-        """
-            e=VLCException()
-            return libvlc_media_list_view_children_for_item(self, p_md, e)
-
-    if hasattr(dll, 'libvlc_media_list_view_parent_media_list'):
-        def parent_media_list(self):
-            """
-        """
-            e=VLCException()
-            return libvlc_media_list_view_parent_media_list(self, e)
-
-class MediaPlayer(object):
-    """Create a new MediaPlayer instance.
-
-    It may take as parameter either:
-      - a string (media URI). In this case, a vlc.Instance will be created.
-      - a vlc.Instance
-
-    """
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-
-    def __new__(cls, *p):
-        if p and p[0] == 0:
-            return None
-        elif p and isinstance(p[0], (int, long)):
-            # instance creation from ctypes
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(p[0])
-            return o
-
-        if p and isinstance(p[0], Instance):
-            return p[0].media_player_new()
-        else:
-            i=Instance()
-            o=i.media_player_new()
-            if p:
-                o.set_media(i.media_new(p[0]))
-            return o
-
-    def get_instance(self):
-        """Return the associated vlc.Instance.
-        """
-        return self._instance
-
-
-    if hasattr(dll, 'libvlc_media_player_release'):
-        def release(self):
-            """Release a media_player after use
-Decrement the reference count of a media player object. If the
-reference count is 0, then libvlc_media_player_release() will
-release the media player object. If the media player object
-has been released, then it should not be used again.
-        """
-            return libvlc_media_player_release(self)
-
-    if hasattr(dll, 'libvlc_media_player_retain'):
-        def retain(self):
-            """Retain a reference to a media player object. Use
-libvlc_media_player_release() to decrement reference count.
-        """
-            return libvlc_media_player_retain(self)
-
-    if hasattr(dll, 'libvlc_media_player_set_media'):
-        def set_media(self, p_md):
-            """Set the media that will be used by the media_player. If any,
-previous md will be released.
- at param p_md: the Media. Afterwards the p_md can be safely
-        """
-            e=VLCException()
-            return libvlc_media_player_set_media(self, p_md, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_media'):
-        def get_media(self):
-            """Get the media used by the media_player.
- at return: the media associated with p_mi, or NULL if no
-        """
-            e=VLCException()
-            return libvlc_media_player_get_media(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_event_manager'):
-        def event_manager(self):
-            """Get the Event Manager from which the media player send event.
- at return: the event manager associated with p_mi
-        """
-            e=VLCException()
-            return libvlc_media_player_event_manager(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_is_playing'):
-        def is_playing(self):
-            """is_playing
- at return: 1 if the media player is playing, 0 otherwise
-        """
-            e=VLCException()
-            return libvlc_media_player_is_playing(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_play'):
-        def play(self):
-            """Play
-        """
-            e=VLCException()
-            return libvlc_media_player_play(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_pause'):
-        def pause(self):
-            """Pause
-        """
-            e=VLCException()
-            return libvlc_media_player_pause(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_stop'):
-        def stop(self):
-            """Stop
-        """
-            e=VLCException()
-            return libvlc_media_player_stop(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_set_nsobject'):
-        def set_nsobject(self, drawable):
-            """Set the agl handler where the media player should render its video output.
- at param drawable: the agl handler
-        """
-            e=VLCException()
-            return libvlc_media_player_set_nsobject(self, drawable, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_nsobject'):
-        def get_nsobject(self):
-            """Get the agl handler previously set with libvlc_media_player_set_agl().
- at return: the agl handler or 0 if none where set
-        """
-            return libvlc_media_player_get_nsobject(self)
-
-    if hasattr(dll, 'libvlc_media_player_set_agl'):
-        def set_agl(self, drawable):
-            """Set the agl handler where the media player should render its video output.
- at param drawable: the agl handler
-        """
-            e=VLCException()
-            return libvlc_media_player_set_agl(self, drawable, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_agl'):
-        def get_agl(self):
-            """Get the agl handler previously set with libvlc_media_player_set_agl().
- at return: the agl handler or 0 if none where set
-        """
-            return libvlc_media_player_get_agl(self)
-
-    if hasattr(dll, 'libvlc_media_player_set_xwindow'):
-        def set_xwindow(self, drawable):
-            """Set an X Window System drawable where the media player should render its
-video output. If LibVLC was built without X11 output support, then this has
-no effects.
-The specified identifier must correspond to an existing Input/Output class
-X11 window. Pixmaps are <b>not</b> supported. The caller shall ensure that
-the X11 server is the same as the one the VLC instance has been configured
-with.
-If XVideo is <b>not</b> used, it is assumed that the drawable has the
-following properties in common with the default X11 screen: depth, scan line
-pad, black pixel. This is a bug.
- at param drawable: the ID of the X window
-        """
-            e=VLCException()
-            return libvlc_media_player_set_xwindow(self, drawable, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_xwindow'):
-        def get_xwindow(self):
-            """Get the X Window System window identifier previously set with
-libvlc_media_player_set_xwindow(). Note that this will return the identifier
-even if VLC is not currently using it (for instance if it is playing an
-audio-only input).
- at return: an X window ID, or 0 if none where set.
-        """
-            return libvlc_media_player_get_xwindow(self)
-
-    if hasattr(dll, 'libvlc_media_player_set_hwnd'):
-        def set_hwnd(self, drawable):
-            """Set a Win32/Win64 API window handle (HWND) where the media player should
-render its video output. If LibVLC was built without Win32/Win64 API output
-support, then this has no effects.
- at param drawable: windows handle of the drawable
-        """
-            e=VLCException()
-            return libvlc_media_player_set_hwnd(self, drawable, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_hwnd'):
-        def get_hwnd(self):
-            """Get the Windows API window handle (HWND) previously set with
-libvlc_media_player_set_hwnd(). The handle will be returned even if LibVLC
-is not currently outputting any video to it.
- at return: a window handle or NULL if there are none.
-        """
-            return libvlc_media_player_get_hwnd(self)
-
-    if hasattr(dll, 'libvlc_media_player_get_length'):
-        def get_length(self):
-            """Get the current movie length (in ms).
- at return: the movie length (in ms).
-        """
-            e=VLCException()
-            return libvlc_media_player_get_length(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_time'):
-        def get_time(self):
-            """Get the current movie time (in ms).
- at return: the movie time (in ms).
-        """
-            e=VLCException()
-            return libvlc_media_player_get_time(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_set_time'):
-        def set_time(self, the):
-            """Set the movie time (in ms).
- at param the: movie time (in ms).
-        """
-            e=VLCException()
-            return libvlc_media_player_set_time(self, the, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_position'):
-        def get_position(self):
-            """Get movie position.
- at return: movie position
-        """
-            e=VLCException()
-            return libvlc_media_player_get_position(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_set_position'):
-        def set_position(self, f_pos):
-            """Set movie position.
- at param f_pos: the position
-        """
-            e=VLCException()
-            return libvlc_media_player_set_position(self, f_pos, e)
-
-    if hasattr(dll, 'libvlc_media_player_set_chapter'):
-        def set_chapter(self, i_chapter):
-            """Set movie chapter
- at param i_chapter: chapter number to play
-        """
-            e=VLCException()
-            return libvlc_media_player_set_chapter(self, i_chapter, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_chapter'):
-        def get_chapter(self):
-            """Get movie chapter
- at return: chapter number currently playing
-        """
-            e=VLCException()
-            return libvlc_media_player_get_chapter(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_chapter_count'):
-        def get_chapter_count(self):
-            """Get movie chapter count
- at return: number of chapters in movie
-        """
-            e=VLCException()
-            return libvlc_media_player_get_chapter_count(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_will_play'):
-        def will_play(self):
-            """Will the player play
- at return: boolean
-        """
-            e=VLCException()
-            return libvlc_media_player_will_play(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_chapter_count_for_title'):
-        def get_chapter_count_for_title(self, i_title):
-            """Get title chapter count
- at param i_title: title
- at return: number of chapters in title
-        """
-            e=VLCException()
-            return libvlc_media_player_get_chapter_count_for_title(self, i_title, e)
-
-    if hasattr(dll, 'libvlc_media_player_set_title'):
-        def set_title(self, i_title):
-            """Set movie title
- at param i_title: title number to play
-        """
-            e=VLCException()
-            return libvlc_media_player_set_title(self, i_title, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_title'):
-        def get_title(self):
-            """Get movie title
- at return: title number currently playing
-        """
-            e=VLCException()
-            return libvlc_media_player_get_title(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_title_count'):
-        def get_title_count(self):
-            """Get movie title count
- at return: title number count
-        """
-            e=VLCException()
-            return libvlc_media_player_get_title_count(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_previous_chapter'):
-        def previous_chapter(self):
-            """Set previous chapter
-        """
-            e=VLCException()
-            return libvlc_media_player_previous_chapter(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_next_chapter'):
-        def next_chapter(self):
-            """Set next chapter
-        """
-            e=VLCException()
-            return libvlc_media_player_next_chapter(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_rate'):
-        def get_rate(self):
-            """Get movie play rate
- at return: movie play rate
-        """
-            e=VLCException()
-            return libvlc_media_player_get_rate(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_set_rate'):
-        def set_rate(self, movie):
-            """Set movie play rate
- at param movie: play rate to set
-        """
-            e=VLCException()
-            return libvlc_media_player_set_rate(self, movie, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_state'):
-        def get_state(self):
-            """Get current movie state
- at return: current movie state as libvlc_state_t
-        """
-            e=VLCException()
-            return libvlc_media_player_get_state(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_get_fps'):
-        def get_fps(self):
-            """Get movie fps rate
- at return: frames per second (fps) for this playing movie
-        """
-            e=VLCException()
-            return libvlc_media_player_get_fps(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_has_vout'):
-        def has_vout(self):
-            """Does this media player have a video output?
-        """
-            e=VLCException()
-            return libvlc_media_player_has_vout(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_is_seekable'):
-        def is_seekable(self):
-            """Is this media player seekable?
-        """
-            e=VLCException()
-            return libvlc_media_player_is_seekable(self, e)
-
-    if hasattr(dll, 'libvlc_media_player_can_pause'):
-        def can_pause(self):
-            """Can this media player be paused?
-        """
-            e=VLCException()
-            return libvlc_media_player_can_pause(self, e)
-
-    if hasattr(dll, 'libvlc_toggle_fullscreen'):
-        def toggle_fullscreen(self):
-            """Toggle fullscreen status on video output.
-        """
-            e=VLCException()
-            return libvlc_toggle_fullscreen(self, e)
-
-    if hasattr(dll, 'libvlc_set_fullscreen'):
-        def set_fullscreen(self, b_fullscreen):
-            """Enable or disable fullscreen on a video output.
- at param b_fullscreen: boolean for fullscreen status
-        """
-            e=VLCException()
-            return libvlc_set_fullscreen(self, b_fullscreen, e)
-
-    if hasattr(dll, 'libvlc_get_fullscreen'):
-        def get_fullscreen(self):
-            """Get current fullscreen status.
- at return: the fullscreen status (boolean)
-        """
-            e=VLCException()
-            return libvlc_get_fullscreen(self, e)
-
-    if hasattr(dll, 'libvlc_video_get_height'):
-        def video_get_height(self):
-            """Get current video height.
- at return: the video height
-        """
-            e=VLCException()
-            return libvlc_video_get_height(self, e)
-
-    if hasattr(dll, 'libvlc_video_get_width'):
-        def video_get_width(self):
-            """Get current video width.
- at return: the video width
-        """
-            e=VLCException()
-            return libvlc_video_get_width(self, e)
-
-    if hasattr(dll, 'libvlc_video_get_scale'):
-        def video_get_scale(self):
-            """Get the current video scaling factor.
-See also libvlc_video_set_scale().
- at return: the currently configured zoom factor, or 0. if the video is set
-        """
-            e=VLCException()
-            return libvlc_video_get_scale(self, e)
-
-    if hasattr(dll, 'libvlc_video_set_scale'):
-        def video_set_scale(self, i_factor):
-            """Set the video scaling factor. That is the ratio of the number of pixels on
-screen to the number of pixels in the original decoded video in each
-dimension. Zero is a special value; it will adjust the video to the output
-window/drawable (in windowed mode) or the entire screen.
-Note that not all video outputs support scaling.
- at param i_factor: the scaling factor, or zero
-        """
-            e=VLCException()
-            return libvlc_video_set_scale(self, i_factor, e)
-
-    if hasattr(dll, 'libvlc_video_get_aspect_ratio'):
-        def video_get_aspect_ratio(self):
-            """Get current video aspect ratio.
- at return: the video aspect ratio
-        """
-            e=VLCException()
-            return libvlc_video_get_aspect_ratio(self, e)
-
-    if hasattr(dll, 'libvlc_video_set_aspect_ratio'):
-        def video_set_aspect_ratio(self, psz_aspect):
-            """Set new video aspect ratio.
- at param psz_aspect: new video aspect-ratio
-        """
-            e=VLCException()
-            return libvlc_video_set_aspect_ratio(self, psz_aspect, e)
-
-    if hasattr(dll, 'libvlc_video_get_spu'):
-        def video_get_spu(self):
-            """Get current video subtitle.
- at return: the video subtitle selected
-        """
-            e=VLCException()
-            return libvlc_video_get_spu(self, e)
-
-    if hasattr(dll, 'libvlc_video_get_spu_count'):
-        def video_get_spu_count(self):
-            """Get the number of available video subtitles.
- at return: the number of available video subtitles
-        """
-            e=VLCException()
-            return libvlc_video_get_spu_count(self, e)
-
-    if hasattr(dll, 'libvlc_video_get_spu_description'):
-        def video_get_spu_description(self):
-            """Get the description of available video subtitles.
- at return: list containing description of available video subtitles
-        """
-            e=VLCException()
-            return libvlc_video_get_spu_description(self, e)
-
-    if hasattr(dll, 'libvlc_video_set_spu'):
-        def video_set_spu(self, i_spu):
-            """Set new video subtitle.
- at param i_spu: new video subtitle to select
-        """
-            e=VLCException()
-            return libvlc_video_set_spu(self, i_spu, e)
-
-    if hasattr(dll, 'libvlc_video_set_subtitle_file'):
-        def video_set_subtitle_file(self, psz_subtitle):
-            """Set new video subtitle file.
- at param psz_subtitle: new video subtitle file
- at return: the success status (boolean)
-        """
-            e=VLCException()
-            return libvlc_video_set_subtitle_file(self, psz_subtitle, e)
-
-    if hasattr(dll, 'libvlc_video_get_title_description'):
-        def video_get_title_description(self):
-            """Get the description of available titles.
- at return: list containing description of available titles
-        """
-            e=VLCException()
-            return libvlc_video_get_title_description(self, e)
-
-    if hasattr(dll, 'libvlc_video_get_chapter_description'):
-        def video_get_chapter_description(self, i_title):
-            """Get the description of available chapters for specific title.
- at param i_title: selected title
- at return: list containing description of available chapter for title i_title
-        """
-            e=VLCException()
-            return libvlc_video_get_chapter_description(self, i_title, e)
-
-    if hasattr(dll, 'libvlc_video_get_crop_geometry'):
-        def video_get_crop_geometry(self):
-            """Get current crop filter geometry.
- at return: the crop filter geometry
-        """
-            e=VLCException()
-            return libvlc_video_get_crop_geometry(self, e)
-
-    if hasattr(dll, 'libvlc_video_set_crop_geometry'):
-        def video_set_crop_geometry(self, psz_geometry):
-            """Set new crop filter geometry.
- at param psz_geometry: new crop filter geometry
-        """
-            e=VLCException()
-            return libvlc_video_set_crop_geometry(self, psz_geometry, e)
-
-    if hasattr(dll, 'libvlc_toggle_teletext'):
-        def toggle_teletext(self):
-            """Toggle teletext transparent status on video output.
-        """
-            e=VLCException()
-            return libvlc_toggle_teletext(self, e)
-
-    if hasattr(dll, 'libvlc_video_get_teletext'):
-        def video_get_teletext(self):
-            """Get current teletext page requested.
- at return: the current teletext page requested.
-        """
-            e=VLCException()
-            return libvlc_video_get_teletext(self, e)
-
-    if hasattr(dll, 'libvlc_video_set_teletext'):
-        def video_set_teletext(self, i_page):
-            """Set new teletext page to retrieve.
- at param i_page: teletex page number requested
-        """
-            e=VLCException()
-            return libvlc_video_set_teletext(self, i_page, e)
-
-    if hasattr(dll, 'libvlc_video_get_track_count'):
-        def video_get_track_count(self):
-            """Get number of available video tracks.
- at return: the number of available video tracks (int)
-        """
-            e=VLCException()
-            return libvlc_video_get_track_count(self, e)
-
-    if hasattr(dll, 'libvlc_video_get_track_description'):
-        def video_get_track_description(self):
-            """Get the description of available video tracks.
- at return: list with description of available video tracks
-        """
-            e=VLCException()
-            return libvlc_video_get_track_description(self, e)
-
-    if hasattr(dll, 'libvlc_video_get_track'):
-        def video_get_track(self):
-            """Get current video track.
- at return: the video track (int)
-        """
-            e=VLCException()
-            return libvlc_video_get_track(self, e)
-
-    if hasattr(dll, 'libvlc_video_set_track'):
-        def video_set_track(self, i_track):
-            """Set video track.
- at param i_track: the track (int)
-        """
-            e=VLCException()
-            return libvlc_video_set_track(self, i_track, e)
-
-    if hasattr(dll, 'libvlc_video_take_snapshot'):
-        def video_take_snapshot(self, psz_filepath, i_width, i_height):
-            """Take a snapshot of the current video window.
-If i_width AND i_height is 0, original size is used.
-If i_width XOR i_height is 0, original aspect-ratio is preserved.
- at param psz_filepath: the path where to save the screenshot to
- at param i_width: the snapshot's width
- at param i_height: the snapshot's height
-        """
-            e=VLCException()
-            return libvlc_video_take_snapshot(self, psz_filepath, i_width, i_height, e)
-
-    if hasattr(dll, 'libvlc_audio_get_track_count'):
-        def audio_get_track_count(self):
-            """Get number of available audio tracks.
- at return: the number of available audio tracks (int)
-        """
-            e=VLCException()
-            return libvlc_audio_get_track_count(self, e)
-
-    if hasattr(dll, 'libvlc_audio_get_track_description'):
-        def audio_get_track_description(self):
-            """Get the description of available audio tracks.
- at return: list with description of available audio tracks
-        """
-            e=VLCException()
-            return libvlc_audio_get_track_description(self, e)
-
-    if hasattr(dll, 'libvlc_audio_get_track'):
-        def audio_get_track(self):
-            """Get current audio track.
- at return: the audio track (int)
-        """
-            e=VLCException()
-            return libvlc_audio_get_track(self, e)
-
-    if hasattr(dll, 'libvlc_audio_set_track'):
-        def audio_set_track(self, i_track):
-            """Set current audio track.
- at param i_track: the track (int)
-        """
-            e=VLCException()
-            return libvlc_audio_set_track(self, i_track, e)
-
-class TrackDescription(object):
-
-    def __new__(cls, pointer=None):
-        '''Internal method used for instanciating wrappers from ctypes.
-        '''
-        if pointer is None:
-            raise Exception("Internal method. Surely this class cannot be instanciated by itself.")
-        if pointer == 0:
-            return None
-        else:
-            o=object.__new__(cls)
-            o._as_parameter_=ctypes.c_void_p(pointer)
-            return o
-
-
-    @staticmethod
-    def from_param(arg):
-        '''(INTERNAL) ctypes parameter conversion method.
-        '''
-        return arg._as_parameter_
-
-    if hasattr(dll, 'libvlc_track_description_release'):
-        def release(self):
-            """Release (free) libvlc_track_description_t
-        """
-            return libvlc_track_description_release(self)
-
-if hasattr(dll, 'libvlc_exception_init'):
-    prototype=ctypes.CFUNCTYPE(None, ctypes.POINTER(VLCException))
-    paramflags=( (3, ), )
-    libvlc_exception_init = prototype( ("libvlc_exception_init", dll), paramflags )
-    libvlc_exception_init.errcheck = check_vlc_exception
-    libvlc_exception_init.__doc__ = """Initialize an exception structure. This can be called several times to
-reuse an exception structure.
- at param p_exception the exception to initialize
-"""
-
-if hasattr(dll, 'libvlc_exception_clear'):
-    prototype=ctypes.CFUNCTYPE(None, ctypes.POINTER(VLCException))
-    paramflags=( (3, ), )
-    libvlc_exception_clear = prototype( ("libvlc_exception_clear", dll), paramflags )
-    libvlc_exception_clear.errcheck = check_vlc_exception
-    libvlc_exception_clear.__doc__ = """Clear an exception object so it can be reused.
-The exception object must have be initialized.
- at param p_exception the exception to clear
-"""
-
-if hasattr(dll, 'libvlc_new'):
-    prototype=ctypes.CFUNCTYPE(Instance, ctypes.c_int, ListPOINTER(ctypes.c_char_p), ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_new = prototype( ("libvlc_new", dll), paramflags )
-    libvlc_new.errcheck = check_vlc_exception
-    libvlc_new.__doc__ = """Create and initialize a libvlc instance.
- at param argc the number of arguments
- at param argv command-line-type arguments. argv[0] must be the path of the
-       calling program.
- at param p_e an initialized exception pointer
- at return the libvlc instance
-"""
-
-if hasattr(dll, 'libvlc_get_vlc_id'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance)
-    paramflags=( (1, ), )
-    libvlc_get_vlc_id = prototype( ("libvlc_get_vlc_id", dll), paramflags )
-    libvlc_get_vlc_id.__doc__ = """Return a libvlc instance identifier for legacy APIs. Use of this
-function is discouraged, you should convert your program to use the
-new API.
- at param p_instance the instance
- at return the instance identifier
-"""
-
-if hasattr(dll, 'libvlc_release'):
-    prototype=ctypes.CFUNCTYPE(None, Instance)
-    paramflags=( (1, ), )
-    libvlc_release = prototype( ("libvlc_release", dll), paramflags )
-    libvlc_release.__doc__ = """Decrement the reference count of a libvlc instance, and destroy it
-if it reaches zero.
- at param p_instance the instance to destroy
-"""
-
-if hasattr(dll, 'libvlc_retain'):
-    prototype=ctypes.CFUNCTYPE(None, Instance)
-    paramflags=( (1, ), )
-    libvlc_retain = prototype( ("libvlc_retain", dll), paramflags )
-    libvlc_retain.__doc__ = """Increments the reference count of a libvlc instance.
-The initial reference count is 1 after libvlc_new() returns.
- at param p_instance the instance to reference
-"""
-
-if hasattr(dll, 'libvlc_add_intf'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_add_intf = prototype( ("libvlc_add_intf", dll), paramflags )
-    libvlc_add_intf.errcheck = check_vlc_exception
-    libvlc_add_intf.__doc__ = """Try to start a user interface for the libvlc instance.
- at param p_instance the instance
- at param name interface name, or NULL for default
- at param p_exception an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_wait'):
-    prototype=ctypes.CFUNCTYPE(None, Instance)
-    paramflags=( (1, ), )
-    libvlc_wait = prototype( ("libvlc_wait", dll), paramflags )
-    libvlc_wait.__doc__ = """Waits until an interface causes the instance to exit.
-You should start at least one interface first, using libvlc_add_intf().
- at param p_instance the instance
-"""
-
-if hasattr(dll, 'libvlc_get_version'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p)
-    paramflags= tuple()
-    libvlc_get_version = prototype( ("libvlc_get_version", dll), paramflags )
-    libvlc_get_version.__doc__ = """Retrieve libvlc version.
-Example: "0.9.0-git Grishenko"
- at return a string containing the libvlc version
-"""
-
-if hasattr(dll, 'libvlc_get_compiler'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p)
-    paramflags= tuple()
-    libvlc_get_compiler = prototype( ("libvlc_get_compiler", dll), paramflags )
-    libvlc_get_compiler.__doc__ = """Retrieve libvlc compiler version.
-Example: "gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu6)"
- at return a string containing the libvlc compiler version
-"""
-
-if hasattr(dll, 'libvlc_get_changeset'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p)
-    paramflags= tuple()
-    libvlc_get_changeset = prototype( ("libvlc_get_changeset", dll), paramflags )
-    libvlc_get_changeset.__doc__ = """Retrieve libvlc changeset.
-Example: "aa9bce0bc4"
- at return a string containing the libvlc changeset
-"""
-
-if hasattr(dll, 'libvlc_free'):
-    prototype=ctypes.CFUNCTYPE(None, ctypes.c_void_p)
-    paramflags=( (1, ), )
-    libvlc_free = prototype( ("libvlc_free", dll), paramflags )
-    libvlc_free.__doc__ = """Frees an heap allocation (char *) returned by a LibVLC API.
-If you know you're using the same underlying C run-time as the LibVLC
-implementation, then you can call ANSI C free() directly instead.
-"""
-
-if hasattr(dll, 'libvlc_event_attach'):
-    prototype=ctypes.CFUNCTYPE(None, EventManager, EventType, ctypes.c_void_p, ctypes.c_void_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (1,), (3,)
-    libvlc_event_attach = prototype( ("libvlc_event_attach", dll), paramflags )
-    libvlc_event_attach.errcheck = check_vlc_exception
-    libvlc_event_attach.__doc__ = """Register for an event notification.
- at param p_event_manager the event manager to which you want to attach to.
-       Generally it is obtained by vlc_my_object_event_manager() where
-       my_object is the object you want to listen to.
- at param i_event_type the desired event to which we want to listen
- at param f_callback the function to call when i_event_type occurs
- at param user_data user provided data to carry with the event
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_event_detach'):
-    prototype=ctypes.CFUNCTYPE(None, EventManager, EventType, ctypes.c_void_p, ctypes.c_void_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (1,), (3,)
-    libvlc_event_detach = prototype( ("libvlc_event_detach", dll), paramflags )
-    libvlc_event_detach.errcheck = check_vlc_exception
-    libvlc_event_detach.__doc__ = """Unregister an event notification.
- at param p_event_manager the event manager
- at param i_event_type the desired event to which we want to unregister
- at param f_callback the function to call when i_event_type occurs
- at param p_user_data user provided data to carry with the event
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_event_type_name'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p, EventType)
-    paramflags=( (1, ), )
-    libvlc_event_type_name = prototype( ("libvlc_event_type_name", dll), paramflags )
-    libvlc_event_type_name.__doc__ = """Get an event's type name.
- at param i_event_type the desired event
-"""
-
-if hasattr(dll, 'libvlc_get_log_verbosity'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_uint, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_get_log_verbosity = prototype( ("libvlc_get_log_verbosity", dll), paramflags )
-    libvlc_get_log_verbosity.errcheck = check_vlc_exception
-    libvlc_get_log_verbosity.__doc__ = """Return the VLC messaging verbosity level.
- at param p_instance libvlc instance
- at param p_e an initialized exception pointer
- at return verbosity level for messages
-"""
-
-if hasattr(dll, 'libvlc_set_log_verbosity'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_uint, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_set_log_verbosity = prototype( ("libvlc_set_log_verbosity", dll), paramflags )
-    libvlc_set_log_verbosity.errcheck = check_vlc_exception
-    libvlc_set_log_verbosity.__doc__ = """Set the VLC messaging verbosity level.
- at param p_instance libvlc log instance
- at param level log level
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_log_open'):
-    prototype=ctypes.CFUNCTYPE(Log, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_log_open = prototype( ("libvlc_log_open", dll), paramflags )
-    libvlc_log_open.errcheck = check_vlc_exception
-    libvlc_log_open.__doc__ = """Open a VLC message log instance.
- at param p_instance libvlc instance
- at param p_e an initialized exception pointer
- at return log message instance
-"""
-
-if hasattr(dll, 'libvlc_log_close'):
-    prototype=ctypes.CFUNCTYPE(None, Log, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_log_close = prototype( ("libvlc_log_close", dll), paramflags )
-    libvlc_log_close.errcheck = check_vlc_exception
-    libvlc_log_close.__doc__ = """Close a VLC message log instance.
- at param p_log libvlc log instance
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_log_count'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_uint, Log, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_log_count = prototype( ("libvlc_log_count", dll), paramflags )
-    libvlc_log_count.errcheck = check_vlc_exception
-    libvlc_log_count.__doc__ = """Returns the number of messages in a log instance.
- at param p_log libvlc log instance
- at param p_e an initialized exception pointer
- at return number of log messages
-"""
-
-if hasattr(dll, 'libvlc_log_clear'):
-    prototype=ctypes.CFUNCTYPE(None, Log, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_log_clear = prototype( ("libvlc_log_clear", dll), paramflags )
-    libvlc_log_clear.errcheck = check_vlc_exception
-    libvlc_log_clear.__doc__ = """Clear a log instance.
-All messages in the log are removed. The log should be cleared on a
-regular basis to avoid clogging.
- at param p_log libvlc log instance
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_log_get_iterator'):
-    prototype=ctypes.CFUNCTYPE(LogIterator, Log, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_log_get_iterator = prototype( ("libvlc_log_get_iterator", dll), paramflags )
-    libvlc_log_get_iterator.errcheck = check_vlc_exception
-    libvlc_log_get_iterator.__doc__ = """Allocate and returns a new iterator to messages in log.
- at param p_log libvlc log instance
- at param p_e an initialized exception pointer
- at return log iterator object
-"""
-
-if hasattr(dll, 'libvlc_log_iterator_free'):
-    prototype=ctypes.CFUNCTYPE(None, LogIterator, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_log_iterator_free = prototype( ("libvlc_log_iterator_free", dll), paramflags )
-    libvlc_log_iterator_free.errcheck = check_vlc_exception
-    libvlc_log_iterator_free.__doc__ = """Release a previoulsy allocated iterator.
- at param p_iter libvlc log iterator
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_log_iterator_has_next'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, LogIterator, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_log_iterator_has_next = prototype( ("libvlc_log_iterator_has_next", dll), paramflags )
-    libvlc_log_iterator_has_next.errcheck = check_vlc_exception
-    libvlc_log_iterator_has_next.__doc__ = """Return whether log iterator has more messages.
- at param p_iter libvlc log iterator
- at param p_e an initialized exception pointer
- at return true if iterator has more message objects, else false
-"""
-
-if hasattr(dll, 'libvlc_log_iterator_next'):
-    prototype=ctypes.CFUNCTYPE(ctypes.POINTER(LogMessage), LogIterator, ctypes.POINTER(LogMessage), ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_log_iterator_next = prototype( ("libvlc_log_iterator_next", dll), paramflags )
-    libvlc_log_iterator_next.errcheck = check_vlc_exception
-    libvlc_log_iterator_next.__doc__ = """Return the next log message.
-The message contents must not be freed
- at param p_iter libvlc log iterator
- at param p_buffer log buffer
- at param p_e an initialized exception pointer
- at return log message object
-"""
-
-if hasattr(dll, 'libvlc_media_new'):
-    prototype=ctypes.CFUNCTYPE(Media, Instance, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_new = prototype( ("libvlc_media_new", dll), paramflags )
-    libvlc_media_new.errcheck = check_vlc_exception
-    libvlc_media_new.__doc__ = """Create a media with the given MRL.
- at param p_instance the instance
- at param psz_mrl the MRL to read
- at param p_e an initialized exception pointer
- at return the newly created media
-"""
-
-if hasattr(dll, 'libvlc_media_new_as_node'):
-    prototype=ctypes.CFUNCTYPE(Media, Instance, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_new_as_node = prototype( ("libvlc_media_new_as_node", dll), paramflags )
-    libvlc_media_new_as_node.errcheck = check_vlc_exception
-    libvlc_media_new_as_node.__doc__ = """Create a media as an empty node with the passed name.
- at param p_instance the instance
- at param psz_name the name of the node
- at param p_e an initialized exception pointer
- at return the new empty media
-"""
-
-if hasattr(dll, 'libvlc_media_add_option'):
-    prototype=ctypes.CFUNCTYPE(None, Media, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_add_option = prototype( ("libvlc_media_add_option", dll), paramflags )
-    libvlc_media_add_option.errcheck = check_vlc_exception
-    libvlc_media_add_option.__doc__ = """Add an option to the media.
-This option will be used to determine how the media_player will
-read the media. This allows to use VLC's advanced
-reading/streaming options on a per-media basis.
-The options are detailed in vlc --long-help, for instance "--sout-all"
- at param p_instance the instance
- at param ppsz_options the options (as a string)
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_add_option_untrusted'):
-    prototype=ctypes.CFUNCTYPE(None, Media, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_add_option_untrusted = prototype( ("libvlc_media_add_option_untrusted", dll), paramflags )
-    libvlc_media_add_option_untrusted.errcheck = check_vlc_exception
-    libvlc_media_add_option_untrusted.__doc__ = """Add an option to the media from an untrusted source.
-This option will be used to determine how the media_player will
-read the media. This allows to use VLC's advanced
-reading/streaming options on a per-media basis.
-The options are detailed in vlc --long-help, for instance "--sout-all"
- at param p_instance the instance
- at param ppsz_options the options (as a string)
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_retain'):
-    prototype=ctypes.CFUNCTYPE(None, Media)
-    paramflags=( (1, ), )
-    libvlc_media_retain = prototype( ("libvlc_media_retain", dll), paramflags )
-    libvlc_media_retain.__doc__ = """Retain a reference to a media descriptor object (libvlc_media_t). Use
-libvlc_media_release() to decrement the reference count of a
-media descriptor object.
- at param p_meta_desc a media descriptor object.
-"""
-
-if hasattr(dll, 'libvlc_media_release'):
-    prototype=ctypes.CFUNCTYPE(None, Media)
-    paramflags=( (1, ), )
-    libvlc_media_release = prototype( ("libvlc_media_release", dll), paramflags )
-    libvlc_media_release.__doc__ = """Decrement the reference count of a media descriptor object. If the
-reference count is 0, then libvlc_media_release() will release the
-media descriptor object. It will send out an libvlc_MediaFreed event
-to all listeners. If the media descriptor object has been released it
-should not be used again.
- at param p_meta_desc a media descriptor object.
-"""
-
-if hasattr(dll, 'libvlc_media_get_mrl'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_get_mrl = prototype( ("libvlc_media_get_mrl", dll), paramflags )
-    libvlc_media_get_mrl.errcheck = check_vlc_exception
-    libvlc_media_get_mrl.__doc__ = """Get the media resource locator (mrl) from a media descriptor object
- at param p_md a media descriptor object
- at param p_e an initialized exception object
- at return string with mrl of media descriptor object
-"""
-
-if hasattr(dll, 'libvlc_media_duplicate'):
-    prototype=ctypes.CFUNCTYPE(Media, Media)
-    paramflags=( (1, ), )
-    libvlc_media_duplicate = prototype( ("libvlc_media_duplicate", dll), paramflags )
-    libvlc_media_duplicate.__doc__ = """Duplicate a media descriptor object.
- at param p_meta_desc a media descriptor object.
-"""
-
-if hasattr(dll, 'libvlc_media_get_meta'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p, Media, Meta, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_get_meta = prototype( ("libvlc_media_get_meta", dll), paramflags )
-    libvlc_media_get_meta.errcheck = check_vlc_exception
-    libvlc_media_get_meta.__doc__ = """Read the meta of the media.
- at param p_meta_desc the media to read
- at param e_meta the meta to read
- at param p_e an initialized exception pointer
- at return the media's meta
-"""
-
-if hasattr(dll, 'libvlc_media_get_state'):
-    prototype=ctypes.CFUNCTYPE(State, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_get_state = prototype( ("libvlc_media_get_state", dll), paramflags )
-    libvlc_media_get_state.errcheck = check_vlc_exception
-    libvlc_media_get_state.__doc__ = """Get current state of media descriptor object. Possible media states
-are defined in libvlc_structures.c ( libvlc_NothingSpecial=0,
-libvlc_Opening, libvlc_Buffering, libvlc_Playing, libvlc_Paused,
-libvlc_Stopped, libvlc_Ended,
-libvlc_Error).
- at see libvlc_state_t
- at param p_meta_desc a media descriptor object
- at param p_e an initialized exception object
- at return state of media descriptor object
-"""
-
-if hasattr(dll, 'libvlc_media_subitems'):
-    prototype=ctypes.CFUNCTYPE(MediaList, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_subitems = prototype( ("libvlc_media_subitems", dll), paramflags )
-    libvlc_media_subitems.errcheck = check_vlc_exception
-    libvlc_media_subitems.__doc__ = """Get subitems of media descriptor object. This will increment
-the reference count of supplied media descriptor object. Use
-libvlc_media_list_release() to decrement the reference counting.
- at param p_md media descriptor object
- at param p_e initalized exception object
- at return list of media descriptor subitems or NULL
-and this is here for convenience */
-"""
-
-if hasattr(dll, 'libvlc_media_event_manager'):
-    prototype=ctypes.CFUNCTYPE(EventManager, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_event_manager = prototype( ("libvlc_media_event_manager", dll), paramflags )
-    libvlc_media_event_manager.errcheck = check_vlc_exception
-    libvlc_media_event_manager.__doc__ = """Get event manager from media descriptor object.
-NOTE: this function doesn't increment reference counting.
- at param p_md a media descriptor object
- at param p_e an initialized exception object
- at return event manager object
-"""
-
-if hasattr(dll, 'libvlc_media_get_duration'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_longlong, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_get_duration = prototype( ("libvlc_media_get_duration", dll), paramflags )
-    libvlc_media_get_duration.errcheck = check_vlc_exception
-    libvlc_media_get_duration.__doc__ = """Get duration of media descriptor object item.
- at param p_md media descriptor object
- at param p_e an initialized exception object
- at return duration of media item
-"""
-
-if hasattr(dll, 'libvlc_media_is_preparsed'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_is_preparsed = prototype( ("libvlc_media_is_preparsed", dll), paramflags )
-    libvlc_media_is_preparsed.errcheck = check_vlc_exception
-    libvlc_media_is_preparsed.__doc__ = """Get preparsed status for media descriptor object.
- at param p_md media descriptor object
- at param p_e an initialized exception object
- at return true if media object has been preparsed otherwise it returns false
-"""
-
-if hasattr(dll, 'libvlc_media_set_user_data'):
-    prototype=ctypes.CFUNCTYPE(None, Media, ctypes.c_void_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_set_user_data = prototype( ("libvlc_media_set_user_data", dll), paramflags )
-    libvlc_media_set_user_data.errcheck = check_vlc_exception
-    libvlc_media_set_user_data.__doc__ = """Sets media descriptor's user_data. user_data is specialized data
-accessed by the host application, VLC.framework uses it as a pointer to
-an native object that references a libvlc_media_t pointer
- at param p_md media descriptor object
- at param p_new_user_data pointer to user data
- at param p_e an initialized exception object
-"""
-
-if hasattr(dll, 'libvlc_media_get_user_data'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_void_p, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_get_user_data = prototype( ("libvlc_media_get_user_data", dll), paramflags )
-    libvlc_media_get_user_data.errcheck = check_vlc_exception
-    libvlc_media_get_user_data.__doc__ = """Get media descriptor's user_data. user_data is specialized data
-accessed by the host application, VLC.framework uses it as a pointer to
-an native object that references a libvlc_media_t pointer
- at param p_md media descriptor object
- at param p_e an initialized exception object
-"""
-
-if hasattr(dll, 'libvlc_media_discoverer_new_from_name'):
-    prototype=ctypes.CFUNCTYPE(MediaDiscoverer, Instance, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_discoverer_new_from_name = prototype( ("libvlc_media_discoverer_new_from_name", dll), paramflags )
-    libvlc_media_discoverer_new_from_name.errcheck = check_vlc_exception
-    libvlc_media_discoverer_new_from_name.__doc__ = """Discover media service by name.
- at param p_inst libvlc instance
- at param psz_name service name
- at param p_e an initialized exception object
- at return media discover object
-"""
-
-if hasattr(dll, 'libvlc_media_discoverer_release'):
-    prototype=ctypes.CFUNCTYPE(None, MediaDiscoverer)
-    paramflags=( (1, ), )
-    libvlc_media_discoverer_release = prototype( ("libvlc_media_discoverer_release", dll), paramflags )
-    libvlc_media_discoverer_release.__doc__ = """Release media discover object. If the reference count reaches 0, then
-the object will be released.
- at param p_mdis media service discover object
-"""
-
-if hasattr(dll, 'libvlc_media_discoverer_localized_name'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p, MediaDiscoverer)
-    paramflags=( (1, ), )
-    libvlc_media_discoverer_localized_name = prototype( ("libvlc_media_discoverer_localized_name", dll), paramflags )
-    libvlc_media_discoverer_localized_name.__doc__ = """Get media service discover object its localized name.
- at param media discover object
- at return localized name
-"""
-
-if hasattr(dll, 'libvlc_media_discoverer_media_list'):
-    prototype=ctypes.CFUNCTYPE(MediaList, MediaDiscoverer)
-    paramflags=( (1, ), )
-    libvlc_media_discoverer_media_list = prototype( ("libvlc_media_discoverer_media_list", dll), paramflags )
-    libvlc_media_discoverer_media_list.__doc__ = """Get media service discover media list.
- at param p_mdis media service discover object
- at return list of media items
-"""
-
-if hasattr(dll, 'libvlc_media_discoverer_event_manager'):
-    prototype=ctypes.CFUNCTYPE(EventManager, MediaDiscoverer)
-    paramflags=( (1, ), )
-    libvlc_media_discoverer_event_manager = prototype( ("libvlc_media_discoverer_event_manager", dll), paramflags )
-    libvlc_media_discoverer_event_manager.__doc__ = """Get event manager from media service discover object.
- at param p_mdis media service discover object
- at return event manager object.
-"""
-
-if hasattr(dll, 'libvlc_media_discoverer_is_running'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaDiscoverer)
-    paramflags=( (1, ), )
-    libvlc_media_discoverer_is_running = prototype( ("libvlc_media_discoverer_is_running", dll), paramflags )
-    libvlc_media_discoverer_is_running.__doc__ = """Query if media service discover object is running.
- at param p_mdis media service discover object
- at return true if running, false if not
-"""
-
-if hasattr(dll, 'libvlc_media_library_new'):
-    prototype=ctypes.CFUNCTYPE(MediaLibrary, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_library_new = prototype( ("libvlc_media_library_new", dll), paramflags )
-    libvlc_media_library_new.errcheck = check_vlc_exception
-    libvlc_media_library_new.__doc__ = """\ingroup libvlc
-LibVLC Media Library
-@{
-"""
-
-if hasattr(dll, 'libvlc_media_library_release'):
-    prototype=ctypes.CFUNCTYPE(None, MediaLibrary)
-    paramflags=( (1, ), )
-    libvlc_media_library_release = prototype( ("libvlc_media_library_release", dll), paramflags )
-    libvlc_media_library_release.__doc__ = """Release media library object. This functions decrements the
-reference count of the media library object. If it reaches 0,
-then the object will be released.
- at param p_mlib media library object
-"""
-
-if hasattr(dll, 'libvlc_media_library_retain'):
-    prototype=ctypes.CFUNCTYPE(None, MediaLibrary)
-    paramflags=( (1, ), )
-    libvlc_media_library_retain = prototype( ("libvlc_media_library_retain", dll), paramflags )
-    libvlc_media_library_retain.__doc__ = """Retain a reference to a media library object. This function will
-increment the reference counting for this object. Use
-libvlc_media_library_release() to decrement the reference count.
- at param p_mlib media library object
-"""
-
-if hasattr(dll, 'libvlc_media_library_load'):
-    prototype=ctypes.CFUNCTYPE(None, MediaLibrary, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_library_load = prototype( ("libvlc_media_library_load", dll), paramflags )
-    libvlc_media_library_load.errcheck = check_vlc_exception
-    libvlc_media_library_load.__doc__ = """Load media library.
- at param p_mlib media library object
- at param p_e an initialized exception object.
-"""
-
-if hasattr(dll, 'libvlc_media_library_save'):
-    prototype=ctypes.CFUNCTYPE(None, MediaLibrary, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_library_save = prototype( ("libvlc_media_library_save", dll), paramflags )
-    libvlc_media_library_save.errcheck = check_vlc_exception
-    libvlc_media_library_save.__doc__ = """Save media library.
- at param p_mlib media library object
- at param p_e an initialized exception object.
-"""
-
-if hasattr(dll, 'libvlc_media_library_media_list'):
-    prototype=ctypes.CFUNCTYPE(MediaList, MediaLibrary, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_library_media_list = prototype( ("libvlc_media_library_media_list", dll), paramflags )
-    libvlc_media_library_media_list.errcheck = check_vlc_exception
-    libvlc_media_library_media_list.__doc__ = """Get media library subitems.
- at param p_mlib media library object
- at param p_e an initialized exception object.
- at return media list subitems
-"""
-
-if hasattr(dll, 'libvlc_media_list_new'):
-    prototype=ctypes.CFUNCTYPE(MediaList, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_new = prototype( ("libvlc_media_list_new", dll), paramflags )
-    libvlc_media_list_new.errcheck = check_vlc_exception
-    libvlc_media_list_new.__doc__ = """Create an empty media list.
- at param p_libvlc libvlc instance
- at param p_e an initialized exception pointer
- at return empty media list
-"""
-
-if hasattr(dll, 'libvlc_media_list_release'):
-    prototype=ctypes.CFUNCTYPE(None, MediaList)
-    paramflags=( (1, ), )
-    libvlc_media_list_release = prototype( ("libvlc_media_list_release", dll), paramflags )
-    libvlc_media_list_release.__doc__ = """Release media list created with libvlc_media_list_new().
- at param p_ml a media list created with libvlc_media_list_new()
-"""
-
-if hasattr(dll, 'libvlc_media_list_retain'):
-    prototype=ctypes.CFUNCTYPE(None, MediaList)
-    paramflags=( (1, ), )
-    libvlc_media_list_retain = prototype( ("libvlc_media_list_retain", dll), paramflags )
-    libvlc_media_list_retain.__doc__ = """Retain reference to a media list
- at param p_ml a media list created with libvlc_media_list_new()
-"""
-
-if hasattr(dll, 'libvlc_media_list_set_media'):
-    prototype=ctypes.CFUNCTYPE(None, MediaList, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_list_set_media = prototype( ("libvlc_media_list_set_media", dll), paramflags )
-    libvlc_media_list_set_media.errcheck = check_vlc_exception
-    libvlc_media_list_set_media.__doc__ = """Associate media instance with this media list instance.
-If another media instance was present it will be released.
-The libvlc_media_list_lock should NOT be held upon entering this function.
- at param p_ml a media list instance
- at param p_mi media instance to add
- at param p_e initialized exception object
-"""
-
-if hasattr(dll, 'libvlc_media_list_media'):
-    prototype=ctypes.CFUNCTYPE(Media, MediaList, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_media = prototype( ("libvlc_media_list_media", dll), paramflags )
-    libvlc_media_list_media.errcheck = check_vlc_exception
-    libvlc_media_list_media.__doc__ = """Get media instance from this media list instance. This action will increase
-the refcount on the media instance.
-The libvlc_media_list_lock should NOT be held upon entering this function.
- at param p_ml a media list instance
- at param p_e initialized exception object
- at return media instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_add_media'):
-    prototype=ctypes.CFUNCTYPE(None, MediaList, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_list_add_media = prototype( ("libvlc_media_list_add_media", dll), paramflags )
-    libvlc_media_list_add_media.errcheck = check_vlc_exception
-    libvlc_media_list_add_media.__doc__ = """Add media instance to media list
-The libvlc_media_list_lock should be held upon entering this function.
- at param p_ml a media list instance
- at param p_mi a media instance
- at param p_e initialized exception object
-"""
-
-if hasattr(dll, 'libvlc_media_list_insert_media'):
-    prototype=ctypes.CFUNCTYPE(None, MediaList, Media, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_media_list_insert_media = prototype( ("libvlc_media_list_insert_media", dll), paramflags )
-    libvlc_media_list_insert_media.errcheck = check_vlc_exception
-    libvlc_media_list_insert_media.__doc__ = """Insert media instance in media list on a position
-The libvlc_media_list_lock should be held upon entering this function.
- at param p_ml a media list instance
- at param p_mi a media instance
- at param i_pos position in array where to insert
- at param p_e initialized exception object
-"""
-
-if hasattr(dll, 'libvlc_media_list_remove_index'):
-    prototype=ctypes.CFUNCTYPE(None, MediaList, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_list_remove_index = prototype( ("libvlc_media_list_remove_index", dll), paramflags )
-    libvlc_media_list_remove_index.errcheck = check_vlc_exception
-    libvlc_media_list_remove_index.__doc__ = """Remove media instance from media list on a position
-The libvlc_media_list_lock should be held upon entering this function.
- at param p_ml a media list instance
- at param i_pos position in array where to insert
- at param p_e initialized exception object
-"""
-
-if hasattr(dll, 'libvlc_media_list_count'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaList, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_count = prototype( ("libvlc_media_list_count", dll), paramflags )
-    libvlc_media_list_count.errcheck = check_vlc_exception
-    libvlc_media_list_count.__doc__ = """Get count on media list items
-The libvlc_media_list_lock should be held upon entering this function.
- at param p_ml a media list instance
- at param p_e initialized exception object
- at return number of items in media list
-"""
-
-if hasattr(dll, 'libvlc_media_list_item_at_index'):
-    prototype=ctypes.CFUNCTYPE(Media, MediaList, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_list_item_at_index = prototype( ("libvlc_media_list_item_at_index", dll), paramflags )
-    libvlc_media_list_item_at_index.errcheck = check_vlc_exception
-    libvlc_media_list_item_at_index.__doc__ = """List media instance in media list at a position
-The libvlc_media_list_lock should be held upon entering this function.
- at param p_ml a media list instance
- at param i_pos position in array where to insert
- at param p_e initialized exception object
- at return media instance at position i_pos and libvlc_media_retain() has been called to increase the refcount on this object.
-"""
-
-if hasattr(dll, 'libvlc_media_list_index_of_item'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaList, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_list_index_of_item = prototype( ("libvlc_media_list_index_of_item", dll), paramflags )
-    libvlc_media_list_index_of_item.errcheck = check_vlc_exception
-    libvlc_media_list_index_of_item.__doc__ = """Find index position of List media instance in media list.
-Warning: the function will return the first matched position.
-The libvlc_media_list_lock should be held upon entering this function.
- at param p_ml a media list instance
- at param p_mi media list instance
- at param p_e initialized exception object
- at return position of media instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_is_readonly'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaList)
-    paramflags=( (1, ), )
-    libvlc_media_list_is_readonly = prototype( ("libvlc_media_list_is_readonly", dll), paramflags )
-    libvlc_media_list_is_readonly.__doc__ = """This indicates if this media list is read-only from a user point of view
- at param p_ml media list instance
- at return 0 on readonly, 1 on readwrite
-"""
-
-if hasattr(dll, 'libvlc_media_list_lock'):
-    prototype=ctypes.CFUNCTYPE(None, MediaList)
-    paramflags=( (1, ), )
-    libvlc_media_list_lock = prototype( ("libvlc_media_list_lock", dll), paramflags )
-    libvlc_media_list_lock.__doc__ = """Get lock on media list items
- at param p_ml a media list instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_unlock'):
-    prototype=ctypes.CFUNCTYPE(None, MediaList)
-    paramflags=( (1, ), )
-    libvlc_media_list_unlock = prototype( ("libvlc_media_list_unlock", dll), paramflags )
-    libvlc_media_list_unlock.__doc__ = """Release lock on media list items
-The libvlc_media_list_lock should be held upon entering this function.
- at param p_ml a media list instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_flat_view'):
-    prototype=ctypes.CFUNCTYPE(MediaListView, MediaList, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_flat_view = prototype( ("libvlc_media_list_flat_view", dll), paramflags )
-    libvlc_media_list_flat_view.errcheck = check_vlc_exception
-    libvlc_media_list_flat_view.__doc__ = """Get a flat media list view of media list items
- at param p_ml a media list instance
- at param p_ex an excpetion instance
- at return flat media list view instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_hierarchical_view'):
-    prototype=ctypes.CFUNCTYPE(MediaListView, MediaList, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_hierarchical_view = prototype( ("libvlc_media_list_hierarchical_view", dll), paramflags )
-    libvlc_media_list_hierarchical_view.errcheck = check_vlc_exception
-    libvlc_media_list_hierarchical_view.__doc__ = """Get a hierarchical media list view of media list items
- at param p_ml a media list instance
- at param p_ex an excpetion instance
- at return hierarchical media list view instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_hierarchical_node_view'):
-    prototype=ctypes.CFUNCTYPE(MediaListView, MediaList, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_hierarchical_node_view = prototype( ("libvlc_media_list_hierarchical_node_view", dll), paramflags )
-    libvlc_media_list_hierarchical_node_view.errcheck = check_vlc_exception
-    libvlc_media_list_hierarchical_node_view.__doc__ = """"""
-
-if hasattr(dll, 'libvlc_media_list_event_manager'):
-    prototype=ctypes.CFUNCTYPE(EventManager, MediaList, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_event_manager = prototype( ("libvlc_media_list_event_manager", dll), paramflags )
-    libvlc_media_list_event_manager.errcheck = check_vlc_exception
-    libvlc_media_list_event_manager.__doc__ = """Get libvlc_event_manager from this media list instance.
-The p_event_manager is immutable, so you don't have to hold the lock
- at param p_ml a media list instance
- at param p_ex an excpetion instance
- at return libvlc_event_manager
-"""
-
-if hasattr(dll, 'libvlc_media_list_player_new'):
-    prototype=ctypes.CFUNCTYPE(MediaListPlayer, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_player_new = prototype( ("libvlc_media_list_player_new", dll), paramflags )
-    libvlc_media_list_player_new.errcheck = check_vlc_exception
-    libvlc_media_list_player_new.__doc__ = """Create new media_list_player.
- at param p_instance libvlc instance
- at param p_e initialized exception instance
- at return media list player instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_player_release'):
-    prototype=ctypes.CFUNCTYPE(None, MediaListPlayer)
-    paramflags=( (1, ), )
-    libvlc_media_list_player_release = prototype( ("libvlc_media_list_player_release", dll), paramflags )
-    libvlc_media_list_player_release.__doc__ = """Release media_list_player.
- at param p_mlp media list player instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_player_set_media_player'):
-    prototype=ctypes.CFUNCTYPE(None, MediaListPlayer, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_list_player_set_media_player = prototype( ("libvlc_media_list_player_set_media_player", dll), paramflags )
-    libvlc_media_list_player_set_media_player.errcheck = check_vlc_exception
-    libvlc_media_list_player_set_media_player.__doc__ = """Replace media player in media_list_player with this instance.
- at param p_mlp media list player instance
- at param p_mi media player instance
- at param p_e initialized exception instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_player_set_media_list'):
-    prototype=ctypes.CFUNCTYPE(None, MediaListPlayer, MediaList, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_list_player_set_media_list = prototype( ("libvlc_media_list_player_set_media_list", dll), paramflags )
-    libvlc_media_list_player_set_media_list.errcheck = check_vlc_exception
-    libvlc_media_list_player_set_media_list.__doc__ = """"""
-
-if hasattr(dll, 'libvlc_media_list_player_play'):
-    prototype=ctypes.CFUNCTYPE(None, MediaListPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_player_play = prototype( ("libvlc_media_list_player_play", dll), paramflags )
-    libvlc_media_list_player_play.errcheck = check_vlc_exception
-    libvlc_media_list_player_play.__doc__ = """Play media list
- at param p_mlp media list player instance
- at param p_e initialized exception instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_player_pause'):
-    prototype=ctypes.CFUNCTYPE(None, MediaListPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_player_pause = prototype( ("libvlc_media_list_player_pause", dll), paramflags )
-    libvlc_media_list_player_pause.errcheck = check_vlc_exception
-    libvlc_media_list_player_pause.__doc__ = """Pause media list
- at param p_mlp media list player instance
- at param p_e initialized exception instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_player_is_playing'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaListPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_player_is_playing = prototype( ("libvlc_media_list_player_is_playing", dll), paramflags )
-    libvlc_media_list_player_is_playing.errcheck = check_vlc_exception
-    libvlc_media_list_player_is_playing.__doc__ = """Is media list playing?
- at param p_mlp media list player instance
- at param p_e initialized exception instance
- at return true for playing and false for not playing
-"""
-
-if hasattr(dll, 'libvlc_media_list_player_get_state'):
-    prototype=ctypes.CFUNCTYPE(State, MediaListPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_player_get_state = prototype( ("libvlc_media_list_player_get_state", dll), paramflags )
-    libvlc_media_list_player_get_state.errcheck = check_vlc_exception
-    libvlc_media_list_player_get_state.__doc__ = """Get current libvlc_state of media list player
- at param p_mlp media list player instance
- at param p_e initialized exception instance
- at return libvlc_state_t for media list player
-"""
-
-if hasattr(dll, 'libvlc_media_list_player_play_item_at_index'):
-    prototype=ctypes.CFUNCTYPE(None, MediaListPlayer, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_list_player_play_item_at_index = prototype( ("libvlc_media_list_player_play_item_at_index", dll), paramflags )
-    libvlc_media_list_player_play_item_at_index.errcheck = check_vlc_exception
-    libvlc_media_list_player_play_item_at_index.__doc__ = """Play media list item at position index
- at param p_mlp media list player instance
- at param i_index index in media list to play
- at param p_e initialized exception instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_player_play_item'):
-    prototype=ctypes.CFUNCTYPE(None, MediaListPlayer, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_list_player_play_item = prototype( ("libvlc_media_list_player_play_item", dll), paramflags )
-    libvlc_media_list_player_play_item.errcheck = check_vlc_exception
-    libvlc_media_list_player_play_item.__doc__ = """"""
-
-if hasattr(dll, 'libvlc_media_list_player_stop'):
-    prototype=ctypes.CFUNCTYPE(None, MediaListPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_player_stop = prototype( ("libvlc_media_list_player_stop", dll), paramflags )
-    libvlc_media_list_player_stop.errcheck = check_vlc_exception
-    libvlc_media_list_player_stop.__doc__ = """Stop playing media list
- at param p_mlp media list player instance
- at param p_e initialized exception instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_player_next'):
-    prototype=ctypes.CFUNCTYPE(None, MediaListPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_player_next = prototype( ("libvlc_media_list_player_next", dll), paramflags )
-    libvlc_media_list_player_next.errcheck = check_vlc_exception
-    libvlc_media_list_player_next.__doc__ = """Play next item from media list
- at param p_mlp media list player instance
- at param p_e initialized exception instance
-"""
-
-if hasattr(dll, 'libvlc_media_list_view_retain'):
-    prototype=ctypes.CFUNCTYPE(None, MediaListView)
-    paramflags=( (1, ), )
-    libvlc_media_list_view_retain = prototype( ("libvlc_media_list_view_retain", dll), paramflags )
-    libvlc_media_list_view_retain.__doc__ = """Retain reference to a media list view
- at param p_mlv a media list view created with libvlc_media_list_view_new()
-"""
-
-if hasattr(dll, 'libvlc_media_list_view_release'):
-    prototype=ctypes.CFUNCTYPE(None, MediaListView)
-    paramflags=( (1, ), )
-    libvlc_media_list_view_release = prototype( ("libvlc_media_list_view_release", dll), paramflags )
-    libvlc_media_list_view_release.__doc__ = """Release reference to a media list view. If the refcount reaches 0, then
-the object will be released.
- at param p_mlv a media list view created with libvlc_media_list_view_new()
-"""
-
-if hasattr(dll, 'libvlc_media_list_view_event_manager'):
-    prototype=ctypes.CFUNCTYPE(EventManager, MediaListView)
-    paramflags=( (1, ), )
-    libvlc_media_list_view_event_manager = prototype( ("libvlc_media_list_view_event_manager", dll), paramflags )
-    libvlc_media_list_view_event_manager.__doc__ = """Get libvlc_event_manager from this media list view instance.
-The p_event_manager is immutable, so you don't have to hold the lock
- at param p_mlv a media list view instance
- at return libvlc_event_manager
-"""
-
-if hasattr(dll, 'libvlc_media_list_view_count'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaListView, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_view_count = prototype( ("libvlc_media_list_view_count", dll), paramflags )
-    libvlc_media_list_view_count.errcheck = check_vlc_exception
-    libvlc_media_list_view_count.__doc__ = """Get count on media list view items
- at param p_mlv a media list view instance
- at param p_e initialized exception object
- at return number of items in media list view
-"""
-
-if hasattr(dll, 'libvlc_media_list_view_item_at_index'):
-    prototype=ctypes.CFUNCTYPE(Media, MediaListView, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_list_view_item_at_index = prototype( ("libvlc_media_list_view_item_at_index", dll), paramflags )
-    libvlc_media_list_view_item_at_index.errcheck = check_vlc_exception
-    libvlc_media_list_view_item_at_index.__doc__ = """List media instance in media list view at an index position
- at param p_mlv a media list view instance
- at param i_index index position in array where to insert
- at param p_e initialized exception object
- at return media instance at position i_pos and libvlc_media_retain() has been called to increase the refcount on this object.
-"""
-
-if hasattr(dll, 'libvlc_media_list_view_children_at_index'):
-    prototype=ctypes.CFUNCTYPE(MediaListView, MediaListView, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_list_view_children_at_index = prototype( ("libvlc_media_list_view_children_at_index", dll), paramflags )
-    libvlc_media_list_view_children_at_index.errcheck = check_vlc_exception
-    libvlc_media_list_view_children_at_index.__doc__ = """"""
-
-if hasattr(dll, 'libvlc_media_list_view_children_for_item'):
-    prototype=ctypes.CFUNCTYPE(MediaListView, MediaListView, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_list_view_children_for_item = prototype( ("libvlc_media_list_view_children_for_item", dll), paramflags )
-    libvlc_media_list_view_children_for_item.errcheck = check_vlc_exception
-    libvlc_media_list_view_children_for_item.__doc__ = """"""
-
-if hasattr(dll, 'libvlc_media_list_view_parent_media_list'):
-    prototype=ctypes.CFUNCTYPE(MediaList, MediaListView, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_list_view_parent_media_list = prototype( ("libvlc_media_list_view_parent_media_list", dll), paramflags )
-    libvlc_media_list_view_parent_media_list.errcheck = check_vlc_exception
-    libvlc_media_list_view_parent_media_list.__doc__ = """"""
-
-if hasattr(dll, 'libvlc_media_player_new'):
-    prototype=ctypes.CFUNCTYPE(MediaPlayer, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_new = prototype( ("libvlc_media_player_new", dll), paramflags )
-    libvlc_media_player_new.errcheck = check_vlc_exception
-    libvlc_media_player_new.__doc__ = """Create an empty Media Player object
- at param p_libvlc_instance the libvlc instance in which the Media Player
-       should be created.
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_new_from_media'):
-    prototype=ctypes.CFUNCTYPE(MediaPlayer, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_new_from_media = prototype( ("libvlc_media_player_new_from_media", dll), paramflags )
-    libvlc_media_player_new_from_media.errcheck = check_vlc_exception
-    libvlc_media_player_new_from_media.__doc__ = """Create a Media Player object from a Media
- at param p_md the media. Afterwards the p_md can be safely
-       destroyed.
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_release'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer)
-    paramflags=( (1, ), )
-    libvlc_media_player_release = prototype( ("libvlc_media_player_release", dll), paramflags )
-    libvlc_media_player_release.__doc__ = """Release a media_player after use
-Decrement the reference count of a media player object. If the
-reference count is 0, then libvlc_media_player_release() will
-release the media player object. If the media player object
-has been released, then it should not be used again.
- at param p_mi the Media Player to free
-"""
-
-if hasattr(dll, 'libvlc_media_player_retain'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer)
-    paramflags=( (1, ), )
-    libvlc_media_player_retain = prototype( ("libvlc_media_player_retain", dll), paramflags )
-    libvlc_media_player_retain.__doc__ = """Retain a reference to a media player object. Use
-libvlc_media_player_release() to decrement reference count.
- at param p_mi media player object
-"""
-
-if hasattr(dll, 'libvlc_media_player_set_media'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, Media, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_player_set_media = prototype( ("libvlc_media_player_set_media", dll), paramflags )
-    libvlc_media_player_set_media.errcheck = check_vlc_exception
-    libvlc_media_player_set_media.__doc__ = """Set the media that will be used by the media_player. If any,
-previous md will be released.
- at param p_mi the Media Player
- at param p_md the Media. Afterwards the p_md can be safely
-       destroyed.
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_media'):
-    prototype=ctypes.CFUNCTYPE(Media, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_get_media = prototype( ("libvlc_media_player_get_media", dll), paramflags )
-    libvlc_media_player_get_media.errcheck = check_vlc_exception
-    libvlc_media_player_get_media.__doc__ = """Get the media used by the media_player.
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return the media associated with p_mi, or NULL if no
-        media is associated
-"""
-
-if hasattr(dll, 'libvlc_media_player_event_manager'):
-    prototype=ctypes.CFUNCTYPE(EventManager, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_event_manager = prototype( ("libvlc_media_player_event_manager", dll), paramflags )
-    libvlc_media_player_event_manager.errcheck = check_vlc_exception
-    libvlc_media_player_event_manager.__doc__ = """Get the Event Manager from which the media player send event.
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return the event manager associated with p_mi
-"""
-
-if hasattr(dll, 'libvlc_media_player_is_playing'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_is_playing = prototype( ("libvlc_media_player_is_playing", dll), paramflags )
-    libvlc_media_player_is_playing.errcheck = check_vlc_exception
-    libvlc_media_player_is_playing.__doc__ = """is_playing
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return 1 if the media player is playing, 0 otherwise
-"""
-
-if hasattr(dll, 'libvlc_media_player_play'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_play = prototype( ("libvlc_media_player_play", dll), paramflags )
-    libvlc_media_player_play.errcheck = check_vlc_exception
-    libvlc_media_player_play.__doc__ = """Play
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_pause'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_pause = prototype( ("libvlc_media_player_pause", dll), paramflags )
-    libvlc_media_player_pause.errcheck = check_vlc_exception
-    libvlc_media_player_pause.__doc__ = """Pause
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_stop'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_stop = prototype( ("libvlc_media_player_stop", dll), paramflags )
-    libvlc_media_player_stop.errcheck = check_vlc_exception
-    libvlc_media_player_stop.__doc__ = """Stop
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_set_nsobject'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_void_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_player_set_nsobject = prototype( ("libvlc_media_player_set_nsobject", dll), paramflags )
-    libvlc_media_player_set_nsobject.errcheck = check_vlc_exception
-    libvlc_media_player_set_nsobject.__doc__ = """Set the agl handler where the media player should render its video output.
- at param p_mi the Media Player
- at param drawable the agl handler
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_nsobject'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_void_p, MediaPlayer)
-    paramflags=( (1, ), )
-    libvlc_media_player_get_nsobject = prototype( ("libvlc_media_player_get_nsobject", dll), paramflags )
-    libvlc_media_player_get_nsobject.__doc__ = """Get the agl handler previously set with libvlc_media_player_set_agl().
- at return the agl handler or 0 if none where set
-"""
-
-if hasattr(dll, 'libvlc_media_player_set_agl'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_uint, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_player_set_agl = prototype( ("libvlc_media_player_set_agl", dll), paramflags )
-    libvlc_media_player_set_agl.errcheck = check_vlc_exception
-    libvlc_media_player_set_agl.__doc__ = """Set the agl handler where the media player should render its video output.
- at param p_mi the Media Player
- at param drawable the agl handler
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_agl'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_uint, MediaPlayer)
-    paramflags=( (1, ), )
-    libvlc_media_player_get_agl = prototype( ("libvlc_media_player_get_agl", dll), paramflags )
-    libvlc_media_player_get_agl.__doc__ = """Get the agl handler previously set with libvlc_media_player_set_agl().
- at param p_mi the Media Player
- at return the agl handler or 0 if none where set
-"""
-
-if hasattr(dll, 'libvlc_media_player_set_xwindow'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_uint, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_player_set_xwindow = prototype( ("libvlc_media_player_set_xwindow", dll), paramflags )
-    libvlc_media_player_set_xwindow.errcheck = check_vlc_exception
-    libvlc_media_player_set_xwindow.__doc__ = """Set an X Window System drawable where the media player should render its
-video output. If LibVLC was built without X11 output support, then this has
-no effects.
-The specified identifier must correspond to an existing Input/Output class
-X11 window. Pixmaps are <b>not</b> supported. The caller shall ensure that
-the X11 server is the same as the one the VLC instance has been configured
-with.
-If XVideo is <b>not</b> used, it is assumed that the drawable has the
-following properties in common with the default X11 screen: depth, scan line
-pad, black pixel. This is a bug.
- at param p_mi the Media Player
- at param drawable the ID of the X window
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_xwindow'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_uint, MediaPlayer)
-    paramflags=( (1, ), )
-    libvlc_media_player_get_xwindow = prototype( ("libvlc_media_player_get_xwindow", dll), paramflags )
-    libvlc_media_player_get_xwindow.__doc__ = """Get the X Window System window identifier previously set with
-libvlc_media_player_set_xwindow(). Note that this will return the identifier
-even if VLC is not currently using it (for instance if it is playing an
-audio-only input).
- at return an X window ID, or 0 if none where set.
-"""
-
-if hasattr(dll, 'libvlc_media_player_set_hwnd'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_void_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_player_set_hwnd = prototype( ("libvlc_media_player_set_hwnd", dll), paramflags )
-    libvlc_media_player_set_hwnd.errcheck = check_vlc_exception
-    libvlc_media_player_set_hwnd.__doc__ = """Set a Win32/Win64 API window handle (HWND) where the media player should
-render its video output. If LibVLC was built without Win32/Win64 API output
-support, then this has no effects.
- at param p_mi the Media Player
- at param drawable windows handle of the drawable
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_hwnd'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_void_p, MediaPlayer)
-    paramflags=( (1, ), )
-    libvlc_media_player_get_hwnd = prototype( ("libvlc_media_player_get_hwnd", dll), paramflags )
-    libvlc_media_player_get_hwnd.__doc__ = """Get the Windows API window handle (HWND) previously set with
-libvlc_media_player_set_hwnd(). The handle will be returned even if LibVLC
-is not currently outputting any video to it.
- at return a window handle or NULL if there are none.
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_length'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_longlong, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_get_length = prototype( ("libvlc_media_player_get_length", dll), paramflags )
-    libvlc_media_player_get_length.errcheck = check_vlc_exception
-    libvlc_media_player_get_length.__doc__ = """Get the current movie length (in ms).
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return the movie length (in ms).
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_time'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_longlong, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_get_time = prototype( ("libvlc_media_player_get_time", dll), paramflags )
-    libvlc_media_player_get_time.errcheck = check_vlc_exception
-    libvlc_media_player_get_time.__doc__ = """Get the current movie time (in ms).
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return the movie time (in ms).
-"""
-
-if hasattr(dll, 'libvlc_media_player_set_time'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_longlong, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_player_set_time = prototype( ("libvlc_media_player_set_time", dll), paramflags )
-    libvlc_media_player_set_time.errcheck = check_vlc_exception
-    libvlc_media_player_set_time.__doc__ = """Set the movie time (in ms).
- at param p_mi the Media Player
- at param the movie time (in ms).
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_position'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_float, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_get_position = prototype( ("libvlc_media_player_get_position", dll), paramflags )
-    libvlc_media_player_get_position.errcheck = check_vlc_exception
-    libvlc_media_player_get_position.__doc__ = """Get movie position.
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return movie position
-"""
-
-if hasattr(dll, 'libvlc_media_player_set_position'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_float, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_player_set_position = prototype( ("libvlc_media_player_set_position", dll), paramflags )
-    libvlc_media_player_set_position.errcheck = check_vlc_exception
-    libvlc_media_player_set_position.__doc__ = """Set movie position.
- at param p_mi the Media Player
- at param f_pos the position
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_set_chapter'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_player_set_chapter = prototype( ("libvlc_media_player_set_chapter", dll), paramflags )
-    libvlc_media_player_set_chapter.errcheck = check_vlc_exception
-    libvlc_media_player_set_chapter.__doc__ = """Set movie chapter
- at param p_mi the Media Player
- at param i_chapter chapter number to play
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_chapter'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_get_chapter = prototype( ("libvlc_media_player_get_chapter", dll), paramflags )
-    libvlc_media_player_get_chapter.errcheck = check_vlc_exception
-    libvlc_media_player_get_chapter.__doc__ = """Get movie chapter
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return chapter number currently playing
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_chapter_count'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_get_chapter_count = prototype( ("libvlc_media_player_get_chapter_count", dll), paramflags )
-    libvlc_media_player_get_chapter_count.errcheck = check_vlc_exception
-    libvlc_media_player_get_chapter_count.__doc__ = """Get movie chapter count
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return number of chapters in movie
-"""
-
-if hasattr(dll, 'libvlc_media_player_will_play'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_will_play = prototype( ("libvlc_media_player_will_play", dll), paramflags )
-    libvlc_media_player_will_play.errcheck = check_vlc_exception
-    libvlc_media_player_will_play.__doc__ = """Will the player play
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return boolean
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_chapter_count_for_title'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_player_get_chapter_count_for_title = prototype( ("libvlc_media_player_get_chapter_count_for_title", dll), paramflags )
-    libvlc_media_player_get_chapter_count_for_title.errcheck = check_vlc_exception
-    libvlc_media_player_get_chapter_count_for_title.__doc__ = """Get title chapter count
- at param p_mi the Media Player
- at param i_title title
- at param p_e an initialized exception pointer
- at return number of chapters in title
-"""
-
-if hasattr(dll, 'libvlc_media_player_set_title'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_player_set_title = prototype( ("libvlc_media_player_set_title", dll), paramflags )
-    libvlc_media_player_set_title.errcheck = check_vlc_exception
-    libvlc_media_player_set_title.__doc__ = """Set movie title
- at param p_mi the Media Player
- at param i_title title number to play
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_title'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_get_title = prototype( ("libvlc_media_player_get_title", dll), paramflags )
-    libvlc_media_player_get_title.errcheck = check_vlc_exception
-    libvlc_media_player_get_title.__doc__ = """Get movie title
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return title number currently playing
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_title_count'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_get_title_count = prototype( ("libvlc_media_player_get_title_count", dll), paramflags )
-    libvlc_media_player_get_title_count.errcheck = check_vlc_exception
-    libvlc_media_player_get_title_count.__doc__ = """Get movie title count
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return title number count
-"""
-
-if hasattr(dll, 'libvlc_media_player_previous_chapter'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_previous_chapter = prototype( ("libvlc_media_player_previous_chapter", dll), paramflags )
-    libvlc_media_player_previous_chapter.errcheck = check_vlc_exception
-    libvlc_media_player_previous_chapter.__doc__ = """Set previous chapter
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_next_chapter'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_next_chapter = prototype( ("libvlc_media_player_next_chapter", dll), paramflags )
-    libvlc_media_player_next_chapter.errcheck = check_vlc_exception
-    libvlc_media_player_next_chapter.__doc__ = """Set next chapter
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_rate'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_float, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_get_rate = prototype( ("libvlc_media_player_get_rate", dll), paramflags )
-    libvlc_media_player_get_rate.errcheck = check_vlc_exception
-    libvlc_media_player_get_rate.__doc__ = """Get movie play rate
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return movie play rate
-"""
-
-if hasattr(dll, 'libvlc_media_player_set_rate'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_float, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_media_player_set_rate = prototype( ("libvlc_media_player_set_rate", dll), paramflags )
-    libvlc_media_player_set_rate.errcheck = check_vlc_exception
-    libvlc_media_player_set_rate.__doc__ = """Set movie play rate
- at param p_mi the Media Player
- at param movie play rate to set
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_state'):
-    prototype=ctypes.CFUNCTYPE(State, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_get_state = prototype( ("libvlc_media_player_get_state", dll), paramflags )
-    libvlc_media_player_get_state.errcheck = check_vlc_exception
-    libvlc_media_player_get_state.__doc__ = """Get current movie state
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return current movie state as libvlc_state_t
-"""
-
-if hasattr(dll, 'libvlc_media_player_get_fps'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_float, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_get_fps = prototype( ("libvlc_media_player_get_fps", dll), paramflags )
-    libvlc_media_player_get_fps.errcheck = check_vlc_exception
-    libvlc_media_player_get_fps.__doc__ = """Get movie fps rate
- at param p_mi the Media Player
- at param p_e an initialized exception pointer
- at return frames per second (fps) for this playing movie
-"""
-
-if hasattr(dll, 'libvlc_media_player_has_vout'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_has_vout = prototype( ("libvlc_media_player_has_vout", dll), paramflags )
-    libvlc_media_player_has_vout.errcheck = check_vlc_exception
-    libvlc_media_player_has_vout.__doc__ = """Does this media player have a video output?
- at param p_md the media player
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_is_seekable'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_is_seekable = prototype( ("libvlc_media_player_is_seekable", dll), paramflags )
-    libvlc_media_player_is_seekable.errcheck = check_vlc_exception
-    libvlc_media_player_is_seekable.__doc__ = """Is this media player seekable?
- at param p_input the input
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_media_player_can_pause'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_media_player_can_pause = prototype( ("libvlc_media_player_can_pause", dll), paramflags )
-    libvlc_media_player_can_pause.errcheck = check_vlc_exception
-    libvlc_media_player_can_pause.__doc__ = """Can this media player be paused?
- at param p_input the input
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_track_description_release'):
-    prototype=ctypes.CFUNCTYPE(None, TrackDescription)
-    paramflags=( (1, ), )
-    libvlc_track_description_release = prototype( ("libvlc_track_description_release", dll), paramflags )
-    libvlc_track_description_release.__doc__ = """Release (free) libvlc_track_description_t
- at param p_track_description the structure to release
-"""
-
-if hasattr(dll, 'libvlc_toggle_fullscreen'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_toggle_fullscreen = prototype( ("libvlc_toggle_fullscreen", dll), paramflags )
-    libvlc_toggle_fullscreen.errcheck = check_vlc_exception
-    libvlc_toggle_fullscreen.__doc__ = """Toggle fullscreen status on video output.
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_set_fullscreen'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_set_fullscreen = prototype( ("libvlc_set_fullscreen", dll), paramflags )
-    libvlc_set_fullscreen.errcheck = check_vlc_exception
-    libvlc_set_fullscreen.__doc__ = """Enable or disable fullscreen on a video output.
- at param p_mediaplayer the media player
- at param b_fullscreen boolean for fullscreen status
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_get_fullscreen'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_get_fullscreen = prototype( ("libvlc_get_fullscreen", dll), paramflags )
-    libvlc_get_fullscreen.errcheck = check_vlc_exception
-    libvlc_get_fullscreen.__doc__ = """Get current fullscreen status.
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
- at return the fullscreen status (boolean)
-"""
-
-if hasattr(dll, 'libvlc_video_get_height'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_height = prototype( ("libvlc_video_get_height", dll), paramflags )
-    libvlc_video_get_height.errcheck = check_vlc_exception
-    libvlc_video_get_height.__doc__ = """Get current video height.
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
- at return the video height
-"""
-
-if hasattr(dll, 'libvlc_video_get_width'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_width = prototype( ("libvlc_video_get_width", dll), paramflags )
-    libvlc_video_get_width.errcheck = check_vlc_exception
-    libvlc_video_get_width.__doc__ = """Get current video width.
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
- at return the video width
-"""
-
-if hasattr(dll, 'libvlc_video_get_scale'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_float, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_scale = prototype( ("libvlc_video_get_scale", dll), paramflags )
-    libvlc_video_get_scale.errcheck = check_vlc_exception
-    libvlc_video_get_scale.__doc__ = """Get the current video scaling factor.
-See also libvlc_video_set_scale().
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
- at return the currently configured zoom factor, or 0. if the video is set
-to fit to the output window/drawable automatically.
-"""
-
-if hasattr(dll, 'libvlc_video_set_scale'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_float, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_video_set_scale = prototype( ("libvlc_video_set_scale", dll), paramflags )
-    libvlc_video_set_scale.errcheck = check_vlc_exception
-    libvlc_video_set_scale.__doc__ = """Set the video scaling factor. That is the ratio of the number of pixels on
-screen to the number of pixels in the original decoded video in each
-dimension. Zero is a special value; it will adjust the video to the output
-window/drawable (in windowed mode) or the entire screen.
-Note that not all video outputs support scaling.
- at param p_mediaplayer the media player
- at param i_factor the scaling factor, or zero
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_video_get_aspect_ratio'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_aspect_ratio = prototype( ("libvlc_video_get_aspect_ratio", dll), paramflags )
-    libvlc_video_get_aspect_ratio.errcheck = check_vlc_exception
-    libvlc_video_get_aspect_ratio.__doc__ = """Get current video aspect ratio.
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
- at return the video aspect ratio
-"""
-
-if hasattr(dll, 'libvlc_video_set_aspect_ratio'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_video_set_aspect_ratio = prototype( ("libvlc_video_set_aspect_ratio", dll), paramflags )
-    libvlc_video_set_aspect_ratio.errcheck = check_vlc_exception
-    libvlc_video_set_aspect_ratio.__doc__ = """Set new video aspect ratio.
- at param p_mediaplayer the media player
- at param psz_aspect new video aspect-ratio
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_video_get_spu'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_spu = prototype( ("libvlc_video_get_spu", dll), paramflags )
-    libvlc_video_get_spu.errcheck = check_vlc_exception
-    libvlc_video_get_spu.__doc__ = """Get current video subtitle.
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
- at return the video subtitle selected
-"""
-
-if hasattr(dll, 'libvlc_video_get_spu_count'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_spu_count = prototype( ("libvlc_video_get_spu_count", dll), paramflags )
-    libvlc_video_get_spu_count.errcheck = check_vlc_exception
-    libvlc_video_get_spu_count.__doc__ = """Get the number of available video subtitles.
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
- at return the number of available video subtitles
-"""
-
-if hasattr(dll, 'libvlc_video_get_spu_description'):
-    prototype=ctypes.CFUNCTYPE(TrackDescription, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_spu_description = prototype( ("libvlc_video_get_spu_description", dll), paramflags )
-    libvlc_video_get_spu_description.errcheck = check_vlc_exception
-    libvlc_video_get_spu_description.__doc__ = """Get the description of available video subtitles.
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
- at return list containing description of available video subtitles
-"""
-
-if hasattr(dll, 'libvlc_video_set_spu'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_video_set_spu = prototype( ("libvlc_video_set_spu", dll), paramflags )
-    libvlc_video_set_spu.errcheck = check_vlc_exception
-    libvlc_video_set_spu.__doc__ = """Set new video subtitle.
- at param p_mediaplayer the media player
- at param i_spu new video subtitle to select
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_video_set_subtitle_file'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_video_set_subtitle_file = prototype( ("libvlc_video_set_subtitle_file", dll), paramflags )
-    libvlc_video_set_subtitle_file.errcheck = check_vlc_exception
-    libvlc_video_set_subtitle_file.__doc__ = """Set new video subtitle file.
- at param p_mediaplayer the media player
- at param psz_subtitle new video subtitle file
- at param p_e an initialized exception pointer
- at return the success status (boolean)
-"""
-
-if hasattr(dll, 'libvlc_video_get_title_description'):
-    prototype=ctypes.CFUNCTYPE(TrackDescription, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_title_description = prototype( ("libvlc_video_get_title_description", dll), paramflags )
-    libvlc_video_get_title_description.errcheck = check_vlc_exception
-    libvlc_video_get_title_description.__doc__ = """Get the description of available titles.
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
- at return list containing description of available titles
-"""
-
-if hasattr(dll, 'libvlc_video_get_chapter_description'):
-    prototype=ctypes.CFUNCTYPE(TrackDescription, MediaPlayer, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_video_get_chapter_description = prototype( ("libvlc_video_get_chapter_description", dll), paramflags )
-    libvlc_video_get_chapter_description.errcheck = check_vlc_exception
-    libvlc_video_get_chapter_description.__doc__ = """Get the description of available chapters for specific title.
- at param p_mediaplayer the media player
- at param i_title selected title
- at param p_e an initialized exception pointer
- at return list containing description of available chapter for title i_title
-"""
-
-if hasattr(dll, 'libvlc_video_get_crop_geometry'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_crop_geometry = prototype( ("libvlc_video_get_crop_geometry", dll), paramflags )
-    libvlc_video_get_crop_geometry.errcheck = check_vlc_exception
-    libvlc_video_get_crop_geometry.__doc__ = """Get current crop filter geometry.
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
- at return the crop filter geometry
-"""
-
-if hasattr(dll, 'libvlc_video_set_crop_geometry'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_video_set_crop_geometry = prototype( ("libvlc_video_set_crop_geometry", dll), paramflags )
-    libvlc_video_set_crop_geometry.errcheck = check_vlc_exception
-    libvlc_video_set_crop_geometry.__doc__ = """Set new crop filter geometry.
- at param p_mediaplayer the media player
- at param psz_geometry new crop filter geometry
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_toggle_teletext'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_toggle_teletext = prototype( ("libvlc_toggle_teletext", dll), paramflags )
-    libvlc_toggle_teletext.errcheck = check_vlc_exception
-    libvlc_toggle_teletext.__doc__ = """Toggle teletext transparent status on video output.
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_video_get_teletext'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_teletext = prototype( ("libvlc_video_get_teletext", dll), paramflags )
-    libvlc_video_get_teletext.errcheck = check_vlc_exception
-    libvlc_video_get_teletext.__doc__ = """Get current teletext page requested.
- at param p_mediaplayer the media player
- at param p_e an initialized exception pointer
- at return the current teletext page requested.
-"""
-
-if hasattr(dll, 'libvlc_video_set_teletext'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_video_set_teletext = prototype( ("libvlc_video_set_teletext", dll), paramflags )
-    libvlc_video_set_teletext.errcheck = check_vlc_exception
-    libvlc_video_set_teletext.__doc__ = """Set new teletext page to retrieve.
- at param p_mediaplayer the media player
- at param i_page teletex page number requested
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_video_get_track_count'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_track_count = prototype( ("libvlc_video_get_track_count", dll), paramflags )
-    libvlc_video_get_track_count.errcheck = check_vlc_exception
-    libvlc_video_get_track_count.__doc__ = """Get number of available video tracks.
- at param p_mi media player
- at param p_e an initialized exception
- at return the number of available video tracks (int)
-"""
-
-if hasattr(dll, 'libvlc_video_get_track_description'):
-    prototype=ctypes.CFUNCTYPE(TrackDescription, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_track_description = prototype( ("libvlc_video_get_track_description", dll), paramflags )
-    libvlc_video_get_track_description.errcheck = check_vlc_exception
-    libvlc_video_get_track_description.__doc__ = """Get the description of available video tracks.
- at param p_mi media player
- at param p_e an initialized exception
- at return list with description of available video tracks
-"""
-
-if hasattr(dll, 'libvlc_video_get_track'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_video_get_track = prototype( ("libvlc_video_get_track", dll), paramflags )
-    libvlc_video_get_track.errcheck = check_vlc_exception
-    libvlc_video_get_track.__doc__ = """Get current video track.
- at param p_mi media player
- at param p_e an initialized exception pointer
- at return the video track (int)
-"""
-
-if hasattr(dll, 'libvlc_video_set_track'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_video_set_track = prototype( ("libvlc_video_set_track", dll), paramflags )
-    libvlc_video_set_track.errcheck = check_vlc_exception
-    libvlc_video_set_track.__doc__ = """Set video track.
- at param p_mi media player
- at param i_track the track (int)
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_video_take_snapshot'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_char_p, ctypes.c_uint, ctypes.c_uint, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (1,), (3,)
-    libvlc_video_take_snapshot = prototype( ("libvlc_video_take_snapshot", dll), paramflags )
-    libvlc_video_take_snapshot.errcheck = check_vlc_exception
-    libvlc_video_take_snapshot.__doc__ = """Take a snapshot of the current video window.
-If i_width AND i_height is 0, original size is used.
-If i_width XOR i_height is 0, original aspect-ratio is preserved.
- at param p_mi media player instance
- at param psz_filepath the path where to save the screenshot to
- at param i_width the snapshot's width
- at param i_height the snapshot's height
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_audio_output_list_get'):
-    prototype=ctypes.CFUNCTYPE(AudioOutput, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_audio_output_list_get = prototype( ("libvlc_audio_output_list_get", dll), paramflags )
-    libvlc_audio_output_list_get.errcheck = check_vlc_exception
-    libvlc_audio_output_list_get.__doc__ = """Get the list of available audio outputs
- at param p_instance libvlc instance
- at param p_e an initialized exception pointer
- at return list of available audio outputs, at the end free it with
-"""
-
-if hasattr(dll, 'libvlc_audio_output_list_release'):
-    prototype=ctypes.CFUNCTYPE(None, AudioOutput)
-    paramflags=( (1, ), )
-    libvlc_audio_output_list_release = prototype( ("libvlc_audio_output_list_release", dll), paramflags )
-    libvlc_audio_output_list_release.__doc__ = """Free the list of available audio outputs
- at param p_list list with audio outputs for release
-"""
-
-if hasattr(dll, 'libvlc_audio_output_set'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance, ctypes.c_char_p)
-    paramflags=(1,), (1,)
-    libvlc_audio_output_set = prototype( ("libvlc_audio_output_set", dll), paramflags )
-    libvlc_audio_output_set.__doc__ = """Set the audio output.
-Change will be applied after stop and play.
- at param p_instance libvlc instance
- at param psz_name name of audio output,
-              use psz_name of \see libvlc_audio_output_t
- at return true if function succeded
-"""
-
-if hasattr(dll, 'libvlc_audio_output_device_count'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance, ctypes.c_char_p)
-    paramflags=(1,), (1,)
-    libvlc_audio_output_device_count = prototype( ("libvlc_audio_output_device_count", dll), paramflags )
-    libvlc_audio_output_device_count.__doc__ = """Get count of devices for audio output, these devices are hardware oriented
-like analor or digital output of sound card
- at param p_instance libvlc instance
- at param psz_audio_output - name of audio output, \see libvlc_audio_output_t
- at return number of devices
-"""
-
-if hasattr(dll, 'libvlc_audio_output_device_longname'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p, Instance, ctypes.c_char_p, ctypes.c_int)
-    paramflags=(1,), (1,), (1,)
-    libvlc_audio_output_device_longname = prototype( ("libvlc_audio_output_device_longname", dll), paramflags )
-    libvlc_audio_output_device_longname.__doc__ = """Get long name of device, if not available short name given
- at param p_instance libvlc instance
- at param psz_audio_output - name of audio output, \see libvlc_audio_output_t
- at param i_device device index
- at return long name of device
-"""
-
-if hasattr(dll, 'libvlc_audio_output_device_id'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p, Instance, ctypes.c_char_p, ctypes.c_int)
-    paramflags=(1,), (1,), (1,)
-    libvlc_audio_output_device_id = prototype( ("libvlc_audio_output_device_id", dll), paramflags )
-    libvlc_audio_output_device_id.__doc__ = """Get id name of device
- at param p_instance libvlc instance
- at param psz_audio_output - name of audio output, \see libvlc_audio_output_t
- at param i_device device index
- at return id name of device, use for setting device, need to be free after use
-"""
-
-if hasattr(dll, 'libvlc_audio_output_device_set'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.c_char_p)
-    paramflags=(1,), (1,), (1,)
-    libvlc_audio_output_device_set = prototype( ("libvlc_audio_output_device_set", dll), paramflags )
-    libvlc_audio_output_device_set.__doc__ = """Set device for using
- at param p_instance libvlc instance
- at param psz_audio_output - name of audio output, \see libvlc_audio_output_t
- at param psz_device_id device
-"""
-
-if hasattr(dll, 'libvlc_audio_output_get_device_type'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_audio_output_get_device_type = prototype( ("libvlc_audio_output_get_device_type", dll), paramflags )
-    libvlc_audio_output_get_device_type.errcheck = check_vlc_exception
-    libvlc_audio_output_get_device_type.__doc__ = """Get current audio device type. Device type describes something like
-character of output sound - stereo sound, 2.1, 5.1 etc
- at param p_instance vlc instance
- at param p_e an initialized exception pointer
- at return the audio devices type \see libvlc_audio_output_device_types_t
-"""
-
-if hasattr(dll, 'libvlc_audio_output_set_device_type'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_audio_output_set_device_type = prototype( ("libvlc_audio_output_set_device_type", dll), paramflags )
-    libvlc_audio_output_set_device_type.errcheck = check_vlc_exception
-    libvlc_audio_output_set_device_type.__doc__ = """Set current audio device type.
- at param p_instance vlc instance
- at param device_type the audio device type,
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_audio_toggle_mute'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_audio_toggle_mute = prototype( ("libvlc_audio_toggle_mute", dll), paramflags )
-    libvlc_audio_toggle_mute.errcheck = check_vlc_exception
-    libvlc_audio_toggle_mute.__doc__ = """Toggle mute status.
- at param p_instance libvlc instance
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_audio_get_mute'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_audio_get_mute = prototype( ("libvlc_audio_get_mute", dll), paramflags )
-    libvlc_audio_get_mute.errcheck = check_vlc_exception
-    libvlc_audio_get_mute.__doc__ = """Get current mute status.
- at param p_instance libvlc instance
- at param p_e an initialized exception pointer
- at return the mute status (boolean)
-"""
-
-if hasattr(dll, 'libvlc_audio_set_mute'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_audio_set_mute = prototype( ("libvlc_audio_set_mute", dll), paramflags )
-    libvlc_audio_set_mute.errcheck = check_vlc_exception
-    libvlc_audio_set_mute.__doc__ = """Set mute status.
- at param p_instance libvlc instance
- at param status If status is true then mute, otherwise unmute
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_audio_get_volume'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_audio_get_volume = prototype( ("libvlc_audio_get_volume", dll), paramflags )
-    libvlc_audio_get_volume.errcheck = check_vlc_exception
-    libvlc_audio_get_volume.__doc__ = """Get current audio level.
- at param p_instance libvlc instance
- at param p_e an initialized exception pointer
- at return the audio level (int)
-"""
-
-if hasattr(dll, 'libvlc_audio_set_volume'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_audio_set_volume = prototype( ("libvlc_audio_set_volume", dll), paramflags )
-    libvlc_audio_set_volume.errcheck = check_vlc_exception
-    libvlc_audio_set_volume.__doc__ = """Set current audio level.
- at param p_instance libvlc instance
- at param i_volume the volume (int)
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_audio_get_track_count'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_audio_get_track_count = prototype( ("libvlc_audio_get_track_count", dll), paramflags )
-    libvlc_audio_get_track_count.errcheck = check_vlc_exception
-    libvlc_audio_get_track_count.__doc__ = """Get number of available audio tracks.
- at param p_mi media player
- at param p_e an initialized exception
- at return the number of available audio tracks (int)
-"""
-
-if hasattr(dll, 'libvlc_audio_get_track_description'):
-    prototype=ctypes.CFUNCTYPE(TrackDescription, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_audio_get_track_description = prototype( ("libvlc_audio_get_track_description", dll), paramflags )
-    libvlc_audio_get_track_description.errcheck = check_vlc_exception
-    libvlc_audio_get_track_description.__doc__ = """Get the description of available audio tracks.
- at param p_mi media player
- at param p_e an initialized exception
- at return list with description of available audio tracks
-"""
-
-if hasattr(dll, 'libvlc_audio_get_track'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaPlayer, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_audio_get_track = prototype( ("libvlc_audio_get_track", dll), paramflags )
-    libvlc_audio_get_track.errcheck = check_vlc_exception
-    libvlc_audio_get_track.__doc__ = """Get current audio track.
- at param p_mi media player
- at param p_e an initialized exception pointer
- at return the audio track (int)
-"""
-
-if hasattr(dll, 'libvlc_audio_set_track'):
-    prototype=ctypes.CFUNCTYPE(None, MediaPlayer, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_audio_set_track = prototype( ("libvlc_audio_set_track", dll), paramflags )
-    libvlc_audio_set_track.errcheck = check_vlc_exception
-    libvlc_audio_set_track.__doc__ = """Set current audio track.
- at param p_mi media player
- at param i_track the track (int)
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_audio_get_channel'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_audio_get_channel = prototype( ("libvlc_audio_get_channel", dll), paramflags )
-    libvlc_audio_get_channel.errcheck = check_vlc_exception
-    libvlc_audio_get_channel.__doc__ = """Get current audio channel.
- at param p_instance vlc instance
- at param p_e an initialized exception pointer
- at return the audio channel \see libvlc_audio_output_channel_t
-"""
-
-if hasattr(dll, 'libvlc_audio_set_channel'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_audio_set_channel = prototype( ("libvlc_audio_set_channel", dll), paramflags )
-    libvlc_audio_set_channel.errcheck = check_vlc_exception
-    libvlc_audio_set_channel.__doc__ = """Set current audio channel.
- at param p_instance vlc instance
- at param channel the audio channel, \see libvlc_audio_output_channel_t
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_release'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.POINTER(VLCException))
-    paramflags=(1,), (3,)
-    libvlc_vlm_release = prototype( ("libvlc_vlm_release", dll), paramflags )
-    libvlc_vlm_release.errcheck = check_vlc_exception
-    libvlc_vlm_release.__doc__ = """Release the vlm instance related to the given libvlc_instance_t
- at param p_instance the instance
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_add_broadcast'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int, ListPOINTER(ctypes.c_char_p), ctypes.c_int, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (3,)
-    libvlc_vlm_add_broadcast = prototype( ("libvlc_vlm_add_broadcast", dll), paramflags )
-    libvlc_vlm_add_broadcast.errcheck = check_vlc_exception
-    libvlc_vlm_add_broadcast.__doc__ = """Add a broadcast, with one input.
- at param p_instance the instance
- at param psz_name the name of the new broadcast
- at param psz_input the input MRL
- at param psz_output the output MRL (the parameter to the "sout" variable)
- at param i_options number of additional options
- at param ppsz_options additional options
- at param b_enabled boolean for enabling the new broadcast
- at param b_loop Should this broadcast be played in loop ?
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_add_vod'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int, ListPOINTER(ctypes.c_char_p), ctypes.c_int, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (1,), (1,), (1,), (1,), (3,)
-    libvlc_vlm_add_vod = prototype( ("libvlc_vlm_add_vod", dll), paramflags )
-    libvlc_vlm_add_vod.errcheck = check_vlc_exception
-    libvlc_vlm_add_vod.__doc__ = """Add a vod, with one input.
- at param p_instance the instance
- at param psz_name the name of the new vod media
- at param psz_input the input MRL
- at param i_options number of additional options
- at param ppsz_options additional options
- at param b_enabled boolean for enabling the new vod
- at param psz_mux the muxer of the vod media
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_del_media'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_vlm_del_media = prototype( ("libvlc_vlm_del_media", dll), paramflags )
-    libvlc_vlm_del_media.errcheck = check_vlc_exception
-    libvlc_vlm_del_media.__doc__ = """Delete a media (VOD or broadcast).
- at param p_instance the instance
- at param psz_name the media to delete
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_set_enabled'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_set_enabled = prototype( ("libvlc_vlm_set_enabled", dll), paramflags )
-    libvlc_vlm_set_enabled.errcheck = check_vlc_exception
-    libvlc_vlm_set_enabled.__doc__ = """Enable or disable a media (VOD or broadcast).
- at param p_instance the instance
- at param psz_name the media to work on
- at param b_enabled the new status
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_set_output'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_set_output = prototype( ("libvlc_vlm_set_output", dll), paramflags )
-    libvlc_vlm_set_output.errcheck = check_vlc_exception
-    libvlc_vlm_set_output.__doc__ = """Set the output for a media.
- at param p_instance the instance
- at param psz_name the media to work on
- at param psz_output the output MRL (the parameter to the "sout" variable)
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_set_input'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_set_input = prototype( ("libvlc_vlm_set_input", dll), paramflags )
-    libvlc_vlm_set_input.errcheck = check_vlc_exception
-    libvlc_vlm_set_input.__doc__ = """Set a media's input MRL. This will delete all existing inputs and
-add the specified one.
- at param p_instance the instance
- at param psz_name the media to work on
- at param psz_input the input MRL
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_add_input'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_add_input = prototype( ("libvlc_vlm_add_input", dll), paramflags )
-    libvlc_vlm_add_input.errcheck = check_vlc_exception
-    libvlc_vlm_add_input.__doc__ = """Add a media's input MRL. This will add the specified one.
- at param p_instance the instance
- at param psz_name the media to work on
- at param psz_input the input MRL
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_set_loop'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_set_loop = prototype( ("libvlc_vlm_set_loop", dll), paramflags )
-    libvlc_vlm_set_loop.errcheck = check_vlc_exception
-    libvlc_vlm_set_loop.__doc__ = """Set a media's loop status.
- at param p_instance the instance
- at param psz_name the media to work on
- at param b_loop the new status
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_set_mux'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_set_mux = prototype( ("libvlc_vlm_set_mux", dll), paramflags )
-    libvlc_vlm_set_mux.errcheck = check_vlc_exception
-    libvlc_vlm_set_mux.__doc__ = """Set a media's vod muxer.
- at param p_instance the instance
- at param psz_name the media to work on
- at param psz_mux the new muxer
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_change_media'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_int, ListPOINTER(ctypes.c_char_p), ctypes.c_int, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (1,), (1,), (1,), (1,), (1,), (3,)
-    libvlc_vlm_change_media = prototype( ("libvlc_vlm_change_media", dll), paramflags )
-    libvlc_vlm_change_media.errcheck = check_vlc_exception
-    libvlc_vlm_change_media.__doc__ = """Edit the parameters of a media. This will delete all existing inputs and
-add the specified one.
- at param p_instance the instance
- at param psz_name the name of the new broadcast
- at param psz_input the input MRL
- at param psz_output the output MRL (the parameter to the "sout" variable)
- at param i_options number of additional options
- at param ppsz_options additional options
- at param b_enabled boolean for enabling the new broadcast
- at param b_loop Should this broadcast be played in loop ?
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_play_media'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_vlm_play_media = prototype( ("libvlc_vlm_play_media", dll), paramflags )
-    libvlc_vlm_play_media.errcheck = check_vlc_exception
-    libvlc_vlm_play_media.__doc__ = """Play the named broadcast.
- at param p_instance the instance
- at param psz_name the name of the broadcast
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_stop_media'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_vlm_stop_media = prototype( ("libvlc_vlm_stop_media", dll), paramflags )
-    libvlc_vlm_stop_media.errcheck = check_vlc_exception
-    libvlc_vlm_stop_media.__doc__ = """Stop the named broadcast.
- at param p_instance the instance
- at param psz_name the name of the broadcast
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_pause_media'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_vlm_pause_media = prototype( ("libvlc_vlm_pause_media", dll), paramflags )
-    libvlc_vlm_pause_media.errcheck = check_vlc_exception
-    libvlc_vlm_pause_media.__doc__ = """Pause the named broadcast.
- at param p_instance the instance
- at param psz_name the name of the broadcast
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_seek_media'):
-    prototype=ctypes.CFUNCTYPE(None, Instance, ctypes.c_char_p, ctypes.c_float, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_seek_media = prototype( ("libvlc_vlm_seek_media", dll), paramflags )
-    libvlc_vlm_seek_media.errcheck = check_vlc_exception
-    libvlc_vlm_seek_media.__doc__ = """Seek in the named broadcast.
- at param p_instance the instance
- at param psz_name the name of the broadcast
- at param f_percentage the percentage to seek to
- at param p_e an initialized exception pointer
-"""
-
-if hasattr(dll, 'libvlc_vlm_show_media'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p, Instance, ctypes.c_char_p, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (3,)
-    libvlc_vlm_show_media = prototype( ("libvlc_vlm_show_media", dll), paramflags )
-    libvlc_vlm_show_media.errcheck = check_vlc_exception
-    libvlc_vlm_show_media.__doc__ = """Return information about the named broadcast.
-\bug will always return NULL
- at param p_instance the instance
- at param psz_name the name of the broadcast
- at param p_e an initialized exception pointer
- at return string with information about named media
-"""
-
-if hasattr(dll, 'libvlc_vlm_get_media_instance_position'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_float, Instance, ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_get_media_instance_position = prototype( ("libvlc_vlm_get_media_instance_position", dll), paramflags )
-    libvlc_vlm_get_media_instance_position.errcheck = check_vlc_exception
-    libvlc_vlm_get_media_instance_position.__doc__ = """Get vlm_media instance position by name or instance id
- at param p_instance a libvlc instance
- at param psz_name name of vlm media instance
- at param i_instance instance id
- at param p_e an initialized exception pointer
- at return position as float
-"""
-
-if hasattr(dll, 'libvlc_vlm_get_media_instance_time'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance, ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_get_media_instance_time = prototype( ("libvlc_vlm_get_media_instance_time", dll), paramflags )
-    libvlc_vlm_get_media_instance_time.errcheck = check_vlc_exception
-    libvlc_vlm_get_media_instance_time.__doc__ = """Get vlm_media instance time by name or instance id
- at param p_instance a libvlc instance
- at param psz_name name of vlm media instance
- at param i_instance instance id
- at param p_e an initialized exception pointer
- at return time as integer
-"""
-
-if hasattr(dll, 'libvlc_vlm_get_media_instance_length'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance, ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_get_media_instance_length = prototype( ("libvlc_vlm_get_media_instance_length", dll), paramflags )
-    libvlc_vlm_get_media_instance_length.errcheck = check_vlc_exception
-    libvlc_vlm_get_media_instance_length.__doc__ = """Get vlm_media instance length by name or instance id
- at param p_instance a libvlc instance
- at param psz_name name of vlm media instance
- at param i_instance instance id
- at param p_e an initialized exception pointer
- at return length of media item
-"""
-
-if hasattr(dll, 'libvlc_vlm_get_media_instance_rate'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance, ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_get_media_instance_rate = prototype( ("libvlc_vlm_get_media_instance_rate", dll), paramflags )
-    libvlc_vlm_get_media_instance_rate.errcheck = check_vlc_exception
-    libvlc_vlm_get_media_instance_rate.__doc__ = """Get vlm_media instance playback rate by name or instance id
- at param p_instance a libvlc instance
- at param psz_name name of vlm media instance
- at param i_instance instance id
- at param p_e an initialized exception pointer
- at return playback rate
-"""
-
-if hasattr(dll, 'libvlc_vlm_get_media_instance_title'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance, ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_get_media_instance_title = prototype( ("libvlc_vlm_get_media_instance_title", dll), paramflags )
-    libvlc_vlm_get_media_instance_title.errcheck = check_vlc_exception
-    libvlc_vlm_get_media_instance_title.__doc__ = """Get vlm_media instance title number by name or instance id
-\bug will always return 0
- at param p_instance a libvlc instance
- at param psz_name name of vlm media instance
- at param i_instance instance id
- at param p_e an initialized exception pointer
- at return title as number
-"""
-
-if hasattr(dll, 'libvlc_vlm_get_media_instance_chapter'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance, ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_get_media_instance_chapter = prototype( ("libvlc_vlm_get_media_instance_chapter", dll), paramflags )
-    libvlc_vlm_get_media_instance_chapter.errcheck = check_vlc_exception
-    libvlc_vlm_get_media_instance_chapter.__doc__ = """Get vlm_media instance chapter number by name or instance id
-\bug will always return 0
- at param p_instance a libvlc instance
- at param psz_name name of vlm media instance
- at param i_instance instance id
- at param p_e an initialized exception pointer
- at return chapter as number
-"""
-
-if hasattr(dll, 'libvlc_vlm_get_media_instance_seekable'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, Instance, ctypes.c_char_p, ctypes.c_int, ctypes.POINTER(VLCException))
-    paramflags=(1,), (1,), (1,), (3,)
-    libvlc_vlm_get_media_instance_seekable = prototype( ("libvlc_vlm_get_media_instance_seekable", dll), paramflags )
-    libvlc_vlm_get_media_instance_seekable.errcheck = check_vlc_exception
-    libvlc_vlm_get_media_instance_seekable.__doc__ = """Is libvlc instance seekable ?
-\bug will always return 0
- at param p_instance a libvlc instance
- at param psz_name name of vlm media instance
- at param i_instance instance id
- at param p_e an initialized exception pointer
- at return 1 if seekable, 0 if not
-"""
-
-if hasattr(dll, 'mediacontrol_RGBPicture__free'):
-    prototype=ctypes.CFUNCTYPE(None, ctypes.POINTER(RGBPicture))
-    paramflags=( (1, ), )
-    mediacontrol_RGBPicture__free = prototype( ("mediacontrol_RGBPicture__free", dll), paramflags )
-    mediacontrol_RGBPicture__free.__doc__ = """Free a RGBPicture structure.
- at param pic: the RGBPicture structure
-"""
-
-if hasattr(dll, 'mediacontrol_StreamInformation__free'):
-    prototype=ctypes.CFUNCTYPE(None, ctypes.POINTER(MediaControlStreamInformation))
-    paramflags=( (1, ), )
-    mediacontrol_StreamInformation__free = prototype( ("mediacontrol_StreamInformation__free", dll), paramflags )
-    mediacontrol_StreamInformation__free.__doc__ = """Free a StreamInformation structure.
- at param pic: the StreamInformation structure
-"""
-
-if hasattr(dll, 'mediacontrol_exception_create'):
-    prototype=ctypes.CFUNCTYPE(MediaControlException)
-    paramflags= tuple()
-    mediacontrol_exception_create = prototype( ("mediacontrol_exception_create", dll), paramflags )
-    mediacontrol_exception_create.__doc__ = """Instanciate and initialize an exception structure.
- at return the exception
-"""
-
-if hasattr(dll, 'mediacontrol_exception_init'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControlException)
-    paramflags=( (1, ), )
-    mediacontrol_exception_init = prototype( ("mediacontrol_exception_init", dll), paramflags )
-    mediacontrol_exception_init.__doc__ = """Initialize an existing exception structure.
- at param p_exception the exception to initialize.
-"""
-
-if hasattr(dll, 'mediacontrol_exception_cleanup'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControlException)
-    paramflags=( (1, ), )
-    mediacontrol_exception_cleanup = prototype( ("mediacontrol_exception_cleanup", dll), paramflags )
-    mediacontrol_exception_cleanup.__doc__ = """Clean up an existing exception structure after use.
- at param p_exception the exception to clean up.
-"""
-
-if hasattr(dll, 'mediacontrol_exception_free'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControlException)
-    paramflags=( (1, ), )
-    mediacontrol_exception_free = prototype( ("mediacontrol_exception_free", dll), paramflags )
-    mediacontrol_exception_free.__doc__ = """Free an exception structure created with mediacontrol_exception_create().
- at return the exception
-"""
-
-if hasattr(dll, 'mediacontrol_new'):
-    prototype=ctypes.CFUNCTYPE(MediaControl, ctypes.c_int, ListPOINTER(ctypes.c_char_p), MediaControlException)
-    paramflags=(1,), (1,), (1,)
-    mediacontrol_new = prototype( ("mediacontrol_new", dll), paramflags )
-    mediacontrol_new.__doc__ = """Create a MediaControl instance with parameters
- at param argc the number of arguments
- at param argv parameters
- at param exception an initialized exception pointer
- at return a mediacontrol_Instance
-"""
-
-if hasattr(dll, 'mediacontrol_new_from_instance'):
-    prototype=ctypes.CFUNCTYPE(MediaControl, Instance, MediaControlException)
-    paramflags=(1,), (1,)
-    mediacontrol_new_from_instance = prototype( ("mediacontrol_new_from_instance", dll), paramflags )
-    mediacontrol_new_from_instance.__doc__ = """Create a MediaControl instance from an existing libvlc instance
- at param p_instance the libvlc instance
- at param exception an initialized exception pointer
- at return a mediacontrol_Instance
-"""
-
-if hasattr(dll, 'mediacontrol_get_libvlc_instance'):
-    prototype=ctypes.CFUNCTYPE(Instance, MediaControl)
-    paramflags=( (1, ), )
-    mediacontrol_get_libvlc_instance = prototype( ("mediacontrol_get_libvlc_instance", dll), paramflags )
-    mediacontrol_get_libvlc_instance.__doc__ = """Get the associated libvlc instance
- at param self: the mediacontrol instance
- at return a libvlc instance
-"""
-
-if hasattr(dll, 'mediacontrol_get_media_player'):
-    prototype=ctypes.CFUNCTYPE(MediaPlayer, MediaControl)
-    paramflags=( (1, ), )
-    mediacontrol_get_media_player = prototype( ("mediacontrol_get_media_player", dll), paramflags )
-    mediacontrol_get_media_player.__doc__ = """Get the associated libvlc_media_player
- at param self: the mediacontrol instance
- at return a libvlc_media_player_t instance
-"""
-
-if hasattr(dll, 'mediacontrol_get_media_position'):
-    prototype=ctypes.CFUNCTYPE(ctypes.POINTER(MediaControlPosition), MediaControl, PositionOrigin, PositionKey, MediaControlException)
-    paramflags=(1,), (1,), (1,), (1,)
-    mediacontrol_get_media_position = prototype( ("mediacontrol_get_media_position", dll), paramflags )
-    mediacontrol_get_media_position.__doc__ = """Get the current position
- at param self the mediacontrol instance
- at param an_origin the position origin
- at param a_key the position unit
- at param exception an initialized exception pointer
- at return a mediacontrol_Position
-"""
-
-if hasattr(dll, 'mediacontrol_set_media_position'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControl, ctypes.POINTER(MediaControlPosition), MediaControlException)
-    paramflags=(1,), (1,), (1,)
-    mediacontrol_set_media_position = prototype( ("mediacontrol_set_media_position", dll), paramflags )
-    mediacontrol_set_media_position.__doc__ = """Set the position
- at param self the mediacontrol instance
- at param a_position a mediacontrol_Position
- at param exception an initialized exception pointer
-"""
-
-if hasattr(dll, 'mediacontrol_start'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControl, ctypes.POINTER(MediaControlPosition), MediaControlException)
-    paramflags=(1,), (1,), (1,)
-    mediacontrol_start = prototype( ("mediacontrol_start", dll), paramflags )
-    mediacontrol_start.__doc__ = """Play the movie at a given position
- at param self the mediacontrol instance
- at param a_position a mediacontrol_Position
- at param exception an initialized exception pointer
-"""
-
-if hasattr(dll, 'mediacontrol_pause'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControl, MediaControlException)
-    paramflags=(1,), (1,)
-    mediacontrol_pause = prototype( ("mediacontrol_pause", dll), paramflags )
-    mediacontrol_pause.__doc__ = """Pause the movie at a given position
- at param self the mediacontrol instance
- at param exception an initialized exception pointer
-"""
-
-if hasattr(dll, 'mediacontrol_resume'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControl, MediaControlException)
-    paramflags=(1,), (1,)
-    mediacontrol_resume = prototype( ("mediacontrol_resume", dll), paramflags )
-    mediacontrol_resume.__doc__ = """Resume the movie at a given position
- at param self the mediacontrol instance
- at param exception an initialized exception pointer
-"""
-
-if hasattr(dll, 'mediacontrol_stop'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControl, MediaControlException)
-    paramflags=(1,), (1,)
-    mediacontrol_stop = prototype( ("mediacontrol_stop", dll), paramflags )
-    mediacontrol_stop.__doc__ = """Stop the movie at a given position
- at param self the mediacontrol instance
- at param exception an initialized exception pointer
-"""
-
-if hasattr(dll, 'mediacontrol_exit'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControl)
-    paramflags=( (1, ), )
-    mediacontrol_exit = prototype( ("mediacontrol_exit", dll), paramflags )
-    mediacontrol_exit.__doc__ = """Exit the player
- at param self the mediacontrol instance
-"""
-
-if hasattr(dll, 'mediacontrol_set_mrl'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControl, ctypes.c_char_p, MediaControlException)
-    paramflags=(1,), (1,), (1,)
-    mediacontrol_set_mrl = prototype( ("mediacontrol_set_mrl", dll), paramflags )
-    mediacontrol_set_mrl.__doc__ = """Set the MRL to be played.
- at param self the mediacontrol instance
- at param psz_file the MRL
- at param exception an initialized exception pointer
-"""
-
-if hasattr(dll, 'mediacontrol_get_mrl'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_char_p, MediaControl, MediaControlException)
-    paramflags=(1,), (1,)
-    mediacontrol_get_mrl = prototype( ("mediacontrol_get_mrl", dll), paramflags )
-    mediacontrol_get_mrl.__doc__ = """Get the MRL to be played.
- at param self the mediacontrol instance
- at param exception an initialized exception pointer
-"""
-
-if hasattr(dll, 'mediacontrol_snapshot'):
-    prototype=ctypes.CFUNCTYPE(ctypes.POINTER(RGBPicture), MediaControl, ctypes.POINTER(MediaControlPosition), MediaControlException)
-    paramflags=(1,), (1,), (1,)
-    mediacontrol_snapshot = prototype( ("mediacontrol_snapshot", dll), paramflags )
-    mediacontrol_snapshot.__doc__ = """Get a snapshot
- at param self the mediacontrol instance
- at param a_position the desired position (ignored for now)
- at param exception an initialized exception pointer
- at return a RGBpicture
-"""
-
-if hasattr(dll, 'mediacontrol_display_text'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControl, ctypes.c_char_p, ctypes.POINTER(MediaControlPosition), ctypes.POINTER(MediaControlPosition), MediaControlException)
-    paramflags=(1,), (1,), (1,), (1,), (1,)
-    mediacontrol_display_text = prototype( ("mediacontrol_display_text", dll), paramflags )
-    mediacontrol_display_text.__doc__ = """ Displays the message string, between "begin" and "end" positions.
- at param self the mediacontrol instance
- at param message the message to display
- at param begin the begin position
- at param end the end position
- at param exception an initialized exception pointer
-"""
-
-if hasattr(dll, 'mediacontrol_get_stream_information'):
-    prototype=ctypes.CFUNCTYPE(ctypes.POINTER(MediaControlStreamInformation), MediaControl, PositionKey, MediaControlException)
-    paramflags=(1,), (1,), (1,)
-    mediacontrol_get_stream_information = prototype( ("mediacontrol_get_stream_information", dll), paramflags )
-    mediacontrol_get_stream_information.__doc__ = """ Get information about a stream
- at param self the mediacontrol instance
- at param a_key the time unit
- at param exception an initialized exception pointer
- at return a mediacontrol_StreamInformation
-"""
-
-if hasattr(dll, 'mediacontrol_sound_get_volume'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_short, MediaControl, MediaControlException)
-    paramflags=(1,), (1,)
-    mediacontrol_sound_get_volume = prototype( ("mediacontrol_sound_get_volume", dll), paramflags )
-    mediacontrol_sound_get_volume.__doc__ = """Get the current audio level, normalized in [0..100]
- at param self the mediacontrol instance
- at param exception an initialized exception pointer
- at return the volume
-"""
-
-if hasattr(dll, 'mediacontrol_sound_set_volume'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControl, ctypes.c_short, MediaControlException)
-    paramflags=(1,), (1,), (1,)
-    mediacontrol_sound_set_volume = prototype( ("mediacontrol_sound_set_volume", dll), paramflags )
-    mediacontrol_sound_set_volume.__doc__ = """Set the audio level
- at param self the mediacontrol instance
- at param volume the volume (normalized in [0..100])
- at param exception an initialized exception pointer
-"""
-
-if hasattr(dll, 'mediacontrol_set_visual'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaControl, ctypes.c_ulong, MediaControlException)
-    paramflags=(1,), (1,), (1,)
-    mediacontrol_set_visual = prototype( ("mediacontrol_set_visual", dll), paramflags )
-    mediacontrol_set_visual.__doc__ = """Set the video output window
- at param self the mediacontrol instance
- at param visual_id the Xid or HWND, depending on the platform
- at param exception an initialized exception pointer
-"""
-
-if hasattr(dll, 'mediacontrol_get_rate'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaControl, MediaControlException)
-    paramflags=(1,), (1,)
-    mediacontrol_get_rate = prototype( ("mediacontrol_get_rate", dll), paramflags )
-    mediacontrol_get_rate.__doc__ = """Get the current playing rate, in percent
- at param self the mediacontrol instance
- at param exception an initialized exception pointer
- at return the rate
-"""
-
-if hasattr(dll, 'mediacontrol_set_rate'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControl, ctypes.c_int, MediaControlException)
-    paramflags=(1,), (1,), (1,)
-    mediacontrol_set_rate = prototype( ("mediacontrol_set_rate", dll), paramflags )
-    mediacontrol_set_rate.__doc__ = """Set the playing rate, in percent
- at param self the mediacontrol instance
- at param rate the desired rate
- at param exception an initialized exception pointer
-"""
-
-if hasattr(dll, 'mediacontrol_get_fullscreen'):
-    prototype=ctypes.CFUNCTYPE(ctypes.c_int, MediaControl, MediaControlException)
-    paramflags=(1,), (1,)
-    mediacontrol_get_fullscreen = prototype( ("mediacontrol_get_fullscreen", dll), paramflags )
-    mediacontrol_get_fullscreen.__doc__ = """Get current fullscreen status
- at param self the mediacontrol instance
- at param exception an initialized exception pointer
- at return the fullscreen status
-"""
-
-if hasattr(dll, 'mediacontrol_set_fullscreen'):
-    prototype=ctypes.CFUNCTYPE(None, MediaControl, ctypes.c_int, MediaControlException)
-    paramflags=(1,), (1,), (1,)
-    mediacontrol_set_fullscreen = prototype( ("mediacontrol_set_fullscreen", dll), paramflags )
-    mediacontrol_set_fullscreen.__doc__ = """Set fullscreen status
- at param self the mediacontrol instance
- at param b_fullscreen the desired status
- at param exception an initialized exception pointer
-"""
-
-### Start of footer.py ###
-
-class MediaEvent(ctypes.Structure):
-    _fields_ = [
-        ('media_name', ctypes.c_char_p),
-        ('instance_name', ctypes.c_char_p),
-        ]
-
-class EventUnion(ctypes.Union):
-    _fields_ = [
-        ('meta_type', ctypes.c_uint),
-        ('new_child', ctypes.c_uint),
-        ('new_duration', ctypes.c_longlong),
-        ('new_status', ctypes.c_int),
-        ('media', ctypes.c_void_p),
-        ('new_state', ctypes.c_uint),
-        # Media instance
-        ('new_position', ctypes.c_float),
-        ('new_time', ctypes.c_longlong),
-        ('new_title', ctypes.c_int),
-        ('new_seekable', ctypes.c_longlong),
-        ('new_pausable', ctypes.c_longlong),
-        # FIXME: Skipped MediaList and MediaListView...
-        ('filename', ctypes.c_char_p),
-        ('new_length', ctypes.c_longlong),
-        ('media_event', MediaEvent),
-        ]
-
-class Event(ctypes.Structure):
-    _fields_ = [
-        ('type', EventType),
-        ('object', ctypes.c_void_p),
-        ('u', EventUnion),
-        ]
-
-# Decorator for callback methods
-callbackmethod=ctypes.CFUNCTYPE(None, Event, ctypes.c_void_p)
-
-# Example callback method
- at callbackmethod
-def debug_callback(event, data):
-    print "Debug callback method"
-    print "Event:", event.type
-    print "Data", data
-
-if __name__ == '__main__':
-    try:
-        from msvcrt import getch
-    except ImportError:
-        def getch():
-            import tty
-            import termios
-            fd=sys.stdin.fileno()
-            old_settings=termios.tcgetattr(fd)
-            try:
-                tty.setraw(fd)
-                ch=sys.stdin.read(1)
-            finally:
-                termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
-            return ch
-
-    @callbackmethod
-    def end_callback(event, data):
-        print "End of stream"
-        sys.exit(0)
-
-    if sys.argv[1:]:
-        instance=Instance()
-        media=instance.media_new(sys.argv[1])
-        player=instance.media_player_new()
-        player.set_media(media)
-        player.play()
-
-        event_manager=player.event_manager()
-        event_manager.event_attach(EventType.MediaPlayerEndReached, end_callback, None)
-
-        def print_info():
-            """Print information about the media."""
-            media=player.get_media()
-            print "State:", player.get_state()
-            print "Media:", media.get_mrl()
-            try:
-                print "Current time:", player.get_time(), "/", media.get_duration()
-                print "Position:", player.get_position()
-                print "FPS:", player.get_fps()
-                print "Rate:", player.get_rate()
-                print "Video size: (%d, %d)" % (player.video_get_width(), player.video_get_height())
-            except Exception:
-                pass
-
-        def forward():
-            """Go forward 1s"""
-            player.set_time(player.get_time() + 1000)
-
-        def one_frame_forward():
-            """Go forward one frame"""
-            player.set_time(player.get_time() + long(1000 / (player.get_fps() or 25)))
-
-        def one_frame_backward():
-            """Go backward one frame"""
-            player.set_time(player.get_time() - long(1000 / (player.get_fps() or 25)))
-
-        def backward():
-            """Go backward 1s"""
-            player.set_time(player.get_time() - 1000)
-
-        def print_help():
-            """Print help
-            """
-            print "Commands:"
-            for k, m in keybindings.iteritems():
-                print "  %s: %s" % (k, (m.__doc__ or m.__name__).splitlines()[0])
-            print " 1-9: go to the given fraction of the movie"
-
-        def quit_app():
-            """Exit."""
-            sys.exit(0)
-
-        keybindings={
-            'f': player.toggle_fullscreen,
-            ' ': player.pause,
-            '+': forward,
-            '-': backward,
-            '.': one_frame_forward,
-            ',': one_frame_backward,
-            '?': print_help,
-            'i': print_info,
-            'q': quit_app,
-            }
-
-        print "Press q to quit, ? to get help."
-        while True:
-            k=getch()
-            o=ord(k)
-            method=keybindings.get(k, None)
-            if method is not None:
-                method()
-            elif o >= 49 and o <= 57:
-                # Numeric value. Jump to a fraction of the movie.
-                v=0.1*(o-48)
-                player.set_position(v)
-
-
-# Not wrapped methods:
-#    libvlc_get_version
-#    libvlc_exception_get_message
-#    libvlc_media_list_view_remove_at_index
-#    libvlc_media_list_view_insert_at_index
-#    libvlc_get_compiler
-#    mediacontrol_RGBPicture__free
-#    libvlc_free
-#    libvlc_event_type_name
-#    libvlc_get_vlc_instance
-#    libvlc_media_list_view_add_item
-#    libvlc_get_changeset
-#    libvlc_exception_init
-#    mediacontrol_exception_init
-#    mediacontrol_exception_create
-#    libvlc_new
-#    mediacontrol_exception_cleanup
-#    libvlc_exception_raise
-#    mediacontrol_new
-#    libvlc_media_list_view_index_of_item
-#    libvlc_exception_raised
-#    mediacontrol_StreamInformation__free
-#    mediacontrol_PlaylistSeq__free
-#    libvlc_exception_clear
-#    mediacontrol_exception_free
diff --git a/lib/advene/player/vlcctypes.py b/lib/advene/player/vlcctypes.py
deleted file mode 100644
index dc2e46e..0000000
--- a/lib/advene/player/vlcctypes.py
+++ /dev/null
@@ -1,368 +0,0 @@
-#
-# Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2009-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-#
-# Advene is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# Advene is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Advene; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-"""VLC access using the python ctypes-based module.
-"""
-
-import advene.core.config as config
-import os
-
-try:
-    import advene.player.vlc as vlc
-except ImportError:
-    vlc=None
-
-name="VLC-ctypes video player"
-
-def register(controller=None):
-    if vlc is None:
-        return False
-    controller.register_player(Player)
-    return True
-
-if vlc is not None:
-    # Shortcut used for get_stream_information
-    MediaTime=vlc.PositionKey.MediaTime
-
-    # We store Status information as int, so that it is hashable
-    PlayingStatus=vlc.PlayerStatus.PlayingStatus.value
-    PauseStatus=vlc.PlayerStatus.PauseStatus.value
-    InitStatus=vlc.PlayerStatus.InitStatus.value
-    EndStatus=vlc.PlayerStatus.EndStatus.value
-    UndefinedStatus=vlc.PlayerStatus.UndefinedStatus.value
-
-class Player(object):
-    """Wrapper class for a native vlc.MediaControl object.
-
-    It provides some helper methods, and forwards other requests to
-    the vlc.MediaControl object.
-
-    @ivar mc: the vlc.MediaControl player
-    @type mc: vlc.MediaControl
-
-    @ivar relative_position: a predefined position (0-relative)
-    @type relative_position: vlc.Position
-
-    Status attributes :
-
-    @ivar current_position_value: the current player position (in ms)
-    @type current_position_value: int
-    @ivar stream_duration: the current stream duration
-    @type stream_duration: long
-    @ivar status: the player's current status
-    @type status: vlc.Status
-    """
-    player_id='vlc'
-    player_capabilities=[ 'seek', 'pause', 'caption', 'svg' ]
-
-    if vlc is not None:
-        # Class attributes
-        AbsolutePosition=vlc.PositionOrigin.AbsolutePosition
-        RelativePosition=vlc.PositionOrigin.RelativePosition
-        ModuloPosition=vlc.PositionOrigin.ModuloPosition
-
-        ByteCount=vlc.PositionKey.ByteCount
-        SampleCount=vlc.PositionKey.SampleCount
-        MediaTime=vlc.PositionKey.MediaTime
-
-        # Status
-        PlayingStatus=vlc.PlayerStatus.PlayingStatus.value
-        PauseStatus=vlc.PlayerStatus.PauseStatus.value
-        InitStatus=vlc.PlayerStatus.InitStatus.value
-        EndStatus=vlc.PlayerStatus.EndStatus.value
-        UndefinedStatus=vlc.PlayerStatus.UndefinedStatus.value
-
-        # Exceptions
-        PositionKeyNotSupported=vlc.MediaControlException
-        PositionOriginNotSupported=vlc.MediaControlException
-        InvalidPosition=vlc.MediaControlException
-        class PlaylistException(Exception):
-            pass
-        class InternalException(Exception):
-            pass
-
-    def __getattribute__ (self, name):
-        """
-        Use the defined method if necessary. Else, forward the request
-        to the mc object
-        """
-        #print "********************** Getattr", name
-        try:
-            return object.__getattribute__ (self, name)
-        except AttributeError, e:
-            return self.mc.__getattribute__ (name)
-            raise self.InternalException(e)
-
-    def fullscreen(self, connect=None):
-        self.mc.set_fullscreen(True)
-        return True
-
-    def playlist_add_item(self, name):
-        self.mc.set_mrl(name)
-
-    def playlist_clear(self):
-        self.mc.set_mrl('')
-
-    def playlist_get_list(self):
-        return [ self.mc.get_mrl() ]
-
-    def is_active (self):
-        """Checks whether the player is active.
-
-        @return: True if the player process is active.
-        @rtype: boolean
-        """
-        return True
-
-    def stop_player(self):
-        """Stop the player."""
-        return
-
-    def get_player_args (self):
-        """Build the VLC player argument list.
-
-        @return: the list of arguments
-        """
-        args=[]
-        filters=[]
-
-        args.append( '--intf=dummy' )
-
-        if os.path.isdir(config.data.path['plugins']):
-            args.append( '--plugin-path=%s' % config.data.path['plugins'] )
-        if config.data.player['verbose'] is not None:
-            args.append ('--verbose')
-            args.append (config.data.player['verbose'])
-        if config.data.player['vout'] != 'default':
-            args.append( '--vout=%s' % config.data.player['vout'] )
-        if config.data.player['svg']:
-            args.append( '--text-renderer=svg' )
-        if config.data.player['bundled']:
-            args.append( '--no-plugins-cache' )
-        if filters != []:
-            # Some filters have been defined
-            args.append ('--vout-filter=%s' %":".join(filters))
-        #print "player args", args
-        return [ str(i) for i in args ]
-
-    def restart_player (self):
-        """Restart (cleanly) the player."""
-        del self.mc
-
-        self.args=self.get_player_args()
-
-        print "Before MC instanciation"
-        self.mc = vlc.MediaControl( self.args )
-        print "After MC instanciation"
-
-        # 0 relative position
-        pos = vlc.MediaControlPosition ()
-        pos.origin = self.RelativePosition
-        pos.key = self.MediaTime
-        pos.value = 0
-        self.relative_position = pos
-
-        self.dvd_device = config.data.player['dvd-device']
-
-        # Attributes updated by self.position_update
-        self.status = UndefinedStatus
-        self.current_position_value = 0
-        self.stream_duration = 0
-
-        return True
-
-    def exit (self):
-        self.stop_player()
-
-    def get_default_media (self):
-        """Return the default media path (used when starting the player).
-
-        This method should be overriden by the mediacontrol parent.
-        """
-        return None
-
-    def __init__ (self):
-        """Wrapper initialization.
-        """
-        self.mc=None
-        self.mute_volume=None
-        self.restart_player()
-
-    def update_status (self, status=None, position=None):
-        """Update the player status.
-
-        Defined status:
-           - C{start}
-           - C{pause}
-           - C{resume}
-           - C{stop}
-           - C{set}
-
-        If no status is given, it only updates the value of self.status
-
-        If C{position} is None, it will be considered as zero for the
-        "start" action, and as the current relative position for other
-        actions.
-
-        @param status: the new status
-        @type status: string
-        @param position: the position
-        @type position: vlc.Position
-        """
-        print "update_status", status
-
-        if status == "start":
-            if position is None:
-                position=self.create_position(0, self.MediaTime, self.AbsolutePosition)
-            elif not isinstance(position, vlc.MediaControlPosition):
-                p=long(position)
-                position=self.create_position(p, self.MediaTime, self.AbsolutePosition)
-            self.check_player ()
-            self.mc.start(position)
-            # Workaround for the unstable position parameter handling by start
-            self.mc.set_media_position(position)
-        else:
-            if position is None:
-                position = self.relative_position
-            elif not isinstance(position, vlc.MediaControlPosition):
-                p=long(position)
-                position=self.create_position(p, self.MediaTime, self.AbsolutePosition)
-            if status == "pause":
-                self.check_player ()
-                if self.status == PlayingStatus:
-                    self.mc.pause ()
-                elif self.status == PauseStatus:
-                    self.mc.resume ()
-            elif status == "resume":
-                self.check_player()
-                if self.status == PauseStatus:
-                    self.mc.resume ()
-                else:
-                    self.mc.start (position)
-            elif status == "stop":
-                self.check_player()
-                if not self.status in (EndStatus, UndefinedStatus):
-                    self.mc.stop ()
-            elif status == "set":
-                self.check_player()
-                if self.status in (EndStatus, UndefinedStatus):
-                    self.mc.start (position)
-                else:
-                    self.mc.set_media_position (position)
-            elif status == "" or status == None:
-                pass
-            else:
-                print "******* Error : unknown status %s in mediacontrol.py" % status
-
-        self.position_update ()
-
-    def position_update (self):
-        """Updates the current status information."""
-        mc=getattr(self, 'mc', None)
-        if mc is not None:
-            try:
-                s = mc.get_stream_information(MediaTime)
-            except Exception, e:
-                print "Exception", str(e)
-                raise self.InternalException(str(e))
-            # Make sure we store the (python) value of the status
-            self.status = s.status.value
-            self.stream_duration = s.length
-            self.current_position_value = s.position
-            self.url=s.url
-            # FIXME: the returned values are wrong just after a player start
-            # (pressing Play button)
-            # Workaround for now:
-            # If the duration is larger than 24h, then set it to 0
-            if self.stream_duration > 86400000:
-                self.stream_duration = 0
-                self.current_position_value = 0
-        else:
-            self.status = UndefinedStatus
-            self.stream_duration = 0
-            self.current_position_value = 0
-            self.url=''
-
-    def dvd_uri(self, title=None, chapter=None):
-        if self.dvd_device is None:
-            return ""
-        else:
-            return "dvdsimple://%s@%s:%s" % (self.dvd_device,
-                                             str(title),
-                                             str(chapter))
-
-    def create_position (self, value=0, key=None, origin=None):
-        """Create a Position.
-
-        Returns a Position object initialized to the right value, by
-        default using a MediaTime in AbsolutePosition.
-
-        @param value: the value
-        @type value: int
-        @param key: the Position key
-        @type key: vlc.Key
-        @param origin: the Position origin
-        @type origin: vlc.Origin
-        @return: a position
-        @rtype: vlc.Position
-        """
-        if key is None:
-            key=self.MediaTime
-        if origin is None:
-            origin=self.AbsolutePosition
-        p = vlc.MediaControlPosition ()
-        p.origin = origin
-        p.key = key
-        p.value=long(value)
-        return p
-
-    def check_player(self):
-        return True
-
-    def snapshot(self, position):
-        # Do not update the snapshot if we are not playing
-        if self.status != PlayingStatus:
-            return None
-        # FIXME: dirty hack to workaround a bug in VLC snapshot
-        # functionality (unstability of the GUI when taking a snapshot
-        # < 100ms)
-        if (self.current_position_value <= 100 and
-            (config.data.os == 'win32' or config.data.os == 'darwin')):
-            print "Snapshots <=100ms dropped"
-            return None
-        s=self.mc.snapshot(position)
-        return s
-
-    def set_visual(self, xid):
-        if xid:
-            self.mc.set_visual(xid)
-
-    def sound_mute(self):
-        if self.mute_volume is None:
-            self.mute_volume=self.sound_get_volume()
-            self.sound_set_volume(0)
-        return
-
-    def sound_unmute(self):
-        if self.mute_volume is not None:
-            self.sound_set_volume(self.mute_volume)
-            self.mute_volume=None
-        return
-
-    def sound_is_muted(self):
-        return (self.mute_volume is not None)
diff --git a/lib/advene/plugins/__init__.py b/lib/advene/plugins/__init__.py
index dc5e3f5..dc19bba 100644
--- a/lib/advene/plugins/__init__.py
+++ b/lib/advene/plugins/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/plugins/aeidon_import.py b/lib/advene/plugins/aeidon_import.py
index df563df..395743f 100644
--- a/lib/advene/plugins/aeidon_import.py
+++ b/lib/advene/plugins/aeidon_import.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,6 +20,8 @@
 # AEIDON importer
 # See http://home.gna.org/gaupol/
 # Install python-aeidon on Debian
+import logging
+logger = logging.getLogger(__name__)
 
 name="AEIDON importer"
 
@@ -68,8 +70,8 @@ class AeidonImporter(GenericImporter):
                     project.open_main(filename, encoding='latin1')
                 except UnicodeError:
                     return
-        except Exception, e:
-            print "AEIDON: ", unicode(e)
+        except:
+            logger.error("Cannot process file ", exc_info=True)
             return
         p, at = self.init_package(filename=dest,
                                   schemaid='subtitle', annotationtypeid=project.main_file.format.name)
@@ -91,15 +93,16 @@ class AeidonImporter(GenericImporter):
             yield {
                 'type': self.annotationtype,
                 'content': s.main_text,
-                'begin': long(s.start_seconds * 1000),
-                'duration': long(s.duration_seconds * 1000)
+                'begin': int(s.start_seconds * 1000),
+                'duration': int(s.duration_seconds * 1000)
                 }
         self.progress(1.0)
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
     import sys
     if len(sys.argv) < 3:
-        print "Should provide a file name and a package name"
+        logger.error("Should provide a file name and a package name")
         sys.exit(1)
 
     fname=sys.argv[1]
@@ -110,7 +113,7 @@ if __name__ == "__main__":
     # FIXME: i.process_options()
     i.process_options(sys.argv[1:])
     # (for .sub conversion for instance, --fps, --offset)
-    print "Converting %s to %s using %s" % (fname, pname, i.name)
+    logger.info("Converting %s to %s using %s", fname, pname, i.name)
     p=i.process_file(fname)
     p.save(pname)
-    print i.statistics_formatted()
+    logger.info(i.statistics_formatted())
diff --git a/lib/advene/plugins/annotationgraph.py b/lib/advene/plugins/annotationgraph.py
index bfbf8ac..1a11b17 100644
--- a/lib/advene/plugins/annotationgraph.py
+++ b/lib/advene/plugins/annotationgraph.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -21,6 +21,9 @@
 
 name="AnnotationGraph importer"
 
+import logging
+logger = logging.getLogger(__name__)
+
 from gettext import gettext as _
 
 import advene.core.config as config
@@ -62,7 +65,7 @@ class AnnotationGraphImporter(GenericImporter):
         video=root.find('%s/%s' % (tag('Timeline'), tag('Signal')))
         if video is not None:
             mediafile=video.attrib[ET.QName(XLINKURI, 'href')]
-            p.setMetaData(config.data.namespace, 'mediafile', mediafile)
+            p.setMedia(mediafile)
         self.convert(self.iterator(root))
         self.progress(1.0)
         return self.package
@@ -70,7 +73,7 @@ class AnnotationGraphImporter(GenericImporter):
     def iterator(self, root):
         schema=self.package.get_element_by_id('ag')
         if root.tag != tag('AGSet'):
-            print "Invalid AnnotationGraph file format: ", root.tag
+            logger.error("Invalid AnnotationGraph file format: %s", root.tag)
             return
 
         # Import anchors
@@ -78,8 +81,8 @@ class AnnotationGraphImporter(GenericImporter):
         for anchor in root.findall('%s/%s' % (tag('AG'), tag('Anchor'))):
             # FIXME: in multisignal version, use the appropriate signal
             if anchor.attrib['unit'] != 'milliseconds':
-                print "Unhandled anchor unit (", anchor.attrib['unit'], ") Positioning will be wrong."
-            self.anchors[anchor.attrib['id']]=long(anchor.attrib['offset'])
+                logger.error("Unhandled anchor unit (%s) Positioning will be wrong.", anchor.attrib['unit'])
+            self.anchors[anchor.attrib['id']]=int(anchor.attrib['offset'])
         ats={}
         attribs={}
 
@@ -108,7 +111,7 @@ class AnnotationGraphImporter(GenericImporter):
                 'end': self.anchors[an.attrib['end']],
                 }
 
-        for typename, atnames in attribs.iteritems():
+        for typename, atnames in attribs.items():
             if len(atnames) == 1:
                 n=list(atnames)[0]
                 # Only 1 attribute name. Define an appropriate
@@ -120,9 +123,10 @@ class AnnotationGraphImporter(GenericImporter):
         self.progress(1.0)
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
     import sys
     if len(sys.argv) < 3:
-        print "Should provide a file name and a package name"
+        logger.error("Should provide a file name and a package name")
         sys.exit(1)
 
     fname=sys.argv[1]
@@ -133,7 +137,7 @@ if __name__ == "__main__":
     # FIXME: i.process_options()
     i.process_options(sys.argv[1:])
     # (for .sub conversion for instance, --fps, --offset)
-    print "Converting %s to %s using %s" % (fname, pname, i.name)
+    logger.info("Converting %s to %s using %s", fname, pname, i.name)
     p=i.process_file(fname)
     p.save(pname)
-    print i.statistics_formatted()
+    logger.info(i.statistics_formatted())
diff --git a/lib/advene/plugins/anvil.py b/lib/advene/plugins/anvil.py
index 775fd79..b5b3602 100644
--- a/lib/advene/plugins/anvil.py
+++ b/lib/advene/plugins/anvil.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -21,6 +21,9 @@
 
 name="Anvil importer"
 
+import logging
+logger = logging.getLogger(__name__)
+
 from gettext import gettext as _
 
 import advene.core.config as config
@@ -55,7 +58,7 @@ class AnvilImporter(GenericImporter):
         video=root.find('head/video')
         if video is not None:
             mediafile=video.attrib['src']
-            p.setMetaData(config.data.namespace, 'mediafile', mediafile)
+            p.setMedia(mediafile)
         self.convert(self.iterator(root))
         self.progress(1.0)
         return self.package
@@ -63,7 +66,7 @@ class AnvilImporter(GenericImporter):
     def iterator(self, root):
         schema=self.package.get_element_by_id('anvil')
         if root.tag != 'annotation':
-            print "Invalid Anvil file format: ", root.tag
+            logger.error("Invalid Anvil file format: %s", root.tag)
             return
 
         progress=0.01
@@ -85,8 +88,8 @@ class AnvilImporter(GenericImporter):
                 yield {
                     'type': at,
                     'content': content,
-                    'begin': long(float(el.attrib['start']) * 1000),
-                    'end': long(float(el.attrib['end']) * 1000),
+                    'begin': int(float(el.attrib['start']) * 1000),
+                    'end': int(float(el.attrib['end']) * 1000),
                     }
             if len(attribnames) == 1:
                 n=list(attribnames)[0]
@@ -98,9 +101,10 @@ class AnvilImporter(GenericImporter):
         self.progress(1.0)
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
     import sys
     if len(sys.argv) < 3:
-        print "Should provide a file name and a package name"
+        logger.error("Should provide a file name and a package name")
         sys.exit(1)
 
     fname=sys.argv[1]
@@ -111,7 +115,7 @@ if __name__ == "__main__":
     # FIXME: i.process_options()
     i.process_options(sys.argv[1:])
     # (for .sub conversion for instance, --fps, --offset)
-    print "Converting %s to %s using %s" % (fname, pname, i.name)
+    logger.info("Converting %s to %s using %s", fname, pname, i.name)
     p=i.process_file(fname)
     p.save(pname)
-    print i.statistics_formatted()
+    logger.info(i.statistics_formatted())
diff --git a/lib/advene/plugins/brltty.py b/lib/advene/plugins/brltty.py
index 09d05c4..bf65d99 100644
--- a/lib/advene/plugins/brltty.py
+++ b/lib/advene/plugins/brltty.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,9 +16,11 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+import logging
+logger = logging.getLogger(__name__)
 
 from gettext import gettext as _
-import gobject
+from gi.repository import GObject
 
 try:
     import brlapi
@@ -69,8 +71,8 @@ def register(controller=None):
         try:
             engine.init_brlapi()
             if engine.brlconnection is not None:
-                gobject.io_add_watch(engine.brlconnection.fileDescriptor,
-                                     gobject.IO_IN,
+                GObject.io_add_watch(engine.brlconnection.fileDescriptor,
+                                     GObject.IO_IN,
                                      engine.input_handler)
                 method=engine.action_brldisplay
                 engine.brldisplay("Advene connected")
@@ -109,7 +111,7 @@ class BrlEngine:
 
     def generate_reverse_mapping(self):
         self.revmap={}
-        for n, v in brlapi.__dict__.iteritems():
+        for n, v in brlapi.__dict__.items():
             if n.startswith('KEY_'):
                 self.revmap[v]=n
 
@@ -135,7 +137,7 @@ class BrlEngine:
                     bookmark=v.bookmarks[index]
                 except IndexError:
                     return
-            self.controller.move_position(bookmark.begin, relative=False)
+            self.controller.update_status("seek", bookmark.begin)
             v.set_current_bookmark(bookmark)
             self.brldisplay(bookmark.content)
             return
@@ -159,7 +161,7 @@ class BrlEngine:
                    for an in self.controller.future_begins
                    if an[0].type == self.currenttype ]
                 if l:
-                    self.controller.queue_action(self.controller.update_status, 'set', l[0][1])
+                    self.controller.queue_action(self.controller.update_status, 'seek', l[0][1])
         elif k == brlapi.KEY_SYM_LEFT or k == ALVA_LPAD_LEFT or k == ALVA_MPAD_BUTTON1:
             if self.currenttype == 'scroll':
                 if self.char_index >= 0:
@@ -175,7 +177,7 @@ class BrlEngine:
                 l=[ an for an in self.currenttype.annotations if an.fragment.end < pos ]
                 l.sort(key=lambda a: a.fragment.begin, reverse=True)
                 if l:
-                    self.controller.queue_action(self.controller.update_status, 'set', l[0].fragment.begin)
+                    self.controller.queue_action(self.controller.update_status, 'seek', l[0].fragment.begin)
         elif k == brlapi.KEY_SYM_UP or k == brlapi.KEY_SYM_DOWN or k == ALVA_LPAD_UP or k == ALVA_LPAD_DOWN:
             types=list( self.controller.package.annotationTypes )
             types.sort(key=lambda at: at.title or at.id)
@@ -220,11 +222,11 @@ class BrlEngine:
                 return True
             if self.revmap is None:
                 self.generate_reverse_mapping()
-            print "brltty: unknown key ", k, "expanded", str(d)
+            logger.error("brltty: unknown key %s - expanded %s", k, str(d))
             if k in self.revmap:
-                print "Symbol", self.revmap[k]
+                logger.info("Symbol %s", self.revmap[k])
             elif d['command'] in self.revmap:
-                print "Command", self.revmap[d['command']]
+                logger.info("Command %s", self.revmap[d['command']])
         return True
 
     def parse_parameter(self, context, parameters, name, default_value):
@@ -233,14 +235,14 @@ class BrlEngine:
         if name in parameters:
             try:
                 result=context.evaluateValue(parameters[name])
-            except advene.model.tal.context.AdveneTalesException, e:
+            except advene.model.tal.context.AdveneTalesException as e:
                 try:
                     rulename=context.evaluateValue('rule')
                 except advene.model.tal.context.AdveneTalesException:
                     rulename=_("Unknown rule")
                 self.controller.log(_("Rule %(rulename)s: Error in the evaluation of the parameter %(parametername)s:") % {'rulename': rulename,
                                                                                                                           'parametername': name})
-                self.controller.log(unicode(e)[:160])
+                self.controller.log(str(e)[:160])
                 result=default_value
         else:
             result=default_value
@@ -252,8 +254,8 @@ class BrlEngine:
             b = brlapi.Connection()
             b.enterTtyMode()
             self.brlconnection=b
-        except (brlapi.ConnectionError, TypeError), e:
-            self.controller.log(_("BrlTTY connection error: %s") % unicode(e))
+        except (brlapi.ConnectionError, TypeError) as e:
+            self.controller.log(_("BrlTTY connection error: %s") % str(e))
             self.brlconnection=None
 
     def disconnect_brlapi(self):
diff --git a/lib/advene/plugins/cinelab.py b/lib/advene/plugins/cinelab.py
index a275217..2e750fd 100644
--- a/lib/advene/plugins/cinelab.py
+++ b/lib/advene/plugins/cinelab.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2010-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2010-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -45,7 +45,7 @@ prefixes = {
     'advene': ADVENE,
     'cinelab': CINELAB,
     }
-prefix_re = re.compile('(%s):' % "|".join( prefixes.keys() ))
+prefix_re = re.compile('(%s):' % "|".join( list(prefixes.keys()) ))
 
 def ns(path):
     """Convert NS prefixes to {URL} in ET path expressions
@@ -88,16 +88,11 @@ class CinelabImporter(GenericImporter):
     can_handle=staticmethod(can_handle)
 
     def tempfile(self, *names):
-        """Return a tempfile name in the filesystem encoding.
-
-        Try to deal appropriately with filesystem encodings:
+        """Return a tempfile name.
 
         self._tempdir is a unicode string.
-
-        tempfile takes unicode parameters, and returns a path encoded
-        in sys.getfilesystemencoding()
         """
-        return os.path.join(self._tempdir, *names).encode(_fs_encoding)
+        return os.path.join(self._tempdir, *names)
 
     def extract(self, fname):
         """Extract the zip file to a temporary directory.
@@ -122,7 +117,7 @@ class CinelabImporter(GenericImporter):
 
         # The file is an advene2 zip package. We can extract its contents
         # to a temporary directory
-        self._tempdir=unicode(tempfile.mkdtemp('', 'czp'), _fs_encoding)
+        self._tempdir=str(tempfile.mkdtemp('', 'czp'), _fs_encoding)
 
         for name in z.namelist():
             if name.endswith('/'):
@@ -148,7 +143,7 @@ class CinelabImporter(GenericImporter):
         self._tempdir = None
         if filename.endswith('.zip') or filename.endswith('.czp'):
             self.extract(filename)
-            filename = self.tempfile(u'content.xml')
+            filename = self.tempfile('content.xml')
 
         tree=ET.parse(filename)
         root=tree.getroot()
@@ -170,7 +165,7 @@ class CinelabImporter(GenericImporter):
         p.author = package_author
         p.date = package_created
         p.title = meta(root, 'dc:title')
-        p.setMetaData(ADVENE, 'mediafile', self.default_media)
+        p.setMedia(self.default_media)
 
         # Finalize
         self.progress(.3, _("Converting annotation types"))
diff --git a/lib/advene/plugins/cutter.py b/lib/advene/plugins/cutter.py
index a2d256e..ead0ab9 100644
--- a/lib/advene/plugins/cutter.py
+++ b/lib/advene/plugins/cutter.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,16 +16,17 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-
 name="Audio segmentation importer"
 
+import logging
+logger = logging.getLogger(__name__)
+
 from gettext import gettext as _
 
 import os
-import urllib
 
-import gobject
-import gst
+from gi.repository import GObject
+from gi.repository import Gst
 
 import advene.core.config as config
 from advene.util.importer import GenericImporter
@@ -43,6 +44,7 @@ class CutterImporter(GenericImporter):
 
         self.threshold = -25
         self.channel = 'both'
+        self.min_silence_duration = 0
         self.channel_mapping = {
             'both': 0,
             'left': -1,
@@ -54,7 +56,9 @@ class CutterImporter(GenericImporter):
         self.optionparser.add_option("-c", "--channel",
                                      action="store", type="choice", dest="channel", choices=("both", "left", "right"), default=self.channel,
                                      help=_("Channel selection."))
-
+        self.optionparser.add_option("-s", "--silence-duration",
+                                     action="store", type="int", dest="min_silence_duration", default=self.min_silence_duration,
+                                     help=_("Length (in ms) of drop below threshold before silence is detected"))
         self.buffer = []
         self.last_above = None
 
@@ -71,8 +75,7 @@ class CutterImporter(GenericImporter):
 
     def on_bus_message(self, bus, message):
         def finalize():
-            pos = self.pipeline.query_position(gst.FORMAT_TIME)[0] / gst.MSECOND
-            gobject.idle_add(lambda: self.pipeline.set_state(gst.STATE_NULL) and False)
+            GObject.idle_add(lambda: self.pipeline.set_state(Gst.State.NULL) and False)
             self.convert( {
                     'begin': begin,
                     'end': end,
@@ -82,34 +85,34 @@ class CutterImporter(GenericImporter):
             self.end_callback()
             return True
 
-        if message.type == gst.MESSAGE_EOS:
+        s = message.get_structure()
+        if message.type == Gst.MessageType.EOS:
             finalize()
-        ##elif message.type == gst.MESSAGE_STATE_CHANGED:
+        ##elif message.type == Gst.MessageType.STATE_CHANGED:
         ##    old, new, pending = message.parse_state_changed()
-        ##    if old == gst.STATE_READY and new == gst.STATE_PAUSED:
+        ##    if old == Gst.State.READY and new == Gst.State.PAUSED:
         ##        # There has been a problem. Cancel.
         ##        self.progress(1.0, _("Problem when running detection"))
         ##        print "Undetermined problem when running silence detection."
         ##        self.end_callback()
-        ##        gobject.idle_add(lambda: self.pipeline.set_state(gst.STATE_NULL) and False)
-        ##    #if new == gst.STATE_NULL:
+        ##        GObject.idle_add(lambda: self.pipeline.set_state(Gst.State.NULL) and False)
+        ##    #if new == Gst.State.NULL:
         ##    #    self.end_callback()
-        elif message.structure:
-            s=message.structure
-            #print "MSG " + bus.get_name() + ": " + s.to_string()
+        elif s:
+            logger.debug("MSG %s: %s", bus.get_name(), s.to_string())
             if s.get_name() == 'progress' and self.progress is not None:
                 if not self.progress(s['percent-double'] / 100, _("Detected %(count)d segments until %(time)s") % { 'count': len(self.buffer),
                                                                                                                     'time': helper.format_time(s['current'] * 1000) }):
                     finalize()
             elif s.get_name() == 'cutter':
-                t = s['timestamp'] / gst.MSECOND
+                t = s['timestamp'] / Gst.MSECOND
                 if s['above']:
                     self.last_above = t
                 else:
                     if self.last_above is not None:
                         self.buffer.append( (self.last_above, t) )
                     else:
-                        print "Error: not above without matching above"
+                        logger.error("Error: not above without matching above")
                     self.last_above = t
         return True
 
@@ -120,7 +123,7 @@ class CutterImporter(GenericImporter):
         at.setMetaData(config.data.namespace_prefix['dc'], "description", _("Sound segmentation with a threshold of %(threshold)d dB - channel: %(channel)s") % self.__dict__)
 
         # Build pipeline
-        self.pipeline = gst.parse_launch('uridecodebin name=decoder ! audioconvert ! audiopanorama method=1 panorama=%d ! audioconvert ! cutter threshold-dB=%s ! progressreport silent=true update-freq=1 name=report ! fakesink' % (self.channel_mapping[self.channel], str(self.threshold)))
+        self.pipeline = Gst.parse_launch('uridecodebin name=decoder ! audioconvert ! audiopanorama method=1 panorama=%d ! audioconvert ! cutter threshold-dB=%s run-length=%d ! progressreport silent=true update-freq=1 name=report ! fakesink' % (self.channel_mapping[self.channel], str(self.threshold), self.min_silence_duration * Gst.MSECOND))
         self.decoder = self.pipeline.get_by_name('decoder')
         self.report = self.pipeline.get_by_name('report')
         bus = self.pipeline.get_bus()
@@ -132,9 +135,9 @@ class CutterImporter(GenericImporter):
         bus.connect('message', self.on_bus_message)
 
         if config.data.os == 'win32':
-            self.decoder.props.uri = 'file:///' + os.path.abspath(unicode(filename))
+            self.decoder.props.uri = 'file:///' + os.path.abspath(str(filename))
         else:
-            self.decoder.props.uri = 'file://' + os.path.abspath(unicode(filename))
+            self.decoder.props.uri = 'file://' + os.path.abspath(str(filename))
         self.progress(.1, _("Starting silence detection"))
-        self.pipeline.set_state(gst.STATE_PLAYING)
+        self.pipeline.set_state(Gst.State.PLAYING)
         return self.package
diff --git a/lib/advene/plugins/dcp.py b/lib/advene/plugins/dcp.py
index abf3874..951a80d 100644
--- a/lib/advene/plugins/dcp.py
+++ b/lib/advene/plugins/dcp.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,12 +19,14 @@
 
 name="DCP importer"
 
+import logging
+logger = logging.getLogger(__name__)
+
 from gettext import gettext as _
 
 import re
 import csv
 import itertools
-import urllib
 
 import advene.core.config as config
 import advene.util.helper as helper
@@ -39,26 +41,26 @@ timestamp_re = re.compile('(\d\d):(\d\d):(\d\d):(\d\d)')
 # Column -> (type, attr) mapping.
 #
 type_mapping = {
-    u'Inquadratura'                      : (u'Inquadratura', 'num'),
-    u'Descrizione inquadratura'          : (u'Inquadratura', 'descrizione'),
-    u'Piani/Immagini'                    : (u'Inquadratura', 'piani_immagini'),
-    u'Ampiezza temporale inquadratura'   : (u'Inquadratura', 'ampiezza_temporale'),
-
-    u'Ampiezza temporale raccordo'       : (u'Raccordo'    , 'ampiezza_temporale'),
-    u'Raccordi di contenuto'             : (u'Raccordo'    , 'contenuto'),
-    u'Raccordi spaziali'                 : (u'Raccordo'    , 'spaziali'),
-    u'Raccordi tecnici'                  : (u'Raccordo'    , 'tecnici'),
-    u'Raccordi temporali'                : (u'Raccordo'    , 'temporali'),
-
-    u'Grande unit\xe0'                   : (u'Grande_unita', 'num'),
-    u'Ampiezza temporale grande unit\xe0': (u'Grande_unita', 'ampiezza_temporale'),
-    u'Descrizione grande unit\xe0'       : (u'Grande_unita', 'descrizione'),
-    u'Transizioni fra grandi unit\xe0'   : (u'Grande_unita', 'transizioni_fra'),
-
-    u'Sequenza'                          : (u'Sequenza'    , 'num'),
-    u'Ampiezza temporale sequenza'       : (u'Sequenza'    , 'ampiezza_temporale'),
-    u'Descrizione sequenza'              : (u'Sequenza'    , 'descrizione'),
-    u'Transizioni fra sequenze'          : (u'Sequenza'    , 'transizioni_fra'),
+    'Inquadratura'                      : ('Inquadratura', 'num'),
+    'Descrizione inquadratura'          : ('Inquadratura', 'descrizione'),
+    'Piani/Immagini'                    : ('Inquadratura', 'piani_immagini'),
+    'Ampiezza temporale inquadratura'   : ('Inquadratura', 'ampiezza_temporale'),
+
+    'Ampiezza temporale raccordo'       : ('Raccordo'    , 'ampiezza_temporale'),
+    'Raccordi di contenuto'             : ('Raccordo'    , 'contenuto'),
+    'Raccordi spaziali'                 : ('Raccordo'    , 'spaziali'),
+    'Raccordi tecnici'                  : ('Raccordo'    , 'tecnici'),
+    'Raccordi temporali'                : ('Raccordo'    , 'temporali'),
+
+    'Grande unit\xe0'                   : ('Grande_unita', 'num'),
+    'Ampiezza temporale grande unit\xe0': ('Grande_unita', 'ampiezza_temporale'),
+    'Descrizione grande unit\xe0'       : ('Grande_unita', 'descrizione'),
+    'Transizioni fra grandi unit\xe0'   : ('Grande_unita', 'transizioni_fra'),
+
+    'Sequenza'                          : ('Sequenza'    , 'num'),
+    'Ampiezza temporale sequenza'       : ('Sequenza'    , 'ampiezza_temporale'),
+    'Descrizione sequenza'              : ('Sequenza'    , 'descrizione'),
+    'Transizioni fra sequenze'          : ('Sequenza'    , 'transizioni_fra'),
     }
 
 class DCPImporter(GenericImporter):
@@ -88,11 +90,11 @@ class DCPImporter(GenericImporter):
         f.close()
         del rows
 
-        print "Converting ", self.row_count, " records"
+        logger.debug("Converting %s records", self.row_count)
         # Conversion
         f=open(filename, 'rU')
         rows=csv.reader(f, 'excel-tab')
-        self.labels = rows.next()
+        self.labels = next(rows)
         self.label2type = {}
         self.convert(self.iterator(rows))
         self.progress(1.0)
@@ -102,7 +104,7 @@ class DCPImporter(GenericImporter):
         m=timestamp_re.match(s)
         if m:
             (h, m, s, f) = m.groups()
-            t=( ((long(h) * 60 + long(m)) * 60) + long(s) ) * 1000 + long(f) * (1000 / config.data.preferences['default-fps'])
+            t=( ((int(h) * 60 + int(m)) * 60) + int(s) ) * 1000 + int(f) * int(1000 / config.data.preferences['default-fps'])
         else:
             t=0
         return t
@@ -121,12 +123,12 @@ class DCPImporter(GenericImporter):
                                                                              'count': self.row_count})
             progress += incr
             t = self.str2time(row[1])
-            for (label, tc, value) in itertools.izip(self.labels[2::2], row[2::2], row[3::2]):
-                label = unicode(label, 'mac_roman')
+            for (label, tc, value) in zip(self.labels[2::2], row[2::2], row[3::2]):
+                label = str(label, 'mac_roman')
 
                 if tc == 'IN':
                     # Store into column_cache
-                    column_cache[label]=( t, unicode(value, 'mac_roman') )
+                    column_cache[label]=( t, str(value, 'mac_roman') )
                 elif tc == 'OUT':
                     (begin, content) = column_cache.get(label, (0, 'OUT without IN'))
                     if label in type_mapping:
@@ -144,7 +146,7 @@ class DCPImporter(GenericImporter):
                         }
             # Process row_cache
             output = {}
-            for dcp_type, data in row_cache.iteritems():
+            for dcp_type, data in row_cache.items():
                 label, attr = type_mapping[dcp_type]
                 begin, content = data
                 at = self.label2type.get(label)
@@ -155,7 +157,7 @@ class DCPImporter(GenericImporter):
                 #if info[begin] != begin:
                 #    # FIXME: consistency check on begin time. What to do here???
                 info['content'].append('%s=%s' % (attr, content.replace('\n', ' -- ')))
-            for at, info in output.iteritems():
+            for at, info in output.items():
                 yield {
                     'begin': info['begin'],
                     'end': t,
diff --git a/lib/advene/plugins/fcp.py b/lib/advene/plugins/fcp.py
index f8342d8..1c6c443 100644
--- a/lib/advene/plugins/fcp.py
+++ b/lib/advene/plugins/fcp.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,9 +19,11 @@
 
 name="Final Cut Pro XML importer"
 
+import logging
+logger = logging.getLogger(__name__)
+
 from gettext import gettext as _
 
-import advene.core.config as config
 from advene.util.importer import GenericImporter
 import xml.etree.ElementTree as ET
 
@@ -64,7 +66,7 @@ class XMLFCPImporter(GenericImporter):
 
     def iterator(self, root):
         if root.tag != 'xmeml':
-            print "Invalid FCP XML file format: ", root.tag
+            logger.error("Invalid FCP XML file format: %s", root.tag)
             return
 
         progress=0.01
@@ -81,8 +83,8 @@ class XMLFCPImporter(GenericImporter):
                 yield {
                     'type': self.at['subtitle'],
                     'content': "\n".join([ p.findtext('value') for p in e.findall('.//parameter') if p.findtext('parameterid').startswith('str') and p.findtext('value') ]),
-                    'begin': long(e.find('in').text) * invrate,
-                    'end': long(e.find('out').text) * invrate,
+                    'begin': int(e.find('in').text) * invrate,
+                    'end': int(e.find('out').text) * invrate,
                     }
         else:
             progress = .5
@@ -100,8 +102,8 @@ class XMLFCPImporter(GenericImporter):
             yield {
                 'type': self.at['clipitem'],
                 'content': "\n".join([ p.text.strip() for p in e.find('comments') if p.text and p.text.strip() ]),
-                'begin': long(e.findtext('start')) * invrate,
-                'end': long(e.findtext('end')) * invrate,
+                'begin': int(e.findtext('start')) * invrate,
+                'end': int(e.findtext('end')) * invrate,
                 }
 
         self.progress(1.0)
diff --git a/lib/advene/plugins/featuredetect.py b/lib/advene/plugins/featuredetect.py
index eaa711e..4bb58fb 100644
--- a/lib/advene/plugins/featuredetect.py
+++ b/lib/advene/plugins/featuredetect.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,6 +18,9 @@
 #
 name="Feature detection importer"
 
+import logging
+logger = logging.getLogger(__name__)
+
 from gettext import gettext as _
 
 import os
@@ -79,7 +82,7 @@ class FeatureDetectImporter(GenericImporter):
         at.setMetaData(config.data.namespace_prefix['dc'], "description", _("Detected %s") % self.classifier)
 
         self.progress(0, _("Detection started"))
-        video = cv.CreateFileCapture(unicode(filename).encode(sys.getfilesystemencoding()))
+        video = cv.CreateFileCapture(str(filename).encode(sys.getfilesystemencoding()))
 
         if not video:
             raise "Cannot read video file:"
@@ -95,7 +98,7 @@ class FeatureDetectImporter(GenericImporter):
         frame = cv.QueryFrame(video)
         width, height = cv.GetSize(frame)
         scaled_width, scaled_height = int(width / self.scale), int(height / self.scale)
-        print width, height, scaled_width, scaled_height
+        logger.warn("Video dimensions %dx%d - scaled to %dx%d", width, height, scaled_width, scaled_height)
 
         # create storage for grayscale version
         largegrayscale = cv.CreateImage( (width, height), 8, 1)
@@ -137,6 +140,7 @@ class FeatureDetectImporter(GenericImporter):
             # We start a new annotation if the threshold is reached,
             # but we do not end if if we get below the threshold.
             if objects:
+                logger.debug("Detected object %s", objects)
                 # Detected face.
                 if start_pos is None:
                     # Only create a new annotation if above threshold
diff --git a/lib/advene/plugins/goodshotdetector.py b/lib/advene/plugins/goodshotdetector.py
index c113269..20b34cd 100644
--- a/lib/advene/plugins/goodshotdetector.py
+++ b/lib/advene/plugins/goodshotdetector.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
-from __future__ import division
+
 
 name="Shot detection importer"
 
@@ -59,7 +59,7 @@ class DelakisShotDetectImporter(GenericImporter):
                                      action="store_true", dest="cache_histogram", default=self.cache_histogram,
                                      help=_("Cache histogram alongside video files."))
         self.optionparser.add_option("-p", "--profile",
-                                     action="store", type="choice", dest="profile", choices=self.profiles.keys(), default=self.profile,
+                                     action="store", type="choice", dest="profile", choices=list(self.profiles.keys()), default=self.profile,
                                      help=_("Parameter profile: safe will detect less cuts, aggressive will detect more cuts (but more false ones too). default is a compromise."))
 
     def can_handle(fname):
@@ -86,19 +86,18 @@ class DelakisShotDetectImporter(GenericImporter):
             fps = float(config.data.preferences['default-fps'])
         else :
             he = HistogramExtractor()
-            print "Processing ", filename
             histos, fps = he.process(filename, self.progress)
             if self.cache_histogram:
                 try:
                     numpy.save(histofile, histos)
-                except Exception, e:
+                except Exception as e:
                     self.controller.log("Cannot save histogram: %s" % e.message)
 
         sd = ShotDetector()
-        for k, v in self.profiles[self.profile].iteritems():
+        for k, v in self.profiles[self.profile].items():
             setattr(sd, k, v)
         #Detect cut and dissolve
-        self.convert(sd.process(histos, 1000 / fps))
+        self.convert(sd.process(histos, int(1000 / fps)))
         return self.package
 
 # Code adapted from pimpy: http://pim.gforge.inria.fr/pimpy/
@@ -142,7 +141,6 @@ class ShotDetector:
         pass
 
     def process(self, histos, mspf=40):
-        print "MSPF", mspf
         self.progress(.1, _("Computing hdiff"))
         nbpixel = numpy.sum(histos[0])
         #compute various histogram variations
@@ -197,7 +195,7 @@ class ShotDetector:
         for f in numpy.flatnonzero(hcumul > self.DISS_THRESHOLD):
             #new frame not in current dissolve, record dissolve
             if start > 0 and f > end:
-                motion = numpy.sum(motion_frames[range(start,end)])
+                motion = numpy.sum(motion_frames[list(range(start,end))])
                 if not motion and end - start > self.DISS_MIN_FRAMES:
                     yield (start,end)
                 start = end = -1
@@ -213,7 +211,7 @@ class ShotDetector:
 
         #add the last dissolve
         if start > 0 and end > 0 :
-            motion = numpy.sum(motion_frames[range(start,end)])
+            motion = numpy.sum(motion_frames[list(range(start,end))])
             if not motion and end - start > self.DISS_MIN_FRAMES:
                 yield (start,end)
 
@@ -263,7 +261,7 @@ class ShotDetector:
 class HistogramExtractor:
     def process(self, videofile, progress):
         progress(0, _("Extracting histogram"))
-        video = hg.cvCreateFileCapture(unicode(videofile).encode(sys.getfilesystemencoding()))
+        video = hg.cvCreateFileCapture(str(videofile).encode(sys.getfilesystemencoding()))
         if not video:
             raise Exception("Could not open video file")
         histo = cv.cvCreateHist([256],cv.CV_HIST_ARRAY,[[0,256]], 1)
diff --git a/lib/advene/plugins/hpi.py b/lib/advene/plugins/hpi.py
new file mode 100644
index 0000000..783c1de
--- /dev/null
+++ b/lib/advene/plugins/hpi.py
@@ -0,0 +1,312 @@
+#
+# Advene: Annotate Digital Videos, Exchange on the NEt
+# Copyright (C) 2017 Olivier Aubert <contact at olivieraubert.net>
+#
+# Advene is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# Advene is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Advene; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+
+name="HPI plugin"
+
+import logging
+logger = logging.getLogger(__name__)
+
+from gettext import gettext as _
+
+import base64
+from collections import OrderedDict
+from io import BytesIO
+import json
+from PIL import Image
+import requests
+
+import advene.core.config as config
+import advene.util.helper as helper
+from advene.util.importer import GenericImporter
+
+def register(controller=None):
+    controller.register_importer(HPIImporter)
+    return True
+
+class HPIImporter(GenericImporter):
+    name = _("HPI concept extraction")
+    annotation_filter = True
+
+    def can_handle(fname):
+        """Return a score between 0 and 100.
+
+        100 is for the best match (specific extension), 0 is for no match at all.
+        """
+        return 80
+    can_handle=staticmethod(can_handle)
+
+    def __init__(self, author=None, package=None, defaulttype=None,
+                 controller=None, callback=None, source_type=None):
+        GenericImporter.__init__(self,
+                                 author=author,
+                                 package=package,
+                                 defaulttype=defaulttype,
+                                 controller=controller,
+                                 callback=callback,
+                                 source_type=source_type)
+        if self.source_type is None:
+            self.source_type = self.controller.package.annotationTypes[0]
+        self.source_type_id = self.source_type.id
+
+        if source_type is not None:
+            # A source_type was specified at instanciation. Update the
+            # preferences now since we will use this info to update
+            # the filter options.
+            self.get_preferences().update({'source_type_id': self.source_type_id})
+
+        self.model = "standard"
+        self.confidence = 0.0
+        self.detected_position = True
+        self.split_types = False
+        self.create_relations = False
+        self.url = self.get_preferences().get('url', 'http://localhost:9000/')
+
+        self.server_options = {}
+        # Populate available models options from server
+        try:
+            r = requests.get(self.url)
+            if r.status_code == 200:
+                # OK. We should have some server options available as json
+                data = r.json()
+                caps = data.get('data', {}).get('capabilities', {})
+                for n in ('minimum_batch_size', 'maximum_batch_size', 'available_models'):
+                    self.server_options[n] = caps.get(n, None)
+                logger.warn("Got capabilities from VCD server - batch size in (%d, %d) - %d models: %s",
+                            self.server_options['minimum_batch_size'],
+                            self.server_options['maximum_batch_size'],
+                            len(self.server_options['available_models']),
+                            ", ".join(item['id'] for item in self.server_options['available_models']))
+        except requests.exceptions.RequestException:
+            pass
+        if 'available_models' in self.server_options:
+            self.available_models = OrderedDict((item['id'], item) for item in self.server_options['available_models'])
+        else:
+            self.available_models = OrderedDict()
+            self.available_models["standard"] = { 'id': "standard",
+                                                  'label': "Standard",
+                                                  'image_size': 224 }
+
+        self.optionparser.add_option(
+            "-t", "--source-type-id", action="store", type="choice", dest="source_type_id",
+            choices=[at.id for at in self.controller.package.annotationTypes],
+            default=self.source_type_id,
+            help=_("Type of annotation to analyze"),
+            )
+        self.optionparser.add_option(
+            "-u", "--url", action="store", type="string",
+            dest="url", default=self.url,
+            help=_("URL of the webservice"),
+            )
+        self.optionparser.add_option(
+            "-c", "--min-confidence", action="store", type="float",
+            dest="confidence", default=0.0,
+            help=_("Minimum confidence level (between 0.0 and 1.0)"),
+            )
+        self.optionparser.add_option(
+            "-p", "--position", action="store_true",
+            dest="detected_position", default=self.detected_position,
+            help=_("Use detected position for created annotations"),
+            )
+        self.optionparser.add_option(
+            "-x", "--split-types", action="store_true",
+            dest="split_types", default=self.split_types,
+            help=_("Split by entity type"),
+            )
+        self.optionparser.add_option(
+            "-m", "--model", action="store", type="choice",
+            dest="model", default=self.model, choices=list(self.available_models.keys()),
+            help=_("Model to be used for detection"),
+            )
+        self.optionparser.add_option(
+            "-r", "--relations", action="store_true",
+            dest="create_relations", default=self.create_relations,
+            help=_("Create relations between the original annotations and the new ones"),
+            )
+
+    @staticmethod
+    def can_handle(fname):
+        """
+        """
+        if 'http' in fname:
+            return 100
+        else:
+            return 0
+
+    def process_file(self, _filename):
+        self.convert(self.iterator())
+
+    def check_requirements(self):
+        """Check if external requirements for the importers are met.
+
+        It returns a list of strings describing the unmet
+        requirements. If the list is empty, then all requirements are
+        met.
+        """
+        unmet_requirements = []
+
+        # Check server connectivity
+        try:
+            requests.get(self.url)
+        except requests.exceptions.RequestException:
+            unmet_requirements.append(_("Cannot connect to VCD server. Check that it is running and accessible."))
+
+        # Make sure that we have all appropriate screenshots
+        missing_screenshots = []
+        for a in self.source_type.annotations:
+            for t in (a.fragment.begin,
+                      int((a.fragment.begin + a.fragment.end) / 2),
+                      a.fragment.end):
+                s = self.controller.get_snapshot(annotation=a, position=t)
+                if s.is_default:
+                    missing_screenshots.append(t)
+        if len(missing_screenshots) > 0:
+            unmet_requirements.append(_("%d / %d screenshots are missing. Wait for extraction to complete.") % (len(missing_screenshots),
+                                                                                                                3 * len(self.source_type.annotations)))
+        return unmet_requirements
+
+    def iterator(self):
+        """I iterate over the created annotations.
+        """
+        self.source_type = self.controller.package.get_element_by_id(self.source_type_id)
+        minconf = self.confidence
+
+        self.progress(.1, "Sending request to server")
+        if self.split_types:
+            # Dict indexed by entity type name
+            new_atypes = {}
+        else:
+            new_atype = self.ensure_new_type(
+                "concept_%s" % self.source_type_id,
+                title = _("Concepts for %s" % (self.source_type_id)))
+            new_atype.mimetype = 'application/json'
+            new_atype.setMetaData(config.data.namespace, "representation",
+                                  'here/content/parsed/label')
+        if self.create_relations:
+            schema = self.create_schema('s_concept')
+            rtype_id = 'concept_relation'
+            rtype = self.package.get_element_by_id(rtype_id)
+            if not rtype:
+                # Create a relation type if it does not exist.
+                rtype = schema.createRelationType(ident=rtype_id)
+                rtype.author = config.data.get_userid()
+                rtype.date = self.timestamp
+                rtype.title = "Related concept"
+                rtype.mimetype='text/plain'
+                rtype.setHackedMemberTypes( ('*', '*') )
+                schema.relationTypes.append(rtype)
+                self.update_statistics('relation-type')
+            if not hasattr(rtype, 'getHackedMemberTypes'):
+                logger.error("%s is not a valid relation type" % rtype_id)
+
+        image_scale = self.available_models.get(self.model, {}).get('image_size')
+        if image_scale:
+            logger.warn("Scaling images to (%d, %d) as requested by %s", image_scale, image_scale, self.model)
+
+        def get_scaled_image(t):
+            """Return the image at the appropriate scale for the selected model.
+            """
+            original = bytes(self.controller.package.imagecache.get(t))
+            if image_scale:
+                im = Image.open(BytesIO(original))
+                im = im.resize((image_scale, image_scale))
+                buf = BytesIO()
+                im.save(buf, 'PNG')
+                scaled = buf.getvalue()
+                buf.close()
+            else:
+                scaled = original
+            return scaled
+
+        # Use a requests.session to use a KeepAlive connection to the server
+        session = requests.session()
+        headers = {"Content-Type": "application/json", "Accept": "application/json"}
+        response = session.post(self.url, headers=headers, json={
+            "model": self.model,
+            'media_uri': self.package.uri,
+            'media_filename': self.controller.get_default_media(),
+            'minimum_confidence': minconf,
+            'annotations': [
+                { 'annotationid': a.id,
+                  'begin': a.fragment.begin,
+                  'end': a.fragment.end,
+                  'frames': [
+                      {
+                          'screenshot': base64.encodebytes(get_scaled_image(t)).decode('ascii'),
+                          'timecode': t
+                      } for t in (a.fragment.begin,
+                                  int((a.fragment.begin + a.fragment.end) / 2),
+                                  a.fragment.end)
+                  ]
+                }
+                for a in self.source_type.annotations
+            ]
+        })
+
+        output = response.json()
+        if output.get('status') != 200:
+            # Not OK result. Display error message.
+            msg = _("Server error: %s") % output.get('message', _("Server transmission error."))
+            logger.error(msg)
+            self.output_message = msg
+            return
+        # FIXME: maybe check consistency with media_filename/media_uri?
+        concepts = output.get('data', {}).get('concepts', [])
+        progress = .2
+        step = .8 / (len(concepts) or 1)
+        self.progress(.2, _("Parsing %d results") % len(concepts))
+        for item in concepts:
+            # Should not happen, since we pass the parameter to the server
+            if item["confidence"] < minconf:
+                continue
+            a = self.package.get_element_by_id(item['annotationid'])
+            if self.detected_position:
+                begin = item['timecode']
+            else:
+                begin = a.fragment.begin
+            end = a.fragment.end
+            label = item.get('label')
+            label_id = helper.title2id(label)
+            if label and self.split_types:
+                new_atype = new_atypes.get(label_id)
+                if new_atype is None:
+                   # Not defined yet. Create a new one.
+                   new_atype = self.ensure_new_type(label_id, title = _("%s concept" % label))
+                   new_atype.mimetype = 'application/json'
+                   new_atype.setMetaData(config.data.namespace, "representation",
+                                         'here/content/parsed/label')
+                   new_atypes[label_id] = new_atype
+            an = yield {
+                'type': new_atype,
+                'begin': begin,
+                'end': end,
+                'content': json.dumps(item),
+                'send': True
+            }
+            if an is not None and self.create_relations:
+                r = self.package.createRelation(
+                    ident='_'.join( ('r', a.id, an.id) ),
+                    type=rtype,
+                    author=config.data.get_userid(),
+                    date=self.timestamp,
+                    members=(a, an))
+                r.title = "Relation between %s and %s" % (a.id, an.id)
+                self.package.relations.append(r)
+                self.update_statistics('relation')
+            self.progress(progress)
+            progress += step
diff --git a/lib/advene/plugins/montagerenderer.py b/lib/advene/plugins/montagerenderer.py
index 31e3bdd..b4cf1ed 100644
--- a/lib/advene/plugins/montagerenderer.py
+++ b/lib/advene/plugins/montagerenderer.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -92,16 +92,16 @@ class MontageRenderer(object):
         sink.set_property("location", outputfile)
 
         def on_bus_message(bus, message):
+            s = message.get_structure()
             if message.type == gst.MESSAGE_STATE_CHANGED:
                 old, new, pending = message.parse_state_changed()
-                print "STATE", old.value_nick, new.value_nick, pending.value_nick
+                logger.warn("STATE %s %s %s", old.value_nick, new.value_nick, pending.value_nick)
             elif message.type == gst.MESSAGE_EOS:
-                print " EOS"
+                logger.warn(" EOS")
                 pipe.set_state(gst.STATE_NULL)
                 progress_callback(None)
-            elif message.structure:
-                s=message.structure
-                print "MSG " + bus.get_name() + ": " + s.to_string()
+            elif s:
+                logger.warn("MSG %s %s", bus.get_name(), s.to_string())
                 if s.get_name() == 'progress' and progress_callback is not None:
                     progress_callback(s['percent-double'] / 100)
             return True
diff --git a/lib/advene/plugins/mpeg7.py b/lib/advene/plugins/mpeg7.py
index 7e34372..d9537b5 100644
--- a/lib/advene/plugins/mpeg7.py
+++ b/lib/advene/plugins/mpeg7.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -22,6 +22,9 @@
 
 name="MPEG7 importer"
 
+import logging
+logger = logging.getLogger(__name__)
+
 from gettext import gettext as _
 
 import re
@@ -75,7 +78,7 @@ class MPEG7Importer(GenericImporter):
         if self.package is None:
             self.package=p
             # FIXME: should specify title
-            p.setMetaData (config.data.namespace, "mediafile", "dvd at 1,1")
+            p.setMedia("dvd at 1,1")
         self.defaulttype=at
         self.convert(self.iterator(root))
         self.progress(1.0)
@@ -83,7 +86,7 @@ class MPEG7Importer(GenericImporter):
 
     def iterator(self, root):
         if root.tag != tag('Mpeg7'):
-            print "Invalid MPEG7 file format: ", root.tag
+            logger.error("Invalid MPEG7 file format: %s", root.tag)
             return
 
         for s in (root.findall('.//%s' % tag('AudioVisualSegment'))
@@ -111,7 +114,7 @@ class MPEG7Importer(GenericImporter):
                 d=m.groupdict()
                 for k in d:
                     if d[k] is not None:
-                        d[k]=long(d[k])
+                        d[k]=int(d[k])
                 if d['fraction'] is None:
                     d['fraction']=1.0
                 begin=d['ms']/d['fraction']+d['s']*1000+d['m']*60000+d['h']*3600000
@@ -122,7 +125,7 @@ class MPEG7Importer(GenericImporter):
                 d=m.groupdict()
                 for k in d:
                     if d[k] is not None:
-                        d[k]=long(d[k])
+                        d[k]=int(d[k])
                 if d['fraction'] is None:
                     d['fraction']=1.0
                 duration=d['ms']/d['fraction']+d['s']*1000+d['m']*60000+d['h']*3600000
@@ -146,9 +149,10 @@ def mpeg7_duration(target, context):
     return "PT%s%03dN1000" % (time.strftime("%HH%MM%SS", time.gmtime(target / 1000)), target % 1000)
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
     import sys
     if len(sys.argv) < 3:
-        print "Should provide a file name and a package name"
+        logger.error("Should provide a file name and a package name")
         sys.exit(1)
 
     fname=sys.argv[1]
@@ -159,7 +163,7 @@ if __name__ == "__main__":
     # FIXME: i.process_options()
     i.process_options(sys.argv[1:])
     # (for .sub conversion for instance, --fps, --offset)
-    print "Converting %s to %s using %s" % (fname, pname, i.name)
+    logger.info("Converting %s to %s using %s", fname, pname, i.name)
     p=i.process_file(fname)
     p.save(pname)
-    print i.statistics_formatted()
+    logger.info(i.statistics_formatted())
diff --git a/lib/advene/plugins/owl_import.py b/lib/advene/plugins/owl_import.py
new file mode 100644
index 0000000..9bceb30
--- /dev/null
+++ b/lib/advene/plugins/owl_import.py
@@ -0,0 +1,150 @@
+#
+# Advene: Annotate Digital Videos, Exchange on the NEt
+# Copyright (C) 2017 Olivier Aubert <contact at olivieraubert.net>
+#
+# Advene is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# Advene is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Advene; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+
+# OWL importer
+
+name="OWL importer"
+
+import logging
+logger = logging.getLogger(__name__)
+
+from gettext import gettext as _
+import os
+
+import advene.core.config as config
+from advene.util.importer import GenericImporter
+try:
+    import rdflib
+except ImportError:
+    rdflib = None
+
+def register(controller=None):
+    if rdflib is not None:
+        controller.register_importer(OWLImporter)
+    return True
+
+class OWLImporter(GenericImporter):
+    name = _("OWL (schema) importer")
+
+    def can_handle(fname):
+        """Return a score between 0 and 100.
+
+        100 is for the best match (specific extension), 0 is for no match at all.
+        """
+        ext = os.path.splitext(fname)[1]
+        if ext in [ '.owl' ]:
+            return 90
+        return 0
+    can_handle=staticmethod(can_handle)
+
+    def process_file(self, filename, dest=None):
+        graph = rdflib.Graph()
+        graph.parse(filename)
+        p, at = self.init_package(filename=dest)
+        p.setMetaData(config.data.namespace_prefix['dc'],
+                      'description',
+                      _("Converted from %s") % filename)
+        self.convert(self.iterator(graph))
+        self.progress(1.0)
+        return self.package
+
+    def iterator(self, graph):
+        """Iterate through the loaded OWL.
+        """
+        AO = rdflib.Namespace('http://ada.filmontology.org/ontology/')
+        AR = rdflib.Namespace('http://ada.filmontology.org/resource/')
+        PREFIX = """PREFIX owl: <http://www.w3.org/2002/07/owl#>
+        PREFIX ar: <http://ada.filmontology.org/resource/>
+        PREFIX ao: <http://ada.filmontology.org/ontology/>
+        PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
+        PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
+        """
+        def get_label(graph, subject, default=""):
+            """Return a label for the object.
+
+            Using preferably @en labels
+            """
+            labels = graph.preferredLabel(s, lang='en')
+            if labels:
+                # We have at least 1 @en label. Return it.
+                return labels[0][1]
+            else:
+                # No defined label. Use default
+                return default
+
+        def get_comment(graph, subject, default=""):
+            """Return the comment at en for the object.
+            """
+            results = list(graph.query(PREFIX + 'SELECT ?comment WHERE { <%s> rdfs:comment ?comment . FILTER langMatches( lang(?comment), "en" ) }' % str(subject)))
+            if results:
+                return str(results[0][0])
+            else:
+                return default
+
+        progress=0.01
+        self.progress(progress, "Starting conversion")
+        RDF = rdflib.RDF
+        schemas = list(graph.subjects(RDF.type, AO.AnnotationLevel))
+        incr=0.98 / len(schemas)
+        for s in schemas:
+            progress += incr
+            # Create the schema
+            # FIXME: there is no label neither description at the moment.
+            schema_id = s.rpartition('/')[-1]
+            title = get_label(graph, s, schema_id)
+            description = get_comment(graph, s)
+            schema = self.create_schema(schema_id, title=title, description=description)
+            if not self.progress(progress, "Creating schema %s" % schema.title):
+                break
+            for atnode in graph.objects(s, AO.term('hasAnnotationType')):
+                at_id = atnode.rpartition('/')[-1]
+                label = get_label(graph, atnode, at_id)
+                description = get_comment(graph, atnode)
+                at = self.create_annotation_type(schema, at_id, title=label, description=description)
+                values = [ str(t[0])
+                           for t in graph.query(PREFIX + "SELECT ?label WHERE { <%s> ao:hasPredefinedValue ?x . ?x rdfs:label ?label . }" % str(atnode)) ]
+                if values:
+                    at.setMetaData(config.data.namespace, "completions", ",".join(values))
+        self.progress(1.0)
+        # Hack: we have an empty iterator (no annotations here), but
+        # if the yield instruction is not present in the method code,
+        # it will not be considered as an iterator. So the following 2
+        # lines mark the end of the iterator, and its iterator status.
+        return
+        yield None
+
+if __name__ == "__main__":
+    import sys
+    if rdflib is None:
+        logger.error("Cannot import required rdflib module")
+        sys.exit(1)
+    if len(sys.argv) < 3:
+        logger.error("Should provide a file name and a package name")
+        sys.exit(1)
+
+    fname=sys.argv[1]
+    pname=sys.argv[2]
+
+    i = OWLImporter()
+
+    i.process_options(sys.argv[1:])
+    logger.info("Converting %s to %s using %s", fname, pname, i.name)
+    p=i.process_file(fname)
+    p.save(pname)
+    logger.info(i.statistics_formatted())
diff --git a/lib/advene/plugins/pocketsphinx.py b/lib/advene/plugins/pocketsphinx.py
index 00a7ad1..d9c48b0 100644
--- a/lib/advene/plugins/pocketsphinx.py
+++ b/lib/advene/plugins/pocketsphinx.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -19,19 +19,22 @@
 
 name="Speech recognition"
 
+import logging
+logger = logging.getLogger(__name__)
+
 from gettext import gettext as _
 
 import os
-import gobject
-import gst
+from gi.repository import GObject
+from gi.repository import Gst
 
 import advene.core.config as config
 from advene.util.importer import GenericImporter
 import advene.util.helper as helper
 
 def register(controller=None):
-    if (gst.element_factory_find('vader')
-         and gst.element_factory_find('pocketsphinx')):
+    if (Gst.ElementFactory.find('vader')
+         and Gst.ElementFactory.find('pocketsphinx')):
         controller.register_importer(PocketSphinxImporter)
     else:
         controller.log(_("Cannot register speech recognition: Pocketsphinx plugins not found. See http://cmusphinx.sourceforge.net/wiki/gstreamer for details."))
@@ -98,14 +101,14 @@ class PocketSphinxImporter(GenericImporter):
     def on_vader_start(self, vader, pos):
         """Store start position.
         """
-        self.start_position = pos / gst.MSECOND
+        self.start_position = pos / Gst.MSECOND
         return True
 
     def on_vader_stop(self, vader, pos):
         """Store stop position.
         """
         if self.start_position and self.text:
-            self.buffer_list.append( (self.start_position, pos / gst.MSECOND, self.text) )
+            self.buffer_list.append( (self.start_position, pos / Gst.MSECOND, self.text) )
             self.text = None
             self.start_position = 0
         return True
@@ -129,17 +132,17 @@ class PocketSphinxImporter(GenericImporter):
         def finalize():
             """Finalize data creation.
             """
-            gobject.idle_add(lambda: self.pipeline.set_state(gst.STATE_NULL) and False)
+            GObject.idle_add(lambda: self.pipeline.set_state(Gst.State.NULL) and False)
             self.generate_annotations()
             if self.end_callback:
                 self.end_callback()
             return False
 
-        if message.type == gst.MESSAGE_EOS:
+        s = message.get_structure()
+        if message.type == Gst.MessageType.EOS:
             finalize()
-        elif message.structure:
-            s = message.structure
-            #print "MSG " + s.get_name() + ": " + s.to_string()
+        elif s:
+            logger.debug("MSG ", s.get_name(), s.to_string())
             if s.get_name() == 'progress' and self.progress is not None:
                 if not self.progress(s['percent-double'] / 100, _("%(count)d utterances until %(time)s") % {
                         'count': len(self.buffer_list),
@@ -163,9 +166,9 @@ class PocketSphinxImporter(GenericImporter):
                 self.lang_model)
 
         # Build pipeline
-        self.pipeline = gst.parse_launch('uridecodebin name=decoder ! audioconvert ! audioresample ! progressreport silent=true update-freq=1 name=report  ! vader name=vader auto-threshold=false threshold=%(noise).9f run-length=%(silence)d ! pocketsphinx name=pocketsphinx %(pocketsphinxargs)s ! fakesink' % ( {
+        self.pipeline = Gst.parse_launch('uridecodebin name=decoder ! audioconvert ! audioresample ! progressreport silent=true update-freq=1 name=report  ! vader name=vader auto-threshold=false threshold=%(noise).9f run-length=%(silence)d ! pocketsphinx name=pocketsphinx %(pocketsphinxargs)s ! fakesink' % ( {
                 'noise': self.noise,
-                'silence': self.silence * gst.MSECOND,
+                'silence': self.silence * Gst.MSECOND,
                 'pocketsphinxargs': args }))
         self.decoder = self.pipeline.get_by_name('decoder')
 
@@ -185,9 +188,9 @@ class PocketSphinxImporter(GenericImporter):
         bus.connect('sync-message', self.on_bus_message)
 
         if config.data.os == 'win32':
-            self.decoder.props.uri = 'file:///' + os.path.abspath(unicode(filename))
+            self.decoder.props.uri = 'file:///' + os.path.abspath(str(filename))
         else:
             self.decoder.props.uri = 'file://' + os.path.abspath(filename)
         self.progress(0, _("Recognizing speech"))
-        self.pipeline.set_state(gst.STATE_PLAYING)
+        self.pipeline.set_state(Gst.State.PLAYING)
         return self.package
diff --git a/lib/advene/plugins/shotdetect.py b/lib/advene/plugins/shotdetect.py
index 7185a51..28a2cee 100644
--- a/lib/advene/plugins/shotdetect.py
+++ b/lib/advene/plugins/shotdetect.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -17,9 +17,12 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
 
-# AnnotationGraph importer.
+# ShotDetect XML output importer.
 
-name="ShotDetect importer"
+name="ShotDetect XML importer"
+
+import logging
+logger = logging.getLogger(__name__)
 
 from gettext import gettext as _
 
@@ -32,7 +35,7 @@ def register(controller=None):
     return True
 
 class ShotdetectImporter(GenericImporter):
-    name = _("Shotdetect importer")
+    name = _("Shotdetect XML importer")
 
     def can_handle(fname):
         """Return a score between 0 and 100.
@@ -61,14 +64,14 @@ class ShotdetectImporter(GenericImporter):
         video=root.find('content/head/media')
         if video is not None:
             mediafile=video.attrib['src']
-            p.setMetaData(config.data.namespace, 'mediafile', mediafile)
+            p.setMedia(mediafile)
         self.convert(self.iterator(root))
         self.progress(1.0)
         return self.package
 
     def iterator(self, root):
         if root.tag != 'shotdetect':
-            print "Invalid Shotdetect file format: ", root.tag
+            logger.error("Invalid Shotdetect file format: %s", root.tag)
             return
 
         progress=0.01
@@ -85,15 +88,16 @@ class ShotdetectImporter(GenericImporter):
             yield {
                 'type': self.annotationtype,
                 'content': "num=" + an.attrib['id'],
-                'begin': long(an.attrib['msbegin']),
-                'duration': long(an.attrib['msduration']),
+                'begin': int(an.attrib['msbegin']),
+                'duration': int(an.attrib['msduration']),
                 }
         self.progress(1.0)
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
     import sys
     if len(sys.argv) < 3:
-        print "Should provide a file name and a package name"
+        logger.error("Should provide a file name and a package name")
         sys.exit(1)
 
     fname=sys.argv[1]
@@ -104,7 +108,7 @@ if __name__ == "__main__":
     # FIXME: i.process_options()
     i.process_options(sys.argv[1:])
     # (for .sub conversion for instance, --fps, --offset)
-    print "Converting %s to %s using %s" % (fname, pname, i.name)
+    logger.info("Converting %s to %s using %s", fname, pname, i.name)
     p=i.process_file(fname)
     p.save(pname)
-    print i.statistics_formatted()
+    logger.info(i.statistics_formatted())
diff --git a/lib/advene/plugins/shotdetectapp.py b/lib/advene/plugins/shotdetectapp.py
index a2fe6c6..b373a37 100644
--- a/lib/advene/plugins/shotdetectapp.py
+++ b/lib/advene/plugins/shotdetectapp.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -21,12 +21,9 @@ name="ShotDetectApp importer"
 
 from gettext import gettext as _
 import os
-import sys
 import re
 import tempfile
 
-import gobject
-
 import advene.util.helper as helper
 
 import advene.core.config as config
@@ -38,6 +35,13 @@ def register(controller=None):
     return True
 
 class ShotdetectAppImporter(ExternalAppImporter):
+    """Shot detection.
+
+    The threshold parameter is used to specify the sensitivity of the
+    algorithm, and should typically be between 50 and 80. If too many
+    shots are detected, try to increase its value.
+    """
+
     name = _("ShotdetectApp importer")
 
     def __init__(self, *p, **kw):
@@ -74,7 +78,7 @@ class ShotdetectAppImporter(ExternalAppImporter):
             self.duration = self.controller.cached_duration
         # FIXME: else we could/should get it somehow
 
-        self.tempdir = unicode(tempfile.mkdtemp('', 'shotdetect'), sys.getfilesystemencoding())
+        self.tempdir = tempfile.mkdtemp('', 'shotdetect')
         self.temporary_resources.append(self.tempdir)
 
         self.ensure_new_type('shots', title=_("Detected shots"), schemaid='detected')
@@ -85,14 +89,9 @@ class ShotdetectAppImporter(ExternalAppImporter):
         Return the process arguments (the app_path, argv[0], will be
         prepended in async_process_file and should not be included here).
         """
-        if config.data.os == 'win32':
-            args = [ '-i', filename.encode('utf8', sys.getfilesystemencoding()),
-                     '-o', self.tempdir.encode('utf8', sys.getfilesystemencoding()),
-                     '-s', str(self.sensitivity) ]
-        else:
-            args = [ '-i', gobject.filename_from_utf8(filename.encode('utf8')),
-                     '-o', gobject.filename_from_utf8(self.tempdir.encode('utf8')),
-                     '-s', str(self.sensitivity) ]
+        args = [ '-i', filename,
+                 '-o', self.tempdir,
+                 '-s', str(self.sensitivity) ]
         return args
 
     def iterator(self):
@@ -112,24 +111,24 @@ class ShotdetectAppImporter(ExternalAppImporter):
         begin = 0
         while True:
             l = self.process.stderr.readline()
+            l = l.decode('utf-8')
             if not l:
                 break
             ms = shot_re.findall(l)
             if ms:
                 ts = 0
                 try:
-                    ts = long(ms[0])
+                    ts = int(ms[0])
                 except ValueError:
                     m = exp_re.match(ms[0])
                     if m:
-                        ts = long(float(m.group(1)) * 10 ** int(m.group(2)))
+                        ts = int(float(m.group(1)) * 10 ** int(m.group(2)))
                 if ts == 0:
                     continue
                 yield {
                     'content': str(num),
                     'begin': begin,
-                    # Offset the end timecode by 1 frame.
-                    'end': ts - (1000 / config.data.preferences['default-fps'])
+                    'end': ts
                     }
                 begin = ts
                 num += 1
diff --git a/lib/advene/plugins/soundenveloppe.py b/lib/advene/plugins/soundenveloppe.py
index 406f713..8e593b1 100644
--- a/lib/advene/plugins/soundenveloppe.py
+++ b/lib/advene/plugins/soundenveloppe.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,6 +16,8 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+import logging
+logger = logging.getLogger(__name__)
 
 name="Sound enveloppe importer"
 
@@ -23,21 +25,14 @@ from gettext import gettext as _
 
 import os
 import sys
-import urllib
-import gobject
-import gst
+from gi.repository import GObject
+from gi.repository import Gst
 
 import advene.core.config as config
 from advene.util.importer import GenericImporter
 import advene.util.helper as helper
 
-try:
-    from math import isinf, isnan
-except ImportError:
-    # python <= 2.5
-    def isnan(f):
-        return repr(f) == 'nan'
-    isinf = isnan
+from math import isinf, isnan
 
 def register(controller=None):
     controller.register_importer(SoundEnveloppeImporter)
@@ -55,6 +50,9 @@ class SoundEnveloppeImporter(GenericImporter):
         self.count = 1000
         self.channel = 'both'
 
+        # Lower bound for db values, to avoid a too large value range
+        self.lower_db_limit = -80
+
         self.optionparser.add_option("-i", "--interval",
                                      action="store", type="int", dest="interval", default=self.interval,
                                      help=_("Interval (in ms) at which to take samples."))
@@ -67,8 +65,8 @@ class SoundEnveloppeImporter(GenericImporter):
 
         self.buffer = []
         self.buffer_list = []
-        self.min = sys.maxint
-        self.max = -sys.maxint
+        self.min = sys.maxsize
+        self.max = -sys.maxsize
         self.first_item_time = 0
         self.lastval = 0
 
@@ -93,30 +91,38 @@ class SoundEnveloppeImporter(GenericImporter):
             self.convert( [ {
                         'begin': tup[0],
                         'end': tup[1],
-                        'content': " ".join("%.02f" % (factor * (f -m)) for f in tup[2]),
+                        'content': " ".join("%.02f" % (factor * (f - m)) for f in tup[2]),
                         } ])
 
     def on_bus_message(self, bus, message):
         def finalize():
-            pos = self.pipeline.query_position(gst.FORMAT_TIME)[0] / gst.MSECOND
-            gobject.idle_add(lambda: self.pipeline.set_state(gst.STATE_NULL) and False)
+            GObject.idle_add(lambda: self.pipeline.set_state(Gst.State.NULL) and False)
             # Add last buffer data
-            self.buffer_list.append((self.first_item_time, pos, list(self.buffer)))
+            if self.buffer:
+                # There is some data left.
+                self.buffer_list.append((self.first_item_time,
+                                         self.first_item_time + len(self.buffer) * self.interval,
+                                         list(self.buffer)))
             self.generate_normalized_annotations()
             self.end_callback()
             return True
 
-        if message.type == gst.MESSAGE_EOS:
+        s = message.get_structure()
+        if message.type == Gst.MessageType.EOS:
             finalize()
-        elif message.structure:
-            s=message.structure
-            #print "MSG " + bus.get_name() + ": " + s.to_string()
+        elif message.type == Gst.MessageType.ERROR:
+            title, message = message.parse_error()
+            logger.error("%s: %s", title, message)
+        elif message.type == Gst.MessageType.WARNING:
+            title, message = message.parse_warning()
+            logger.warn("%s: %s", title, message)
+        elif s:
             if s.get_name() == 'progress' and self.progress is not None:
                 if not self.progress(s['percent-double'] / 100, _("At %s") % helper.format_time(s['current'] * 1000)):
                     finalize()
             elif s.get_name() == 'level':
                 if not self.buffer:
-                    self.first_item_time = s['stream-time'] / gst.MSECOND
+                    self.first_item_time = s['stream-time'] / Gst.MSECOND
                 rms = s['rms']
                 v = rms[0]
                 if len(rms) > 1:
@@ -124,7 +130,7 @@ class SoundEnveloppeImporter(GenericImporter):
                         v = rms[1]
                     elif self.channel == 'both':
                         v = (rms[0] + rms[1]) / 2
-                if isinf(v) or isnan(v):
+                if isinf(v) or isnan(v) or v < self.lower_db_limit:
                     v = self.lastval
                 if v < self.min:
                     self.min = v
@@ -133,7 +139,7 @@ class SoundEnveloppeImporter(GenericImporter):
                 self.lastval = v
                 self.buffer.append(v)
                 if len(self.buffer) >= self.count:
-                    self.buffer_list.append((self.first_item_time, s['endtime'] / gst.MSECOND, list(self.buffer)))
+                    self.buffer_list.append((self.first_item_time, s['endtime'] / Gst.MSECOND, list(self.buffer)))
                     self.buffer = []
         return True
 
@@ -145,7 +151,7 @@ class SoundEnveloppeImporter(GenericImporter):
         at.setMetaData(config.data.namespace_prefix['dc'], "description", _("Sound enveloppe"))
 
         # Build pipeline
-        self.pipeline = gst.parse_launch('uridecodebin name=decoder ! audioconvert ! level name=level interval=%s ! progressreport silent=true update-freq=1 name=report ! fakesink' % str(self.interval * gst.MSECOND))
+        self.pipeline = Gst.parse_launch('uridecodebin name=decoder ! audioconvert ! level name=level interval=%s ! progressreport silent=true update-freq=1 name=report ! fakesink' % str(self.interval * Gst.MSECOND))
         self.decoder = self.pipeline.get_by_name('decoder')
         bus = self.pipeline.get_bus()
         # Enabling sync_message_emission will in fact force the
@@ -156,9 +162,9 @@ class SoundEnveloppeImporter(GenericImporter):
         bus.connect('message', self.on_bus_message)
 
         if config.data.os == 'win32':
-            self.decoder.props.uri = 'file:///' + os.path.abspath(unicode(filename))
+            self.decoder.props.uri = 'file:///' + os.path.abspath(str(filename))
         else:
             self.decoder.props.uri = 'file://' + os.path.abspath(filename)
         self.progress(0, _("Extracting sound enveloppe"))
-        self.pipeline.set_state(gst.STATE_PLAYING)
+        self.pipeline.set_state(Gst.State.PLAYING)
         return self.package
diff --git a/lib/advene/plugins/ted.py b/lib/advene/plugins/ted.py
index 4fa1be1..239f681 100644
--- a/lib/advene/plugins/ted.py
+++ b/lib/advene/plugins/ted.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2009-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2009-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -22,7 +22,7 @@ name="TED transcription importer"
 from gettext import gettext as _
 
 import re
-import urllib
+import urllib.request, urllib.parse, urllib.error
 try:
     # json is standard in python 2.6
     import json
@@ -54,9 +54,9 @@ class TEDImporter(GenericImporter):
         self.progress(0.1, "Fetching " + filename)
         if filename.startswith('http://www.ted.com'):
             filename=filename.strip('#/')
-            f=urllib.urlopen(filename)
+            f=urllib.request.urlopen(filename)
         else:
-            f=open(filename, 'r')
+            f=open(filename, 'r', encoding='utf-8')
         data='\n'.join(f.readlines())
         f.close()
 
@@ -66,7 +66,7 @@ class TEDImporter(GenericImporter):
 
         offset=re.findall('introDuration\s*:\s*(\d+)', data)
         if offset:
-            offset=long(offset[0])
+            offset=int(offset[0])
         else:
             offset=0
         m = re.findall('/talks/subtitles/id/(\d+)', data, re.MULTILINE)
@@ -79,7 +79,7 @@ class TEDImporter(GenericImporter):
         if podcast:
             podcast=podcast[0]
             self.progress(0.2, "Fetching podcast information")
-            podcast=urllib.urlopen(podcast.replace('itpc:', 'http:'))
+            podcast=urllib.request.urlopen(podcast.replace('itpc:', 'http:'))
             data=podcast.read()
             podcast.close()
             title=re.findall('<title>(.+?)</title>', data)
@@ -117,7 +117,7 @@ class TEDImporter(GenericImporter):
             'end': offset,
             }
         for timestamp, buf in re.findall('seekVideo.(\d+).+?>(.+?)</a>', data):
-            t=long(timestamp) + offset
+            t=int(timestamp) + offset
             if start is not None:
                 yield {
                     'type': at,
@@ -141,7 +141,7 @@ class TEDImporter(GenericImporter):
             self.progress(0.1, "Converting %s subtitles" % lang)
             at=self.create_annotation_type(self.package.get_element_by_id('ted'), lang)
             url=urlbase+'/lang/'+lang
-            f=urllib.urlopen(url)
+            f=urllib.request.urlopen(url)
             data=f.read()
             f.close()
             data=json.loads(data)
diff --git a/lib/advene/plugins/tracebuilder.py b/lib/advene/plugins/tracebuilder.py
deleted file mode 100644
index d7906e8..0000000
--- a/lib/advene/plugins/tracebuilder.py
+++ /dev/null
@@ -1,1201 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-#
-# Advene is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# Advene is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Advene; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-"""Trace builder.
-
-This plugin build a Trace object from events.
-It needs to register to the ECAEngine to capture events.
-It transforms these events into Operation objects and Action objects.
-Widgets can register with this trace builder to receive the trace.
-"""
-
-import os
-
-from threading import Thread
-import Queue
-import gobject
-import time
-import socket
-import urllib
-import xml.dom
-from gettext import gettext as _
-
-import advene.core.config as config
-
-import advene.model.view
-import xml.etree.ElementTree as ET
-
-import advene.util.helper as helper
-import advene.util.handyxml as handyxml
-
-from advene.model.schema import Schema, AnnotationType, RelationType
-from advene.model.annotation import Annotation, Relation
-from advene.model.view import View
-from advene.model.package import Package
-from advene.rules.elements import ECACatalog
-
-def register(controller):
-    tb = TraceBuilder(controller)
-    tb.start()
-    controller.register_tracer(tb)
-    return
-
-name="Trace Builder plugin"
-
-class TraceBuilder(Thread):
-    def __init__ (self, controller=None, parameters=None, package=None, ntbd=False, nte=False):
-        Thread.__init__(self)
-        self.equeue = Queue.Queue(-1)
-        self.exit_code = "###\n"
-        #self.close_on_package_load = False
-
-        self.controller=controller
-        self.host = "::1" #"2a01:e35:2efc:5cd0:216:cbff:fea0:3fb9"
-        self.port = 9992
-        self.texp = None # thread to export trace to a network
-        self.tbroad = None # thread to broadcast trace
-        self.bdq = None # broadcasting queue
-        self.network_broadcasting = ntbd
-        self.network_exp = nte
-        self.operations = []
-        self.registered_views = []
-        self.filtered_events = ['SnapshotUpdate', 'AnnotationBegin', 'AnnotationEnd', 'BookmarkHighlight', 'BookmarkUnhighlight']
-        self.tracemodel = {'events':[],
-                            'operations':[],
-                            'actions':[],
-                            }
-        for i in ECACatalog.event_names:
-            self.tracemodel['events'].append(i)
-            if i not in self.filtered_events:
-                self.tracemodel['operations'].append(i)
-        self.tracemodel['actions']=['Annotation', 'Restructuration', 'Navigation', 'Classification', 'View building']
-        self.opened_actions = {}
-        self.reset_opened_actions()
-        self.modelmapping = {
-                        'operations': {
-                                'actions': {
-                                        'AnnotationCreate':0,
-                                        'AnnotationEditEnd':1,
-                                        'AnnotationDelete':1,
-                                        'RelationCreate':1,
-                                        'RelationEditEnd':1,
-                                        'RelationDelete':1,
-                                        'AnnotationMerge':1,
-                                        'AnnotationMove':1,
-                                        'PlayerStart':2,
-                                        'PlayerStop':2,
-                                        'PlayerPause':2,
-                                        'PlayerResume':2,
-                                        'PlayerSet':2,
-                                        'ViewActivation':2,
-                                        'ViewDeactivation':2,
-                                        'AnnotationTypeCreate':3,
-                                        'RelationTypeCreate':3,
-                                        'RelationTypeDelete':3,
-                                        'AnnotationTypeDelete':3,
-                                        'AnnotationTypeEditEnd':3,
-                                        'RelationTypeEditEnd':3,
-                                        'SchemaCreate':3,
-                                        'SchemaEditEnd':3,
-                                        'SchemaDelete':3,
-                                        'ViewCreate':4,
-                                        'ViewEditEnd':4,
-                                        'ViewDelete':4,
-                                        'EditSessionStart':-1,
-                                        #'ElementEditEnd':5,
-                                        'ElementEditDestroy':-1,
-                                        'EditSessionEnd':-1,
-                                        },
-                                     },
-                            }
-
-        # FIXME: this does not belong here. It should be in a
-        # view-related module, which would allow use to directly store
-        # gtk.gdk.Color instances.
-        self.colormodel = {'events':{},
-                            'operations':{},
-                            'actions':{ 'Annotation': "#444488",
-                                        'Restructuration': "#448844",
-                                        'Navigation': "#884444",
-                                        'Classification': "#448888",
-                                        'View building': "#884488",
-                                        }
-                            }
-        #for i in self.tracemodel['operations']:
-        #    if i not in self.modelmapping['operations']['actions']:
-        #        print i
-        self.editEndNames = ['ElementEditDestroy', 'ElementEditEnd', 'AnnotationEditEnd', 'RelationEditEnd', 'AnnotationTypeEditEnd', 'RelationTypeEditEnd', 'EditSessionEnd', 'ViewEditEnd', 'SchemaEditEnd']
-
-        if package is None and controller is not None:
-            package=controller.package
-        self.__package=package
-        if self.network_broadcasting:
-            self.init_broadcasting()
-        self.controller.event_handler.register_view(self)
-        self.traces = []
-        self.trace = Trace() # current trace
-        self.trace.start = config.data.startup_time
-        self.traces.append(self.trace)
-
-    def reset_opened_actions(self):
-        for i in self.tracemodel['actions']:
-            self.opened_actions[i]=None
-
-    def log(self, msg, level=None):
-        m=": ".join( ("Tracebuilder", msg) )
-        if self.controller:
-            self.controller.log(m, level)
-        else:
-            print m
-
-    def run(self):
-        while (1):
-            #we shouldnt receive exception from the queue
-            obj = self.equeue.get()
-            if not isinstance(obj, dict):
-                if obj == self.exit_code:
-                    self.on_exit()
-                    break
-                else:
-                    continue
-            if obj['event_name'] in self.filtered_events:
-                continue
-            self.receive(obj)
-
-    def on_exit(self):
-        if self.network_exp:
-            # wait for export thread death
-            if self.texp is not None:
-                if self.texp.isAlive():
-                    self.log('Export thread still running, waiting for its death...')
-                self.texp.join()
-        # Also save trace on filesystem.
-        if config.data.preferences['record-actions']:
-            try:
-                fn = self.export()
-            except Exception, e:
-                self.log("error exporting trace : %s" % unicode(e).encode('utf-8'))
-
-        if self.network_broadcasting:
-            self.end_broadcasting()
-
-    def init_broadcasting(self):
-        self.bdq = Queue.Queue(-1)
-        self.tbroad = TBroadcast(self.host, self.port, self.bdq)
-        self.tbroad.start()
-
-    def export(self):
-        # Check that there are events to record
-        if not sum( len(l) for l in self.trace.levels.itervalues() ):
-            self.log("No event to export")
-            return ''
-
-        d=config.data.advenefile('traces', category='settings')
-        if not os.path.isdir(d):
-            helper.recursive_mkdir(d)
-
-        fname=config.data.advenefile(['traces',time.strftime("trace_advene-%Y%m%d-%H%M%S")],
-                                     category='settings')
-        try:
-            stream=open(fname, 'wb')
-        except (OSError, IOError), e:
-            #self.log(_("Cannot export to %(fname)s: %(e)s") % locals())
-            self.log(_("Cannot export to %(fname)s: %(e)s") % locals())
-            return None
-        tr=ET.Element('trace', name=self.trace.name, start=str(self.trace.start))
-
-        for lvl in self.trace.levels:
-            grp = ET.Element(lvl)
-            #everything can be rebuild from events.
-            for (id_e, e) in enumerate(self.trace.levels[lvl]):
-                #e.to_xml_string(id_e)
-                grp.append(e.export(id_e))
-            tr.append(grp)
-            # everything except comments could be rebuild from events...
-
-        helper.indent(tr)
-        ET.ElementTree(tr).write(stream, encoding='utf-8')
-        stream.close()
-        if self.network_exp:
-            self.network_export()
-        self.log("trace exported to %s" % fname)
-        return fname
-
-    def toggle_network_export(self):
-        self.network_exp = not self.network_exp
-        self.log("network export %s" % self.network_exp)
-        return
-
-    def network_export(self):
-        if not self.network_exp:
-            return
-        if self.texp is not None:
-            if self.texp.isAlive():
-                self.log("Export thread still running")
-                return
-            else:
-                self.texp.join() # nettoie le zombie ou pas ...
-        self.texp = TExport(self.host, self.port, self.trace)
-        self.texp.start()
-
-    def toggle_network_broadcasting(self):
-        self.network_broadcasting = not self.network_broadcasting
-        if self.network_broadcasting:
-            self.init_broadcasting()
-        else:
-            self.end_broadcasting()
-        self.log("broadcast %s" % self.network_broadcasting)
-        return
-
-    def end_broadcasting(self):
-        if self.tbroad.isAlive(): # should always be
-            self.log('Broadcasting thread still running, sending its death order !')
-            self.bdq.put("###\n")
-            self.tbroad.join()
-        return
-
-    def change_nework_infos(self, ip, port):
-        bc=self.network_broadcasting
-        if bc:
-            self.toggle_network_broadcasting()
-        self.host = ip
-        self.port = port
-        if bc:
-            self.toggle_network_broadcasting()
-        return
-
-    def remove_trace(self, index):
-        if index >= len(self.traces):
-            return False
-        self.traces.pop(index)
-        self.alert_registered(None, None, None)
-        return True
-
-    def search(self, trace, words=u'', exact=False, options=None):
-        if options is None:
-            options=['oname', 'oid', 'ocontent']
-        # exact will be to match exact terms or just find the terms in a string
-        # oname : objects name
-        # oid : objects id
-        # ocontent : objects content
-        temp=Trace()
-        temp.rename('Results for \'%s\' in %s' % (words, trace.name))
-        temp.start = trace.start
-        for e in trace.levels['events']:
-            etemp = e.copy()
-            temp.add_to_trace('events', etemp)
-        for a in trace.levels['actions']:
-            atemp = a.copy()
-            atemp.operations=[]
-            temp.add_to_trace('actions', atemp)
-
-            for o in a.operations:
-                if o.concerned_object['name'] is not None:
-                    content=o.content.encode('utf-8')
-                    contentb = content.find('content="')
-                    if contentb > 0 :
-                        contentb = contentb+9
-                        contentf = content.find('"', contentb)
-                        content = urllib.unquote(content[contentb:contentf])
-                        content = unicode(content)
-                    name = unicode(o.concerned_object['name'])
-                    _id = o.concerned_object['id']
-                    found = False or (not exact and 'oname' in options and name.find(words.lower())>=0) or (exact and 'oname' in options and name==words) or (not exact and 'oid' in options and _id.lower().find(words.lower())>=0) or (exact and 'oid' in options and _id==words) or (not exact and 'ocontent' in options and content.lower().find(words.lower())>=0) or (exact and 'ocontent' in options and content==words)
-                    if found and not o in temp.levels['operations']:
-                        otemp = o.copy()
-                        temp.add_to_trace('operations', otemp)
-                        atemp.operations.append(otemp)
-
-            if len(atemp.operations)<=0:
-                temp.remove_from_trace('actions', atemp)
-        self.traces.append(temp)
-        self.alert_registered(None, None, None)
-        return temp
-
-    def convert_old_trace(self, fname):
-        #FIXME : complete the import and do not use handyxml.
-        self.log('importing trace from %s' % fname)
-        if not os.path.exists(fname):
-            oldfname=fname
-            fname = config.data.advenefile(oldfname, category='settings')
-            self.log("%s not found, trying %s" % (oldfname, fname))
-            if not os.path.exists(fname):
-                self.log("%s not found, giving up." % fname)
-                return False
-        pk=handyxml.xml(fname, forced=True)
-        if pk.node.nodeName != 'package':
-            self.log("This does not look like a trace file.")
-            return False
-        self.traces.append(Trace())
-        self.reset_opened_actions()
-        if pk.annotations:
-            for an in pk.annotations[0].annotation:
-                an_content = ''
-                an_ac_time='0'
-                an_m_time='0'
-                an_movie_time='0'
-                evn=None
-                if an.childNodes:
-                    an_ac_time=an.childNodes[1].getAttribute('begin')
-                if an.content:
-                    if an.content[0].childNodes:
-                        evn=an.content[0].childNodes[0]
-                        if evn and evn.nodeType is xml.dom.Node.TEXT_NODE:
-                            an_content = evn.data.encode('utf-8')
-                an_name = an.type[1:]
-                if an_content.find('position='):
-                    d= an_content.find('position=')
-                    e = an_content.find('\n', an_content.find('position='))
-                    an_m_time=an_content[d:e]
-                #evt = Event(an_name, float(an_time), float(an_ac_time), an_content, an_movie, float(an_m_time), an_o_name, an_o_id)
-                #evt.change_comment(ev.comment)
-                #self.trace.add_to_trace('events', evt)
-                self.log('%s %s %s' % (an_name, an_ac_time, an_content))
-        return
-
-    def imp_type(self, typ):
-        if typ == 'advene.model.schema.Schema':
-            return advene.model.schema.Schema
-        elif typ == 'advene.model.schema.AnnotationType':
-            return advene.model.schema.AnnotationType
-        elif typ == 'advene.model.schema.RelationType':
-            return advene.model.schema.RelationType
-        elif typ == 'advene.model.annotation.Annotation':
-            return advene.model.annotation.Annotation
-        elif typ == 'advene.model.annotation.Relation':
-            return advene.model.annotation.Relation
-        elif typ == 'advene.model.view.View':
-            return advene.model.view.View
-        else:
-            return None
-
-    def import_trace(self, fname, reset=False):
-        # fname : String, trace file path
-        # reset : boolean, reset current trace FIXME: to be removed or modified
-        # import append a trace to self.traces
-        self.log('importing trace from %s' % fname)
-        # reseting current trace
-        if reset:
-            self.trace = Trace()
-            self.reset_opened_actions()
-            self.trace.start = config.data.startup_time
-            # should be now
-            self.log("Trace cleaned.")
-        # checking trace path
-        if not os.path.exists(fname):
-            oldfname=fname
-            fname = config.data.advenefile(oldfname, category='settings')
-            self.log("%s not found, trying %s" % (oldfname, fname))
-            if not os.path.exists(fname):
-                self.log("%s not found, giving up." % fname)
-                return False
-        tr=handyxml.xml(fname, forced=True)
-        lid=0
-        if tr.node.nodeName != 'trace':
-            self.log("This does not look like a trace file.")
-            return False
-        # creating an empty new trace
-        self.traces.append(Trace())
-        # initializing opened actions for the imported trace
-        tmp_opened_actions = {}
-        for i in self.tracemodel['actions']:
-            tmp_opened_actions[i]=None
-        if hasattr(tr, 'name'):
-            self.traces[-1].rename('%s (imported)' % tr.name)
-        else:
-            self.traces[-1].rename('No Name (imported)')
-        if hasattr(tr, 'start'):
-            self.traces[-1].start=float(tr.start)
-        events = tr
-        if hasattr(tr, 'events'):
-            events = tr.events[0]
-        for ev in events.event:
-            lid = lid+1
-            ev_content = ''
-            evn=None
-            if ev.childNodes:
-                evn=ev.childNodes[0]
-            if evn and evn.nodeType is xml.dom.Node.TEXT_NODE:
-                ev_content = evn.data.encode('utf-8')
-            if ev.o_name=="None":
-                ev.o_name=None
-            if ev.o_id=="None":
-                ev.o_id=None
-            if not hasattr(ev, 'o_type') or ev.o_type=="None": #for compatibility with previous traces
-                ev.o_type=None
-            if not hasattr(ev, 'o_cid') or ev.o_cid=="None": #for compatibility with previous traces
-                ev.o_cid=None
-            if self.traces[-1].start == 0 or float(ev.time) < self.traces[-1].start: #for compatibility with previous traces
-                self.traces[-1].start=float(ev.time)
-            ot = self.imp_type(ev.o_type)
-            evt = Event(ev.name, float(ev.time), float(ev.ac_time), ev_content, ev.movie, float(ev.m_time), ev.o_name, ev.o_id, ot, ev.o_cid)
-            evt.change_comment(ev.comment)
-            self.traces[-1].add_to_trace('events', evt)
-            if evt.name in self.modelmapping['operations']['actions']:
-                op = Operation(ev.name, float(ev.time), float(ev.ac_time), ev_content, ev.movie, float(ev.m_time), ev.o_name, ev.o_id, ot, ev.o_cid)
-                self.traces[-1].add_to_trace('operations', op)
-                if op is not None:
-                    if ev.name in self.modelmapping['operations']['actions']:
-                        ac_t = self.modelmapping['operations']['actions'][ev.name]
-                    else:
-                        continue
-                    typ = "Undefined"
-                    if ac_t >=0:
-                        typ = self.tracemodel['actions'][ac_t]
-                    if typ == "Undefined":
-                        if ot==advene.model.annotation.Annotation or ot==advene.model.annotation.Annotation:
-                            typ="Restructuration"
-                        elif ot==advene.model.schema.AnnotationType or ot==advene.model.schema.RelationType or ot==advene.model.schema.Schema:
-                            typ="Classification"
-                        elif ot==advene.model.view.View:
-                            typ="View building"
-                        else:
-                            print "undefined action type ! %s" % ev.o_type
-                            continue
-                    if tmp_opened_actions[typ]:
-                        # an action is already opened for this type of event
-                        ac = tmp_opened_actions[typ]
-                        #add operation to existing action
-                        ac.add_operation(op)
-                        if typ == "Navigation" and (op.name == "PlayerStop" or op.name == "PlayerPause"):
-                            # Navigation action end if PlayerStop or PlayerPause
-                            tmp_opened_actions[typ]=None
-                        continue
-                    #no corresponding action was already opened
-                    for t in tmp_opened_actions.keys():
-                        #we close every opened actions except Navigation
-                        if t != "Navigation":
-                            tmp_opened_actions[t]=None
-                    #we create the new action
-                    ac = Action(name=typ, begintime=op.time, endtime=None, acbegintime=op.activity_time, acendtime=None, content=None, movie=op.movie, movietime=op.movietime, operations=[op])
-                    self.traces[-1].add_to_trace('actions', ac)
-                    #we append the new action to the trace and flag it as opened (not yet ended)
-                    tmp_opened_actions[typ]=ac
-        # copy comments
-        if hasattr(tr, 'actions'):
-            for ac in tr.actions[0].action:
-                if ac.comment != "":
-                    self.traces[-1].levels['actions'][int(ac.id[1:])].change_comment(ac.comment)
-
-        self.alert_registered(None, None, None)
-        self.log("%s events imported" % lid)
-        return True
-
-    def receive(self, obj):
-        # obj : received event
-        ev = op = ac = None
-        ev = self.packEvent(obj)
-        # broadcast reseau
-        if self.network_broadcasting:
-            #verifying thread is still alive
-            if self.tbroad.isAlive():
-                self.bdq.put_nowait(ev)
-            #should be handled in TBroadcast thread
-            else:
-                #cleaning
-                self.toggle_network_broadcasting()
-                #relaunching
-                self.toggle_network_broadcasting()
-                self.bdq.put_nowait(ev)
-        if ev.name in self.modelmapping['operations']['actions']:
-            op = self.packOperation(obj)
-            if op is not None:
-                ac = self.packAction(obj, op)
-        self.alert_registered(ev, op, ac)
-
-    def packEvent(self, obj):
-        #print obj['event_name']
-        if obj['event_name'] != 'SnapshotUpdate':
-            self.controller.update_snapshot(self.controller.player.current_position_value)
-        ev_time = time.time()
-        ev_activity_time = (time.time() - self.trace.start) * 1000
-        ev_name = obj['event_name']
-        ev_movie = self.controller.package.getMetaData(config.data.namespace, "mediafile")
-        ev_movie_time = self.controller.player.current_position_value
-        if not ev_movie_time:
-            ev_movie_time=0
-        ev_content = ''
-        elem = None
-        elem_name = None
-        elem_id = None
-        elem_type = None
-        elem_class_id = None
-        # Logging content depending on keys
-        if 'element' in obj:
-            if isinstance(obj['element'], Annotation):
-                obj['annotation']=obj['element']
-            elif isinstance(obj['element'], Relation):
-                obj['relation']=obj['element']
-            elif isinstance(obj['element'], AnnotationType):
-                obj['annotationtype']=obj['element']
-            elif isinstance(obj['element'], RelationType):
-                obj['relationtype']=obj['element']
-            elif isinstance(obj['element'], Schema):
-                obj['schema']=obj['element']
-            elif isinstance(obj['element'], View):
-                obj['view']=obj['element']
-            elif isinstance(obj['element'], Package):
-                obj['package']=obj['element']
-        if 'uri' in obj:
-            obj['content']='movie="%s"' % str(obj['uri'])
-            elem_name='movie'
-            elem_id=str(obj['uri'])
-        elif 'annotation' in obj:
-            elem=obj['annotation']
-            if elem is not None:
-                ev_content= "\n".join(
-                    ( 'annotation=' + elem.id,
-                      'type=' + elem.type.id,
-                      'mimetype=' + elem.type.mimetype,
-                      'begin=' + str(elem.fragment.begin),
-                      'end=' + str(elem.fragment.end),
-                      'content="'+ urllib.quote(elem.content.data.encode('utf-8'))+'"')
-                            )
-                elem_name='annotation'
-                elem_id=elem.id
-                elem_type = advene.model.annotation.Annotation
-                elem_class_id = elem.type.id
-        elif 'relation' in obj:
-            elem=obj['relation']
-            if elem is not None:
-                ev_content= "\n".join(
-                    ( 'relation=' + elem.id,
-                      'type=' + elem.type.id,
-                      'mimetype=' + elem.type.mimetype,
-                      'source=' + elem.members[0].id,
-                      'dest=' + elem.members[1].id,
-                      'content="'+ urllib.quote(elem.content.data.encode('utf-8'))+'"')
-                    )
-                elem_name='relation'
-                elem_id=elem.id
-                elem_type = advene.model.annotation.Relation
-                elem_class_id = elem.type.id
-        elif 'annotationtype' in obj:
-            elem=obj['annotationtype']
-            if elem is not None:
-                ev_content= "\n".join(
-                    ('annotationtype='+elem.id,
-                     'schema=' + elem.schema.id,
-                     'mimetype=' + elem.mimetype)
-                    )
-                elem_name=elem.title
-                elem_id=elem.id
-                elem_type = advene.model.schema.AnnotationType
-                elem_class_id = elem.schema.id
-        elif 'relationtype' in obj:
-            elem=obj['relationtype']
-            if elem is not None:
-                ev_content= "\n".join(
-                    ('relationtype=' + elem.id,
-                     'schema=' + elem.schema.id,
-                     'mimetype=' + elem.mimetype)
-                    )
-                elem_name=elem.title
-                elem_id=elem.id
-                elem_type = advene.model.schema.RelationType
-                elem_class_id = elem.schema.id
-        elif 'schema' in obj:
-            elem=obj['schema']
-            if elem is not None:
-                ev_content= 'schema=' + elem.id
-                elem_name=elem.title
-                elem_id=elem.id
-                elem_type = advene.model.schema.Schema
-        elif 'view' in obj:
-            elem=obj['view']
-            if elem is not None:
-                if isinstance(elem, advene.model.view.View):
-                    ev_content= "\n".join(
-                        ('view=' + elem.id,
-                         'content="'+ urllib.quote(elem.content.data.encode('utf-8'))+'"')
-                        )
-                    elem_name=elem.title
-                    elem_id=elem.id
-                    elem_type = advene.model.view.View
-                else:
-                    ev_content= 'view=' + str(elem)
-                    elem_name='not a view'
-                    elem_id='undefined'
-        elif 'package' in obj:
-            elem=obj['package']
-            if elem is not None:
-                ev_content= 'package=' + elem.title
-                elem_name='package'
-                elem_id=elem.title
-                elem_type = advene.model.package.Package
-        elif 'position' in obj:
-            #event related to the player
-            if obj['position'] is None:
-                obj['position']=0
-            if obj['position_before'] is None:
-                obj['position_before']=0
-            ev_content=str(time.strftime("%H:%M:%S", time.gmtime(obj['position_before']/1000)))
-            ev_content+= '\n'
-            ev_content+=str(time.strftime("%H:%M:%S", time.gmtime(obj['position']/1000)))
-            if not obj['event_name'].find('Set')>0:
-                #not a PlayerSet
-                ev_movie_time=obj['position_before']
-            else:
-                ev_movie_time=obj['position']
-        #TODO undo ?
-        ev_undo=False
-        if 'undone' in obj:
-            ev_undo = True
-        ev = Event(ev_name, ev_time, ev_activity_time, unicode(ev_content), ev_movie, ev_movie_time, elem_name, elem_id, elem_type, elem_class_id)
-        #ev = Event(ev_name, ev_time, ev_activity_time, ev_snapshot, ev_content, ev_movie, ev_movie_time, elem_name, elem_id)
-        self.trace.add_to_trace('events', ev)
-        return ev
-
-    def packOperation(self, obj):
-        #op_snapshot = self.controller.package.imagecache.get(self.controller.player.current_position_value, epsilon=100)
-        op_time = time.time()
-        op_activity_time = (time.time() - self.trace.start) * 1000
-        op_name = obj['event_name']
-        #op_params = obj['parameters']
-        #for i in obj:
-        #    print "%s : %s" % (i,obj[i])
-        op_movie = self.controller.package.getMetaData(config.data.namespace, "mediafile")
-        op_movie_time = self.controller.player.current_position_value
-        if not op_movie_time:
-            op_movie_time=0
-        op_content = None
-        elem = None
-        elem_name = None
-        elem_id = None
-        elem_type = None
-        elem_class_id = None
-        # package uri annotation relation annotationtype relationtype schema
-        # Logging content depending on keys
-        if 'element' in obj:
-            if isinstance(obj['element'], advene.model.annotation.Annotation):
-                obj['annotation']=obj['element']
-            elif isinstance(obj['element'], advene.model.annotation.Relation):
-                obj['relation']=obj['element']
-            elif isinstance(obj['element'], advene.model.schema.AnnotationType):
-                obj['annotationtype']=obj['element']
-            elif isinstance(obj['element'], advene.model.schema.RelationType):
-                obj['relationtype']=obj['element']
-            elif isinstance(obj['element'], advene.model.schema.Schema):
-                obj['schema']=obj['element']
-            elif isinstance(obj['element'], advene.model.view.View):
-                obj['view']=obj['element']
-            elif isinstance(obj['element'], advene.model.package.Package):
-                obj['package']=obj['element']
-        if 'uri' in obj:
-            obj['content']='movie="'+str(obj['uri'])+'"'
-            elem_name='movie'
-            elem_id=str(obj['uri'])
-        elif 'annotation' in obj:
-            elem=obj['annotation']
-            if elem is not None:
-                op_content= "\n".join(
-                    ( 'annotation=' + elem.id,
-                      'type=' + elem.type.id,
-                      'mimetype=' + elem.type.mimetype,
-                      'begin=' + str(elem.fragment.begin),
-                      'end=' + str(elem.fragment.end),
-                      'content="'+ urllib.quote(elem.content.data.encode('utf-8'))+'"')
-                            )
-                elem_name='annotation'
-                elem_id=elem.id
-                elem_type = advene.model.annotation.Annotation
-                elem_class_id = elem.type.id
-        elif 'relation' in obj:
-            elem=obj['relation']
-            if elem is not None:
-                op_content= "\n".join(
-                    ( 'relation=' + elem.id,
-                      'type=' + elem.type.id,
-                      'mimetype=' + elem.type.mimetype,
-                      'source=' + elem.members[0].id,
-                      'dest=' + elem.members[1].id,
-                      'content="'+ urllib.quote(elem.content.data.encode('utf-8'))+'"')
-                    )
-                elem_name='relation'
-                elem_id=elem.id
-                elem_type = advene.model.annotation.Relation
-                elem_class_id = elem.type.id
-        elif 'annotationtype' in obj:
-            elem=obj['annotationtype']
-            if elem is not None:
-                op_content= "\n".join(
-                    ('annotationtype='+elem.id,
-                     'schema=' + elem.schema.id,
-                     'mimetype=' + elem.mimetype)
-                    )
-                elem_name=elem.title
-                elem_id=elem.id
-                elem_type = advene.model.schema.AnnotationType
-                elem_class_id = elem.schema.id
-        elif 'relationtype' in obj:
-            elem=obj['relationtype']
-            if elem is not None:
-                op_content= "\n".join(
-                    ('relationtype=' + elem.id,
-                     'schema=' + elem.schema.id,
-                     'mimetype=' + elem.mimetype)
-                    )
-                elem_name=elem.title
-                elem_id=elem.id
-                elem_type = advene.model.schema.RelationType
-                elem_class_id = elem.schema.id
-        elif 'schema' in obj:
-            elem=obj['schema']
-            if elem is not None:
-                op_content= 'schema=' + elem.id
-                elem_name=elem.title
-                elem_id=elem.id
-                elem_type = advene.model.schema.Schema
-        elif 'view' in obj:
-            elem=obj['view']
-            if elem is not None:
-                if isinstance(elem, advene.model.view.View):
-                    op_content= "\n".join(
-                        ('view=' + elem.id,
-                         'content="'+ urllib.quote(elem.content.data.encode('utf-8'))+'"')
-                        )
-                    elem_name=elem.title
-                    elem_id=elem.id
-                    elem_type = advene.model.view.View
-                else:
-                    op_content= 'view=' + str(elem)
-                    elem_name='not a view'
-                    elem_id='undefined'
-        elif 'package' in obj:
-            elem=obj['package']
-            if elem is not None:
-                op_content= 'package=' + elem.title
-                elem_name='package'
-                elem_id=elem.title
-                elem.type=advene.model.package.Package
-        elif 'position' in obj:
-            #event related to the player
-            if obj['position'] is None:
-                obj['position']=0
-            if obj['position_before'] is None:
-                obj['position_before']=0
-            op_content=str(time.strftime("%H:%M:%S", time.gmtime(obj['position_before']/1000)))
-            op_content+= '\n'
-            op_content+=str(time.strftime("%H:%M:%S", time.gmtime(obj['position']/1000)))
-            if not obj['event_name'].find('Set')>0:
-                #not a PlayerSet
-                op_movie_time=obj['position_before']
-            else:
-                op_movie_time=obj['position']
-        if self.trace.levels['operations']:
-            prev = self.trace.levels['operations'][-1]
-            if op_name in self.editEndNames and prev.name in self.editEndNames and prev.concerned_object['id'] == elem_id:
-                return
-        op = Operation(op_name, op_time, op_activity_time, unicode(op_content), op_movie, op_movie_time, elem_name, elem_id, elem_type, elem_class_id)
-        self.trace.add_to_trace('operations', op)
-        return op
-
-    def packAction(self, obj, op):
-        ope = op
-        ac_t = None
-        # verifier l'action de l'evenement
-        if obj['event_name'] in self.modelmapping['operations']['actions']:
-            ac_t = self.modelmapping['operations']['actions'][obj['event_name']]
-        else:
-            return
-        typ = "Undefined"
-        if ac_t >=0:
-            typ = self.tracemodel['actions'][ac_t]
-        if typ == "Undefined":
-            # some operations can be mapped to different actions, we check that
-            typ = self.find_action_name(obj)
-        if self.opened_actions.get(typ):
-            # an action is already opened for this event
-            ac = self.opened_actions[typ]
-            if typ == "Navigation" and (ope.name == "PlayerStop" or ope.name == "PlayerPause"):
-                # navigation action is ended by a stop or pause
-                self.opened_actions[typ] = None
-            # we pack the operation to the already existing action
-            ac.add_operation(ope)
-            return ac
-        #no existing action found, we close every previously opened actions except navigation
-        for t in self.opened_actions.keys():
-            if t != "Navigation":
-                self.opened_actions[t]=None
-        # we create a new action
-        ac = Action(name=typ, begintime=ope.time, endtime=None, acbegintime=ope.activity_time, acendtime=None, content=None, movie=ope.movie, movietime=ope.movietime, operations=[ope])
-        # add it to the trace
-        self.trace.add_to_trace('actions', ac)
-        # and flag it as opened
-        self.opened_actions[typ]=ac
-        return ac
-
-    def alert_registered(self, event, operation, action):
-        for i in self.registered_views:
-            gobject.idle_add(i.receive, self.trace, event, operation, action)
-        return
-
-    def register_view(self, view):
-        self.registered_views.append(view)
-        return
-
-    def unregister_view(self, view):
-        self.registered_views.remove(view)
-        return
-
-    def find_action_name(self, obj_evt):
-        # need to test something else in annot
-        if 'annotation' in obj_evt or 'relation' in obj_evt:
-            return "Restructuration"
-        if 'annotationtype' in obj_evt or 'relationtype' in obj_evt or 'schema' in obj_evt:
-            return "Classification"
-        if 'view' in obj_evt:
-            return "View building"
-        return "Undefined"
-
-    #def get_trace_level(self, level):
-    #    return self.trace.get_level(level)
-
-    #def get_trace(self):
-    #    return self.trace
-
-class Trace:
-    def __init__ (self):
-        self.start=0
-        self.name=time.strftime("trace-%Y%m%d-%H%M%S")
-        self.levels={
-        'events':[],
-        'operations':[],
-        'actions':[],
-        }
-
-    def rename(self, name):
-        # rename the trace
-        self.name = name
-        return
-
-    def sort_trace_by(self, level, typ):
-        # allow to sort trace level 1 or 2 by time or name
-        return
-
-    def add_to_trace(self, level, obj):
-        # add an object to a level of the trace
-        if obj is None or not self.levels.has_key(level):
-            return None
-        self.levels[level].append(obj)
-        return obj
-
-    def remove_from_trace(self, level, obj):
-        # remove an object from the trace
-        if obj is None or not self.levels.has_key(level) or obj not in self.levels[level]:
-            return None
-        self.levels[level].remove(obj)
-        return obj
-
-    def add_level(self, level):
-        # create a new level in the trace
-        if self.levels.has_key(level):
-            return None
-        self.levels[level]=[]
-        return self.levels[level]
-
-    def remove_level(self, level):
-        # remove a level from the trace
-        if level == 'actions' or level == 'operations' or level=='events':
-            print 'You cannot delete events, operations and actions levels'
-            return
-        if self.levels.has_key(level):
-            del self.levels[level]
-        return
-
-    def rename_level(self, level, new_name):
-        # change the name of a level of the trace
-        if (not self.levels.has_key(level)) or self.levels.has_key(new_name) or level == 'actions' or level == 'operations':
-            print 'You cannot rename operations and actions levels'
-            return None
-        self.levels[new_name]=self.levels[level]
-        del self.levels[level]
-        return self.levels[new_name]
-
-    def get_level(self, level):
-        if self.levels.has_key(level):
-            return self.levels[level]
-        else:
-            return None
-
-    def list_all(self):
-        for i in self.levels:
-            print "Trace niveau \'%s\'" % i
-            for t in self.levels[i]:
-                print "    %s : \'%s\'" % (t, t.name)
-        return
-
-class Event:
-    def __init__(self, name, time_, actime, content, movie, movietime, obj, obj_id, obj_type, o_class_id):
-        self.name = name
-        self.time = time_
-        self.activity_time = actime
-        self.content = content or u''
-        self.movie = movie
-        self.movietime = movietime
-        self.comment = ''
-        self.concerned_object = {
-            'name':obj,
-            'id':obj_id,
-            'type':obj_type,
-            'cid':o_class_id,
-        }
-
-    def copy(self):
-        e = Event(self.name, self.time, self.activity_time,
-                  self.content, self.movie, self.movietime,
-                  self.concerned_object['name'], self.concerned_object['id'],
-                  self.concerned_object['type'], self.concerned_object['cid'])
-        e.change_comment(self.comment)
-        return e
-
-    def exp_type(self, typ):
-        if typ == Schema:
-            return 'advene.model.schema.Schema'
-        elif typ == AnnotationType:
-            return 'advene.model.schema.AnnotationType'
-        elif typ == RelationType:
-            return 'advene.model.schema.RelationType'
-        elif typ == Annotation:
-            return 'advene.model.annotation.Annotation'
-        elif typ == Relation:
-            return 'advene.model.annotation.Relation'
-        elif typ == View:
-            return 'advene.model.view.View'
-        else:
-            return 'None'
-
-    def export(self, n_id):
-        #print "%s %s %s %s %s %s %s %s %s %s" % ('e'+str(n_id), self.name, str(self.time), str(self.activity_time), self.movie, str(self.movietime), self.comment, str(self.concerned_object['name']), str(self.concerned_object['id']), self.content)
-        e = ET.Element('event', id='e'+str(n_id),
-                name=self.name, time=str(self.time),
-                ac_time=str(self.activity_time), movie=str(self.movie), m_time=str(self.movietime), comment=self.comment, o_name=str(self.concerned_object['name']), o_id=str(self.concerned_object['id']), o_type=self.exp_type(self.concerned_object['type']), o_cid=str(self.concerned_object['cid']))
-        e.text = self.content
-        return e
-
-    def to_xml_string(self, n_id):
-        return ET.tostring(self.export(n_id), encoding="utf-8")
-        #return "<event id='e%s' name='%s' time='%s' ac_time='%s' movie='%s' m_time='%s' comment='%s' o_name='%s' o_id='%s' o_type='%s' o_cid='%s'/>" % (str(n_id), self.name, str(self.time), str(self.activity_time), str(self.movie), str(self.movietime), self.comment, str(self.concerned_object['name']), str(self.concerned_object['id']), str(self.concerned_object['type']), str(self.concerned_object['cid']))
-
-
-    def change_comment(self, comment=''):
-        self.comment = comment
-        return
-
-
-class Operation:
-    def __init__(self, name, time_, actime, content, movie, movietime, obj, obj_id, obj_type, o_class_id):
-        self.name = name
-        self.time = time_
-        self.activity_time = actime
-        self.content = content or u''
-        self.movie = movie
-        self.movietime = movietime
-        self.comment = ''
-        self.concerned_object = {
-            'name':obj,
-            'id':obj_id,
-            'type':obj_type,
-            'cid':o_class_id,
-        }
-
-    def copy(self):
-        o = Operation(self.name, self.time, self.activity_time,
-                      self.content, self.movie, self.movietime,
-                      self.concerned_object['name'], self.concerned_object['id'],
-                      self.concerned_object['type'],self.concerned_object['cid'])
-        o.change_comment(self.comment)
-        return o
-
-    def exp_type(self, typ):
-        if typ == Schema:
-            return 'advene.model.schema.Schema'
-        elif typ == AnnotationType:
-            return 'advene.model.schema.AnnotationType'
-        elif typ == RelationType:
-            return 'advene.model.schema.RelationType'
-        elif typ == Annotation:
-            return 'advene.model.annotation.Annotation'
-        elif typ == Relation:
-            return 'advene.model.annotation.Relation'
-        elif typ == View:
-            return 'advene.model.view.View'
-        else:
-            return 'None'
-
-    def export(self, n_id):
-        #print "%s %s %s %s %s %s %s %s %s %s" % ('e'+str(n_id), self.name, str(self.time), str(self.activity_time), self.movie, str(self.movietime), self.comment, str(self.concerned_object['name']), str(self.concerned_object['id']), self.content)
-        e = ET.Element('operation', id='o'+str(n_id),
-                name=self.name, time=str(self.time),
-                ac_time=str(self.activity_time), movie=str(self.movie), m_time=str(self.movietime), comment=self.comment, o_name=str(self.concerned_object['name']), o_id=str(self.concerned_object['id']), o_type=self.exp_type(self.concerned_object['type']), o_cid=str(self.concerned_object['cid']))
-        e.text = self.content
-        return e
-
-    def to_xml_string(self, n_id):
-        return ET.tostring(self.export(n_id), encoding="utf-8")
-
-    def change_comment(self, comment=''):
-        self.comment = comment
-        return
-
-class Action:
-    def __init__(self, name, begintime, endtime, acbegintime, acendtime, content, movie, movietime, operations):
-        self.operations = operations or []
-        self.name = name
-
-        if endtime is None:
-            endtime = begintime + 0.5
-        if acendtime is None:
-            acendtime = acbegintime + 500
-
-        self.time = [ begintime, endtime ]
-        self.activity_time = [ acbegintime, acendtime ]
-
-        self.content = content or u''
-
-        self.movie = movie
-        self.movietime = movietime
-
-        self.comment = ''
-
-    def copy(self):
-        a = Action(self.name, self.time[0], self.time[1],
-                   self.activity_time[0], self.activity_time[1],
-                   self.content, self.movie, self.movietime,
-                   self.operations)
-        a.change_comment(self.comment)
-        return a
-
-    def change_comment(self, comment=''):
-        self.comment = comment
-
-    def add_operation(self, operation):
-        self.operations.append(operation)
-        self.set_time(1, operation.time)
-
-    def set_time(self, choice, newtime):
-        offset = (newtime - self.time[choice])*1000
-        self.time[choice]=newtime
-        self.activity_time[choice]=self.activity_time[choice] + offset
-
-    def set_content(self, newcontent):
-        self.content = newcontent
-
-    def export(self, a_id):
-        #print "%s %s %s %s %s %s %s %s %s %s" % ('e'+str(n_id), self.name, str(self.time), str(self.activity_time), self.movie, str(self.movietime), self.comment, str(self.concerned_object['name']), str(self.concerned_object['id']), self.content)
-        e = ET.Element('action', id='a'+str(a_id),
-                name=self.name, b_time=str(self.time[0]),
-                e_time=str(self.time[1]),
-                ac_b_time=str(self.activity_time[0]),
-                ac_e_time=str(self.activity_time[1]),
-                movie=self.movie,
-                m_time=str(self.movietime),
-                comment = self.comment)
-        e.text = self.content
-        return e
-
-    def to_xml_string(self, n_id):
-        return ET.tostring(self.export(n_id), encoding="utf-8")
-
-class TExport(Thread):
-    def __init__ (self, host, port, trace):
-        Thread.__init__(self)
-        self.host = host
-        self.port = port
-        self.trace = trace
-
-    def run(self):
-        try:
-            sck = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
-            addr = socket.getaddrinfo(self.host, self.port)
-            sck.connect(addr[0][4])
-        except (socket.error, socket.gaierror), e:
-            print(_("Cannot export to %(host)s:%(port)s %(error)s") % {
-                    'host': self.host,
-                    'port': self.port,
-                    'error': e})
-            return
-        nbe=0
-        try:
-            data="INCOMIIIIIIIIIIIIIIING !"
-            sck.send(data.encode('utf-8'))
-            for (id_e, e) in enumerate(self.trace.levels['events']):
-                tmp=e.to_xml_string(id_e)
-                sck.sendall(tmp)
-                nbe+=1
-        except (socket.error, socket.gaierror), e:
-            print(_("Cannot send data to %(host)s:%(port)s %(error)s") % {
-                    'host': self.host,
-                    'port': self.port,
-                    'error': e } )
-            sck.close()
-            return
-        print '%s events exported to %s:%s' % (nbe, self.host, self.port)
-        sck.close()
-
-class TBroadcast(Thread):
-
-    def __init__ (self, host, port, bdq):
-        Thread.__init__(self)
-        self.host = host
-        self.port = port
-        self.bdq = bdq
-        self.obsel = None
-
-    def run(self):
-        # Creating socket and queue
-        try:
-            sck = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
-            addr = socket.getaddrinfo(self.host, self.port)
-            sck.connect(addr[0][4])
-        except (socket.error, socket.gaierror), e:
-            print(_("Cannot export to %(host)s:%(port)s %(error)s") % {
-                    'host': self.host,
-                    'port': self.port,
-                    'error': e})
-            return
-        nbe=0
-        # Infinite loop waiting for event to send
-        # Receiving from Queue and sending to host
-        # Need to test some special code to stop thread
-        while (1):
-            #we shouldnt receive exception from the queue
-            self.obsel = self.bdq.get()
-            if not isinstance(self.obsel, Event):
-                if self.obsel == "###\n":
-                    print "Broadcasting: death received"
-                    break
-                else:
-                    continue
-            tmp = self.obsel.to_xml_string(nbe)
-            try:
-                sck.sendall(tmp)
-                nbe+=1
-            except (socket.error, socket.gaierror), e:
-                print(_("Cannot send event %(nb)s to %(host)s:%(port)s %(error)s") % {
-                        'nb': nbe,
-                        'host': self.host,
-                        'port': self.port,
-                        'error': e})
-                return
-        print _('%(nb)s events sent to %(host)s:%(port)s during session.') % {
-            'nb': nbe,
-            'host': self.host,
-            'port': self.port }
-        sck.close()
diff --git a/lib/advene/plugins/transcriber.py b/lib/advene/plugins/transcriber.py
index c9433eb..054f328 100644
--- a/lib/advene/plugins/transcriber.py
+++ b/lib/advene/plugins/transcriber.py
@@ -23,6 +23,9 @@
 
 name="Transcriber importer"
 
+import logging
+logger = logging.getLogger(__name__)
+
 from gettext import gettext as _
 
 from advene.util.importer import GenericImporter
@@ -88,31 +91,31 @@ class TrsImporter(GenericImporter):
 
                     try:
                         s_begin=float(s.get('startTime')) ## 'startTime' is a "Section" required attribute
-                    except AttributeError, e:
-                        print str(e)
+                    except:
+                        logger.error("startTime Conversion", exc_info=True)
                         continue
 
                     s_begin=int(s_begin*1000)
 
                     try:
                         s_end=float(s.get('endTime'))    ## 'endTime' is a "Section" required attribute
-                    except AttributeError, e:
-                        print str(e)
+                    except:
+                        logger.error("endTime Conversion", exc_info=True)
                         continue
 
                     s_end=int(s_end*1000)
 
                     try:
                         typ = s.get('type')              ## 'type' is a "Section" required attribute
-                    except AttributeError, e:
-                        print str(e)
+                    except:
+                        logger.error("type Conversion", exc_info=True)
                         continue
 
                     topic = ""  ## 'topic' is a "Section" optional  attribute
                     try :
                         if s.get('topic') is not None:
                             topic = self.topics[s.get('topic')].rstrip('[]')
-                    except AttributeError, KeyError:
+                    except AttributeError as KeyError:
                         pass
 
 
@@ -129,16 +132,16 @@ class TrsImporter(GenericImporter):
 
                             try:
                                 t_begin=float(t.get('startTime')) ## 'startTime' is a "Turn" required attribute
-                            except AttributeError, e:
-                                print str(e)
+                            except:
+                                logger.error("startTime Conversion", exc_info=True)
                                 continue
 
                             t_begin=int(t_begin*1000)
 
                             try:
                                 t_end=float(t.get('endTime'))   ## 'endTime' is a "Turn" required attribute
-                            except AttributeError, e:
-                                print str(e)
+                            except:
+                                logger.error("endTime Conversion", exc_info=True)
                                 continue
 
                             t_end=int(t_end*1000)
@@ -167,9 +170,9 @@ class TrsImporter(GenericImporter):
                                 if elem.tag == "Sync" :
                                     try:
                                         seg_time = float(elem.get('time'))
-                                    except AttributeError, e:
-                                            print str(e)
-                                            continue
+                                    except:
+                                        logger.error("time Conversion", exc_info=True)
+                                        continue
 
                                     seg_time = int(seg_time*1000)
 
@@ -191,8 +194,8 @@ class TrsImporter(GenericImporter):
                                 elif elem.tag == 'Background':
                                     try:
                                         time = elem.get('time')
-                                    except AttributeError, e:
-                                        print str(e)
+                                    except:
+                                        logger.error("time Conversion", exc_info=True)
                                         continue
 
                                     level = 'off'
@@ -230,12 +233,12 @@ class TrsImporter(GenericImporter):
                                 seg['content'] = text+"\n"
                                 yield seg
 
-                    except AttributeError,e: ## catch exception on Turn elements
-                        print str(e)
+                    except AttributeError: ## catch exception on Turn elements
+                        logger.error("Exception on Turn element", exc_info=True)
                         continue
 
-            except AttributeError,e:  ## catch exceptions on Section elements
-                print str(e)
+            except AttributeError:  ## catch exceptions on Section elements
+                logger.error("Exception on Section element", exc_info=True)
                 continue
 
             if b['begin'] is not None:
diff --git a/lib/advene/plugins/youtubeannotations.py b/lib/advene/plugins/transcript.py
similarity index 63%
rename from lib/advene/plugins/youtubeannotations.py
rename to lib/advene/plugins/transcript.py
index b425230..7201fef 100644
--- a/lib/advene/plugins/youtubeannotations.py
+++ b/lib/advene/plugins/transcript.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2013 Olivier Aubert <contact at olivieraubert.net>
+# Copyright (C) 2016 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,21 +16,22 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+name="Youtube XML importer"
 
-name="Youtube Annotations XML importer"
+import logging
+logger = logging.getLogger(__name__)
 
 from gettext import gettext as _
 
 from advene.util.importer import GenericImporter
 import xml.etree.ElementTree as ET
-import HTMLParser
 
 def register(controller=None):
-    controller.register_importer(XMLYoutubeImporter)
+    controller.register_importer(TranscriptImporter)
     return True
 
-class XMLYoutubeImporter(GenericImporter):
-    name = _("Youtube XML annotations importer")
+class TranscriptImporter(GenericImporter):
+    name = _("Youtube XML importer")
 
     def can_handle(fname):
         """Return a score between 0 and 100.
@@ -40,46 +41,47 @@ class XMLYoutubeImporter(GenericImporter):
         if fname.endswith('.xml'):
             return 80
         return 0
-    can_handle = staticmethod(can_handle)
+    can_handle=staticmethod(can_handle)
 
     def process_file(self, filename, dest=None):
         tree = ET.parse(filename)
         root = tree.getroot()
 
         p, at = self.init_package(filename=dest,
-                                  schemaid='youtube', annotationtypeid='transcript')
-        at.mimetype = 'text/plain'
-        at.title = "Youtube Transcript"
-
-        self.package=p
+                                  annotationtypeid='transcript')
+        at.mimetype='text/plain'
+        at.title = "Transcript"
 
+        self.at = at
+        self.package = p
         self.convert(self.iterator(root))
         self.progress(1.0)
         return self.package
 
     def iterator(self, root):
-        parser = HTMLParser.HTMLParser()
-
         if root.tag != 'transcript':
-            print "Invalid Youtube XML file format: ", root.tag
+            logger.error("Invalid Youtube XML file format: %s", root.tag)
             return
 
-        progress = 0.01
+        progress=0.01
         self.progress(progress)
 
-        l = root.findall('.//text')
+        l=root.findall('.//text')
         if l:
-            self.progress(progress, _("Importing annotations"))
-            incr = 1.0 / len(l)
+            self.progress(progress, _("Importing transcript"))
+            incr = 0.5 / len(l)
             for e in l:
                 progress += incr
                 self.progress(progress)
+                begin = int(float(e.attrib['start']) * 1000)
+                end = begin + int(float(e.attrib['dur']) * 1000)
                 yield {
-                    'content': parser.unescape(e.text),
-                    'begin': long(float(e.attrib.get('start')) * 1000),
-                    'duration': long(float(e.attrib.get('dur')) * 1000),
+                    'type': self.at,
+                    'content': e.text,
+                    'begin': begin,
+                    'end': end
                     }
         else:
             progress = 1.0
 
-        self.progress(progress)
+        self.progress(1.0)
diff --git a/lib/advene/plugins/ttl.py b/lib/advene/plugins/ttl.py
index 5e5f766..c6f714e 100644
--- a/lib/advene/plugins/ttl.py
+++ b/lib/advene/plugins/ttl.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -51,7 +51,7 @@ class TTLImporter(GenericImporter):
     can_handle=staticmethod(can_handle)
 
     def process_file(self, filename, dest=None):
-        f=open(filename, 'r')
+        f=open(filename, 'rb')
         if self.package is None:
             self.init_package(filename=filename, schemaid='traces', annotationtypeid=None)
         self.model = None
@@ -70,7 +70,7 @@ class TTLImporter(GenericImporter):
         propname = ''
         data = ''
         for l in fd:
-            l=unicode(l.strip().rstrip(";").strip(), 'latin1')
+            l=str(l.strip().rstrip(";").strip(), 'latin1')
             if self.model is None:
                 if '/modelLDT/' in l:
                     self.model = 'ldt'
@@ -104,7 +104,7 @@ class TTLImporter(GenericImporter):
                     continue
 
                 if num_re.match(data):
-                    data = long(data)
+                    data = int(data)
                 elif data.startswith('"') and data.endswith('"'):
                     data = data.strip('"')
 
@@ -136,7 +136,7 @@ class TTLImporter(GenericImporter):
                 item['_end'] = helper.format_time_reference(item['end'])
 
                 yield {
-                    'content': "\n".join( "%s=%s" % (k, str(item[k])) for k in sorted(item.iterkeys())).encode('utf8'),
+                    'content': "\n".join( "%s=%s" % (k, str(item[k])) for k in sorted(item.keys())).encode('utf8'),
                     'begin': begin,
                     'end' : end,
                     }
diff --git a/lib/advene/plugins/tts.py b/lib/advene/plugins/tts.py
index 778f400..b6664be 100644
--- a/lib/advene/plugins/tts.py
+++ b/lib/advene/plugins/tts.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,6 +16,9 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+import logging
+logger = logging.getLogger(__name__)
+
 from gettext import gettext as _
 import subprocess
 import os
@@ -103,14 +106,14 @@ class TTSEngine:
         if name in parameters:
             try:
                 result=context.evaluateValue(parameters[name])
-            except advene.model.tal.context.AdveneTalesException, e:
+            except advene.model.tal.context.AdveneTalesException as e:
                 try:
                     rulename=context.evaluateValue('rule')
                 except advene.model.tal.context.AdveneTalesException:
                     rulename=_("Unknown rule")
                 self.controller.log(_("Rule %(rulename)s: Error in the evaluation of the parameter %(parametername)s:") % {'rulename': rulename,
                                                                                                                           'parametername': name})
-                self.controller.log(unicode(e.message)[:160])
+                self.controller.log(str(e.message)[:160])
                 result=default_value
         else:
             result=default_value
@@ -182,8 +185,8 @@ class FestivalTTSEngine(TTSEngine):
             self.init()
             if self.festival_process is not None:
                 self.festival_process.stdin.write('(SayText "%s")\n' % helper.unaccent(sentence))
-        except OSError, e:
-            self.controller.log(u"TTS Error: " + unicode(e.message))
+        except OSError as e:
+            self.controller.log("TTS Error: " + str(e.message))
         return True
 ENGINES['festival'] = FestivalTTSEngine
 
@@ -268,8 +271,8 @@ class EspeakTTSEngine(TTSEngine):
                     kw = { 'preexec_fn': subprocess_setup }
                 self.espeak_process = subprocess.Popen([ self.espeak_path, '-v', self.language ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, **kw)
             self.espeak_process.stdin.write((sentence + "\n").encode(config.data.preferences['tts-encoding'], 'ignore'))
-        except OSError, e:
-            self.controller.log("TTS Error: ", unicode(e.message).encode('utf8'))
+        except OSError as e:
+            self.controller.log("TTS Error: ", str(e.message).encode('utf8'))
         return True
 ENGINES['espeak'] = EspeakTTSEngine
 
@@ -347,8 +350,8 @@ class CustomTTSEngine(TTSEngine):
             if self.prg_process is None:
                 self.prg_process = subprocess.Popen([ self.prg_path, '-v', self.language ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, creationflags = CREATE_NO_WINDOW)
             self.prg_process.stdin.write((sentence + "\n").encode(config.data.preferences['tts-encoding'], 'ignore'))
-        except OSError, e:
-            self.controller.log("TTS Error: ", unicode(e.message).encode('utf8'))
+        except OSError as e:
+            self.controller.log("TTS Error: ", str(e.message).encode('utf8'))
         return True
 ENGINES['custom'] = CustomTTSEngine
 
@@ -386,13 +389,11 @@ class CustomArgTTSEngine(TTSEngine):
             self.language=lang
         try:
             fse = sys.getfilesystemencoding()
-            subprocess.Popen(unicode(" ".join([self.prg_path, '-v', self.language, '"%s"' % (sentence.replace('\n',' ').replace('"', '') + u"\n")])).encode(config.data.preferences['tts-encoding'], 'ignore'), creationflags = CREATE_NO_WINDOW)
-        except OSError, e:
+            subprocess.Popen(str(" ".join([self.prg_path, '-v', self.language, '"%s"' % (sentence.replace('\n',' ').replace('"', '') + "\n")])).encode(config.data.preferences['tts-encoding'], 'ignore'), creationflags = CREATE_NO_WINDOW)
+        except OSError as e:
             try:
-                m = unicode(e.message)
+                m = str(e.message)
             except UnicodeDecodeError:
-                print "TTS: Error decoding error message with standard encoding"
-                m = unicode(e.message, fse, 'ignore')
-            self.controller.log("TTS Error: ", m.encode('ascii', 'ignore'))
+                logger.error("TTS: Error decoding error message with standard encoding", m.encode('ascii', 'replace'))
         return True
 ENGINES['customarg'] = CustomArgTTSEngine
diff --git a/lib/advene/plugins/undomanager.py b/lib/advene/plugins/undomanager.py
index fa5b28c..6ba3780 100644
--- a/lib/advene/plugins/undomanager.py
+++ b/lib/advene/plugins/undomanager.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,12 +20,14 @@
 
 It provides a basic framework for simple undos.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 from advene.model.annotation import Annotation
 from advene.model.fragment import MillisecondFragment
 from advene.model.view import View
 from advene.model.query import Query
-from cPickle import dumps, loads
+from pickle import dumps, loads
 
 name="Undo Manager"
 
@@ -90,8 +92,8 @@ class UndoHistory:
             d['content']=str(el.content.data)
             d['mimetype']=el.content.mimetype
         if hasattr(el, 'fragment'):
-            d['begin']=long(el.fragment.begin)
-            d['end']=long(el.fragment.end)
+            d['begin']=int(el.fragment.begin)
+            d['end']=int(el.fragment.end)
         if hasattr(el, 'tags'):
             d['tags']=dumps(el.tags)
         for a in ('id', 'title', 'author', 'date', 'viewableClass', 'type'):
@@ -104,7 +106,7 @@ class UndoHistory:
         """
         el=context.evaluateValue('element')
         self._edits[el]=self.get_cached_representation(el)
-        #print "Recording cached for ", el
+        logger.debug("Recording cached for %s", el)
 
     def element_edit_cancel(self, context, parameters):
         """Remove the value from the cache.
@@ -112,7 +114,7 @@ class UndoHistory:
         el=context.evaluateValue('element')
         try:
             del self._edits[el]
-            #print "Removing cached value for ", el
+            logger.debug("Removing cached value for %s", el)
         except KeyError:
             pass
 
@@ -122,7 +124,7 @@ class UndoHistory:
         if context.globals.get('undone'):
             # The change is done in the context of an Undo.
             # Do not record it.
-            #print "EditEnd in Undo context"
+            logger.debug("EditEnd in Undo context")
             return
         batch=context.globals.get('batch', None)
         if batch:
@@ -142,11 +144,11 @@ class UndoHistory:
         if element in self._edits:
             cached=self._edits[element]
             new=self.get_cached_representation(element)
-            changed=[ (k, v) for (k, v) in cached.iteritems() if new[k] != v ]
+            changed=[ (k, v) for (k, v) in cached.items() if new[k] != v ]
             # Store changed elements in history
             history.append( ('changed', element, changed) )
             self._edits[element]=new
-            #print "Saving diff for ", element
+            logger.debug("Saving diff for %s", element)
 
     def element_create(self, context, parameters):
         """Record the created element id.
@@ -154,7 +156,7 @@ class UndoHistory:
         if context.globals.get('undone'):
             # The change is done in the context of an Undo.
             # Do not record it.
-            #print "Create in Undo context"
+            logger.debug("Create in Undo context")
             return
         event=context.evaluateValue('event')
         el=event.replace('Create', '').lower()
@@ -184,7 +186,7 @@ class UndoHistory:
         if context.globals.get('undone'):
             # The change is done in the context of an Undo.
             # Do not record it.
-            #print "Delete in Undo context"
+            logger.debug("Delete in Undo context")
             return
         event=context.evaluateValue('event')
         el=event.replace('Delete', '').lower()
@@ -210,7 +212,7 @@ class UndoHistory:
             # element type (annotation, view...) as second parameter
             history.append( ('deleted', el, self._edits[element]) )
             del self._edits[element]
-            #print "Saving content for ", el
+            logger.debug("Saving content for %s", el)
 
     def log(self, *p):
         self.controller.log("UndoManager: " + str(p))
diff --git a/lib/advene/rules/__init__.py b/lib/advene/rules/__init__.py
index dc5e3f5..dc19bba 100644
--- a/lib/advene/rules/__init__.py
+++ b/lib/advene/rules/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/rules/actions.py b/lib/advene/rules/actions.py
index 6e04f6b..16d0cdc 100644
--- a/lib/advene/rules/actions.py
+++ b/lib/advene/rules/actions.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,6 +16,8 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+import logging
+logger = logging.getLogger(__name__)
 
 import advene.core.config as config
 
@@ -224,7 +226,7 @@ def register(controller=None):
             method=ac.OpenURL,
             description=_("Open a URL in the web browser"),
             parameters={'url': _("URL")},
-            defaults={'url': 'string:http://liris.cnrs.fr/advene/'},
+            defaults={'url': 'string:http://advene.org/'},
             category='external',
             )
                                )
@@ -323,10 +325,10 @@ class DefaultActionsRepository:
         self.soundplayer=None
 
     def parse_parameter(self, context, parameters, name, default_value):
-        if parameters.has_key(name):
+        if name in parameters:
             try:
                 result=context.evaluateValue(parameters[name])
-            except AdveneTalesException, e:
+            except AdveneTalesException as e:
                 self.controller.log(_("Error in the evaluation of the parameter %s:" % name))
                 self.controller.log(str(e))
                 result=default_value
@@ -340,7 +342,7 @@ class DefaultActionsRepository:
         This method is overriden in the GUI by self.log
         """
         message=self.parse_parameter(context, parameters, 'message', "An event occurred.")
-        print "** Message ** " + message.encode('utf8')
+        logger.warn("** Message ** %s", message)
         return True
 
     def PlayerStart (self, context, parameters):
@@ -354,7 +356,7 @@ class DefaultActionsRepository:
                 # Probably a fragment
                 position = position.begin
             else:
-                position=long(position)
+                position=int(position)
         self.controller.update_status ("start", position)
         return True
 
@@ -362,8 +364,6 @@ class DefaultActionsRepository:
         """Goto the given position."""
         position=self.parse_parameter(context, parameters, 'position', None)
 
-        #print "Goto from %s to %s" % (helper.format_time_reference(self.controller.player.current_position_value),
-        #                              helper.format_time_reference(position))
         if position is not None:
             if hasattr(position, 'fragment'):
                 # Probably an annotation.
@@ -372,12 +372,8 @@ class DefaultActionsRepository:
                 # Probably a fragment
                 position = position.begin
             else:
-                position=long(position)
-        c=self.controller
-        pos = c.create_position (value=position,
-                                 key=c.player.MediaTime,
-                                 origin=c.player.AbsolutePosition)
-        self.controller.update_status ("set", pos)
+                position=int(position)
+        self.controller.update_status ("seek", position)
         return True
 
     def PlayerGoto_predefined(self, controller):
@@ -414,7 +410,7 @@ class DefaultActionsRepository:
         if pos is None:
             pos=self.controller.player.current_position_value
         else:
-            pos = long(pos)
+            pos = int(pos)
         if abs(pos - self.controller.player.current_position_value) > 100:
             # The current position is too far away from the requested position
             # FIXME: do something useful (warning) ?
@@ -430,21 +426,19 @@ class DefaultActionsRepository:
         message=self.parse_parameter(context, parameters, 'message', "Default caption.")
         duration=self.parse_parameter(context, parameters, 'duration', None)
 
-        begin = self.controller.player.relative_position
+        begin = self.controller.player.current_position_value
         if duration is not None:
-            duration=long(duration)
+            duration=int(duration)
         else:
             duration=config.data.player_preferences['default_caption_duration']
 
         c=self.controller
-        end = c.create_position (value=duration,
-                                 key=c.player.MediaTime,
-                                 origin=c.player.RelativePosition)
+        end = begin + duration
         if c.gui and c.gui.captionview:
-            c.gui.captionview.display_text(message.encode('utf8'),
+            c.gui.captionview.display_text(message,
                                            duration)
         else:
-            c.player.display_text (message.encode('utf8'), begin, end)
+            c.player.display_text(message, begin, end)
         return True
 
     def DisplayMarker (self, context, parameters):
@@ -470,9 +464,9 @@ class DefaultActionsRepository:
             code='<circle cx="%s%%" cy="%s%%" r="%sem" fill="%s" />' % (x, y, size, color)
         elif shape == 'triangle':
             # Size is 800x600 (see code below)
-            x=long(x)*8
-            y=long(y)*6
-            s=long(size)*10
+            x=int(x)*8
+            y=int(y)*6
+            s=int(size)*10
             code='<polygon fill="%s" points="%d,%d %d,%d %d,%d" />' % (color,
                                                                        x-s, y+s,
                                                                        x+s, y+s,
@@ -485,19 +479,16 @@ class DefaultActionsRepository:
         message="""<svg version='1' width="800" height="600" preserveAspectRatio='xMinYMin meet' viewBox='0 0 800 600'>%s</svg>""" % code
 
         c=self.controller
-        begin = c.player.relative_position
+        begin = c.player.current_position_value
         if duration is not None:
-            duration=long(duration)
+            duration=int(duration)
         else:
             duration=config.data.player_preferences['default_caption_duration']
-        end = c.create_position (value=duration,
-                                 key=c.player.MediaTime,
-                                 origin=c.player.RelativePosition)
         if c.gui and c.gui.captionview:
-            c.gui.captionview.display_text(message.encode('utf8'),
+            c.gui.captionview.display_text(message,
                                            duration)
         else:
-            c.player.display_text (message.encode('utf8'), begin, end)
+            c.player.display_text (message, begin, begin + duration)
         return True
 
     def AnnotationCaption (self, context, parameters):
@@ -508,18 +499,13 @@ class DefaultActionsRepository:
 
         if annotation is not None:
             c=self.controller
-            begin = c.player.relative_position
-            duration=annotation.fragment.end - c.player.current_position_value
-            end = c.create_position (value=duration,
-                                     key=c.player.MediaTime,
-                                     origin=c.player.RelativePosition)
-            #begin = c.create_position (value=annotation.fragment.begin)
-            #end = c.create_position (value=annotation.fragment.end)
+            begin = c.player.current_position_value
+            end = annotation.fragment.end
             if c.gui and c.gui.captionview:
-                c.gui.captionview.display_text(message.encode('utf8'),
-                                               duration)
+                c.gui.captionview.display_text(message,
+                                               end - begin)
             else:
-                c.player.display_text (message.encode('utf8'), begin, end)
+                c.player.display_text (message, begin, end)
         return True
 
     def SoundOff (self, context, parameters):
@@ -570,7 +556,7 @@ class DefaultActionsRepository:
         delay=self.parse_parameter(context, parameters, 'delay', None)
         if delay is None:
             delay=0
-        delay=long(delay)
+        delay=int(delay)
 
         self.controller.notify('UserEvent', identifier=identifier, delay=delay)
         return True
@@ -654,14 +640,13 @@ class DefaultActionsRepository:
         'soundclips' resource folder in the package.
         """
         if not ('soundclips' in self.controller.package.resources):
-            self.controller.log(_("No 'soundclips' resource folder in the package"))
-            print "No soundclips"
+            logger.error(_("No 'soundclips' resource folder in the package"))
             return True
         clip = self.parse_parameter(context, parameters, 'clip', None)
         volume = self.parse_parameter(context, parameters, 'volume', 100)
         balance = self.parse_parameter(context, parameters, 'balance', 0)
         if clip is None:
-            print "No clip"
+            logger.error("No clip")
             return True
         else:
             # Get the resource
@@ -716,10 +701,10 @@ class DefaultActionsRepository:
             return True
         try:
             val=int(float(value))
-        except ValueError, e:
+        except ValueError:
             # Store it as a string.
             val=value
-        self.controller.package.state[name]=value
+        self.controller.package.state[name]=val
         return True
 
     def IncrState(self, context, parameters):
diff --git a/lib/advene/rules/ecaengine.py b/lib/advene/rules/ecaengine.py
index 4901929..870142b 100755
--- a/lib/advene/rules/ecaengine.py
+++ b/lib/advene/rules/ecaengine.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -21,6 +21,8 @@
 This module holds the ECAEngine class which is dedicated to handling
 events and triggering actions.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import advene.core.config as config
 
@@ -28,8 +30,7 @@ import time
 import sched
 import threading
 import copy
-import StringIO
-import urllib
+import io
 
 import advene.rules.elements
 
@@ -105,7 +106,7 @@ class ECAEngine:
         @param state: a previously saved state (cf L{get_state})
         @type state: dict
         """
-        for k, v in state.iteritems():
+        for k, v in state.items():
             self.set_ruleset(v, type_=k)
 
     def clear_state(self):
@@ -210,7 +211,6 @@ class ECAEngine:
         if action.immediate or immediate:
             action.execute(context)
         else:
-            #print "Scheduling %s with delay %f" % (action.name, delay)
             if delay:
                 self.scheduler.enterabs(time.time()+delay, 0, action.execute, (context,))
             else:
@@ -218,12 +218,8 @@ class ECAEngine:
             if not self.schedulerthread.isAlive():
                 try:
                     self.schedulerthread.run()
-                except Exception, e:
-                    import traceback
-                    s=StringIO.StringIO()
-                    traceback.print_exc (file = s)
-                    v = unicode(s.getvalue(), 'utf8', 'ignore')
-                    self.controller.queue_action(self.controller.log, "Exception (traceback in console):" + v)
+                except Exception:
+                    logger.error("Exception in scheduler", exc_info=True)
 
     def reset_queue (self):
         """Reset the scheduler's queue.
@@ -256,7 +252,7 @@ class ECAEngine:
             'event': event
             }
         globals_.update(kw)
-        for k, v in globals_.iteritems():
+        for k, v in globals_.items():
             context.addGlobal(k, v)
         return context
 
@@ -329,10 +325,9 @@ class ECAEngine:
             # Ignore the error if the rule was already removed.
             # but display a warning anyway (it should not happen)
             try:
-                print "Trying to remove non-existant rule %s from %s ruleset" % (str(rule), type_)
+                logger.warn("Trying to remove non-existant rule %s from %s ruleset", str(rule), type_)
             except AttributeError:
-                print "********** ATTRIBUTE ERROR **********", dir(rule)
-                print hex(id(rule))
+                logger.error("********** ATTRIBUTE ERROR for rule %s **********", hex(id(rule)))
             pass
 
     def dump(self):
@@ -359,8 +354,6 @@ class ECAEngine:
         A special named parameter is delay, which will be given in ms.
         It contains the delay to apply to the rule execution.
         """
-        #print "notify %s for %s" % (event_name, str(kw))
-
         if config.data.preferences['record-actions']:
             # FIXME: we should not store the whole element, it is too costly
             d=dict(kw)
@@ -377,10 +370,10 @@ class ECAEngine:
             del kw['immediate']
 
         delay=0
-        if kw.has_key('delay'):
-            delay=long(kw['delay']) / 1000.0
+        if 'delay' in kw:
+            delay=int(kw['delay']) / 1000.0
             del kw['delay']
-            print "Delay specified: %f" % delay
+            logger.debug("Delay specified: %f", delay)
 
         context=self.build_context(event_name, **kw)
         try:
diff --git a/lib/advene/rules/elements.py b/lib/advene/rules/elements.py
index 4e390c9..6649bd7 100755
--- a/lib/advene/rules/elements.py
+++ b/lib/advene/rules/elements.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,10 +20,14 @@
 
 The event framework makes it possible to bind actions to specific
 events that match a condition."""
+import logging
+logger = logging.getLogger(__name__)
 
+from collections import OrderedDict
+import functools
 import re
-import StringIO
-import urllib
+import io
+import urllib.request, urllib.parse, urllib.error
 import xml.etree.ElementTree as ET
 import itertools
 
@@ -31,7 +35,6 @@ import advene.core.config as config
 from advene.model.annotation import Annotation
 from advene.model.fragment import MillisecondFragment
 
-from advene.util.odict import odict
 from gettext import gettext as _
 
 class Event(str):
@@ -61,13 +64,13 @@ class EtreeMixin(object):
         root=self.to_etree()
         etree=ET.ElementTree(root)
         if stream is None:
-            etree.write(uri, encoding='utf-8')
+            etree.write(uri, encoding='unicode')
         else:
-            etree.write(stream, encoding='utf-8')
+            etree.write(stream, encoding='unicode')
 
     def xml_repr(self):
         """Return the XML representation of the instance."""
-        s=StringIO.StringIO()
+        s=io.StringIO()
         self.to_xml(stream=s)
         buf=s.getvalue()
         s.close()
@@ -76,7 +79,7 @@ class EtreeMixin(object):
     def from_xml_string(self, xmlstring, catalog=None):
         """Read the rule from a XML string.
         """
-        s=StringIO.StringIO(xmlstring)
+        s=io.StringIO(xmlstring)
         rulenode=ET.parse(s).getroot()
         self.from_etree(rulenode, catalog=catalog, origin='XML string')
         s.close()
@@ -89,7 +92,7 @@ class EtreeMixin(object):
         @type catalog: ECACatalog
         """
         rulesetnode=ET.parse(uri).getroot()
-        if origin is None and isinstance(uri, basestring):
+        if origin is None and isinstance(uri, str):
             origin=uri
         self.from_etree(rulesetnode, catalog=catalog, origin=origin)
 
@@ -391,7 +394,7 @@ class Action:
         @return: an ElementTree.Element
         """
         node=ET.Element(tag('action'), { 'name': self.name })
-        for pname, pvalue in self.parameters.iteritems():
+        for pname, pvalue in self.parameters.items():
             paramnode=ET.Element(tag('param'), {
                     'name': pname,
                     'value': pvalue })
@@ -520,14 +523,14 @@ class Rule(EtreeMixin):
                         method=unknown_action,
                         description=_("Unknown action %s") % name,
                         parameters=dict( (name, _("Unknown parameter %s") % name)
-                                         for (name, value) in param.iteritems() ),
+                                         for (name, value) in param.items() ),
                         defaults=dict(param),
                         category='unknown',
                         ))
                 catalog.action_categories['unknown']=_("Unknown actions")
 
             action=Action(registeredaction=catalog.get_action(name), catalog=catalog)
-            for name, value in param.iteritems():
+            for name, value in param.items():
                 action.add_parameter(name, value)
             self.add_action(action)
         return self
@@ -847,7 +850,7 @@ class Quicksearch(EtreeMixin):
         # Searched string
         s=element.find('searched')
         if s is not None:
-            self.searched=urllib.unquote(unicode(s.attrib['value']).encode('utf-8'))
+            self.searched=urllib.parse.unquote(str(s.attrib['value']).encode('utf-8'))
 
         # Case-sensitive
         s=element.find['case_sensitive']
@@ -867,7 +870,7 @@ class Quicksearch(EtreeMixin):
 
         qnode.append(ET.Element(tag('searched'),
                      { 'value':
-                       urllib.quote(unicode(self.searched).encode('utf-8'))} ))
+                       urllib.parse.quote(str(self.searched).encode('utf-8'))} ))
 
         qnode.append(ET.Element('case_sensitive'),
                      { 'value': str(int(self.case_sensitive)) })
@@ -883,6 +886,7 @@ class Quicksearch(EtreeMixin):
                                              sources=self.sources,
                                              case_sensitive=self.case_sensitive)
 
+ at functools.total_ordering
 class RegisteredAction:
     """Registered action.
 
@@ -926,7 +930,7 @@ class RegisteredAction:
         if defaults is None:
             defaults={}
         # Set default values for non-specified default
-        for k, v in parameters.iteritems():
+        for k, v in parameters.items():
             defaults.setdefault(k, "string:%s" % v)
         self.defaults=defaults
         # If immediate, the action will be run in the main thread, and not
@@ -936,6 +940,12 @@ class RegisteredAction:
         self.category=category
         self.predefined=predefined
 
+    def __eq__(self, other):
+        return other is self
+
+    def __lt__(self, other):
+        return self.name < other.name
+
     def add_parameter(self, name, description):
         """Add a new parameter to the action."""
         self.parameters[name]=description
@@ -950,7 +960,7 @@ class RegisteredAction:
 
     def as_html(self, action_url):
         r="""<form method="GET" action="%s">""" % action_url
-        l=self.parameters.keys()
+        l=list(self.parameters.keys())
         l.sort()
         for k in l:
             r += """%s: <input name="%s" title="%s" value="%s"/>""" % (k,
@@ -1063,7 +1073,7 @@ class ECACatalog:
                   'PlayerResume', 'PlayerStop', 'ApplicationStart', 'ViewActivation',
                   'UserEvent']
 
-    action_categories=odict((
+    action_categories=OrderedDict((
             ('player', _("Player control")),
             ('sound', _("Audio enrichment")),
             ('image', _("Image enrichment")),
@@ -1097,7 +1107,7 @@ class ECACatalog:
         @return: True if name is a valid action name
         @rtype: boolean
         """
-        return self.actions.has_key(name)
+        return name in self.actions
 
     def get_action(self, name):
         """Return the action matching name.
@@ -1133,7 +1143,7 @@ class ECACatalog:
         @rtype: list
         """
         if expert:
-            return self.event_names.keys()
+            return list(self.event_names.keys())
         else:
             return self.basic_events
 
@@ -1165,15 +1175,16 @@ class ECACatalog:
         """Return the list of defined actions.
         """
         if expert:
-            return self.actions.keys()
+            return list(self.actions.keys())
         else:
-            return self.actions.keys()
+            return list(self.actions.keys())
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
     default='default_rules.txt'
     import sys
     if len(sys.argv) < 2:
-        print "No name provided. Using %s." % default
+        logger.error("No name provided. Using %s.", default)
         filename=default
     else:
         filename=sys.argv[1]
@@ -1182,4 +1193,4 @@ if __name__ == "__main__":
     catalog=ECACatalog()
     r=RuleSet()
     r.from_xml(uri=filename, catalog=catalog)
-    print "Read %d rules." % len(r)
+    logger.info("Read %d rules.", len(r))
diff --git a/lib/advene/rules/importer.py b/lib/advene/rules/importer.py
index 19985cc..0b4f8f7 100644
--- a/lib/advene/rules/importer.py
+++ b/lib/advene/rules/importer.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -49,10 +49,10 @@ class EventHistoryImporter(GenericImporter):
                 type=schema.createAnnotationType(
                     ident=type_)
                 type.author=config.data.userid
-                type.date=time.strftime("%Y-%m-%d")
+                type.date=self.controller.get_timestamp()
                 type.title=type_
                 type.mimetype='application/x-advene-structured'
-                type.setMetaData(config.data.namespace, 'color', self.package._color_palette.next())
+                type.setMetaData(config.data.namespace, 'color', next(self.package._color_palette))
                 type.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
                 schema.annotationTypes.append(type)
 
@@ -63,7 +63,7 @@ class EventHistoryImporter(GenericImporter):
                 'timestamp': e['timestamp'],
                 'content': '',
             }
-            if e.has_key('content'):
+            if 'content' in e:
                 d['content']=e['content']+'\nposition='+str(e['movietime'])+'\n'
             else:
                 d['content']='position='+str(e['movietime'])+'\n'
@@ -83,7 +83,7 @@ class EventHistoryImporter(GenericImporter):
             self.package._idgenerator.add(id_)
             schema=self.package.createSchema(ident=id_)
             schema.author=config.data.userid
-            schema.date=time.strftime("%Y-%m-%d")
+            schema.date=self.controller.get_timestamp()
             schema.title=title_
             self.package.schemas.append(schema)
         self.convert(self.iterator(filename))
diff --git a/lib/advene/util/__init__.py b/lib/advene/util/__init__.py
index dc5e3f5..dc19bba 100644
--- a/lib/advene/util/__init__.py
+++ b/lib/advene/util/__init__.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/lib/advene/util/audio.py b/lib/advene/util/audio.py
index b4436ca..dd77707 100644
--- a/lib/advene/util/audio.py
+++ b/lib/advene/util/audio.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,35 +16,39 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+import logging
+logger = logging.getLogger(__name__)
+
 import advene.core.config as config
 
 import subprocess
 import signal
 import os
 import sys
-import urllib
+import urllib.request, urllib.parse, urllib.error
 
 if config.data.os == 'win32':
     #try to determine if gstreamer is already installed
-    fsenc = sys.getfilesystemencoding()
-    ppath = unicode(os.getenv('GST_PLUGIN_PATH', ""), fsenc)
+    ppath = os.getenv('GST_PLUGIN_PATH', "")
     if not ppath or not os.path.exists(ppath):
-        os.environ['GST_PLUGIN_PATH'] = os.path.join(config.data.path['advene'], 'gst', 'lib', 'gstreamer-0.10').encode(fsenc)
-        gstpath = unicode(os.getenv('PATH', ""), fsenc)
-        os.environ['PATH'] = os.pathsep.join( ( os.path.join(config.data.path['advene'], 'gst', 'bin'), gstpath) ).encode(fsenc)
+        os.environ['GST_PLUGIN_PATH'] = os.path.join(config.data.path['advene'], 'gst', 'lib', 'gstreamer-1.0')
+        gstpath = os.getenv('PATH', "")
+        os.environ['PATH'] = os.pathsep.join( ( os.path.join(config.data.path['advene'], 'gst', 'bin'), gstpath) )
     else:
         #even if gstpluginpath is defined, gst still may not be in path
-        gstpath = unicode(os.getenv('PATH', ""), fsenc)
+        gstpath = os.getenv('PATH', "")
         h,t = os.path.split(ppath)
         binpath,t = os.path.split(h)
-        os.environ['PATH'] = os.pathsep.join( (os.path.join( binpath, 'bin'), gstpath) ).encode(fsenc)
+        os.environ['PATH'] = os.pathsep.join( (os.path.join( binpath, 'bin'), gstpath) )
 
 try:
-    import pygst
-    pygst.require('0.10')
-    import gst
+    import gi
+    gi.require_version('Gst', '1.0')
+    from gi.repository import GObject, Gst
+    GObject.threads_init()
+    Gst.init(None)
 except ImportError:
-    gst=None
+    Gst=None
 
 import advene.core.config as config
 
@@ -60,19 +64,19 @@ class SoundPlayer:
         if fname.startswith('file:') or fname.startswith('http:'):
             uri = fname
         elif config.data.os == 'win32':
-            uri = 'file:' + urllib.pathname2url(fname)
+            uri = 'file:' + urllib.request.pathname2url(fname)
         else:
             uri = 'file://' + os.path.abspath(fname)
-        pipe = gst.parse_launch('uridecodebin name=decode uri=%s ! audioconvert ! audiopanorama panorama=%f ! audioamplify name=amplify amplification=%f ! autoaudiosink' % (uri, float(balance), int(volume) / 100.0 ))
+        pipe = Gst.parse_launch('uridecodebin name=decode uri=%s ! audioconvert ! audiopanorama panorama=%f ! audioamplify name=amplify amplification=%f ! autoaudiosink' % (uri, float(balance), int(volume) / 100.0 ))
         bus = pipe.get_bus()
         bus.add_signal_watch()
 
         def eos_cb(b, m):
             if m.src == pipe:
-                pipe.set_state(gst.STATE_NULL)
+                pipe.set_state(Gst.State_NULL)
 
         bus.connect('message::eos', eos_cb)
-        pipe.set_state(gst.STATE_PLAYING)
+        pipe.set_state(Gst.State.PLAYING)
         # FIXME: since we do not reuse the pipeline, we maybe should clean it up on state_change -> READY
         return True
 
@@ -97,7 +101,7 @@ class SoundPlayer:
             pid=subprocess.Popen( [ pathsp, fname ] )
             #no SIGCHLD handler for win32
         else:
-            print "pySoundPlayer.exe can not be found. Advene will be unable to play sounds."
+            logger.error("pySoundPlayer.exe can not be found. Advene will be unable to play sounds.")
         return True
 
     def macosx_play(self, fname, volume=100, balance=0):
@@ -108,7 +112,6 @@ class SoundPlayer:
 
         It ignores the balance parameter.
         """
-        import objc
         import AppKit
         sound = AppKit.NSSound.alloc().initWithContentsOfFile_byReference_(fname, True)
         sound.setVolume( volume / 100.0 )
@@ -119,16 +122,15 @@ class SoundPlayer:
         os.waitpid(-1, os.WNOHANG)
         return True
 
-    if gst is not None:
+    if Gst is not None:
         play = gst_play
-        print "Using gstreamer to play sounds"
+        logger.warn("Using gstreamer to play sounds")
     elif config.data.os == 'win32':
         play=win32_play
-        print "Using win32_player to play sounds (may not be present)"
+        logger.warn("Using win32_player to play sounds (may not be present)")
     elif config.data.os == 'darwin':
         play=macosx_play
     else:
         if not os.path.exists('/usr/bin/aplay'):
-            print "Error: aplay is not installed. Advene will be unable to play sounds."
+            logger.warn("Error: aplay is not installed. Advene will be unable to play sounds.")
         play=linux_play
-
diff --git a/lib/advene/util/ctypesrsvg.py b/lib/advene/util/ctypesrsvg.py
deleted file mode 100644
index e6f88f1..0000000
--- a/lib/advene/util/ctypesrsvg.py
+++ /dev/null
@@ -1,115 +0,0 @@
-#
-# Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-#
-# Advene is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# Advene is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Advene; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-
-"""ctypes-based wrapper mimicking native py-rsvg API
-"""
-
-# Code adapted from http://cairographics.org/cairo_rsvg_and_python_in_windows/
-import sys
-import os
-import ctypes
-print "ctypes RSVG support"
-
-if sys.platform == 'win32':
-    l=ctypes.CDLL('librsvg-2-2.dll')
-    g=ctypes.CDLL('libgobject-2.0-0.dll')
-elif sys.platform == 'darwin':
-    try:
-        l=ctypes.CDLL('librsvg-2.dylib')
-        g=ctypes.CDLL('libgobject-2.0.dylib')
-    except OSError:
-        # Try to determine the .dylib location
-        if os.path.exists('/opt/local/lib/librsvg-2.dylib'):
-            # macports install.
-            l=ctypes.CDLL('/opt/local/lib/librsvg-2.dylib')
-            g=ctypes.CDLL('/opt/local/lib/libgobject-2.0.dylib')
-        else:
-            # .app bundle resource.
-            d = os.path.dirname(os.path.abspath(sys.argv[0]))
-            if os.path.basename(d) == 'Resources':
-                base=os.path.dirname(d)
-                l=ctypes.CDLL('%s/Frameworks/librsvg-2.2.dylib' % base)
-                g=ctypes.CDLL('%s/Frameworks/libgobject-2.0.0.dylib' % base)
-            else:
-                # Cannot find librsvg
-                print "Cannot find librsvg"
-                l=None
-                g=None
-else:
-    try:
-        # First try numbered versions.
-        l=ctypes.CDLL('librsvg-2.so.2')
-        g=ctypes.CDLL('libgobject-2.0.so.0')
-    except OSError:
-        l=ctypes.CDLL('librsvg-2.so')
-        g=ctypes.CDLL('libgobject-2.0.so')
-
-if g is not None:
-    g.g_type_init()
-
-class RsvgDimensionData(ctypes.Structure):
-    _fields_ = [("width", ctypes.c_int),
-                ("height", ctypes.c_int),
-                ("em", ctypes.c_double),
-                ("ex", ctypes.c_double)]
-
-class PycairoContext(ctypes.Structure):
-    _fields_ = [("PyObject_HEAD", ctypes.c_byte * object.__basicsize__),
-                ("ctx", ctypes.c_void_p),
-                ("base", ctypes.c_void_p)]
-
-class GError(ctypes.Structure):
-    _fields_ = [("quark", ctypes.c_uint32),
-                ("code", ctypes.c_int),
-                ("message", ctypes.c_char_p)]
-
-class Handle(object):
-    def __init__(self, filename=None, data=None):
-        error = ctypes.POINTER(GError)() # A GError
-        self.handle = None
-        if filename is not None:
-            self.handle = l.rsvg_handle_new_from_file(unicode(filename).encode('utf8'), ctypes.byref(error))
-        elif data is not None:
-            if isinstance(data, unicode):
-                data = data.encode('utf8')
-            self.handle = l.rsvg_handle_new_from_data(data, len(data), ctypes.byref(error))
-        if error:
-            print "SVG rendering error:", error.contents.message
-            g.g_clear_error(ctypes.byref(error))
-
-    def __del__(self):
-        if self.handle and l:
-            l.rsvg_handle_free(self.handle)
-            self.handle = None
-
-    def get_dimension_data(self):
-        if self.handle:
-            svgDim = RsvgDimensionData()
-            l.rsvg_handle_get_dimensions(self.handle, ctypes.byref(svgDim))
-            return (svgDim.width, svgDim.height, svgDim.em, svgDim.ex)
-        else:
-            return (320, 200, 1.0, 1.0)
-
-    def render_cairo(self, ctx):
-        if self.handle:
-            ctx.save()
-            z = PycairoContext.from_address(id(ctx))
-            l.rsvg_handle_render_cairo(self.handle, z.ctx)
-            ctx.restore()
-
diff --git a/lib/advene/util/debug.py b/lib/advene/util/debug.py
new file mode 100644
index 0000000..3356f20
--- /dev/null
+++ b/lib/advene/util/debug.py
@@ -0,0 +1,108 @@
+#
+# Advene: Annotate Digital Videos, Exchange on the NEt
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
+#
+# Advene is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# Advene is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Advene; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+"""Debug functions/utilities."""
+import logging
+logger = logging.getLogger(__name__)
+
+from collections import Mapping, Container
+import datetime
+try:
+    import objgraph
+except ImportError:
+    objgraph = None
+import resource
+from sys import getsizeof
+
+# We should use the logging API, but some packages (like objgraph)
+# take an open file as parameter, so let's accomodate this
+DEBUGFILENAME = '/tmp/advene-debug-%s.log' % datetime.datetime.now().isoformat()[:19]
+logger.warn("Logging additional debug information to %s" % DEBUGFILENAME)
+DEBUGFILE = open(DEBUGFILENAME, 'w')
+
+def debug_log(*args):
+    """Log information to a specific logfile.
+    """
+    DEBUGFILE.write("%s - %s\n" % (datetime.datetime.now().isoformat(),
+                                 " ".join(str(a) for a in args)))
+
+def deep_getsizeof(o, ids=None):
+    """Find the memory footprint of a Python object
+
+    Source: https://code.tutsplus.com/tutorials/understand-how-much-memory-your-python-objects-use--cms-25609
+
+    This is a recursive function that drills down a Python object graph
+    like a dictionary holding nested dictionaries with lists of lists
+    and tuples and sets.
+
+    The sys.getsizeof function does a shallow size of only. It counts each
+    object inside a container as pointer only regardless of how big it
+    really is.
+
+    :param o: the object
+    :param ids:
+    :return:
+    """
+    if ids is None:
+        ids = set()
+    d = deep_getsizeof
+    if id(o) in ids:
+        return 0
+
+    r = getsizeof(o)
+    ids.add(id(o))
+
+    if isinstance(o, str) or isinstance(o, bytes):
+        return r
+
+    if isinstance(o, Mapping):
+        return r + sum(d(k, ids) + d(v, ids) for k, v in o.items())
+
+    if isinstance(o, Container):
+        return r + sum(d(x, ids) for x in o)
+
+    return r
+
+last_mem = None
+def log_global_memory_usage():
+    global last_mem
+    mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
+    if mem != last_mem:
+        debug_log("Memory usage: %s" % mem)
+        logger.warn("Memory usage: %s" % mem)
+        last_mem = mem
+
+last_imagecache_size = None
+def log_imagecache_size(controller):
+    global last_imagecache_size
+    size = deep_getsizeof(controller.package.imagecache)
+    if size != last_imagecache_size:
+        debug_log("Imagecache usage: %s" % size)
+        last_imagecache_size = size
+
+def debug_slow_update_hook(controller):
+    """Debug method.
+
+    This method will be regularly called (from the
+    slow_update_display) when -d (debug) option is given.
+    """
+    log_global_memory_usage()
+    log_imagecache_size(controller)
+    if objgraph is not None:
+        debug_log("------------ Object growth ---------------")
+        objgraph.show_growth(shortnames=False, limit=30, file=DEBUGFILE)
diff --git a/lib/advene/util/expat.py b/lib/advene/util/expat.py
index 9ba511d..1937447 100755
--- a/lib/advene/util/expat.py
+++ b/lib/advene/util/expat.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,7 +18,7 @@
 #
 """Legacy expat wrapping functions."""
 
-from urllib2 import urlopen
+from urllib.request import urlopen
 
 from xml.dom.minidom import parse, parseString
 class PyExpat:
diff --git a/lib/advene/util/handyxml.py b/lib/advene/util/handyxml.py
index 0e557ba..c1c81bc 100644
--- a/lib/advene/util/handyxml.py
+++ b/lib/advene/util/handyxml.py
@@ -12,11 +12,6 @@ from advene.util.expat import PyExpat
 __version__ = '1.1.20040127'        # History at the end of the file.
 __all__ = ['path', 'xml', 'xpath']
 
-try:
-    True, False
-except NameError:
-    True, False = (1==1, 1==0)
-
 # Try to use 4Suite for speed.
 bDomlette = False
 try:
@@ -56,7 +51,6 @@ class HandyXmlWrapper:
             return getattr(self.node, attr)
 
         if attr[0:2] != '__':
-            #print "Looking for "+attr, self.node, dir(self.node)
             if hasattr(self.node, 'hasAttribute'):
                 if self.node.hasAttribute(attr):
                     return self.node.getAttribute(attr)
@@ -78,12 +72,12 @@ class HandyXmlWrapper:
             if els:
                 # Save the attribute, since this could be a hasattr
                 # that will be followed by getattr
-                els = map(HandyXmlWrapper, els)
+                els = list(map(HandyXmlWrapper, els))
                 if type(self.node) == types.InstanceType:
                     setattr(self.node, attr, els)
                 return els
 
-        raise AttributeError, "Couldn't find %s for node" % attr
+        raise AttributeError("Couldn't find %s for node" % attr)
 
 # The path on which we look for XML files.
 path = ['.']
@@ -94,7 +88,7 @@ def _findFile(filename):
     ret = None
     searchPath = path
     # If cog is in use, then use its path as well.
-    if sys.modules.has_key('cog'):
+    if 'cog' in sys.modules:
         searchPath += sys.modules['cog'].path
     # Search the directories on the path.
     for dir in searchPath:
@@ -117,13 +111,13 @@ def xml(xmlin, forced=False):
     filename = None
 
     # A string argument is a file name.
-    if isinstance(xmlin, types.StringTypes):
+    if isinstance(xmlin, (str,)):
         filename = _findFile(xmlin)
         if not filename:
             raise "Couldn't find XML to parse: %s" % xmlin
 
     if filename:
-        if _xmlcache.has_key(filename) and not forced:
+        if filename in _xmlcache and not forced:
             return _xmlcache[filename]
         xmlin = open(filename)
 
@@ -145,10 +139,10 @@ if bXPath:
     def xpath(input, expr):
         """ Evaluate the xpath expression against the input XML.
         """
-        if isinstance(input, types.StringTypes) or hasattr(input, 'read'):
+        if isinstance(input, (str,)) or hasattr(input, 'read'):
             # If input is a filename or an open file, then parse the XML.
             input = xml(input)
-        return map(HandyXmlWrapper, xml_xpath.Evaluate(expr, input))
+        return list(map(HandyXmlWrapper, xml_xpath.Evaluate(expr, input)))
 
 else:
     def xpath(input, expr):
diff --git a/lib/advene/util/helper.py b/lib/advene/util/helper.py
index 8bffb11..68ccdda 100755
--- a/lib/advene/util/helper.py
+++ b/lib/advene/util/helper.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -17,28 +17,30 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
 """Generic helper functions."""
+import logging
+logger = logging.getLogger(__name__)
 
+import json
 import time
-import StringIO
+import io
 import inspect
 try:
     from hashlib import md5
 except ImportError:
     from md5 import md5
 import os
-import sys
 import re
 import zipfile
-import urllib
+import urllib.request, urllib.parse, urllib.error
 import unicodedata
 
 import advene.core.config as config
 from advene.core.imagecache import ImageCache
 
 try:
-    import Image
+    from PIL import Image
 except ImportError:
-    print "Cannot load Image module. Image conversion is disabled."
+    logger.error("Cannot load Image module. Image conversion is disabled.")
 
 from gettext import gettext as _
 
@@ -67,6 +69,11 @@ ET._namespace_map.update({
     'http://xml.zope.org/namespaces/metal': 'metal',
     })
 
+class chars:
+    ellipsis=b'\\u2026'.decode('unicode_escape')
+    arrow_from=b'\\u2190'.decode('unicode_escape')
+    arrow_to=b'\\u2192'.decode('unicode_escape')
+
 def fourcc2rawcode (code):
     """VideoLan to PIL code conversion.
 
@@ -89,7 +96,7 @@ def fourcc2rawcode (code):
         'png ' : 'PNG',
         ' gnp' : 'PNG', # On PPC-MacOS X
         }
-    if isinstance(code, int) or isinstance(code, long):
+    if isinstance(code, int) or isinstance(code, int):
         fourcc = "%c%c%c%c" % (code & 0xff,
                                code >> 8 & 0xff,
                                code >> 16 & 0xff,
@@ -109,19 +116,19 @@ class TitledElement:
         self.value=value
         self.title=title
 
-class TypedUnicode(unicode):
+class TypedUnicode(str):
     """Unicode string with a mimetype attribute.
     """
     def __new__(cls, value=""):
-        s=unicode.__new__(cls, value)
+        s=str.__new__(cls, value)
         s.contenttype='text/plain'
         return s
 
-class TypedString(str):
-    """String with a mimetype attribute.
+class TypedString(bytes):
+    """Bytes with a mimetype attribute.
     """
     def __new__(cls, value=""):
-        s=str.__new__(cls, value)
+        s=bytes.__new__(cls, value)
         s.contenttype='text/plain'
         return s
 
@@ -138,7 +145,7 @@ def snapshot2png (image, output=None):
     @rtype: string
     """
     if image.height == 0 or image.height is None:
-        print "Error : 0 sized snapshot"
+        logger.error("Error : 0 sized snapshot")
         return ""
 
     png=None
@@ -151,14 +158,14 @@ def snapshot2png (image, output=None):
         try:
             i = Image.fromstring ("RGB", (image.width, image.height), image.data,
                                   "raw", code)
-            ostream = StringIO.StringIO ()
+            ostream = io.StringIO ()
             i.save(ostream, 'png')
             png=TypedString(ostream.getvalue())
             png.contenttype='image/png'
         except NameError:
-            print "snapshot: conversion module not available"
+            logger.error("snapshot: conversion module not available")
     else:
-        print "snapshot: unknown image type ", repr(image.type)
+        logger.error("snapshot: unknown image type %s", repr(image.type))
 
     if png is None:
         png=ImageCache.not_yet_available_image
@@ -179,7 +186,7 @@ def mediafile2id (mediafile):
     @return: an id
     @rtype: string
     """
-    m=md5(mediafile)
+    m=md5(mediafile.encode('utf-8'))
     return m.hexdigest()
 
 def package2id (p):
@@ -195,7 +202,7 @@ def package2id (p):
     @return: the corresponding id
     @rtype: string
     """
-    mediafile = p.getMetaData (config.data.namespace, "mediafile")
+    mediafile = p.media
     if mediafile is not None and mediafile != "":
         return mediafile2id (mediafile)
     else:
@@ -211,7 +218,7 @@ def title2id(t):
     It will replace spaces by underscores, accented chars by their
     accented equivalent, and other characters by -
     """
-    t=unicode(t)
+    t=str(t)
     (text, count)=re.subn(r'\s', '_', t)
     res=[]
     for c in text:
@@ -230,7 +237,7 @@ def title2id(t):
 def unaccent(t):
     """Remove accents from a string.
     """
-    t=unicode(t)
+    t=str(t)
     res=[]
     for c in t:
         if not extended_valid_re.match(c):
@@ -255,7 +262,7 @@ def format_time_reference(val = 0):
         return '--:--:--.---'
     elif val < 0:
         return '00:00:00.000'
-    (s, ms) = divmod(long(val), 1000)
+    (s, ms) = divmod(int(val), 1000)
     # Format: HH:MM:SS.mmm
     return "%s.%03d" % (time.strftime("%H:%M:%S", time.gmtime(s)), ms)
 
@@ -273,14 +280,14 @@ def format_time (val = 0):
         val = 0
     elif val < 0:
         val = 0
-    (s, ms) = divmod(long(val), 1000)
+    (s, ms) = divmod(int(val), 1000)
     f = config.data.preferences['timestamp-format']
     if f == '%S':
         ret = str(s)
     elif f == '%.S':
         ret = '%d.%03d' % (s, ms)
     else:
-        f = f.replace('''%.S''', '''%S.''' + '%03d' % ms).replace('''%fS''', '''%Sf''' + '%02d' % long(ms * config.data.preferences['default-fps'] / 1000))
+        f = f.replace('''%.S''', '''%S.''' + '%03d' % ms).replace('''%fS''', '''%Sf''' + '%02d' % int(ms * config.data.preferences['default-fps'] / 1000))
         try:
             ret = time.strftime(f, time.gmtime(s))
         except ValueError:
@@ -326,7 +333,7 @@ def parse_time(s):
       NN: frame number
     """
     try:
-        val=long(s)
+        val=int(s)
     except ValueError:
         # It was not a plain integer. Try to determine its format.
         t=None
@@ -348,7 +355,7 @@ def parse_time(s):
             if 'ms' in t and t['ms']:
                 if t['sep'] == 'f':
                     # Frame number
-                    t['ms'] = long(long(t['ms']) * (1000 / config.data.preferences['default-fps']))
+                    t['ms'] = int(int(t['ms']) * (1000 / config.data.preferences['default-fps']))
                 else:
                     t['ms']=(t['ms'] + ("0" * 4))[:3]
             else:
@@ -357,7 +364,7 @@ def parse_time(s):
                 if t[k] is None:
                     t[k] = 0
                 try:
-                    t[k] = long(t[k] or 0)
+                    t[k] = int(t[k] or 0)
                 except ValueError:
                     t[k] = 0
             val= t.get('ms', 0) + t.get('s', 0) * 1000 + t.get('m', 0) * 60000 + t.get('h', 0) * 3600000
@@ -378,7 +385,7 @@ def matching_relationtypes(package, typ1, typ2):
                 i=uri[uri.index('#')+1:]
             except ValueError:
                 i=uri
-            return unicode(i)
+            return str(i)
 
         # URI version
         # lat=[ absolute_uri(package, t) for t in rt.getHackedMemberTypes() ]
@@ -390,12 +397,11 @@ def matching_relationtypes(package, typ1, typ2):
         t1=get_id_from_fragment(typ1.uri)
         t2=get_id_from_fragment(typ2.uri)
 
-        #print "Testing (%s, %s) matching %s" % (t1, t2, lat)
+        logger.debug("Testing (%s, %s) matching %s", t1, t2, lat)
         if len (lat) == 2 \
-        and (lat[0] == u'' or lat[0] == t1) \
-        and (lat[1] == u'' or lat[1] == t2):
+        and (lat[0] == '' or lat[0] == t1) \
+        and (lat[1] == '' or lat[1] == t2):
             r.append(rt)
-    #print "Matching: %s" % r
     return r
 
 element_label = {
@@ -415,7 +421,7 @@ def get_type(el):
     try:
         t=element_label[type(el)]
     except:
-        t=unicode(type(el))
+        t=str(type(el))
     return t
 
 def get_valid_members (el):
@@ -439,7 +445,7 @@ def get_valid_members (el):
         l.extend(el.ids())
     except AttributeError:
         try:
-            l.extend(el.keys())
+            l.extend(list(el.keys()))
         except AttributeError:
             pass
     if l:
@@ -488,7 +494,7 @@ def import_element(package, element, controller, notify=True):
         if notify:
             controller.notify("QueryCreate", query=q)
     else:
-        print "Import element of class %s not supported yet." % element.viewableClass
+        logger.warn("Import element of class %s not supported yet." % element.viewableClass)
 
 def unimport_element(package, element, controller, notify=True):
     p=package
@@ -513,7 +519,7 @@ def unimport_element(package, element, controller, notify=True):
         if notify:
             controller.notify("QueryDelete", query=element)
     else:
-        print "%s Not supported yet." % element.viewableClass
+        logger.warn("%s Not supported yet.", element.viewableClass)
 
 def get_statistics(fname):
     """Return formatted statistics about the package.
@@ -522,25 +528,23 @@ def get_statistics(fname):
     if fname.lower().endswith('.azp'):
         # If the file is a .azp, then it may have a
         # META-INF/statistics.xml file. Use it.
-        # Encoding issues on win32:
-        if isinstance(fname, unicode):
-            fname=fname.encode(sys.getfilesystemencoding())
         try:
             z=zipfile.ZipFile(fname, 'r')
-        except Exception, e:
+        except Exception as e:
             raise AdveneException(_("Cannot read %(filename)s: %(error)s") % {'filename': fname,
-                                                                              'error': unicode(e)})
+                                                                              'error': str(e)})
 
         # Check the validity of mimetype
         try:
-            typ = z.read('mimetype')
+            typ = z.read('mimetype').decode('utf-8')
         except KeyError:
-            raise AdveneException(_("File %s is not an Advene zip package.") % fname)
+            raise AdveneException(_("File %s is not an Advene zip package - no mimetype.") % fname)
         if typ != advene.model.zippackage.MIMETYPE:
-            raise AdveneException(_("File %s is not an Advene zip package.") % fname)
+            raise AdveneException(_("File %(fname)s is not an Advene zip package - wrong mimetype %(type)s.") % {'fname': fname,
+                                                                                                                 'type': typ})
 
         try:
-            st=z.read('META-INF/statistics.xml')
+            st=z.read('META-INF/statistics.xml').decode('utf-8')
         except KeyError:
             st=None
 
@@ -551,13 +555,13 @@ def get_statistics(fname):
         # Generate it (it can take some time)
         try:
             p=Package(uri=fname)
-        except Exception, e:
-            raise(_("Error:\n%s") % unicode(e))
+        except Exception as e:
+            raise _("Error:\n%s")
         st=p.generate_statistics()
         p.close()
 
     # We have the statistics in XML format. Render it.
-    s=StringIO.StringIO(st)
+    s=io.StringIO(st)
     h=advene.model.package.StatisticsHandler()
     data=h.parse_file(s)
     s.close()
@@ -584,18 +588,54 @@ Description:
         }
     return m
 
-def get_annotations_statistics(annotations):
-    data = [ format_element_name('annotation', len(annotations)) ]
-    if annotations:
-        data.extend( "%s : %s" % (label, value)
-                     for label, value in (
-                             (_("Min duration"), format_time(min( a.fragment.duration for a in annotations))),
-                             (_("Max duration"), format_time(max( a.fragment.duration for a in annotations))),
-                             (_("Mean duration"), format_time(sum( a.fragment.duration for a in annotations) / len(annotations))),
-                             (_("Total duration"), format_time(sum( a.fragment.duration for a in annotations)))
-                     )
-                 )
-    return "\n".join(data)
+def median(values):
+    """Return the median value of a list of values.
+    """
+    if not values:
+        return None
+    values = sorted(values)
+    n = len(values)
+    if n % 2:
+        return values[int((n + 1) / 2) - 1]
+    else:
+        return sum(values[int(n / 2) - 1:int(n / 2) + 1]) / 2.0
+
+def get_annotations_statistics(annotations, format='text'):
+    """Return some statistics about the given annotations.
+
+    The returned format can be either text or dict
+    """
+    if not annotations:
+        if format == 'text':
+            return _("No annotation")
+        else:
+            return {
+                'min': 0,
+                'max': 0,
+                'mean': 0,
+                'median': 0,
+                'total': 0
+            }
+    total_duration = sum(a.fragment.duration for a in annotations)
+    res = {
+        'min': min(a.fragment.duration for a in annotations),
+        'max': max(a.fragment.duration for a in annotations),
+        'mean': total_duration / len(annotations),
+        'median': median(a.fragment.duration for a in annotations),
+        'total': total_duration
+    }
+    if format == 'text':
+        for k in res:
+            res[k] = format_time(res[k])
+        res['count'] = format_element_name('annotation', len(annotations))
+        return """Count: %(count)s
+Min duration: %(min)s
+Max duration: %(max)s
+Mean duration: %(mean)s
+Median duration: %(median)s
+Total duration: %(total)s""" % res
+    else:
+        return res
 
 element_declinations={
     'schema': (_('schema'), _('schemas')),
@@ -684,17 +724,17 @@ def get_video_stream_from_website(url):
     if  'dailymotion' in url:
         if '/get/' in url:
             return url
-        u=urllib.urlopen(url)
+        u=urllib.request.urlopen(url)
         data=[ l for l in u.readlines() if '.addVariable' in l and 'flv' in l ]
         u.close()
         if data:
             addr=re.findall('\"(http.+?)\"', data[0])
             if addr:
-                stream=urllib.unquote(addr[0])
+                stream=urllib.parse.unquote(addr[0])
     elif 'youtube.com' in url:
         if '/get_video' in url:
             return url
-        u=urllib.urlopen(url)
+        u=urllib.request.urlopen(url)
         data=[ l for l in u.readlines() if 'player2.swf' in l ]
         u.close()
         if data:
@@ -704,13 +744,13 @@ def get_video_stream_from_website(url):
     elif 'video.google.com' in url:
         if '/videodownload' in url:
             return url
-        u=urllib.urlopen(url)
+        u=urllib.request.urlopen(url)
         data=[ l for l in u.readlines() if '.gvp' in l ]
         u.close()
         if data:
             addr=re.findall('http://.+?.gvp\?docid=.\d+', data[0])
             if addr:
-                u=urllib.urlopen(addr[0])
+                u=urllib.request.urlopen(addr[0])
                 data=[ l for l in u.readlines() if 'url:' in l ]
                 u.close()
                 if data:
@@ -745,7 +785,7 @@ class CircularList(list):
         else:
             return None
 
-    def next(self):
+    def __next__(self):
         self._index = (self._index + 1) % len(self)
         return self.current()
 
@@ -806,26 +846,40 @@ def title2content(new_title, original_content, representation):
     then we can convert the short representation back to the
     appropriate content.
 
+    new_title is expected to be unicode.
+
     @return the new content or None if the content could not be updated.
     """
+    assert(isinstance(new_title, str))
     r = None
     if representation is None or empty_representation.match(representation):
-        r = unicode(new_title)
+        r = new_title
     else:
         m = parsed_representation.match(representation)
         if m:
             # We have a simple representation (here/content/parsed/name)
             # so we can update the name field.
-            new_title = unicode(new_title).replace('\n', '\\n')
+            new_title = new_title.replace('\n', '\\n')
             name=m.group(1)
-            reg = re.compile('^' + name + '=(.*?)$', re.MULTILINE)
-            if reg.search(original_content):
-                r = reg.sub(name + '=' + new_title, original_content)
-            else:
-                # The key is not present, add it
-                if original_content:
-                    r = original_content + "\n%s=%s" % (name, new_title)
+
+            if original_content.mimetype == 'application/x-advene-structured':
+                reg = re.compile('^' + name + '=(.*?)$', re.MULTILINE)
+                if reg.search(original_content.data):
+                    r = reg.sub(name + '=' + new_title, original_content.data)
                 else:
-                    r = "%s=%s" % (name, new_title)
+                    # The key is not present, add it
+                    if original_content.data:
+                        r = original_content.data + "\n%s=%s" % (name, new_title)
+                    else:
+                        r = "%s=%s" % (name, new_title)
+            elif original_content.mimetype == 'application/json':
+                data = json.loads(original_content.data)
+                data[name] = new_title
+                r = json.dumps(data)
         # else: too complex representation. Return None as default value.
     return r
+
+def clamp(x, minimum, maximum):
+    """Clamp given value between minimum and maximum.
+    """
+    return max(minimum, min(x, maximum))
diff --git a/lib/advene/util/importer.py b/lib/advene/util/importer.py
index 925ceb6..9171ea3 100644
--- a/lib/advene/util/importer.py
+++ b/lib/advene/util/importer.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -49,17 +49,20 @@ The general idea is:
 im.statistics hold a dictionary containing the creation statistics.
 """
 
+import logging
+logger = logging.getLogger(__name__)
+
 import sys
-import time
 import re
 import os
 import optparse
 import gzip
-import urllib
+import urllib.request, urllib.parse, urllib.error
 
 from gettext import gettext as _
 
-import gobject
+from gi.repository import GObject
+
 import shutil
 import subprocess
 import signal
@@ -69,15 +72,15 @@ import xml.dom
 import xml.etree.ElementTree as ET
 
 if __name__ != '__main__':
-   import advene.core.config as config
+    import advene.core.config as config
 
-   from advene.model.package import Package
-   from advene.model.annotation import Annotation
-   from advene.model.schema import AnnotationType, Schema
-   from advene.model.fragment import MillisecondFragment
+    from advene.model.package import Package
+    from advene.model.annotation import Annotation
+    from advene.model.schema import AnnotationType, Schema
+    from advene.model.fragment import MillisecondFragment
 
-   import advene.util.helper as helper
-   import advene.util.handyxml as handyxml
+    import advene.util.helper as helper
+    import advene.util.handyxml as handyxml
 
 IMPORTERS=[]
 
@@ -107,8 +110,8 @@ def get_valid_importers(fname):
         else:
             invalid.append(i)
     # reverse sort along matching scores
-    valid.sort(lambda a, b: cmp(b[1], a[1]))
-    return [ i for (i, v) in valid ], invalid
+    valid.sort(key=lambda a: a[1], reverse=True)
+    return [ i for (i, r) in valid ], invalid
 
 def get_importer(fname, **kw):
     """Return the first/best valid importer.
@@ -116,31 +119,52 @@ def get_importer(fname, **kw):
     valid, invalid=get_valid_importers(fname)
     i=None
     if len(valid) == 0:
-        print "No valid importer"
+        logger.warn("No valid importer")
     else:
         if len(valid) > 1:
-            print "Multiple importers: ", str(valid)
-            print "Using first one."
+            logger.warn("Multiple importers: %s. Using first one.", str(valid))
         i=valid[0](**kw)
     return i
 
 class GenericImporter(object):
     """Generic importer class
-
     @ivar statistics: Dictionary holding the creation statistics
     @type statistics: dict
-    FIXME...
     """
     name = _("Generic importer")
-
-    def __init__(self, author=None, package=None, defaulttype=None, controller=None, callback=None):
+    annotation_filter = False
+
+    def __init__(self, author=None, package=None, defaulttype=None, controller=None, callback=None, source_type=None):
+        """Instanciate the importer.
+
+        Note: some importers can use an existing annotation type as
+        source element (for processing annotations, e.g. concept
+        extraction). In this case, the annotation_filter attribute
+        must be set to True, and an additional annotation_type
+        parameter is provided to __init__.
+
+        @param author: author for imported/created elements
+        @type author: string
+        @param package: package where elements will be created
+        @type package: advene.model.Package
+        @param defaulttype: default annotation type for created annotations
+        @type defaulltype: advene.model.AnnotationType
+        @param controller: controller
+        @type controller: advene.core.controller
+        @param callback: callback method for progress report
+        @type callback: method
+
+        @param source_type: source annotation type (optional - for annotation filters)
+        @param source_type: advene.model.AnnotationType
+        """
         self.package=package
         if author is None:
             author=config.data.userid
         self.author=author
         self.controller=controller
-        self.timestamp=time.strftime("%Y-%m-%d")
+        self.timestamp=controller.get_timestamp()
         self.defaulttype=defaulttype
+        self.source_type=source_type
         self.callback=callback
         # Default offset in ms
         self.offset=0
@@ -154,6 +178,9 @@ class GenericImporter(object):
             'view': 0,
             'package': 0,
             }
+        # Optional output message that can be set by the importer to
+        # provide feedback to the user
+        self.output_message = ""
 
         # The convention for OptionParser is to have the "dest"
         # attribute of the same name as the Importer attribute
@@ -185,11 +212,38 @@ class GenericImporter(object):
             return True
 
     def set_options(self, options):
-        for k in (n
-                  for n in dir(options)
-                  if not n.startswith('_')):
-            if hasattr(self, k):
-                setattr(self, k, getattr(options, k))
+        """Set importer options (attributes) according to the given options.
+
+        options may be either an option object from OptionParser (where
+        options are attributes of the object) or a dictionary.
+        """
+        if isinstance(options, dict):
+            for k, v in options.items():
+                k = k.replace('-', '_')
+                if hasattr(self, k):
+                    logger.debug("Set option %s %s", k, v)
+                    setattr(self, k, v)
+                else:
+                    logger.info("Unknown option %s", k)
+        else:
+            for k in (n
+                      for n in dir(options)
+                      if not n.startswith('_')):
+                k = k.replace('-', '_')
+                if hasattr(self, k):
+                    logger.debug("Set option %s %s", k, v)
+                    setattr(self, k, getattr(options, k))
+                else:
+                    logger.info("Unknown option %s", k)
+
+    def get_preferences(self):
+        """Get the plugin preferences as a dict.
+
+        The plugin prefs are stored in the Advene preferences and
+        persist across sessions. The plugin options are saved in it.
+
+        """
+        return config.data.preferences['filter-options'].setdefault(type(self).__name__, {})
 
     def process_options(self, source):
         (options, args) = self.optionparser.parse_args(args=source)
@@ -226,7 +280,7 @@ class GenericImporter(object):
         if self.controller is not None:
             self.controller.log(*p)
         else:
-            print " ".join(p)
+            logger.warn(" ".join(p))
 
     def update_statistics(self, elementtype):
         self.statistics[elementtype] = self.statistics.get(elementtype, 0) + 1
@@ -270,12 +324,12 @@ class GenericImporter(object):
         if representation:
             at.setMetaData(config.data.namespace, "representation", representation)
         try:
-            color=self.package._color_palette.next()
+            color=next(self.package._color_palette)
             at.setMetaData(config.data.namespace, "color", color)
         except AttributeError:
             # The package does not have a _color_palette
             pass
-        at._fieldnames = set()
+        at.setMetaData(config.data.namespace, 'item_color', 'here/tag_color')
         schema.annotationTypes.append(at)
         self.update_statistics('annotation-type')
         return at
@@ -322,7 +376,7 @@ class GenericImporter(object):
     def statistics_formatted(self):
         """Return a string representation of the statistics."""
         res=[]
-        kl=self.statistics.keys()
+        kl=list(self.statistics.keys())
         kl.sort()
         for k in kl:
             v=self.statistics[k]
@@ -360,6 +414,15 @@ class GenericImporter(object):
 
         return p, at
 
+    def check_requirements(self):
+        """Check if external requirements for the importers are met.
+
+        It returns a list of strings describing the unmet
+        requirements. If the list is empty, then all requirements are
+        met.
+        """
+        return []
+
     def convert(self, source):
         """Converts the source elements to annotations.
 
@@ -399,7 +462,7 @@ class GenericImporter(object):
                 ident=None
             try:
                 type_=d['type']
-                if isinstance(type_, basestring):
+                if isinstance(type_, str):
                     # A type id was specified. Dereference it, and
                     # create it if necessary.
                     type_id = type_
@@ -441,7 +504,7 @@ class GenericImporter(object):
             if 'complete' in d:
                 a.complete=d['complete']
             if 'notify' in d and d['notify'] and self.controller is not None:
-                print "Notifying", a
+                logger.debug("Notifying %s", a)
                 self.controller.notify('AnnotationCreate', annotation=a)
             if 'send' in d:
                 # We are expected to return a value in the yield call
@@ -501,12 +564,12 @@ class ExternalAppImporter(GenericImporter):
                                              stdout=subprocess.PIPE,
                                              stderr=subprocess.PIPE,
                                              **kw )
-        except OSError, e:
+        except OSError as e:
             self.cleanup()
-            msg = unicode(e.args)
+            msg = str(e.args)
             raise Exception(_("Could not run %(appname)s: %(msg)s") % locals())
 
-        self.progress(.01, _("Processing %s") % gobject.filename_display_name(filename))
+        self.progress(.01, _("Processing %s") % GObject.filename_display_name(filename))
 
         def execute_process():
             self.convert(self.iterator())
@@ -516,7 +579,7 @@ class ExternalAppImporter(GenericImporter):
             end_callback()
             return True
 
-        # Note: the "proper" way would be to use gobject.io_add_watch,
+        # Note: the "proper" way would be to use Gobject.io_add_watch,
         # but last time I tried, this had cross-platform issues. The
         # threading approach seems to work across platforms, so "if it
         # ain't broke, don't fix it".
@@ -529,20 +592,11 @@ class ExternalAppImporter(GenericImporter):
         """
         # Terminate the process if necessary
         if self.process:
-            if config.data.os == 'win32':
-                import ctypes
-                ctypes.windll.kernel32.TerminateProcess(int(self.process._handle), -1)
-            else:
-                try:
-                    # Python 2.6 only
-                    self.process.terminate()
-                except AttributeError:
-                    try:
-                        os.kill(self.process.pid, 9)
-                        os.waitpid(self.process.pid, os.WNOHANG)
-                    except OSError, e:
-                        print "Cannot kill application", unicode(e)
-            self.process = None
+           try:
+              self.process.terminate()
+           except:
+              logger.warn("Cannot terminate application", exc_info=True)
+        self.process = None
 
         for r in self.temporary_resources:
             # Cleanup temp. dir. and files
@@ -683,7 +737,7 @@ class TextImporter(GenericImporter):
         for l in f:
             if not self.progress(f.tell() / filesize):
                 break
-            l = unicode(l.strip(), self.encoding)
+            l = str(l.strip(), self.encoding)
             data = whitespace_re.split(l, 2)
 
             if not data:
@@ -777,11 +831,11 @@ class TextImporter(GenericImporter):
 
     def process_file(self, filename):
         if filename.lower().endswith('.gz'):
-            f = gzip.open(filename, 'r')
+            f = gzip.open(filename, 'r', encoding='utf-8')
         elif filename.startswith('http'):
-            f = urllib.urlopen(filename)
+            f = urllib.request.urlopen(filename)
         else:
-            f = open(filename, 'r')
+            f = open(filename, 'r', encoding='utf-8')
         if self.package is None:
             self.init_package(filename=filename)
         self.ensure_new_type()
@@ -825,7 +879,7 @@ class LsDVDImporter(GenericImporter):
             if not self.progress(progress, _("Processing data")):
                 break
             l=l.rstrip()
-            l=unicode(l, self.encoding).encode('utf-8')
+            l=str(l, self.encoding).encode('utf-8')
             m=reg.search(l)
             if m is not None:
                 d=m.groupdict()
@@ -841,9 +895,9 @@ class LsDVDImporter(GenericImporter):
             pass
         self.init_package(filename=filename)
         self.ensure_new_type('chapter', _("DVD Chapter"))
-        if not self.package.getMetaData(config.data.namespace, "mediafile"):
+        if not self.package.media:
             # We created a new package. Set the mediafile
-            p.setMetaData (config.data.namespace, "mediafile", "dvd at 1,1")
+            p.setMedia("dvd at 1,1")
         self.progress(0.1, _("Launching lsdvd..."))
         f=os.popen(self.command, "r")
         self.convert(self.iterator(f))
@@ -880,7 +934,7 @@ class ChaplinImporter(GenericImporter):
         chapter=None
         for l in f:
             l=l.rstrip()
-            l=unicode(l, self.encoding).encode('utf-8')
+            l=str(l, self.encoding).encode('utf-8')
             m=reg.search(l)
             if m is not None:
                 d=m.groupdict()
@@ -901,9 +955,9 @@ class ChaplinImporter(GenericImporter):
         f=os.popen(self.command, "r")
         self.init_package(filename=filename)
         self.ensure_new_type('chapter', _("DVD Chapter"))
-        if not self.package.getMetaData(config.data.namespace, "mediafile"):
+        if not self.package.media:
             # We created a new package. Set the mediafile
-            p.setMetaData (config.data.namespace, "mediafile", "dvd at 1,1")
+            p.setMedia("dvd at 1,1")
         self.convert(self.iterator(f))
         f.close()
         self.progress(1.0)
@@ -963,16 +1017,15 @@ class XiImporter(GenericImporter):
         # self.anchors init
         filename=None
         for a in xi.Anchors[0].Anchor:
-            self.anchors[a.id] = long(float(a.offset.replace(',','.')) * self.factors[a.unit])
+            self.anchors[a.id] = int(float(a.offset.replace(',','.')) * self.factors[a.unit])
             if filename is None:
                 filename = self.signals[a.refSignal]
             elif filename != self.signals[a.refSignal]:
-                print "Erreur: plusieurs fichiers sources, non supportes"
+                logger.error("Erreur: many source files, not supported")
                 sys.exit(1)
 
-        if self.package.getMetaData(config.data.namespace, "mediafile") in (None, ""):
-            self.package.setMetaData (config.data.namespace,
-                                      "mediafile", filename)
+        if not self.package.media:
+            self.package.setMedia(filename)
 
         self.convert(self.iterator(xi))
         self.progress(1.0)
@@ -1033,7 +1086,7 @@ class ElanImporter(GenericImporter):
 
             tid=valid_id_re.sub('', tid)
 
-            if not self.atypes.has_key(tid):
+            if tid not in self.atypes:
                 self.atypes[tid]=self.create_annotation_type(self.schema, tid)
 
             if not self.progress(progress, _("Converting tier %s") % tid):
@@ -1043,9 +1096,6 @@ class ElanImporter(GenericImporter):
                 d={}
 
                 d['type']=self.atypes[tid]
-                #d['type']=self.atypes[tier.TIER_ID.replace(' ','_')]
-
-                #print "Creating " + al.ANNOTATION_ID
                 if hasattr(an, 'ALIGNABLE_ANNOTATION'):
                     # Annotation on a timeline
                     al=an.ALIGNABLE_ANNOTATION[0]
@@ -1064,7 +1114,7 @@ class ElanImporter(GenericImporter):
                     rel_id = ref.ANNOTATION_REF
                     rel_uri = '#'.join( (self.package.uri, rel_id) )
 
-                    if self.package.annotations.has_key(rel_uri):
+                    if rel_uri in self.package.annotations:
                         rel_an=self.package.annotations[rel_uri]
                         # We reuse the related annotation fragment
                         d['begin'] = rel_an.fragment.begin
@@ -1086,7 +1136,6 @@ class ElanImporter(GenericImporter):
             dest=self.package.annotations['#'.join( (self.package.uri,
                                                      dest_id) ) ]
 
-            #print "Relation %s -> %s" % (source, dest)
             rtypeid='_'.join( ('rt', source.type.id, dest.type.id) )
             try:
                 rtype=self.package.relationTypes['#'.join( (self.package.uri,
@@ -1140,7 +1189,7 @@ class ElanImporter(GenericImporter):
         self.progress(0.1, _("Processing time slots"))
         for a in elan.TIME_ORDER[0].TIME_SLOT:
             try:
-                self.anchors[a.TIME_SLOT_ID] = long(a.TIME_VALUE)
+                self.anchors[a.TIME_SLOT_ID] = int(a.TIME_VALUE)
             except AttributeError:
                 # FIXME: should not silently ignore error
                 self.anchors[a.TIME_SLOT_ID] = 0
@@ -1182,16 +1231,15 @@ class SubtitleImporter(GenericImporter):
             return 0
     can_handle=staticmethod(can_handle)
 
-    def srt_iterator(self, f, filesize):
-        if filesize == 0:
-            # Dummy value, but we will be sure not to divide by 0
-            filesize = 1
+    def srt_iterator(self, f):
         base=r'\d+:\d+:\d+[,\.:]\d+'
         pattern=re.compile('(' + base + ').+(' + base + ')')
         tc=None
         content=[]
-        for line in f:
-            if not self.progress(1.0 * f.tell() / filesize):
+        # 10000 lines should be a reasonable max.
+        max_lines = 10000
+        for index, line in enumerate(f):
+            if not self.progress(index / max_lines):
                 break
             line=line.rstrip()
             match=pattern.search(line)
@@ -1202,42 +1250,35 @@ class SubtitleImporter(GenericImporter):
                 # Convert it and reset the data
                 if tc is None:
                     if content:
-                        print "Strange error: no timestamp was found for content ", "".join(content)
+                        logger.warn("Strange error: no timestamp was found for content %s", "".join(content))
                         content = []
                 else:
                     d={'begin': tc[0],
                        'end': tc[1],
-                       'content': u"\n".join(content)}
+                       'content': "\n".join(content)}
                     tc=None
                     content=[]
                     yield d
             else:
                 if tc is not None:
-                    if self.encoding:
-                        data=unicode(line, self.encoding)
-                    else:
-                        # We will try utf8 first, then fallback on latin1
-                        try:
-                            data=unicode(line, 'utf8')
-                        except UnicodeDecodeError:
-                            # Fallback on latin1, which is very common, but may
-                            # sometimes fail
-                            data=unicode(line, 'latin1')
-                    content.append(data)
+                    content.append(line)
                     # else We could check line =~ /^\d+$/
         # End of for-loop: if there is a last item, convert it.
         if tc is not None:
             d={'begin': tc[0],
                'end': tc[1],
-               'content': u"\n".join(content)}
+               'content': "\n".join(content)}
             yield d
 
     def process_file(self, filename):
-        f=open(filename, 'r')
+        f = open(filename, 'r', encoding=self.encoding or 'utf-8')
         p, at = self.init_package(filename=filename, annotationtypeid='subtitle')
         at.title = _("Subtitles from %s") % os.path.basename(filename)
         # FIXME: implement subtitle type detection
-        self.convert(self.srt_iterator(f, os.path.getsize(filename)))
+        try:
+           self.convert(self.srt_iterator(f))
+        except UnicodeDecodeError:
+           self.output_message = _("Cannot decode subtitle file. Try to specify an encoding (latin1 perhaps?).")
         f.close()
         self.progress(1.0)
         return self.package
@@ -1265,7 +1306,7 @@ class PraatImporter(GenericImporter):
     def iterator(self, f):
         l=f.readline()
         if not 'ooTextFile' in l:
-            print "Invalid PRAAT file"
+            logger.error("Invalid PRAAT file")
             return
 
         name_re=re.compile('^(\s+)name\s*=\s*"(.+)"')
@@ -1282,12 +1323,12 @@ class PraatImporter(GenericImporter):
             l=f.readline()
             if not l:
                 break
-            l=unicode(l, 'iso-8859-1').encode('utf-8')
+            l=str(l, 'iso-8859-1').encode('utf-8')
             m=name_re.match(l)
             if m:
                 ws, current_type=m.group(1, 2)
                 type_align=len(ws)
-                if not self.atypes.has_key(current_type):
+                if current_type not in self.atypes:
                     self.atypes[current_type]=self.create_annotation_type(self.schema, current_type)
                 continue
             m=boundary_re.match(l)
@@ -1297,7 +1338,7 @@ class PraatImporter(GenericImporter):
                     # It is either the xmin/xmax for the current type
                     # or a upper-level xmin. Ignore.
                     continue
-                v=long(float(t) * 1000)
+                v=int(float(t) * 1000)
                 if name == 'xmin':
                     begin=v
                 else:
@@ -1307,11 +1348,10 @@ class PraatImporter(GenericImporter):
             if m:
                 ws, text = m.group(1, 2)
                 if len(ws) <= type_align:
-                    print "Error: invalid alignment for %s" % l
+                    logger.error("Error: invalid alignment for %s", l)
                     continue
                 if begin is None or end is None or current_type is None:
-                    print "Error: found text tag before xmin or xmax info"
-                    print l
+                    logger.error("Error: found text tag before xmin or xmax info: %s", l)
                     continue
                 yield {
                     'type': self.atypes[current_type],
@@ -1321,7 +1361,7 @@ class PraatImporter(GenericImporter):
                     }
 
     def process_file(self, filename):
-        f=open(filename, 'r')
+        f=open(filename, 'rb')
 
         self.init_package(filename)
         self.schema=self.create_schema('praat',
@@ -1359,7 +1399,7 @@ class CmmlImporter(GenericImporter):
 
         Cf http://www.annodex.net/TR/draft-pfeiffer-temporal-fragments-03.html#anchor5
         """
-        if isinstance(npt, long) or isinstance(npt, int):
+        if isinstance(npt, int) or isinstance(npt, int):
             return npt
 
         if npt.startswith('npt:'):
@@ -1367,7 +1407,7 @@ class CmmlImporter(GenericImporter):
 
         try:
             msec=helper.parse_time(npt)
-        except Exception, e:
+        except Exception as e:
             self.log("Unhandled NPT format: " + npt)
             self.log(str(e))
             msec=0
@@ -1406,8 +1446,8 @@ class CmmlImporter(GenericImporter):
             progress += incr
             try:
                 begin=clip.start
-            except AttributeError, e:
-                print str(e)
+            except AttributeError:
+                logger.error("Error in CMML importer", exc_info=True)
                 begin=0
             begin=self.npt2time(begin)
 
@@ -1436,8 +1476,8 @@ class CmmlImporter(GenericImporter):
                     delayed.append(d)
                 else:
                     yield d
-            except AttributeError, e:
-                #print "Erreur dans link" + str(e)
+            except AttributeError:
+                logger.error("CMML - link error", exc_info=True)
                 pass
 
             # img attribute
@@ -1475,7 +1515,7 @@ class CmmlImporter(GenericImporter):
             # Meta attributes (need to create schemas as needed)
             try:
                 for meta in clip.meta:
-                    if not self.atypes.has_key(meta.name):
+                    if meta.name not in self.atypes:
                         self.atypes[meta.name]=self.create_annotation_type(self.schema, meta.name)
                     d={
                         'type': self.atypes[meta.name],
@@ -1532,7 +1572,7 @@ class CmmlImporter(GenericImporter):
         try:
             t=s.basetime
             if t:
-                t=long(t)
+                t=int(t)
         except AttributeError:
             t=0
         self.basetime=t
@@ -1545,7 +1585,7 @@ class CmmlImporter(GenericImporter):
                 src=i.getAttributeNS(xml.dom.EMPTY_NAMESPACE, 'src')
         except AttributeError:
             src=""
-        self.package.setMetaData (config.data.namespace, "mediafile", src)
+        self.package.setMedia(src)
 
         self.convert(self.iterator(cm))
 
@@ -1586,7 +1626,6 @@ class IRIImporter(GenericImporter):
         incr=0.02
         for ensemble in ensembles:
             sid=ensemble.id
-            print "Ensemble", sid
             progress += incr
             if not self.progress(progress, _("Parsing ensemble %s") % sid):
                 break
@@ -1601,12 +1640,11 @@ class IRIImporter(GenericImporter):
                 progress += incr
                 if not self.progress(progress, _("Parsing decoupage %s") % tid):
                     break
-                print "  Decoupage ", tid
                 # Update self.duration
-                self.duration=max(long(decoupage.dur), self.duration)
+                self.duration=max(int(decoupage.dur), self.duration)
 
                 # Create the type
-                if not self.atypes.has_key(tid):
+                if tid not in self.atypes:
                     at=self.create_annotation_type(schema, tid,
                                                    mimetype='application/x-advene-structured',
                                                    author=decoupage.author or self.author,
@@ -1627,9 +1665,9 @@ class IRIImporter(GenericImporter):
                        'author': el.author or self.author,
                        'date': el.date,
                        'content': "title=%s\nabstract=%s\nsrc=%s" % (
-                            unicode(el.title).encode('utf-8').replace('\n', '\\n'),
-                            unicode(el.abstract).encode('utf-8').replace('\n', '\\n'),
-                            unicode(el.src).encode('utf-8').replace('\n', '\\n'),
+                            str(el.title).encode('utf-8').replace('\n', '\\n'),
+                            str(el.abstract).encode('utf-8').replace('\n', '\\n'),
+                            str(el.src).encode('utf-8').replace('\n', '\\n'),
                             )
                        }
                     yield d
@@ -1645,7 +1683,7 @@ class IRIImporter(GenericImporter):
                 for view in views:
                     if self.multiple_types:
                         tid=view.id
-                        if not self.atypes.has_key(tid):
+                        if tid not in self.atypes:
                             at=self.create_annotation_type(schema, tid,
                                                            mimetype='text/plain',
                                                            author=view.author or self.author,
@@ -1659,11 +1697,10 @@ class IRIImporter(GenericImporter):
                     progress += incr
                     if not self.progress(progress, view.title):
                         break
-                    print "     ", view.title.encode('latin1')
                     for ref in view.ref:
                         an = [a for a in self.package.annotations if a.id == ref.id ]
                         if not an:
-                            print "Invalid id", ref.id
+                            logger.error("IRIImporter: Invalid id %s", ref.id)
                         else:
                             an=an[0]
                             if self.multiple_types:
@@ -1695,8 +1732,8 @@ class IRIImporter(GenericImporter):
         med=[ i for i in iri.body[0].medias[0].media  if i.id == 'video' ]
         if med:
             # Got a video file reference
-            if not self.package.getMetaData(config.data.namespace, "mediafile"):
-                self.package.setMetaData (config.data.namespace, "mediafile", med[0].video[0].src)
+            if not self.package.media:
+                self.package.setMedia(med[0].video[0].src)
 
         # Metadata extraction
         meta=dict([ (m.name, m.content) for m in iri.head[0].meta ])
@@ -1748,7 +1785,7 @@ class IRIDataImporter(GenericImporter):
         incr = 1.0 / n
         progress = .1
         self.progress(progress, _("Creating annotations"))
-        for c in range(0, n / size):
+        for c in range(0, int(n / size)):
             progress += incr
             if not self.progress(progress, ''):
                 break
@@ -1786,6 +1823,7 @@ class IRIDataImporter(GenericImporter):
 register(IRIDataImporter)
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
     USAGE = "%prog filter_name input_file [options] output_file"
     if sys.argv[1:]:
         filtername = sys.argv[1]
@@ -1806,9 +1844,9 @@ if __name__ == "__main__":
     import advene.util.helper as helper
     import advene.util.handyxml as handyxml
 
-    import StringIO
+    import io
 
-    log = StringIO.StringIO()
+    log = io.StringIO()
     saved, sys.stdout = sys.stdout, log
     # Load plugins
     c = controller.AdveneController()
@@ -1826,12 +1864,12 @@ if __name__ == "__main__":
     sys.stdout = saved
 
     if filtername is None or len(params) == 0:
-        print """Syntax: %s
+        logger.error("""Syntax: %s
 filter_name can be "auto" for autodetection.
 Available filters:
   * %s
         """ % (USAGE.replace('%prog', sys.argv[0]),
-               "\n  * ".join(i.name for i in controller.advene.util.importer.IMPORTERS))
+               "\n  * ".join(i.name for i in controller.advene.util.importer.IMPORTERS)))
         sys.exit(0)
 
     if filtername == 'auto':
@@ -1842,11 +1880,11 @@ Available filters:
         if len(cl) == 1:
             i = cl[0]()
         elif len(cl) > 1:
-            print "Too many possibilities:\n%s" % "\n".join(f.name for f in cl)
+            logger.error("Too many possibilities:\n%s", "\n".join(f.name for f in cl))
             sys.exit(1)
 
     if i is None:
-        print "No matching importer for %s" % filtername
+        logger.error("No matching importer for %s", filtername)
         sys.exit(1)
 
     i.optionparser.set_usage(USAGE)
@@ -1860,11 +1898,11 @@ Available filters:
     except IndexError:
         outputfile = ''
     # (for .sub conversion for instance, --fps, --offset)
-    print "Converting %s to %s using %s" % (inputfile, outputfile, i.name)
+    logger.info("Converting %s to %s using %s", inputfile, outputfile, i.name)
     p = i.process_file(inputfile)
     if outputfile:
         p.save(outputfile)
     else:
         p.serialize()
-    print i.statistics_formatted()
+    logger.info(i.statistics_formatted())
     sys.exit(0)
diff --git a/lib/advene/util/merger.py b/lib/advene/util/merger.py
index 5ddf865..e81b86c 100644
--- a/lib/advene/util/merger.py
+++ b/lib/advene/util/merger.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -20,7 +20,10 @@
 Merge packages
 ==============
 """
+import logging
+logger = logging.getLogger(__name__)
 
+import itertools
 import sys
 import os
 import filecmp
@@ -48,21 +51,34 @@ class Differ:
         self.translated_ids = {}
 
     def diff(self):
-        """Iterator returning a changelist.
+        """Iterator returning a changelist for all elements.
 
         Structure of returned elements:
         (action_name, source_element, dest_element, action)
         """
-        for m in (self.diff_schemas,
-                  self.diff_annotation_types,
-                  self.diff_relation_types,
-                  self.diff_annotations,
-                  self.diff_relations,
-                  self.diff_views,
-                  self.diff_queries,
-                  self.diff_resources):
-            for d in m():
-                yield d
+        return itertools.chain(self.diff_schemas(),
+                               self.diff_annotation_types(),
+                               self.diff_relation_types(),
+                               self.diff_annotations(),
+                               self.diff_relations(),
+                               self.diff_views(),
+                               self.diff_queries(),
+                               self.diff_resources())
+
+    def diff_structure(self):
+        """Iterator returning a changelist for all structure elements
+
+        Excluding annotations/realtions.
+
+        Structure of returned elements:
+        (action_name, source_element, dest_element, action)
+        """
+        return itertools.chain(self.diff_schemas(),
+                               self.diff_annotation_types(),
+                               self.diff_relation_types(),
+                               self.diff_views(),
+                               self.diff_queries(),
+                               self.diff_resources())
 
     def check_meta(self, s, d, namespaceid, name):
         ns=config.data.namespace_prefix[namespaceid]
@@ -269,7 +285,7 @@ class Differ:
         for t in handle_dircmp(d):
             yield t
 
-        for sd in d.subdirs.itervalues():
+        for sd in d.subdirs.values():
             for t in handle_dircmp(sd):
                 yield t
         return
@@ -340,7 +356,7 @@ class Differ:
                 # Any type, no import necessary
                 continue
             if not m.startswith('#'):
-                print "Cannot handle non-fragment membertypes", m
+                logger.error("Cannot handle non-fragment membertypes %s", m)
                 continue
             at=helper.get_id(self.destination.annotationTypes, m[1:])
             if not at:
@@ -393,7 +409,9 @@ class Differ:
             author=s.author or self.source.author,
             fragment=s.fragment.clone())
         el.date=s.date or self.controller.get_timestamp()
+        el.content.mimetype=s.content.mimetype
         el.content.data=s.content.data
+        el.tags = s.tags
         self.destination.annotations.append(el)
         return el
 
@@ -429,6 +447,7 @@ class Differ:
             members=members)
         el.date=s.date or self.controller.get_timestamp()
         el.content.data=s.content.data
+        el.tags = s.tags
         self.destination.relations.append(el)
         #el.title=s.title or ''
         return el
@@ -446,8 +465,8 @@ class Differ:
             author=s.author or self.source.author)
         el.data=s.date or self.controller.get_timestamp()
         el.title=s.title or id_
-        el.content.data=s.content.data
         el.content.mimetype=s.content.mimetype
+        el.content.data=s.content.data
         self.destination.queries.append(el)
         return el
 
@@ -466,12 +485,12 @@ class Differ:
         el.date=s.date or self.controller.get_timestamp()
         el.title=s.title or id_
         el.matchFilter['class']=s.matchFilter['class']
-        if s.matchFilter.has_key('type'):
+        if 'type' in s.matchFilter:
             el.matchFilter['type']=s.matchFilter['type']
         # FIXME: ideally, we should try to fix translated_ids in
         # views. Or at least try to signal possible occurrences.
-        el.content.data=s.content.data
         el.content.mimetype=s.content.mimetype
+        el.content.data=s.content.data
         self.destination.views.append(el)
         return el
 
@@ -479,7 +498,7 @@ class Differ:
         source_name=os.path.join(self.source.resources.dir_, d)
         destination_name=os.path.join(self.destination.resources.dir_, d)
         if not os.path.exists(source_name):
-            print "Package integrity problem: %s does not exist" % source_name
+            logger.error("Package integrity problem: %s does not exist", source_name)
             return
         if os.path.isdir(source_name):
             shutil.copytree(source_name, destination_name)
@@ -491,25 +510,26 @@ class Differ:
         destination_name=os.path.join(self.destination.resources.dir_, d)
         for rep in (source_name, destination_name):
             if not os.path.exists(rep):
-                print "Package integrity problem: %s does not exist" % source_name
+                logger.error("Package integrity problem: %s does not exist", source_name)
                 return
         shutil.copyfile(source_name, destination_name)
 
 if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
     if len(sys.argv) < 3:
-        print "Should provide 2 package names"
+        logger.error("Should provide 2 package names")
         sys.exit(1)
 
     sourcename=sys.argv[1]
     destname=sys.argv[2]
 
-    print sourcename, destname
+    logger.warn("Merging %s into %s", sourcename, destname)
     source=Package(uri=sourcename)
     dest=Package(uri=destname)
 
     differ=Differ(source, dest)
     diff=differ.diff()
     for name, s, d, action in diff:
-        print name, unicode(s).encode('utf-8'), unicode(d).encode('utf-8')
+        logger.info("%s %s %s", name, str(s).encode('utf-8'), str(d).encode('utf-8'))
         #action(s, d)
     #dest.save('foo.xml')
diff --git a/lib/advene/util/odict.py b/lib/advene/util/odict.py
deleted file mode 100644
index e1742f8..0000000
--- a/lib/advene/util/odict.py
+++ /dev/null
@@ -1,328 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-    odict
-    ~~~~~
-
-    This module is an example implementation of an ordered dict for the
-    collections module.  It's not written for performance (it actually
-    performs pretty bad) but to show how the API works.
-
-
-    Questions and Answers
-    =====================
-
-    Why would anyone need ordered dicts?
-
-        Dicts in python are unordered which means that the order of items when
-        iterating over dicts is undefined.  As a matter of fact it is most of
-        the time useless and differs from implementation to implementation.
-
-        Many developers stumble upon that problem sooner or later when
-        comparing the output of doctests which often does not match the order
-        the developer thought it would.
-
-        Also XML systems such as Genshi have their problems with unordered
-        dicts as the input and output ordering of tag attributes is often
-        mixed up because the ordering is lost when converting the data into
-        a dict.  Switching to lists is often not possible because the
-        complexity of a lookup is too high.
-
-        Another very common case is metaprogramming.  The default namespace
-        of a class in python is a dict.  With Python 3 it becomes possible
-        to replace it with a different object which could be an ordered dict.
-        Django is already doing something similar with a hack that assigns
-        numbers to some descriptors initialized in the class body of a
-        specific subclass to restore the ordering after class creation.
-
-        When porting code from programming languages such as PHP and Ruby
-        where the item-order in a dict is guaranteed it's also a great help
-        to have an equivalent data structure in Python to ease the transition.
-
-    Where are new keys added?
-
-        At the end.  This behavior is consistent with Ruby 1.9 Hashmaps
-        and PHP Arrays.  It also matches what common ordered dict
-        implementations do currently.
-
-    What happens if an existing key is reassigned?
-
-        The key is *not* moved.  This is consitent with existing
-        implementations and can be changed by a subclass very easily::
-
-            class movingodict(odict):
-                def __setitem__(self, key, value):
-                    self.pop(key, None)
-                    odict.__setitem__(self, key, value)
-
-        Moving keys to the end of a ordered dict on reassignment is not
-        very useful for most applications.
-
-    Does it mean the dict keys are sorted by a sort expression?
-
-        That's not the case.  The odict only guarantees that there is an order
-        and that newly inserted keys are inserted at the end of the dict.  If
-        you want to sort it you can do so, but newly added keys are again added
-        at the end of the dict.
-
-    I initializes the odict with a dict literal but the keys are not
-    ordered like they should!
-
-        Dict literals in Python generate dict objects and as such the order of
-        their items is not guaranteed.  Before they are passed to the odict
-        constructor they are already unordered.
-
-    What happens if keys appear multiple times in the list passed to the
-    constructor?
-
-        The same as for the dict.  The latter item overrides the former.  This
-        has the side-effect that the position of the first key is used because
-        the key is actually overwritten:
-
-        >>> odict([('a', 1), ('b', 2), ('a', 3)])
-        odict.odict([('a', 3), ('b', 2)])
-
-        This behavor is consistent with existing implementation in Python
-        and the PHP array and the hashmap in Ruby 1.9.
-
-    This odict doesn't scale!
-
-        Yes it doesn't.  The delitem operation is O(n).  This is file is a
-        mockup of a real odict that could be implemented for collections
-        based on an linked list.
-
-    Why is there no .insert()?
-
-        There are few situations where you really want to insert a key at
-        an specified index.  To now make the API too complex the proposed
-        solution for this situation is creating a list of items, manipulating
-        that and converting it back into an odict:
-
-        >>> d = odict([('a', 42), ('b', 23), ('c', 19)])
-        >>> l = d.items()
-        >>> l.insert(1, ('x', 0))
-        >>> odict(l)
-        odict.odict([('a', 42), ('x', 0), ('b', 23), ('c', 19)])
-
-    :copyright: (c) 2008 by Armin Ronacher and PEP 273 authors.
-    :license: modified BSD license.
-"""
-from itertools import izip, imap
-from copy import deepcopy
-
-missing = object()
-
-
-class odict(dict):
-    """
-    Ordered dict example implementation.
-
-    This is the proposed interface for a an ordered dict as proposed on the
-    Python mailinglist (proposal_).
-
-    It's a dict subclass and provides some list functions.  The implementation
-    of this class is inspired by the implementation of Babel but incorporates
-    some ideas from the `ordereddict`_ and Django's ordered dict.
-
-    The constructor and `update()` both accept iterables of tuples as well as
-    mappings:
-
-    >>> d = odict([('a', 'b'), ('c', 'd')])
-    >>> d.update({'foo': 'bar'})
-    >>> d
-    odict.odict([('a', 'b'), ('c', 'd'), ('foo', 'bar')])
-
-    Keep in mind that when updating from dict-literals the order is not
-    preserved as these dicts are unsorted!
-
-    You can copy an odict like a dict by using the constructor, `copy.copy`
-    or the `copy` method and make deep copies with `copy.deepcopy`:
-
-    >>> from copy import copy, deepcopy
-    >>> copy(d)
-    odict.odict([('a', 'b'), ('c', 'd'), ('foo', 'bar')])
-    >>> d.copy()
-    odict.odict([('a', 'b'), ('c', 'd'), ('foo', 'bar')])
-    >>> odict(d)
-    odict.odict([('a', 'b'), ('c', 'd'), ('foo', 'bar')])
-    >>> d['spam'] = []
-    >>> d2 = deepcopy(d)
-    >>> d2['spam'].append('eggs')
-    >>> d
-    odict.odict([('a', 'b'), ('c', 'd'), ('foo', 'bar'), ('spam', [])])
-    >>> d2
-    odict.odict([('a', 'b'), ('c', 'd'), ('foo', 'bar'), ('spam', ['eggs'])])
-
-    All iteration methods as well as `keys`, `values` and `items` return
-    the values ordered by the the time the key-value pair is inserted:
-
-    >>> d.keys()
-    ['a', 'c', 'foo', 'spam']
-    >>> d.values()
-    ['b', 'd', 'bar', []]
-    >>> d.items()
-    [('a', 'b'), ('c', 'd'), ('foo', 'bar'), ('spam', [])]
-    >>> list(d.iterkeys())
-    ['a', 'c', 'foo', 'spam']
-    >>> list(d.itervalues())
-    ['b', 'd', 'bar', []]
-    >>> list(d.iteritems())
-    [('a', 'b'), ('c', 'd'), ('foo', 'bar'), ('spam', [])]
-
-    Index based lookup is supported too by `byindex` which returns the
-    key/value pair for an index:
-
-    >>> d.byindex(2)
-    ('foo', 'bar')
-
-    You can reverse the odict as well:
-
-    >>> d.reverse()
-    >>> d
-    odict.odict([('spam', []), ('foo', 'bar'), ('c', 'd'), ('a', 'b')])
-
-    And sort it like a list:
-
-    >>> d.sort(key=lambda x: x[0].lower())
-    >>> d
-    odict.odict([('a', 'b'), ('c', 'd'), ('foo', 'bar'), ('spam', [])])
-
-    .. _proposal: http://thread.gmane.org/gmane.comp.python.devel/95316
-    .. _ordereddict: http://www.xs4all.nl/~anthon/Python/ordereddict/
-    """
-
-    def __init__(self, *args, **kwargs):
-        dict.__init__(self)
-        self._keys = []
-        self.update(*args, **kwargs)
-
-    def __delitem__(self, key):
-        dict.__delitem__(self, key)
-        self._keys.remove(key)
-
-    def __setitem__(self, key, item):
-        if key not in self:
-            self._keys.append(key)
-        dict.__setitem__(self, key, item)
-
-    def __deepcopy__(self, memo=None):
-        if memo is None:
-            memo = {}
-        d = memo.get(id(self), missing)
-        if d is not missing:
-            return d
-        memo[id(self)] = d = self.__class__()
-        dict.__init__(d, deepcopy(self.items(), memo))
-        d._keys = self._keys[:]
-        return d
-
-    def __getstate__(self):
-        return {'items': dict(self), 'keys': self._keys}
-
-    def __setstate__(self, d):
-        self._keys = d['keys']
-        dict.update(d['items'])
-
-    def __reversed__(self):
-        return reversed(self._keys)
-
-    def __eq__(self, other):
-        if isinstance(other, odict):
-            if not dict.__eq__(self, other):
-                return False
-            return self.items() == other.items()
-        return dict.__eq__(self, other)
-
-    def __ne__(self, other):
-        return not self.__eq__(other)
-
-    def __cmp__(self, other):
-        if isinstance(other, odict):
-            return cmp(self.items(), other.items())
-        elif isinstance(other, dict):
-            return dict.__cmp__(self, other)
-        return NotImplemented
-
-    @classmethod
-    def fromkeys(cls, iterable, default=None):
-        return cls((key, default) for key in iterable)
-
-    def clear(self):
-        del self._keys[:]
-        dict.clear(self)
-
-    def copy(self):
-        return self.__class__(self)
-
-    def items(self):
-        return zip(self._keys, self.values())
-
-    def iteritems(self):
-        return izip(self._keys, self.itervalues())
-
-    def keys(self):
-        return self._keys[:]
-
-    def iterkeys(self):
-        return iter(self._keys)
-
-    def pop(self, key, default=missing):
-        if default is missing:
-            return dict.pop(self, key)
-        elif key not in self:
-            return default
-        self._keys.remove(key)
-        return dict.pop(self, key, default)
-
-    def popitem(self, key):
-        self._keys.remove(key)
-        return dict.popitem(key)
-
-    def setdefault(self, key, default=None):
-        if key not in self:
-            self._keys.append(key)
-        dict.setdefault(self, key, default)
-
-    def update(self, *args, **kwargs):
-        sources = []
-        if len(args) == 1:
-            if hasattr(args[0], 'iteritems'):
-                sources.append(args[0].iteritems())
-            else:
-                sources.append(iter(args[0]))
-        elif args:
-            raise TypeError('expected at most one positional argument')
-        if kwargs:
-            sources.append(kwargs.iteritems())
-        for iterable in sources:
-            for key, val in iterable:
-                self[key] = val
-
-    def values(self):
-        return map(self.get, self._keys)
-
-    def itervalues(self):
-        return imap(self.get, self._keys)
-
-    def index(self, item):
-        return self._keys.index(item)
-
-    def byindex(self, item):
-        key = self._keys[item]
-        return (key, dict.__getitem__(self, key))
-
-    def reverse(self):
-        self._keys.reverse()
-
-    def sort(self, *args, **kwargs):
-        self._keys.sort(*args, **kwargs)
-
-    def __repr__(self):
-        return 'odict.odict(%r)' % self.items()
-
-    __copy__ = copy
-    __iter__ = iterkeys
-
-
-if __name__ == '__main__':
-    import doctest
-    doctest.testmod()
diff --git a/lib/advene/util/slicebuffer.py b/lib/advene/util/slicebuffer.py
index ce4438b..1d9b091 100755
--- a/lib/advene/util/slicebuffer.py
+++ b/lib/advene/util/slicebuffer.py
@@ -2,7 +2,7 @@
 
 """Gstreamer SliceBuffer element
 
-Copyright 2011-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+Copyright 2011-2017 Olivier Aubert <contact at olivieraubert.net>
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -17,7 +17,10 @@ GNU Lesser General Public License for more details.
 You should have received a copy of the GNU Lesser General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
+import logging
+logger = logging.getLogger(__name__)
 
+#FIXME: code not yet converted to gst1.x
 import sys
 
 import gobject
@@ -32,7 +35,7 @@ import cairo
 class SliceBuffer(gst.Element):
     __gtype_name__ = 'SliceBuffer'
     __gstdetails__ = ("Slice buffer", "Filter/Editor/Video", "Buffers slices of data",
-                      "Olivier Aubert <olivier.aubert at liris.cnrs.fr>")
+                      "Olivier Aubert <contact at olivieraubert.net>")
 
     __gproperties__ = {
         'slicewidth':  ( gobject.TYPE_INT, 'slicewidth', 'Width of slices', 0, 65536, 0, gobject.PARAM_WRITABLE ),
@@ -126,11 +129,12 @@ class SliceBuffer(gst.Element):
         elif key.name == 'offset':
             self.offset = value
         else:
-            print "No property %s" % key.name
+            logger.error("No property %s" % key.name)
 
 gst.element_register(SliceBuffer, 'slicebuffer')
 
 if __name__ == '__main__':
+    logging.basicConfig(level=logging.DEBUG)
     mainloop = gobject.MainLoop()
 
     files = [ a for a in sys.argv[1:] if not '=' in a ]
@@ -161,7 +165,7 @@ if __name__ == '__main__':
                 caps = gst.caps_from_string('video/x-raw-rgb,%s' % p)
                 capsfilter.set_property('caps', caps)
             else:
-                slicer.set_property(name, long(value))
+                slicer.set_property(name, int(value))
         player.props.video_sink=bin
     else:
         player = gst.parse_launch('autovideosrc ! ffmpegcolorspace ! videoscale ! slicebuffer %s ! ffmpegcolorspace ! xvimagesink' % " ".join(params))
@@ -172,10 +176,11 @@ if __name__ == '__main__':
 
 
     def on_msg(bus, msg):
-        if msg.structure is None:
+        s = msg.get_structure()
+        if s is None:
             return True
-        if msg.structure.has_field('gerror'):
-            print "MSG", msg.structure['debug']
+        if s.has_field('gerror'):
+            logger.error("MSG %s", msg.structure['debug'])
 
     def on_eos (bus, msg):
         mainloop.quit()
@@ -184,7 +189,7 @@ if __name__ == '__main__':
     bus.connect('message::eos', on_eos)
     bus.connect('message', on_msg)
 
-    print "PLAYING"
+    logger.info("PLAYING")
     pipe.set_state (gst.STATE_PLAYING)
 
     try:
diff --git a/lib/advene/util/snapshotter.py b/lib/advene/util/snapshotter.py
index 07e7542..6953921 100755
--- a/lib/advene/util/snapshotter.py
+++ b/lib/advene/util/snapshotter.py
@@ -1,7 +1,7 @@
 #! /usr/bin/python
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2009-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2009-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -30,102 +30,142 @@ snapshotter.py file://uri/to/movie/file.avi 1200 2400 4600
 This will capture snapshots for the given timestamps (in ms) and save them into /tmp.
 """
 import sys
-import os
 
-import gobject
-import gst
-import gtk
-gtk.gdk.threads_init ()
+import gi
+gi.require_version('Gst', '1.0')
+gi.require_version('GstBase', '1.0')
+from gi.repository import GObject, GLib, GstBase, Gst
+GObject.threads_init()
+Gst.init(None)
 
 from threading import Event, Thread
-import Queue
-from Queue import PriorityQueue
+import queue
 import heapq
+from urllib.parse import unquote
+
+import logging
+logger = logging.getLogger(__name__)
 
 try:
     from evaluator import Evaluator
 except ImportError:
     Evaluator=None
 
-class NotifySink(gst.BaseSink):
+def debug(f):
+    def wrap(*args):
+        logger.warn("%s %s", f.__name__, args)
+        return f(*args)
+    return wrap
+
+class NotifySink(GstBase.BaseSink):
+
+    __gstmetadata__ = ("Notify sink", "Sink", "Notifying sink",
+                       "Olivier Aubert <contact at olivieraubert.net>")
+
     __gsttemplates__ = (
-        gst.PadTemplate("sink",
-                        gst.PAD_SINK,
-                        gst.PAD_ALWAYS,
-                        gst.caps_new_any()),
+        Gst.PadTemplate.new("sink",
+                            Gst.PadDirection.SINK,
+                            Gst.PadPresence.ALWAYS,
+                            Gst.Caps.new_any()),
         )
 
-    __gstdetails__ = ("Notify sink", "Sink", "Notifying sink",
-                      "Olivier Aubert <olivier.aubert at liris.cnrs.fr>")
-
     __gproperties__ = {
-        'notify': ( gobject.TYPE_PYOBJECT, 'notify', 'The notify method', gobject.PARAM_READWRITE ),
+        'notify': ( GObject.TYPE_PYOBJECT, 'notify', 'The notify method', GObject.ParamFlags.READWRITE ),
         }
 
     def __init__(self):
-        gst.BaseSink.__init__(self)
+        GstBase.BaseSink.__init__(self)
         self.set_sync(False)
         self._notify=None
 
-    #def do_render(self, buffer):
-    #    return gst.FLOW_OK
-
     def do_preroll(self, buffer):
+        logger.debug("do_preroll %s", self._notify)
         if self._notify is not None:
-            self._notify(buffer)
-        return gst.FLOW_OK
+            self._notify(self.buffer_as_struct(buffer))
+        return Gst.FlowReturn.OK
 
     def do_set_property(self, key, value):
         if key.name == 'notify':
             self._notify=value
         else:
-            print "No property %s" % key.name
+            logger.info("No property %s" % key.name)
 
     def do_get_property(self, key):
         if key.name == 'notify':
             return self._notify
         else:
-            print "No property %s" % key.name
-gst.element_register(NotifySink, 'notifysink')
-gobject.type_register(NotifySink)
+            logger.info("No property %s" % key.name)
 
-class UniquePriorityQueue(Queue.PriorityQueue):
+    def buffer_as_struct(self, buffer):
+        (res, mapinfo) = buffer.map(Gst.MapFlags.READ)
+        if not res:
+            logger.warn("Error in converting buffer")
+            res = None
+        else:
+            pos = self.query_position(Gst.Format.TIME)[1]
+            res = {
+                'data': bytes(mapinfo.data),
+                'type': 'PNG',
+                'date': pos / Gst.MSECOND,
+                'pts': buffer.pts / Gst.MSECOND,
+                # Hardcoded size values. They are not used
+                # by the application, since they are
+                # encoded in the PNG file anyway.
+                'width': 160,
+                'height': 100 }
+        buffer.unmap(mapinfo)
+        return res
+
+__gstelementfactory__ = ("notifysink", Gst.Rank.NONE, NotifySink)
+def plugin_init(plugin, userarg):
+    NotifySinkType = GObject.type_register(NotifySink)
+    Gst.Element.register(plugin, 'notifysink', 0, NotifySinkType)
+    return True
+
+version = Gst.version()
+reg = Gst.Plugin.register_static_full(version[0], version[1],
+                                      'notify_plugin', 'Notify plugin',
+                                      plugin_init, '1.0', 'Proprietary', 'abc', 'def', 'ghi', None)
+
+class UniquePriorityQueue(queue.PriorityQueue):
     """PriorityQueue with unique elements.
 
     Adapted from http://stackoverflow.com/questions/5997189/how-can-i-make-a-unique-value-priority-queue-in-python
     Thanks to Eli Bendersky.
     """
     def _init(self, maxsize):
-        PriorityQueue._init(self, maxsize)
+        super()._init(maxsize)
         self.values = set()
 
-    def _put(self, item, heappush=heapq.heappush):
+    def _put(self, item):
         if item[1] not in self.values:
             self.values.add(item[1])
-            PriorityQueue._put(self, item, heappush)
+            super()._put(item)
 
     def _get(self, heappop=heapq.heappop):
-        item = PriorityQueue._get(self, heappop)
+        item = super()._get()
         self.values.remove(item[1])
         return item
 
 class Snapshotter(object):
     """Snapshotter class.
 
-    Basic idea: define a "notify" method, which will get a gst.Buffer
-    as parameter. The buffer contains the PNG-encoded snapshot (and
-    its timestamp in buffer.timestamp).
+    Basic idea: define a "notify" method, which will get a dict as
+    parameter. The dict contains the PNG-encoded snapshot ['data']
+    and its timestamp ['date'].
 
     When you need to have a snapshot at a specific timestamp, call
-    s.enqueue class with the timestamp. You notify method will be
+    s.enqueue class with the timestamp. Your notify method will be
     called with the result.
 
     Setup note: the Snapshotter class runs a daemon thread
     continuously waiting for timestamps to process. Thus you should:
-    * call gtk.gdk.threads_init() at the beginning of you application
+    * call GObject.threads_init() at the beginning of you application
     * invoke the "start" method to start the thread.
+
     """
     def __init__(self, notify=None, width=None):
+        self.active = False
         self.notify=notify
         # Snapshot queue handling
         self.timestamp_queue=UniquePriorityQueue()
@@ -135,82 +175,130 @@ class Snapshotter(object):
         self.should_clear = False
 
         # Pipeline building
-        self.videobin=gst.Bin()
+        self.videobin = Gst.Bin()
+        self.videobin.set_name('videosink')
 
-        self.player=gst.element_factory_make("playbin")
+        self.player = Gst.ElementFactory.make("playbin")
 
-        csp=gst.element_factory_make('ffmpegcolorspace')
-        pngenc=gst.element_factory_make('pngenc')
-        queue=gst.element_factory_make('queue')
-        sink=gst.element_factory_make('notifysink')
+        csp = Gst.ElementFactory.make('videoconvert')
+        pngenc = Gst.ElementFactory.make('pngenc')
+        queue = Gst.ElementFactory.make('queue')
+        sink = NotifySink()
+
+        fakesink = Gst.ElementFactory.make('fakesink', 'audiosink')
+        self.player.set_property('audio-sink', fakesink)
 
         if width is not None:
-            filter=gst.element_factory_make("capsfilter")
-            filter.set_property("caps", gst.Caps("video/x-raw-rgb,width=%d,pixel-aspect-ratio=(fraction)1/1" % width))
-            scale=gst.element_factory_make('videoscale')
-            l=(csp, scale, filter, pngenc, queue, sink)
+            caps = Gst.Caps.from_string("video/x-raw,width=%d,pixel-aspect-ratio=(fraction)1/1" % width)
+            filter_ = Gst.ElementFactory.make("capsfilter", "filter")
+            filter_.set_property("caps", caps)
+            scale=Gst.ElementFactory.make('videoscale')
+            l=(csp, scale, filter_, pngenc, queue, sink)
         else:
             l=(csp, pngenc, queue, sink)
 
-        self.videobin.add(*l)
-        gst.element_link_many(*l)
+        for el in l:
+            self.videobin.add(el)
+        for src, dst in zip(l, l[1:]):
+            src.link(dst)
         # Keep a reference on all pipeline elements, so that they are not garbage-collected
         self._elements = l
 
-        self._ghostpad = gst.GhostPad('sink', csp.get_pad('sink'))
+        self._ghostpad = Gst.GhostPad.new('sink', csp.get_static_pad('sink'))
+        self._ghostpad.set_active(True)
         self.videobin.add_pad(self._ghostpad)
 
-        self.player.props.video_sink=self.videobin
+        self.player.set_property('video-sink', self.videobin)
 
         bus=self.player.get_bus()
         bus.enable_sync_message_emission()
         bus.connect('sync-message::element', self.on_bus_message)
+        bus.add_signal_watch()
+        bus.connect('message::error', self.on_bus_message_error)
+        bus.connect('message::warning', self.on_bus_message_warning)
 
         sink.props.notify=self.queue_notify
 
+    def get_uri(self):
+        return self.player.get_property('current-uri')
+
     def set_uri(self, uri):
-        self.player.set_state(gst.STATE_NULL)
-        self.player.props.uri=uri
-        self.player.set_state(gst.STATE_PAUSED)
+        logger.debug("set_uri %s", uri)
+        if uri:
+            self.player.set_state(Gst.State.NULL)
+            self.player.set_property('uri', uri)
+            uri = self.player.get_property('uri')
+            if uri and Gst.uri_is_valid(uri):
+                self.active = True
+            else:
+                self.active = False
+            self.player.set_state(Gst.State.PAUSED)
+            self.enqueue(0)
+        else:
+            self.active = False
+            self.player.set_state(Gst.State.NULL)
 
     def on_bus_message(self, bus, message):
-        if message.structure is None:
+        s = message.get_structure()
+        if s is None:
             return
-        if message.structure.get_name() != 'missing-plugin':
-            print "Bus message::", message.structure.get_name()
+        logger.debug("Bus message::", s.get_name())
+
+    def on_bus_message_error(self, bus, message):
+        s = message.get_structure()
+        if s is None:
+            return True
+        title, message = message.parse_error()
+        logger.error("%s: %s", title, message)
+        return True
+
+    def on_bus_message_warning(self, bus, message):
+        s = message.get_structure()
+        if s is None:
+            return True
+        title, message = message.parse_warning()
+        logger.warn("%s: %s", title, message)
+        return True
 
-    def simple_notify(self, buffer):
+    def simple_notify(self, struct):
         """Basic single-snapshot method.
 
         Used for debugging.
         """
-        t=(buffer.timestamp / gst.MSECOND)
+        if struct is None:
+            logger.warn("Snapshotter: invalid struct")
+            return True
+        logger.info("Timecode %010d - pts %010d" % (struct['date'],
+                                                    struct['pts']))
+        t = struct['date']
         fname='/tmp/%010d.png' % t
-        f=open(fname, 'w')
-        f.write(buffer.data)
+        f=open(fname, 'wb')
+        f.write(struct['data'])
         f.close()
-        print "Snapshot written to", fname
+        logger.info("Snapshot written to" + fname)
         return True
 
     def snapshot(self, t):
         """Set movie time to a specific time.
         """
-        p = long(t * gst.MSECOND)
-        event = gst.event_new_seek(1.0, gst.FORMAT_TIME,
-                                   gst.SEEK_FLAG_FLUSH | gst.SEEK_FLAG_ACCURATE,
-                                   gst.SEEK_TYPE_SET, p,
-                                   gst.SEEK_TYPE_NONE, 0)
-        self.player.set_state(gst.STATE_PAUSED)
-        res = self.player.send_event(event)
+        p = int(t * Gst.MSECOND)
+        logger.debug("Seeking to %d", t)
+        self.player.set_state(Gst.State.PAUSED)
+        res = self.player.seek_simple(Gst.Format.TIME, Gst.SeekFlags.FLUSH | Gst.SeekFlags.ACCURATE, p)
         if not res:
-            print "snapshotter: error when sending event"
+            logger.debug("Snapshotter error when sending event for %d %s. ", t, res)
+            # Enqueue again
+            self.enqueue(t)
         return True
 
     def enqueue(self, *l):
         """Enqueue timestamps to capture.
         """
+        if not self.active:
+            return
         for t in l:
             self.timestamp_queue.put_nowait( (t, t) )
+        logger.debug("----- enqueued elements %s (%d total)", l, self.timestamp_queue.qsize())
         self.snapshot_ready.set()
 
     def process_queue(self):
@@ -220,9 +308,7 @@ class Snapshotter(object):
         """
         self.thread_running=True
         while True:
-            #print "Waiting for event"
             self.snapshot_ready.wait()
-            #print "Getting timestamp"
             if self.should_clear:
                 # Clear the queue
                 self.should_clear = False
@@ -232,12 +318,10 @@ class Snapshotter(object):
                         # there is a producer thread that continuously
                         # adds new elements.
                         self.timestamp_queue.get_nowait()
-                    except Queue.Empty:
+                    except queue.Empty:
                         break
             (t, dummy) = self.timestamp_queue.get()
-            #print "Clearing event"
             self.snapshot_ready.clear()
-            #print "Snapshot", t
             self.snapshot(t)
         return True
 
@@ -248,14 +332,16 @@ class Snapshotter(object):
             self.should_clear = True
         return True
 
-    def queue_notify(self, buffer):
+    def queue_notify(self, struct):
         """Notification method.
 
         It processes the captured buffer and unlocks the
         snapshot_event to process further timestamps.
         """
         if self.notify is not None:
-            self.notify(buffer)
+            # Add media info to the structure
+            struct['media'] = unquote(self.get_uri().replace('file://', ''))
+            self.notify(struct)
         # We are ready to process the next snapshot
         self.snapshot_ready.set()
         return True
@@ -268,12 +354,13 @@ class Snapshotter(object):
         t.start()
 
 if __name__ == '__main__':
+    logging.basicConfig(level=logging.DEBUG)
     try:
         uri=sys.argv[1]
         if uri.startswith('/'):
             uri='file://'+uri
     except IndexError:
-        uri='file:///media/video/Bataille.avi'
+        uri='file:///data/video/Bataille.avi'
 
     s=Snapshotter(width=160)
     s.set_uri(uri)
@@ -282,32 +369,28 @@ if __name__ == '__main__':
 
     if sys.argv[2:]:
         # Timestamps have been specified. Non-interactive version.
-        s.enqueue( *(long(t) for t in sys.argv[2:]) )
+        s.enqueue( *(int(t) for t in sys.argv[2:]) )
 
-        loop=gobject.MainLoop()
+        loop=GObject.MainLoop()
         def wait_for_completion():
             if s.timestamp_queue.empty():
                 # Quit application
                 s.snapshot_ready.wait()
                 loop.quit()
             return True
-        gobject.idle_add(wait_for_completion)
+        GLib.idle_add(wait_for_completion)
         loop.run()
     else:
         if Evaluator is None:
-            print "Missing evaluator module.\nFetch it from http://svn.gna.org/viewcvs/advene/trunk/lib/advene/gui/evaluator.py."
+            logger.warn("Missing evaluator module.\nFetch it from the repository")
             sys.exit(0)
 
         # Adding the following lines breaks the code, with a warning:
         #    sys:1: Warning: cannot register existing type `GstSelectorPad'
         #    sys:1: Warning: g_object_new: assertion `G_TYPE_IS_OBJECT (object_type)' failed
-        #pipe=gst.parse_launch('playbin uri=file:///media/video/Bataille.avi')
-        #pipe.set_state(gst.STATE_PLAYING)
+        #pipe=Gst.parse_launch('playbin uri=file:///media/video/Bataille.avi')
+        #pipe.set_state(Gst.State.PLAYING)
 
         ev=Evaluator(globals_=globals(), locals_=locals())
-        ev.locals_['self']=ev
-        window=ev.popup(embedded=False)
         ev.set_expression('s.enqueue(12000, 24000, 36000)')
-        window.connect ("destroy", lambda e: gtk.main_quit())
-
-        gtk.main()
+        ev.run()
diff --git a/lib/advene/util/spawn.py b/lib/advene/util/spawn.py
index 4553c83..419ce66 100644
--- a/lib/advene/util/spawn.py
+++ b/lib/advene/util/spawn.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -18,10 +18,11 @@
 #
 """Process Launcher module.
 """
+import logging
+logger = logging.getLogger(__name__)
 
 import os
 import signal
-import threading
 
 class ProcessLauncher:
     """Process launcher class.
@@ -76,20 +77,19 @@ class ProcessLauncher:
         """Private method used to launch the program."""
         args = (self.program_name, )+ tuple([str(i) for i in self.args])
         # FIXME: we should close all existing sockets
-        #print "Launching %s with %s" % (self.program_path, args)
+        logger.debug("Launching %s with %s", self.program_path, args)
         self.pid = os.spawnv (os.P_NOWAIT, self.program_path, tuple(args))
         try:
             signal.signal(signal.SIGCHLD, self.sigchld)
         except ValueError:
+            logger.warn("Strange ValueError", exc_info=True)
             # FIXME: we should investigate this rather than ignore it.
             pass
-        #os.waitpid (self.pid, 0)
-        #print "After waitpid"
         return True
 
     def sigchld(self, sig, stack_frame):
         (pid, status)=os.wait()
-        print "Caught child %d" % pid
+        logger.warn("Caught child %d", pid)
         return True
 
     def start (self, args=None):
@@ -125,6 +125,7 @@ class ProcessLauncher:
             return self.thread.isAlive()
 
 if __name__ == '__main__':
+    logging.basicConfig(level=logging.DEBUG)
     args = ('10', )
     l = ProcessLauncher ('sleep', args=args)
-    print "l = Launcher(%s)" % l.program_name
+    logger.info("l = Launcher(%s)", l.program_name)
diff --git a/lib/advene/util/svgoverlay.py b/lib/advene/util/svgoverlay.py
deleted file mode 100755
index ca25608..0000000
--- a/lib/advene/util/svgoverlay.py
+++ /dev/null
@@ -1,213 +0,0 @@
-#! /usr/bin/python
-
-"""Gstreamer SVGOverlay element
-
-Copyright 2009-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation, either version 2.1 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-"""
-
-import sys
-import os
-
-import gobject
-gobject.threads_init()
-
-import pygst
-pygst.require('0.10')
-import gst
-
-import cairo
-
-try:
-    import rsvg
-    print "Native RSVG support"
-except ImportError:
-    import advene.util.ctypesrsvg as rsvg
-
-class SVGOverlay(gst.Element):
-    __gtype_name__ = 'SVGOverlay'
-    __gstdetails__ = ("SVG overlay", "Filter/Editor/Video", "Overlays SVG content over the video",
-                      "Olivier Aubert <olivier.aubert at liris.cnrs.fr>")
-
-    __gproperties__ = {
-        'data': ( gobject.TYPE_STRING, 'data', 'SVG data to overlay', None, gobject.PARAM_WRITABLE ),
-        'location': ( gobject.TYPE_STRING, 'location', 'SVG file to overlay', None, gobject.PARAM_WRITABLE ),
-        }
-
-    _sinkpadtemplate = gst.PadTemplate ("sink",
-                                         gst.PAD_SINK,
-                                         gst.PAD_ALWAYS,
-                                         gst.caps_from_string ("video/x-raw-rgb,bpp=32,depth=32,blue_mask=-16777216,green_mask=16711680, red_mask=65280, alpha_mask=255,width=[ 1, 2147483647 ],height=[ 1, 2147483647 ],framerate=[ 0/1, 2147483647/1 ]"))
-    _srcpadtemplate = gst.PadTemplate ("src",
-                                         gst.PAD_SRC,
-                                         gst.PAD_ALWAYS,
-                                         gst.caps_from_string ("video/x-raw-rgb,bpp=32,depth=32,blue_mask=-16777216,green_mask=16711680, red_mask=65280, alpha_mask=255,width=[ 1, 2147483647 ],height=[ 1, 2147483647 ],framerate=[ 0/1, 2147483647/1 ]"))
-
-    def __init__(self):
-        gst.Element.__init__(self)
-
-        self.svg = None
-
-        self.sinkpad = gst.Pad(self._sinkpadtemplate, "sink")
-        self.sinkpad.set_chain_function(self.chainfunc)
-        self.sinkpad.set_event_function(self.eventfunc)
-        self.sinkpad.set_getcaps_function(gst.Pad.proxy_getcaps)
-        self.sinkpad.set_setcaps_function(gst.Pad.proxy_setcaps)
-        self.add_pad (self.sinkpad)
-
-        self.srcpad = gst.Pad(self._srcpadtemplate, "src")
-        self.srcpad.set_event_function(self.srceventfunc)
-        self.srcpad.set_query_function(self.srcqueryfunc)
-        self.srcpad.set_getcaps_function(gst.Pad.proxy_getcaps)
-        self.srcpad.set_setcaps_function(gst.Pad.proxy_setcaps)
-        self.add_pad (self.srcpad)
-
-    def chainfunc(self, pad, buffer):
-        if self.svg is None:
-            return self.srcpad.push(buffer)
-
-        try:
-            outbuf = buffer.copy_on_write ()
-            self.draw_on(outbuf)
-            return self.srcpad.push(outbuf)
-        except:
-            return gst.GST_FLOW_ERROR
-
-    def eventfunc(self, pad, event):
-        return self.srcpad.push_event (event)
-
-    def srcqueryfunc (self, pad, query):
-        return self.sinkpad.query (query)
-
-    def srceventfunc (self, pad, event):
-        return self.sinkpad.push_event (event)
-
-    def do_change_state(self, transition):
-        #if transition in [gst.STATE_CHANGE_READY_TO_PAUSED, gst.STATE_CHANGE_PAUSED_TO_READY]:
-        #    self._reset()
-        return gst.Element.do_change_state(self, transition)
-
-    def do_set_property(self, key, value):
-        if key.name == 'data':
-            self.set_svg(data=value)
-        elif key.name == 'location':
-            self.set_svg(filename=value)
-        else:
-            print "No property %s" % key.name
-
-    def set_svg(self, filename=None, data=None):
-        """Set the SVG data to render.
-
-        Use None to reset.
-        """
-        if data is not None:
-            self.svg=rsvg.Handle(data=data)
-        elif filename is not None:
-            self.svg=rsvg.Handle(filename)
-        else:
-            self.svg=None
-
-    def draw_on(self, buf):
-        if self.svg is None:
-            return
-
-        try:
-            caps = buf.get_caps()
-            width = caps[0]['width']
-            height = caps[0]['height']
-            surface = cairo.ImageSurface.create_for_data (buf, cairo.FORMAT_ARGB32, width, height, 4 * width)
-            ctx = cairo.Context(surface)
-        except:
-            print "Failed to create cairo surface for buffer"
-            import traceback
-            traceback.print_exc()
-            return
-
-        dim = self.svg.get_dimension_data()
-        scale = cairo.Matrix( 1.0 * width / dim[0], 0, 0, 1.0 * height / dim[1], 0, 0 )
-        ctx.set_matrix(scale)
-        self.svg.render_cairo(ctx)
-
-gst.element_register(SVGOverlay, 'pysvgoverlay')
-
-if __name__ == '__main__':
-    mainloop = gobject.MainLoop()
-
-    if sys.argv[1:]:
-        player=gst.element_factory_make('playbin')
-        player.props.uri = 'file://' + sys.argv[1]
-
-        bin=gst.Bin()
-        elements = [
-            gst.element_factory_make('textoverlay'),
-            gst.element_factory_make('queue'),
-            gst.element_factory_make('ffmpegcolorspace'),
-            gst.element_factory_make('videoscale'),
-            gst.element_factory_make('pysvgoverlay', 'overlay'),
-            gst.element_factory_make('ffmpegcolorspace'),
-            gst.element_factory_make('xvimagesink'),
-            ]
-        bin.add(*elements)
-        gst.element_link_many(*elements)
-        bin.add_pad(gst.GhostPad('sink', elements[0].get_pad('video_sink') or elements[0].get_pad('sink')))
-
-        player.props.video_sink=bin
-    else:
-        player = gst.parse_launch('videotestsrc ! ffmpegcolorspace ! videoscale ! pysvgoverlay name=overlay ! ffmpegcolorspace ! autovideosink')
-        bin = player
-
-    pipe=player
-    overlay=bin.get_by_name('overlay')
-
-    def on_eos (bus, msg):
-        mainloop.quit()
-    bus = pipe.get_bus()
-    bus.add_signal_watch()
-    bus.connect('message::eos', on_eos)
-
-    pipe.set_state (gst.STATE_PLAYING)
-
-    import time
-    def display():
-        t=time.localtime()
-        overlay.props.data='''<svg:svg height="160pt" preserveAspectRatio="xMinYMin meet" version="1" viewBox="0 0 200 160" width="200pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:tal="foobar">
-  <a title="nom=armee anglaise" xlink:href="http://localhost:1234/packages/Bataille/annotations/a9">
-    <svg:circle cx="99" cy="73" fill="none" name="Circle([61, 44], [116, 99])" r="%d" stroke="red" style="stroke-width:2" />
-  </a><svg:ellipse cx="72" cy="108" fill="none" name="" rx="55" ry="19" stroke="green" style="stroke-width:2" />
-  <svg:ellipse tal:test="foo" cx="158" cy="109" fill="none" name="Ellipse([62, 81], [117, 121])" rx="27" ry="20" stroke="red" style="stroke-width:2" />
-  <rect x='3' y='10' width="50" height="12" fill="black" stroke="white" />
-  <text x='5' y='20' fill="white" font-size="10" stroke="white" font-family="sans">
-%s
-  </text>
-
-</svg:svg>''' % (t[5], time.strftime("%H:%M:%S", t))
-##        overlay.props.data='''<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-##<svg height="800" version="1.0" width="600" x="0" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" y="0">
-##  <rect x='50' y='290' width='230' height='60' fill='black' stroke='black' />
-##  <text x='55' y='335' fill="white" font-size="48" stroke="white" font-family="sans-serif">
-##%s
-##  </text>
-##</svg>
-##''' % time.strftime("%H:%M:%S", time.localtime())
-        return True
-
-    gobject.timeout_add(1000, display)
-    try:
-        mainloop.run()
-    except:
-        pass
-
-    pipe.set_state (gst.STATE_NULL)
-    pipe.get_state (gst.CLOCK_TIME_NONE)
diff --git a/lib/advene/util/website_export.py b/lib/advene/util/website_export.py
index 39ff6ed..81c1607 100644
--- a/lib/advene/util/website_export.py
+++ b/lib/advene/util/website_export.py
@@ -1,6 +1,6 @@
 #
 # Advene: Annotate Digital Videos, Exchange on the NEt
-# Copyright (C) 2008-2012 Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+# Copyright (C) 2008-2017 Olivier Aubert <contact at olivieraubert.net>
 #
 # Advene is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,13 +16,15 @@
 # along with Advene; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
+import logging
+logger = logging.getLogger(__name__)
 
 from gettext import gettext as _
 
 import os
 import time
 import re
-import urllib
+import urllib.request, urllib.parse, urllib.error
 import mimetypes
 import shutil
 
@@ -112,8 +114,8 @@ class WebsiteExporter(object):
 
     def unconverted(self, url, reason):
         return 'unconverted.html?url=%s&reason=%s' % (
-            urllib.quote(url),
-            urllib.quote_plus(reason))
+            urllib.parse.quote(url),
+            urllib.parse.quote_plus(reason))
 
     def get_contents(self, url):
         """Return the contents of the given view.
@@ -141,19 +143,18 @@ class WebsiteExporter(object):
         ctx=self.controller.build_context()
         try:
             content=ctx.evaluateValue('here/%s' % address)
-        except Exception, e:
-            print "Exception when evaluating", address
-            print unicode(e).encode('utf-8')
+        except Exception:
+            logger.error("Exception when evaluating %s", address, exc_info=True)
             content=None
 
-        if not isinstance(content, basestring):
+        if not isinstance(content, str):
             # Not a string. Could be an Advene element
             try:
                 c=content.view(context=self.controller.build_context(here=content))
                 content=c
             except AttributeError:
                 # Apparently not. Fallback on explicit string conversion.
-                content=unicode(content)
+                content=str(content)
         return content
 
     def translate_links(self, content, baseurl=None, max_depth_exceeded=False):
@@ -338,7 +339,7 @@ class WebsiteExporter(object):
                 fragment=None
                 tr=self.url_translation.get(link)
             if tr is None:
-                print "website export bug: %s was not translated" % link
+                logger.error("website export bug: %s was not translated", link)
                 continue
             if link != tr:
                 extra=[]
@@ -367,7 +368,7 @@ class WebsiteExporter(object):
         """
         # Write the content.
         output=self.url_translation[url]
-        f=open(os.path.join(self.destination, output), 'w')
+        f=open(os.path.join(self.destination, output), 'w', encoding='utf-8')
         f.write(content)
         f.close()
 
@@ -376,29 +377,27 @@ class WebsiteExporter(object):
             # FIXME: not robust wrt. multiple packages/videos
             if not os.path.isdir(self.imgdir):
                 helper.recursive_mkdir(self.imgdir)
-            f=open(os.path.join(self.imgdir, '%s.png' % t), 'wb')
-            f.write(str(self.controller.package.imagecache[t]))
-            f.close()
+            with open(os.path.join(self.imgdir, '%s.png' % t), 'wb') as f:
+                f.write(bytes(self.controller.package.imagecache[t]))
 
         # Copy overlays
         for (ident, tales) in used_overlays:
             # FIXME: not robust wrt. multiple packages/videos
             a=self.controller.package.get_element_by_id(ident)
             if not a:
-                print "Cannot find annotation %s for overlaying"
+                logger.error("Cannot find annotation %s for overlaying", ident)
                 continue
             name=ident+tales.replace('/', '_')
             if not os.path.isdir(self.imgdir):
                 helper.recursive_mkdir(self.imgdir)
-            f=open(os.path.join(self.imgdir, 'overlay_%s.png' % name), 'wb')
-            if tales:
-                # There is a TALES expression
-                ctx=self.controller.build_context(here=a)
-                data=ctx.evaluateValue('here' + tales)
-            else:
-                data=a.content.data
-            f.write(str(self.controller.gui.overlay(self.controller.package.imagecache[a.fragment.begin], data)))
-            f.close()
+            with open(os.path.join(self.imgdir, 'overlay_%s.png' % name), 'wb') as f:
+                if tales:
+                    # There is a TALES expression
+                    ctx=self.controller.build_context(here=a)
+                    data=ctx.evaluateValue('here' + tales)
+                else:
+                    data=a.content.data
+                f.write(self.controller.gui.overlay(self.controller.package.imagecache[a.fragment.begin], data))
 
         # Copy resources
         for path in used_resources:
@@ -411,9 +410,11 @@ class WebsiteExporter(object):
             r=self.controller.package.resources
             for element in path.split('/'):
                 r=r[element]
-            output=open(dest, 'wb')
-            output.write(r.data)
-            output.close()
+            with open(dest, 'wb') as output:
+                data = r.data
+                if isinstance(data, str):
+                    data = data.encode('utf-8')
+                output.write(data)
 
     def website_export(self):
         main_step=1.0/self.max_depth
@@ -443,7 +444,7 @@ class WebsiteExporter(object):
         progress=.01
         depth=1
 
-        links_to_be_processed=view_url.values()
+        links_to_be_processed=list(view_url.values())
 
         while depth <= self.max_depth:
             max_depth_exceeded = (depth == self.max_depth)
@@ -501,9 +502,9 @@ class WebsiteExporter(object):
 
         # Generate a default index.html
         name="index.html"
-        if name in self.url_translation.values():
+        if name in list(self.url_translation.values()):
             name="_index.html"
-        f=open(os.path.join(self.destination, name), 'w')
+        f=open(os.path.join(self.destination, name), 'w', encoding='utf-8')
         defaultview=self.controller.package.getMetaData(config.data.namespace, 'default_utbv')
         v=self.controller.package.views.get_by_id(defaultview)
         if defaultview and v:
@@ -527,9 +528,9 @@ class WebsiteExporter(object):
         f.close()
 
         frame="frame.html"
-        if frame in self.url_translation.values():
+        if frame in list(self.url_translation.values()):
             frame="_frame.html"
-        f=open(os.path.join(self.destination, frame), 'w')
+        f=open(os.path.join(self.destination, frame), 'w', encoding='utf-8')
         f.write("""<html>
 <head><title>%(title)s</title></head>
 <frameset cols="70%%,30%%">
@@ -543,7 +544,7 @@ class WebsiteExporter(object):
                 })
         f.close()
 
-        f=open(os.path.join(self.destination, "unconverted.html"), 'w')
+        f=open(os.path.join(self.destination, "unconverted.html"), 'w', encoding='utf-8')
         f.write("""<html><head>%(title)s - not converted</head>
 <body>
 <h1>%(title)s - not converted resource</h1>
@@ -632,7 +633,7 @@ class GoogleVideoPlayer(VideoPlayer):
         """Return the URL to play video at the given time.
         """
         # Format: HH:MM:SS.mmm
-        return '%s#%s' % (self.video_url, time.strftime("%Hh%Mm%Ss", time.gmtime(long(begin) / 1000)))
+        return '%s#%s' % (self.video_url, time.strftime("%Hh%Mm%Ss", time.gmtime(int(begin) / 1000)))
 
     def fix_link(self, link):
         """
@@ -672,7 +673,7 @@ class YoutubeVideoPlayer(VideoPlayer):
         """Return the URL to play video at the given time.
         """
         # Format: HHhMMmSSs
-        return '%s#t=%s' % (self.video_url, time.strftime("%Hh%Mm%Ss", time.gmtime(long(begin) / 1000)))
+        return '%s#t=%s' % (self.video_url, time.strftime("%Hh%Mm%Ss", time.gmtime(int(begin) / 1000)))
 
     def fix_link(self, link):
         """
@@ -735,7 +736,7 @@ class HTML5VideoPlayer(VideoPlayer):
 
         # Note: Firefox does not seem to like <link href=... /> style
         # of closing tags. Use the explicit end tag.
-        jsinject=u'''
+        jsinject='''
 <link type="text/css" href="./resources/HTML5/theme/jqueryui.css" rel="stylesheet"></link>
 <link href="./resources/HTML5/style.css" rel="stylesheet" type="text/css"></link>
 
@@ -747,7 +748,7 @@ class HTML5VideoPlayer(VideoPlayer):
         $(document).advene();
     });
 </script>
-''' % { 'video_url': unicode(self.video_url) }
+''' % { 'video_url': str(self.video_url) }
         head_re = re.compile('<head>', re.IGNORECASE)
         if head_re.findall(content):
             content = head_re.sub('''<head>%s''' % jsinject, content)
diff --git a/mac/Advene.icns b/mac/Advene.icns
deleted file mode 100644
index f5ac5cc..0000000
Binary files a/mac/Advene.icns and /dev/null differ
diff --git a/mac/Advene.wrapper b/mac/Advene.wrapper
deleted file mode 100755
index 0920863..0000000
--- a/mac/Advene.wrapper
+++ /dev/null
@@ -1,41 +0,0 @@
-#! /bin/sh
-
-#exec > /tmp/advene.log 2>&1
-
-d=`dirname "$0"`
-parent=`dirname "$d"`
-# Ensure that we get an absolute path
-parent=`(cd "$parent" ; pwd)`
-
-echo "Advene.app started at "  `date` " on " `uname -a`
-
-if [ -x /opt/local/lib/libgstreamer-0.10.0.dylib ]
-then
-   osascript -e 'tell application "Finder" to display dialog "You have installed gstreamer from macports.org.\nThis may conflict with the executable you are trying to run. If the application crashes, you may either disable darwinports (sudo chmod 0 /opt) or try to run Advene from the sources."'
-fi
-
-osx_version=`sw_vers -productVersion`
-case ${osx_version} in
-10.4*)
-      X11APP=/Applications/Utilities/X11.app
-      if [ ! -x $X11APP ]
-      then
-         osascript -e 'tell application "Finder" to display dialog "No X11 server found. Please install it from the MacOS X install disc, package System/Installation/Packages/X11User.pkg"'
-         exit 0
-      fi
-
-      if [ ! -e /tmp/.X11-unix/* ]
-      then
-         osascript -e 'tell application "Finder" to display dialog "Please start the X11 server (from /Applications/Utilities) before trying to run Advene"'
-         exit 0
-      fi
-
-      # Set DISPLAY variable for 10.4 only. In 10.5, the X server is automatically launched.
-      export DISPLAY=:0.0
-      ;;
-esac
-
-theme="${parent}/Resources/theme"
-[ -e "$theme" ] && export GTK2_RC_FILES="${theme}/gtk-2.0/gtkrc"
-
-exec ${d}/Advene.bin $@
diff --git a/mac/Cillop/LICENSE b/mac/Cillop/LICENSE
deleted file mode 100644
index 5b6e7c6..0000000
--- a/mac/Cillop/LICENSE
+++ /dev/null
@@ -1,340 +0,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/mac/Cillop/gtk-2.0/arrow-down-ins.png b/mac/Cillop/gtk-2.0/arrow-down-ins.png
deleted file mode 100644
index a85e48c..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-down-ins.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow-down-pre.png b/mac/Cillop/gtk-2.0/arrow-down-pre.png
deleted file mode 100644
index 0ce6b11..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-down-pre.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow-down.png b/mac/Cillop/gtk-2.0/arrow-down.png
deleted file mode 100644
index d9a7cd7..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-down.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow-left-ins.png b/mac/Cillop/gtk-2.0/arrow-left-ins.png
deleted file mode 100644
index da6c6e7..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-left-ins.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow-left-pre.png b/mac/Cillop/gtk-2.0/arrow-left-pre.png
deleted file mode 100644
index 978cd91..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-left-pre.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow-left.png b/mac/Cillop/gtk-2.0/arrow-left.png
deleted file mode 100644
index db058ab..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-left.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow-pre.svg b/mac/Cillop/gtk-2.0/arrow-pre.svg
deleted file mode 100644
index 658dc14..0000000
--- a/mac/Cillop/gtk-2.0/arrow-pre.svg
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16px"
-   height="16px"
-   id="svg4837"
-   sodipodi:version="0.32"
-   inkscape:version="0.45"
-   inkscape:export-filename="/home/emrah/.themes/Cillop-2/gtk-2.0/arrow-left-pre.png"
-   inkscape:export-xdpi="101.25"
-   inkscape:export-ydpi="101.25"
-   sodipodi:docname="arrow-pre.svg"
-   sodipodi:docbase="/home/emrah/.themes/Cillop-2/gtk-2.0"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   sodipodi:modified="TRUE">
-  <defs
-     id="defs4839">
-    <filter
-       inkscape:collect="always"
-       id="filter5864">
-      <feGaussianBlur
-         inkscape:collect="always"
-         stdDeviation="0.28425268"
-         id="feGaussianBlur5866" />
-    </filter>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="920"
-     inkscape:window-height="658"
-     inkscape:window-x="106"
-     inkscape:window-y="158" />
-  <metadata
-     id="metadata4842">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <g
-       id="g5892"
-       transform="matrix(0,1,-1,0,16.022526,-2.2525707e-2)">
-      <path
-         transform="matrix(-1.1058064,0,0,-1,16.868977,16)"
-         style="opacity:1;fill:#8296af;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.49938306;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51953125;filter:url(#filter5864)"
-         d="M 12.044843,11 L 8.4991505,5.3370109 C 8.2264333,4.9255196 7.8357389,4.8887617 7.6041217,5.238238 C 7.6041217,5.238238 3.9619867,10.81816 3.9551575,11 L 12.044843,11 z "
-         id="path4885"
-         sodipodi:nodetypes="ccccc"
-         inkscape:export-xdpi="101.25"
-         inkscape:export-ydpi="101.25" />
-      <path
-         inkscape:export-ydpi="101.25"
-         inkscape:export-xdpi="101.25"
-         sodipodi:nodetypes="ccccc"
-         id="rect4845"
-         d="M 5.016085,5.753461 L 7.671263,9.9941693 C 7.8754863,10.302313 8.1680563,10.329839 8.341502,10.068135 C 8.341502,10.068135 11.068901,5.889631 11.074015,5.753461 L 5.016085,5.753461 z "
-         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.4079119;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51953125" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/arrow-right-ins.png b/mac/Cillop/gtk-2.0/arrow-right-ins.png
deleted file mode 100644
index ec4f250..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-right-ins.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow-right-pre.png b/mac/Cillop/gtk-2.0/arrow-right-pre.png
deleted file mode 100644
index ebbdfbb..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-right-pre.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow-right.png b/mac/Cillop/gtk-2.0/arrow-right.png
deleted file mode 100644
index 68c295a..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-right.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow-rleft-ins.png b/mac/Cillop/gtk-2.0/arrow-rleft-ins.png
deleted file mode 100644
index da6c6e7..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-rleft-ins.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow-up-ins.png b/mac/Cillop/gtk-2.0/arrow-up-ins.png
deleted file mode 100644
index 740bf9c..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-up-ins.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow-up-pre.png b/mac/Cillop/gtk-2.0/arrow-up-pre.png
deleted file mode 100644
index 4983e11..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-up-pre.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow-up.png b/mac/Cillop/gtk-2.0/arrow-up.png
deleted file mode 100644
index 536b960..0000000
Binary files a/mac/Cillop/gtk-2.0/arrow-up.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/arrow.svg b/mac/Cillop/gtk-2.0/arrow.svg
deleted file mode 100644
index d97fe64..0000000
--- a/mac/Cillop/gtk-2.0/arrow.svg
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16px"
-   height="16px"
-   id="svg4837"
-   sodipodi:version="0.32"
-   inkscape:version="0.45"
-   inkscape:export-filename="/home/emrah/.themes/Cillop-2/gtk-2.0/arrow-up.png"
-   inkscape:export-xdpi="101.25"
-   inkscape:export-ydpi="101.25"
-   sodipodi:docname="arrow.svg"
-   sodipodi:docbase="/home/emrah/.themes/Cillop-2/gtk-2.0"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   sodipodi:modified="TRUE">
-  <defs
-     id="defs4839" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="920"
-     inkscape:window-height="658"
-     inkscape:window-x="76"
-     inkscape:window-y="147" />
-  <metadata
-     id="metadata4842">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <path
-       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.4079119;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.51953125"
-       d="M 11.028965,10.246539 L 8.373787,6.0058307 C 8.1695637,5.697687 7.8769937,5.670161 7.703548,5.931865 C 7.703548,5.931865 4.976149,10.110369 4.971035,10.246539 L 11.028965,10.246539 z "
-       id="rect4845"
-       sodipodi:nodetypes="ccccc"
-       inkscape:export-xdpi="101.25"
-       inkscape:export-ydpi="101.25" />
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/bg.png b/mac/Cillop/gtk-2.0/bg.png
deleted file mode 100644
index c7e7590..0000000
Binary files a/mac/Cillop/gtk-2.0/bg.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/button-default.png b/mac/Cillop/gtk-2.0/button-default.png
deleted file mode 100644
index 6711b0b..0000000
Binary files a/mac/Cillop/gtk-2.0/button-default.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/button-default.svg b/mac/Cillop/gtk-2.0/button-default.svg
deleted file mode 100644
index ef2edc2..0000000
--- a/mac/Cillop/gtk-2.0/button-default.svg
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="36"
-   height="36"
-   id="svg1872"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/Desktop/Cillop-Mediterranean/gtk-2.0"
-   sodipodi:docname="button-default.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   inkscape:export-filename="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0/button-default.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90"
-   version="1.0">
-  <defs
-     id="defs1874">
-    <filter
-       inkscape:collect="always"
-       id="filter5818">
-      <feGaussianBlur
-         inkscape:collect="always"
-         stdDeviation="1.2025014"
-         id="feGaussianBlur5820" />
-    </filter>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="14.78125"
-     inkscape:cx="20.9115"
-     inkscape:cy="16.525099"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1024"
-     inkscape:window-height="714"
-     inkscape:window-x="0"
-     inkscape:window-y="29" />
-  <metadata
-     id="metadata1877">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <rect
-       ry="2.7852964"
-       rx="2.7852964"
-       y="0.96874326"
-       x="0.96874332"
-       height="30.062511"
-       width="30.062513"
-       id="rect2778"
-       style="opacity:1;fill:#6889a6;fill-opacity:1;stroke:none;stroke-width:1.93748653;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter5818)"
-       transform="matrix(1.1309766,0,0,1.0644486,-9.5626027e-2,0.9688226)" />
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/button-insensitive.svg b/mac/Cillop/gtk-2.0/button-insensitive.svg
deleted file mode 100644
index bc98dbd..0000000
--- a/mac/Cillop/gtk-2.0/button-insensitive.svg
+++ /dev/null
@@ -1,225 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="32px"
-   height="32px"
-   id="svg1872"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="button-insensitive.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   inkscape:export-filename="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0/button-normal.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="14.78125"
-     inkscape:cx="20.9115"
-     inkscape:cy="13.669618"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1024"
-     inkscape:window-height="714"
-     inkscape:window-x="0"
-     inkscape:window-y="29" />
-  <defs
-     id="defs1874">
-    <linearGradient
-       id="linearGradient3699">
-      <stop
-         offset="0"
-         id="stop3701"
-         style="stop-color:#ffffff;stop-opacity:0.86274511;" />
-      <stop
-         offset="1"
-         id="stop3703"
-         style="stop-color:#ffffff;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2798">
-      <stop
-         offset="0"
-         id="stop2800"
-         style="stop-color:white;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop2802"
-         style="stop-color:white;stop-opacity:0.1375" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2788">
-      <stop
-         offset="0"
-         id="stop2790"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop2783"
-         style="stop-color:#c4cf9e;stop-opacity:1;" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       id="radialGradient2404"
-       r="14.0625"
-       gradientTransform="matrix(1.6911078,0,0,0.9270546,-11.057726,1.1649887)"
-       cx="16"
-       cy="0.48806855"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient3699"
-       fy="0.48806855"
-       fx="16" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2407"
-       x1="28.094524"
-       y1="27.046463"
-       gradientTransform="matrix(0.9633036,0,0,0.9311933,1.0687977,1.0987694)"
-       x2="22.080519"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient2798"
-       y2="3.8279345" />
-    <radialGradient
-       inkscape:collect="always"
-       id="radialGradient2410"
-       r="16"
-       gradientTransform="matrix(1.4257733,0,0,0.9713742,-6.4588664,-1.726213)"
-       cx="15.285574"
-       cy="33.370087"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient2788"
-       fy="33.370087"
-       fx="15.285574" />
-    <radialGradient
-       inkscape:collect="always"
-       id="radialGradient2410-268"
-       r="16"
-       gradientTransform="matrix(1.4257733,0,0,0.9713742,-6.4588664,-1.726213)"
-       cx="15.285574"
-       cy="33.370087"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient2788-379"
-       fy="33.370087"
-       fx="15.285574" />
-    <linearGradient
-       id="linearGradient2788-379">
-      <stop
-         offset="0"
-         id="stop2195"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop2197"
-         style="stop-color:#c6c6c6;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2407-170"
-       y2="3.8279345"
-       y1="27.046463"
-       gradientTransform="matrix(0.9633036,0,0,0.9311933,1.0687977,1.0987694)"
-       x2="22.080519"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient2798-995"
-       x1="28.094524" />
-    <linearGradient
-       id="linearGradient2798-995">
-      <stop
-         offset="0"
-         id="stop2201"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop2203"
-         style="stop-color:#ffffff;stop-opacity:0.1375" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       id="radialGradient2404-832"
-       r="14.0625"
-       gradientTransform="matrix(1.6911078,0,0,0.9270546,-11.057726,1.1649887)"
-       cx="16"
-       cy="0.48806855"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient3699-438"
-       fy="0.48806855"
-       fx="16" />
-    <linearGradient
-       id="linearGradient3699-438">
-      <stop
-         offset="0"
-         id="stop2207"
-         style="stop-color:#ffffff;stop-opacity:0.86274511;" />
-      <stop
-         offset="1"
-         id="stop2209"
-         style="stop-color:#ffffff;stop-opacity:0;" />
-    </linearGradient>
-  </defs>
-  <metadata
-     id="metadata1877">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <g
-       id="g2173">
-      <rect
-         id="rect2203"
-         x="1.6902257"
-         y="2.6385322"
-         width="28.619549"
-         height="26.722933"
-         ry="1.2525004"
-         rx="1.3183649"
-         style="opacity:0.8;fill:#ededed;fill-opacity:1;stroke:#ffffff;stroke-width:1.27706504;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <rect
-         id="rect1880"
-         x="1.5370671"
-         y="2.4661219"
-         width="28.925865"
-         height="27.063478"
-         ry="2.0389581"
-         rx="2.6329918"
-         style="opacity:0.5;fill:url(#radialGradient2410-268);fill-opacity:1;stroke:#767676;stroke-width:0.93462706;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         d="M 2.0321011,28.103374 L 2.210298,3.3391456 L 29.967899,3.3391456 C 29.967899,28.417649 2.0321011,3.3591153 2.0321011,28.103374 z "
-         id="path2796"
-         style="opacity:0.5;fill:url(#linearGradient2407-170);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         sodipodi:nodetypes="cccc" />
-      <rect
-         id="rect2812"
-         x="2.5230951"
-         y="3.4521499"
-         width="26.95381"
-         height="25.091421"
-         ry="1.2801028"
-         rx="1.2766985"
-         style="opacity:0.5;fill:none;fill-opacity:1;stroke:url(#radialGradient2404-832);stroke-width:1.05212986;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/button-normal.svg b/mac/Cillop/gtk-2.0/button-normal.svg
deleted file mode 100644
index 03ad38d..0000000
--- a/mac/Cillop/gtk-2.0/button-normal.svg
+++ /dev/null
@@ -1,178 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="32px"
-   height="32px"
-   id="svg1872"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="button-normal.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   inkscape:export-filename="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0/button-normal.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs1874">
-    <linearGradient
-       id="linearGradient3804">
-      <stop
-         id="stop3806"
-         offset="0"
-         style="stop-color:#000000;stop-opacity:0.08627451;" />
-      <stop
-         id="stop3808"
-         offset="1"
-         style="stop-color:#ffffff;stop-opacity:0.39215687;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3699">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0.86274511;"
-         offset="0"
-         id="stop3701" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="1"
-         id="stop3703" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2798">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop2800" />
-      <stop
-         style="stop-color:white;stop-opacity:0.1375"
-         offset="1"
-         id="stop2802" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2788">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop2790" />
-      <stop
-         id="stop2783"
-         offset="1"
-         style="stop-color:#c9cccc;stop-opacity:1;" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3699"
-       id="radialGradient3150"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.6988924,0,0,0.9313219,-11.182277,1.0988487)"
-       cx="16"
-       cy="0.48806855"
-       fx="16"
-       fy="0.48806855"
-       r="14.0625" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2798"
-       id="linearGradient3153"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9677379,0,0,0.9354797,1.0000667,1.0323245)"
-       x1="28.094524"
-       y1="27.046463"
-       x2="22.080519"
-       y2="3.8279345" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2788"
-       id="radialGradient3156"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.4323363,0,0,0.9758456,-6.5622485,-1.8056618)"
-       cx="15.285574"
-       cy="33.370087"
-       fx="15.285574"
-       fy="33.370087"
-       r="16" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3804"
-       id="linearGradient3159"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9352346,0,0,0.9516616,1.0362475,0.5184487)"
-       x1="12.36174"
-       y1="5.0757694"
-       x2="12.970619"
-       y2="28.980885" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="14.78125"
-     inkscape:cx="20.9115"
-     inkscape:cy="19.08188"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1024"
-     inkscape:window-height="716"
-     inkscape:window-x="0"
-     inkscape:window-y="52" />
-  <metadata
-     id="metadata1877">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <rect
-       ry="2.0837767"
-       rx="2.6444187"
-       y="1.4848689"
-       x="1.4848689"
-       height="29.030262"
-       width="29.030262"
-       id="rect2778"
-       style="fill:none;fill-opacity:1;stroke:url(#linearGradient3159);stroke-width:0.96973777;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    <rect
-       style="fill:url(#radialGradient3156);fill-opacity:1;stroke:#636363;stroke-width:0.93892932;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect1880"
-       width="29.059017"
-       height="27.188057"
-       x="1.4704916"
-       y="2.4059711"
-       rx="2.6451118"
-       ry="2.0483439" />
-    <path
-       style="fill:url(#linearGradient3153);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 1.9678043,28.161236 L 2.1468215,3.2830136 L 30.032195,3.2830136 C 30.032195,28.476959 1.9678043,3.3030752 1.9678043,28.161236 z "
-       id="path2796"
-       sodipodi:nodetypes="cccc" />
-    <rect
-       style="fill:none;fill-opacity:1;stroke:url(#radialGradient3150);stroke-width:1.0569731;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect2812"
-       width="27.077885"
-       height="25.206923"
-       x="2.4610584"
-       y="3.396538"
-       rx="1.2825754"
-       ry="1.2859955" />
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/button-prelight.svg b/mac/Cillop/gtk-2.0/button-prelight.svg
deleted file mode 100644
index 613288a..0000000
--- a/mac/Cillop/gtk-2.0/button-prelight.svg
+++ /dev/null
@@ -1,178 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="32px"
-   height="32px"
-   id="svg1872"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="button-prelight.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   inkscape:export-filename="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0/button-normal.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs1874">
-    <linearGradient
-       id="linearGradient7212">
-      <stop
-         style="stop-color:#6889a6;stop-opacity:0.94117647;"
-         offset="0"
-         id="stop7214" />
-      <stop
-         style="stop-color:#6889a6;stop-opacity:0.56470591;"
-         offset="1"
-         id="stop7216" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3804">
-      <stop
-         id="stop3806"
-         offset="0"
-         style="stop-color:#000000;stop-opacity:0.08627451;" />
-      <stop
-         id="stop3808"
-         offset="1"
-         style="stop-color:#ffffff;stop-opacity:0.39215687;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2798">
-      <stop
-         style="stop-color:white;stop-opacity:1;"
-         offset="0"
-         id="stop2800" />
-      <stop
-         style="stop-color:white;stop-opacity:0.1375"
-         offset="1"
-         id="stop2802" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2788">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="0"
-         id="stop2790" />
-      <stop
-         id="stop2783"
-         offset="1"
-         style="stop-color:#c9cccc;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2798"
-       id="linearGradient4222"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9677378,0,0,0.9354797,1.0000667,1.0323245)"
-       x1="28.094524"
-       y1="27.046463"
-       x2="22.080519"
-       y2="3.8279345" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2788"
-       id="radialGradient4225"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.4323861,0,0,0.975845,-6.563547,-1.8056508)"
-       cx="15.285574"
-       cy="33.370087"
-       fx="15.285574"
-       fy="33.370087"
-       r="16" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3804"
-       id="linearGradient4228"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9352346,0,0,0.9516616,1.0362475,0.5184487)"
-       x1="12.36174"
-       y1="5.0757694"
-       x2="12.970619"
-       y2="28.980885" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient7212"
-       id="linearGradient8189"
-       x1="16"
-       y1="14.672915"
-       x2="15.158279"
-       y2="17.016605"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0701465,0,0,1.0789276,-1.1223443,-33.262838)" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="14.78125"
-     inkscape:cx="20.9115"
-     inkscape:cy="15.194934"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1024"
-     inkscape:window-height="714"
-     inkscape:window-x="0"
-     inkscape:window-y="29" />
-  <metadata
-     id="metadata1877">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <rect
-       ry="2.0837765"
-       rx="2.6444187"
-       y="1.4848689"
-       x="1.4848689"
-       height="29.030262"
-       width="29.030262"
-       id="rect2778"
-       style="fill:none;fill-opacity:1;stroke:url(#linearGradient4228);stroke-width:0.96973777;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    <rect
-       style="fill:url(#radialGradient4225);fill-opacity:1;stroke:#646464;stroke-width:0.93894541;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect1880"
-       width="29.060026"
-       height="27.188042"
-       x="1.4694726"
-       y="2.4059796"
-       rx="2.6452036"
-       ry="2.0483427" />
-    <path
-       style="fill:url(#linearGradient4222);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 1.9678043,28.161235 L 2.1468215,3.2830136 L 30.032195,3.2830136 C 30.032195,28.476958 1.9678043,3.3030752 1.9678043,28.161235 z "
-       id="path2796"
-       sodipodi:nodetypes="cccc" />
-    <rect
-       style="opacity:0.7;fill:none;fill-opacity:0.33333334;stroke:url(#linearGradient8189);stroke-width:2.67401385;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect2812"
-       width="25.300497"
-       height="23.736408"
-       x="3.3497515"
-       y="-27.868204"
-       rx="0.47712848"
-       ry="0.48104355"
-       transform="scale(1,-1)" />
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/button-pressed.svg b/mac/Cillop/gtk-2.0/button-pressed.svg
deleted file mode 100644
index af9635e..0000000
--- a/mac/Cillop/gtk-2.0/button-pressed.svg
+++ /dev/null
@@ -1,178 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="32px"
-   height="32px"
-   id="svg1872"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="button-pressed.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   inkscape:export-filename="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0/button-normal.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="14.78125"
-     inkscape:cx="20.776193"
-     inkscape:cy="15.814739"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1024"
-     inkscape:window-height="714"
-     inkscape:window-x="0"
-     inkscape:window-y="29" />
-  <defs
-     id="defs1874">
-    <linearGradient
-       id="linearGradient3277">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0.73725492"
-         id="stop3279"
-         offset="0" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0"
-         id="stop3281"
-         offset="1" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3804-579">
-      <stop
-         offset="0"
-         id="stop8547"
-         style="stop-color:#000000;stop-opacity:0.1254902;" />
-      <stop
-         offset="1"
-         id="stop8549"
-         style="stop-color:#e5e5e5;stop-opacity:0.78431374;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2788-132">
-      <stop
-         offset="0"
-         id="stop8553"
-         style="stop-color:#c9cccc;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop8555"
-         style="stop-color:#939999;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2798-608">
-      <stop
-         offset="0"
-         id="stop8559"
-         style="stop-color:#e5e5e5;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop8561"
-         style="stop-color:#e5e5e5;stop-opacity:0.1375" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2798-608"
-       id="linearGradient2298"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9051724,0,0,0.9375,1.9698276,0.9999999)"
-       x1="28.211048"
-       y1="28.798056"
-       x2="22.794416"
-       y2="7.8858352" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2788-132"
-       id="radialGradient2301"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.4100044,0,0,0.9783908,-6.2104735,-1.8521039)"
-       cx="15.285574"
-       cy="33.370087"
-       fx="15.285574"
-       fy="33.370087"
-       r="16" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3804-579"
-       id="linearGradient2304"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.9372544,0,0,0.9537169,1.0039314,0.4850143)"
-       x1="12.36174"
-       y1="5.0757694"
-       x2="12.970619"
-       y2="28.980885" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3277"
-       id="radialGradient3275"
-       cx="16"
-       cy="2.3449633"
-       fx="16"
-       fy="2.3449633"
-       r="14.0625"
-       gradientTransform="matrix(2.1257995,0,0,0.9333333,-18.012792,1.0666677)"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <metadata
-     id="metadata1877">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <rect
-       id="rect2778"
-       x="1.4535216"
-       y="1.4535215"
-       width="29.092957"
-       height="29.092957"
-       ry="2.0882769"
-       rx="2.6501296"
-       style="fill:none;fill-opacity:1;stroke:url(#linearGradient2304);stroke-width:0.90704322;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    <rect
-       id="rect1880"
-       x="1.697026"
-       y="2.3705142"
-       width="28.605949"
-       height="27.258972"
-       ry="2.0536864"
-       rx="2.6038711"
-       style="fill:url(#radialGradient2301);fill-opacity:1;stroke:#424242;stroke-width:0.9375;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-    <path
-       id="path2796"
-       d="M 2.875,28.1875 L 3.0424436,3.2555496 L 29.125,3.2555496 C 29.125,28.503904 2.875,3.2756546 2.875,28.1875 z "
-       style="fill:url(#linearGradient2298);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       sodipodi:nodetypes="cccc" />
-    <rect
-       id="rect2812"
-       x="2.4318194"
-       y="3.3693192"
-       width="27.136362"
-       height="25.26136"
-       ry="1.2887727"
-       rx="1.2853452"
-       style="fill:none;fill-opacity:1;stroke:url(#radialGradient3275);stroke-width:0.98863864;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/comboarrow.png b/mac/Cillop/gtk-2.0/comboarrow.png
deleted file mode 100644
index fa1492b..0000000
Binary files a/mac/Cillop/gtk-2.0/comboarrow.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/gtkrc b/mac/Cillop/gtk-2.0/gtkrc
deleted file mode 100644
index 5f1dd1e..0000000
--- a/mac/Cillop/gtk-2.0/gtkrc
+++ /dev/null
@@ -1,832 +0,0 @@
-# Cillop GTK2 Theme
-# Emrah  Ãœnal - 2006, 2007
-# eunall at gmail.com
-
-gtk-color-scheme = "bg_color: #D6D6D6\nfg_color: #000\nbase_color: #fff\ntext_color: #000\nselected_bg_color: #8E9499\nselected_fg_color: #000"
-style "default"
-{
-GtkRange::trough_border              = 0
-GtkPaned::handle_size                = 6
-GtkRange::slider_width               = 14
-GtkRange::stepper_size               = 10
-GtkScrollbar::trough_border          = 2
-GtkScrollbar::min_slider_length      = 24
-GtkScrollbar::slider_width	     = 14
-GtkScrollbar::stepper_size	     = 12
-GtkCheckButton::indicator_size       = 12
-GtkRadioButton::indicator_size       = 12
-GtkMenuBar::internal-padding         = 1
-GtkTreeView::expander_size           = 14
-GtkExpander::expander_size           = 14
-GtkWidget::interior_focus            = 1
-GtkWidget::focus_padding             = 0
-GtkScale::slider_length              = 30
-  
-# color definitions
-bg[NORMAL]		= @bg_color
-#bg_pixmap[NORMAL]	= "bg.png"
-bg[PRELIGHT]		= shade (0.8, @bg_color)
-bg[ACTIVE]		= shade (0.85, @bg_color)
-bg[SELECTED]		= mix (0.65, @selected_bg_color, @bg_color)
-bg[INSENSITIVE]	        = shade (0.85, @bg_color)
-fg[NORMAL]		= @fg_color
-fg[PRELIGHT]		= @fg_color
-fg[ACTIVE]		= @fg_color
-fg[SELECTED]		= @selected_fg_color
-fg[INSENSITIVE]	        = mix (0.4, @fg_color, shade (0.85, @bg_color)) #shaded to bg[INSENSITIVE]
-base[NORMAL]		= @base_color
-base[PRELIGHT]	        = @base_color #XXX
-base[ACTIVE]		= mix (0.45, @selected_bg_color, @base_color)
-base[SELECTED]	        = @selected_bg_color
-base[INSENSITIVE]	= mix (0.90, @base_color, @text_color)
-text[NORMAL]		= @text_color
-text[PRELIGHT]	        = @text_color #XXX
-text[ACTIVE]		= @selected_fg_color
-text[SELECTED]	        = @selected_fg_color
-text[INSENSITIVE]	= mix (0.5, @text_color, @base_color)
-
-}
-
-style "default"
-{
-  engine "pixmap"
-  {
-	image
-	{
-	function          	= BOX
-	shadow            	= IN
-	file              	= "null.svg"
-	border           	= { 1, 1, 1, 1 }
-	stretch           	= TRUE
-	}
-
-	image
-	{
-	function          	= BOX
-	shadow            	= OUT
-	file              	= "null.svg"
-	border            	= { 1, 1, 1, 1 }
-	stretch           	= TRUE
-	}
-
-	image
-	{
-	function		= ARROW
-	state			= NORMAL
-	file			= "arrow-up.png"
-	border	= { 0, 0, 0, 0 }
-	stretch	= TRUE
-	arrow_direction	= UP
-	}
-
-	image
-	{
-	function		= ARROW
-	state			= PRELIGHT
-	file			= "arrow-up-pre.png"
-	border	= { 0, 0, 0, 0 }
-	stretch	= TRUE
-	arrow_direction	= UP
-	}
-
-	image
-	{
-	function		= ARROW
-	state			= INSENSITIVE
-	file		= "arrow-up-ins.png"
-	border	= { 0, 0, 0, 0 }
-	stretch	= TRUE
-	arrow_direction	= UP
-	}
-
-	image
-	{
-	function			= ARROW
-	state				= NORMAL
-	file		= "arrow-down.png"
-	border	= { 0, 0, 0, 0 }
-	stretch	= TRUE
-	arrow_direction	= DOWN
-	}
-	image
-	{
-	function			= ARROW
-	state				= PRELIGHT
-	file		= "arrow-down-pre.png"
-	border	= { 0, 0, 0, 0 }
-	stretch	= TRUE
-	arrow_direction	= DOWN
-	}
-	image
-	{
-	function			= ARROW
-	state				= INSENSITIVE
-	file		= "arrow-down-ins.png"
-	border	= { 0, 0, 0, 0 }
-	stretch	= TRUE
-	arrow_direction	= DOWN
-	}
-	image
-	{
-	function			= ARROW
-	file				= "null.svg"
-	state				= NORMAL
-	overlay_file		= "arrow-left.png"
-        overlay_border	= { 0, 0, 0, 0 }
-        overlay_stretch	= FALSE
-        arrow_direction	= LEFT
-       }
-        image
-       {
-        function		= ARROW
-        state				= PRELIGHT
-        file				= "null.svg"
-        overlay_file		= "arrow-left-pre.png"
-        overlay_border	= { 0, 0, 0, 0 }
-        overlay_stretch	= FALSE
-        arrow_direction	= LEFT
-       }
-        image
-       {
-        function			= ARROW
-        state				= INSENSITIVE
-        overlay_file		= "arrow-left-ins.png"
-        overlay_border	= { 0, 0, 0, 0 }
-        overlay_stretch	= FALSE
-        arrow_direction	= LEFT
-       }
-        image
-       {
-        function			= ARROW
-        file				= "null.svg"
-        state				= NORMAL
-        overlay_file		= "arrow-right.png"
-        overlay_border	= { 0, 0, 0, 0 }
-        overlay_stretch	= FALSE
-        arrow_direction	= RIGHT
-       } 
-        image
-       {
-        function		= ARROW
-        state				= PRELIGHT
-        file				= "null.svg"
-        overlay_file		= "arrow-right-pre.png"
-        overlay_border	= { 0, 0, 0, 0 }
-        overlay_stretch	= FALSE
-        arrow_direction	= RIGHT
-       }
-        image
-       {
-        function		= ARROW
-        state			= INSENSITIVE
-        overlay_file		= "arrow-right-ins.png"
-        overlay_border		= { 0, 0, 0, 0 }
-        overlay_stretch		= FALSE
-        arrow_direction		= RIGHT
-       }
-
-   }
-}
-class "GtkWidget"          style "default"
-
-style "button"			= "default"
-{
-  xthickness			= 4
-  ythickness			= 4
-  engine "pixmap"
-  {
-
-      image
-     {
-      function			= BOX
-      detail			= "buttondefault"
-      file			= "button-default.png"
-      border			= { 4, 4, 4, 4 }
-      stretch			= TRUE
-     }
-
-      image 
-     {
-      function			= BOX
-      state			= NORMAL
-      recolorable		= TRUE
-      file			= "button-normal.svg"
-      border			= { 15, 15, 8, 8 }
-      stretch			= TRUE
-     }	
-      image
-     {
-      function			= BOX
-      state			= PRELIGHT
-      recolorable		= TRUE      
-      file			= "button-prelight.svg"
-      border			= { 8, 8, 8, 8 }
-      stretch			= TRUE
-     }
-      image
-     {
-      function			= BOX
-      state			= ACTIVE
-      recolorable		= TRUE
-      file			= "button-pressed.svg"
-      border			= { 15,15,8,8 }
-      stretch			= TRUE
-     }	
-      image 
-     {
-      function			= BOX
-      state			= INSENSITIVE
-      recolorable		= TRUE
-      file			= "button-insensitive.svg"
-      border			= { 15,15,8,8 }
-      stretch			= TRUE
-     }
-      image 
-     {
-      function			= BOX
-      recolorable		= TRUE
-      file			= "button-normal.svg"
-      border			= { 15, 15, 8, 8 }
-      stretch			= TRUE
-     }
-
-  }
-}
-
-style "optionmenu"		= "default"
-{
-  xthickness			= 4
-  ythickness			= 4
-  engine "pixmap"
-  {
-      image
-     {
-      function			= BOX
-      state			= NORMAL
-      file			= "button-normal.svg"
-      border			= { 15,15,8,8 }
-      stretch			= TRUE
-     }
-      image
-     {
-      function			= BOX
-      state			= PRELIGHT
-      file			= "button-prelight.svg"
-      border			= { 8,8,8,8 }
-      stretch			= TRUE
-     }
-      image
-     {
-      function			= BOX
-      state			= INSENSITIVE
-      file			= "button-insensitive.svg"
-      border			= { 8,8,8,8}
-      stretch			= TRUE
-     }
-
-      image
-     {
-      function			= BOX
-      state			= INSENSITIVE
-      file			= "button-insensitive.svg"
-      border			= { 8,8,8,8}
-      stretch			= TRUE
-     }
-
-
-      image
-     {
-      function			= TAB
-      state			= NORMAL
-      overlay_file		= "comboarrow.png"
-      overlay_stretch		= FALSE
-     }
-
-  }
-}
-
-
-
-
-
-style "scrollbar"
-{
-
-  engine "pixmap" 
-  {
-      image 
-     {
-      function			= BOX
-      detail			= "trough"
-      file			= "trough2.svg"
-      border			= { 6, 6, 6, 6 }
-      stretch			= TRUE
-      orientation		= VERTICAL
-     }
-      image 
-     {
-      function			= BOX
-      detail			= "trough"
-      file			= "trough2-h.svg"
-      border			= { 6, 6, 6, 6 }
-      stretch			= TRUE
-      orientation		= HORIZONTAL
-     }
-      image 
-     {
-      function			= SLIDER
-      state           		= NORMAL
-      file			= "slider-h.svg" 
-      border			= { 6, 6, 2, 2 }
-      stretch			= TRUE
-      orientation		= HORIZONTAL
-     }
-      image 
-     {
-      function			= SLIDER
-      state           		= PRELIGHT
-      file			= "slider-h-pre.svg" 
-      border			= { 6, 6, 2, 2 }
-      stretch			= TRUE
-      orientation		= HORIZONTAL
-     }
-      image 
-     {
-      function			= SLIDER
-      state           		= INSENSITIVE
-      file			= "slider-h-ins.svg"
-      border			= { 6,6,2,2 }
-      stretch			= TRUE
-      orientation		= HORIZONTAL
-     }
-      image 
-     {
-      function			= SLIDER
-      state           		= NORMAL
-      file			= "slider-v.svg" 
-      border			= { 2, 2, 6, 6 }
-      stretch			= TRUE
-      orientation		= VERTICAL
-	
-	
-      
-     }
-      image 
-     {
-      function			= SLIDER
-      state           		= PRELIGHT
-      file			= "slider-v-pre.svg" 
-      border			= { 2, 2, 6, 6 }
-      stretch			= TRUE
-      orientation		= VERTICAL
-     }
-      image 
-     {
-      function			= SLIDER
-      state           		= INSENSITIVE
-      file			= "slider-v-ins.svg"
-      border			= { 2, 2, 6, 6 }
-      stretch			= TRUE
-      orientation		= VERTICAL
-     }
-      image 
-     {
-      function			= STEPPER
-      state			= NORMAL
-      file			= "null.svg"
-      border			= { 1, 1, 4, 4 }
-      stretch			= TRUE
-      arrow_direction		= UP
-      overlay_file		= "arrow-up.png"
-      overlay_stretch		= FALSE
-     }
-      image 
-     {
-      function			= STEPPER
-      state			= PRELIGHT
-      file			= "null.svg"
-      border			= { 1, 1, 4, 4 }
-      stretch			= TRUE
-      arrow_direction		= UP
-      overlay_file		= "arrow-up-pre.png"
-      overlay_stretch		= FALSE
-     }
-      image
-     {
-      function			= STEPPER
-      state			= ACTIVE
-      file			= "null.svg"
-      border			= { 1, 1, 4, 4 }
-      stretch			= TRUE
-      arrow_direction		= UP
-      overlay_file		= "arrow-up.png"
-      overlay_stretch		= FALSE
-     }
-      image 
-     {
-      function			= STEPPER
-      state			= INSENSITIVE
-      file			= "null.svg"
-      border			= { 1, 1, 4, 4 }
-      stretch			= TRUE
-      arrow_direction		= UP
-      overlay_file		= "arrow-up-ins.png"
-      overlay_stretch		= FALSE
-     }
-      image 
-     {
-      function			= STEPPER
-      state			= NORMAL
-      file			= "null.svg"
-      border			= { 1, 1, 4, 4 }
-      stretch			= TRUE
-      arrow_direction		= DOWN
-      overlay_file		= "arrow-down.png"
-      overlay_stretch		= FALSE
-     }
-      image 
-     {
-      function			= STEPPER
-      state			= PRELIGHT
-      file			= "null.svg"
-      border			= { 1, 1, 4, 4 }
-      stretch			= TRUE
-      arrow_direction		= DOWN
-      overlay_file		= "arrow-down-pre.png"
-      overlay_stretch		= FALSE
-     }
-      image
-     {
-      function			= STEPPER
-      state			= ACTIVE
-      file			= "null.svg"
-      border			= { 1, 1, 4, 4 }
-      stretch			= TRUE
-      arrow_direction		= DOWN
-      overlay_file		= "arrow-down.png"
-      overlay_stretch		= FALSE
-     }
-      image 
-     {
-      function			= STEPPER
-      state			= INSENSITIVE
-      file			= "null.svg"
-      border			= { 1, 1, 4, 4 }
-      stretch			= TRUE
-      arrow_direction		= DOWN
-      overlay_file		= "arrow-down-ins.png"
-      overlay_stretch		= FALSE
-     }
-      image 
-     {
-      function			= STEPPER
-      state			= NORMAL
-      file			= "null.svg"
-      border			= { 4, 4, 1, 1 }
-      stretch			= TRUE
-      arrow_direction		= RIGHT
-      overlay_file		= "arrow-right.png"
-      overlay_stretch		= FALSE
-     }
-      image 
-     {
-      function			= STEPPER
-      state			= PRELIGHT
-      file			= "null.svg"
-      border			= { 4, 4, 1, 1 }
-      stretch			= TRUE
-      arrow_direction		= RIGHT
-      overlay_file		= "arrow-right-pre.png"
-      overlay_stretch		= FALSE
-     }
-      image
-     {
-      function			= STEPPER
-      state			= ACTIVE
-      file			= "null.svg"
-      border			= { 4, 4, 1, 1 }
-      stretch			= TRUE
-      arrow_direction		= RIGHT
-      overlay_file		= "arrow-right.png"
-      overlay_stretch		= FALSE
-     }
-      image
-     {
-      function			= STEPPER
-      state			= INSENSITIVE
-      file			= "null.svg"
-      border			= { 4, 4, 1, 1 }
-      stretch			= TRUE
-      arrow_direction		= RIGHT
-      overlay_file		= "arrow-right-ins.png"
-      overlay_stretch		= FALSE
-     }
-    image 
-    {
-      function			= STEPPER
-      state			= NORMAL
-      file			= "null.svg"
-      border			= { 4,4,1,1 }
-      stretch			= TRUE
-      arrow_direction		= LEFT
-      overlay_file		= "arrow-left.png"
-      overlay_stretch		= FALSE
-   }
-   image 
-   {
-      function			= STEPPER
-      state			= PRELIGHT
-      file			= "null.svg"
-      border			= { 4,4,1,1 }
-      stretch			= TRUE
-      arrow_direction		= LEFT
-      overlay_file		= "arrow-left-pre.png"
-      overlay_stretch		= FALSE
-   }
-     image 
-     {
-      function			= STEPPER
-      state			= ACTIVE
-      file			= "null.svg"
-      border			= { 4,4,1,1 }
-      stretch			= TRUE
-      arrow_direction		= LEFT
-      overlay_file		= "arrow-left.png"
-      overlay_stretch		= FALSE
-     }
-     image 
-     {
-      function			= STEPPER
-      state			= INSENSITIVE
-      file			= "null.svg"
-      border			= { 4,4,1,1 }
-      stretch			= TRUE
-      arrow_direction		= LEFT
-      overlay_file		= "arrow-left-ins.png"
-      overlay_stretch		= FALSE
-     }
-  }
-}
-
-style "range"			= "default"
-{
-  engine "pixmap" 
-     {
-     image
-     {
-      function			= FOCUS
-      file			= "rangetrough-focus.png"
-      border			= { 6, 6, 6, 6 }
-      stretch			= TRUE
-     }	
-     image 
-     {
-      function			= BOX
-      detail			= "trough"
-      file			= "pbtroughh.svg"
-      border			= { 6, 6, 6, 6 }
-      stretch			= TRUE
-      orientation		= HORIZONTAL
-      }	
-      image 
-      {
-       function			= BOX
-       detail			= "trough"
-       file			= "pbtroughv.svg"
-       border			= { 6, 6, 6, 6 }
-       stretch			= TRUE
-       orientation		= VERTICAL
-      }
-      image 
-      {
-       function			= SLIDER
-       state           		= NORMAL
-       file			= "rangeslider.svg"
-       border			= { 6, 6, 6, 6 }
-       stretch			= TRUE
-       overlay_file		= "rangegrip-h.png"
-       overlay_stretch		= FALSE
-       orientation		= HORIZONTAL
-      }
-      image 
-      {
-       function			= SLIDER
-       state          	 	= PRELIGHT
-       file			= "rangeslider-pre.svg"
-       border			= { 6, 6, 6, 6 }
-       stretch			= TRUE
-       overlay_file		= "rangegrip-h.png"
-       overlay_stretch		= FALSE
-       orientation		= HORIZONTAL
-      }
-      image 
-      {
-       function			= SLIDER
-       state         	  	= ACTIVE
-       file			= "rangeslider-pre.svg"
-       border			= { 6, 6, 6, 6 }
-       stretch			= TRUE
-       overlay_file		= "rangegrip-h.png"
-       overlay_stretch		= FALSE
-       orientation		= HORIZONTAL
-      }
-      image 
-      {
-       function			= SLIDER
-       state           		= INSENSITIVE
-       file			= "rangeslider-ins.svg"
-       border			= { 6, 6, 6, 6 }
-       stretch			= TRUE
-       overlay_file		= "rangegrip-h.png"
-       overlay_stretch		= FALSE
-       orientation		= HORIZONTAL
-      }
-      image 
-      {
-       function			= SLIDER
-       state	           	= NORMAL
-       file			= "rangeslider-v.svg"
-       border			= { 6, 6, 6, 6 }
-       stretch			= TRUE
-       overlay_file		= "rangegrip-v.png"
-       overlay_stretch		= FALSE
-       orientation		= VERTICAL
-      }
-      image 
-      {
-       function			= SLIDER
-       state           		= PRELIGHT
-       file			= "rangeslider-v-pre.svg"
-       border			= { 6, 6, 6, 6 }
-       stretch			= TRUE
-       overlay_file=		"rangegrip-v.png"
-       overlay_stretch		= FALSE
-       orientation		= VERTICAL
-      }
-      image 
-      {
-       function			= SLIDER
-       state           		= ACTIVE
-       file			= "rangeslider-v-pre.svg"
-       border			= { 6, 6, 6, 6 }
-       stretch			= TRUE
-       overlay_file		= "rangegrip-v.png"
-       overlay_stretch		= FALSE
-       orientation		= VERTICAL
-      }
-      image 
-      {
-       function			= SLIDER
-       state           		= INSENSITIVE
-       file			= "rangeslider-v-ins.svg"
-       border			= { 6, 6, 6, 6 }
-       stretch			= TRUE
-       overlay_file		= "rangegrip-v.png"
-       overlay_stretch		= FALSE
-       orientation		= VERTICAL
-      }
-  }
-}
-
-
-
-style "menuitem"
-{
-  xthickness			= 2
-  ythickness			= 2
-  fg[PRELIGHT] = @selected_fg_color
-  text[PRELIGHT] = @selected_fg_color
-  engine "clearlooks"
-  {
-  radius = 0.0
-  style = GLOSSY
-  }
-}
-
-
-style "menubar"
-{
-  xthickness = 0
-  ythickness = 0
-  engine "pixmap"
-  {
-      image
-      {
-       function			= BOX
-       state			= NORMAL
-       file			= "menubar.svg"
-       border			= { 8,8,15,15 }
-       stretch			= TRUE
-      }	
-  }
-}
-class "GtkMenuBar" style "menubar"
-
-
-style "list-header"
-{
-   GtkTreeView::odd_row_color = "#F5F5FA"
-   GtkTreeView::even_row_color = "#FFFFFF"
-  xthickness			= 3
-  ythickness			= 2
-   engine "clearlooks" 
-  {
-	
-  }
-}
-
-
-
-style "shallow"
-{
-	xthickness=0
-	ythickness=0
-	engine "clearlooks"	
-	{
-	radius =0.0
-	style = GLOSSY
-	}
-}
-
-style "progressbar" 
-{
-xthickness = 1
-ythickness = 1
- engine "clearlooks"
- {
- style             = GLOSSY
- }
-}
-
-style "spinbutton" 
-{
-xthickness=3
-ythickness=3
- engine "clearlooks"	
- {
- }
-}
-
-style "gtkentry" 
-{
-xthickness=4
-ythickness=4
- engine "clearlooks"	
- {
- radius = 4.0
- style = GLOSSY
- }
-}
-
-style "checkbox"
-{
- engine "clearlooks" 
- {
- }
-}
-
-style "radiobutton"	= "default"
-{
- engine "clearlooks" 
- {
- }
-}
-
-style "notebook"
-{
-	xthickness=2
-	ythickness=2
-	engine "clearlooks"
-	{
-	}
-}
-
-class "GtkButton"          			style "button"
-class "GtkOptionMenu"      			style "optionmenu"
-class "GtkRuler"           			style "shallow"
-class "GtkScrollbar"       			style "scrollbar"
-class "GtkProgressBar"     			style "progressbar"
-class "GtkRange"         			style "range"
-class "GtkMenu"       				style "shallow"
-class "GtkItem"           			style "menuitem"
-class "GtkTearoffMenuItem"			style "menuitem"
-class "GtkNotebook"      			style "notebook"
-class "GtkHandleBox"    			style "gtkentry"
-class "GtkEventBox"    				style "notebook"
-class "GtkPaned"       				style "gtkentry"
-widget "gtk-tooltips"  				style "shallow"
-class "GtkWidget" 				style "notebook"
-class "GtkEntry"  				style "gtkentry"
-class "GtkFrame"  				style "gtkentry"
-class "GtkCheckButton"     			style "checkbox"
-class "GtkStatusbar"   				style "shallow"
-class "GtkSpinButton"   	 		style "spinbutton"
-class "GTKComboEntry"				style	"gtkentry"
-widget_class "*.GtkFrame.GtkLabel" 		style "shallow"
-widget_class "*.GtkFrame.GtkLabel" 		style "shallow"
-widget_class "BasePWidget.GtkEventBox.GtkTable.GtkFrame" style "shallow"
-class "GtkRadioButton"     			style "radiobutton"
-class "GtkRadioMenuItem"    			style "radiobutton"
-class "GtkEditable"				style "gtkentry"
-widget_class "*OptionMenu*"     	style "optionmenu"
-
diff --git a/mac/Cillop/gtk-2.0/lineh.png b/mac/Cillop/gtk-2.0/lineh.png
deleted file mode 100644
index a4e7802..0000000
Binary files a/mac/Cillop/gtk-2.0/lineh.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/linev.png b/mac/Cillop/gtk-2.0/linev.png
deleted file mode 100644
index ecb8fbe..0000000
Binary files a/mac/Cillop/gtk-2.0/linev.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/menubar.svg b/mac/Cillop/gtk-2.0/menubar.svg
deleted file mode 100644
index 00034fc..0000000
--- a/mac/Cillop/gtk-2.0/menubar.svg
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="32px"
-   height="32px"
-   id="svg1872"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0"
-   sodipodi:docname="menubar.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs1874">
-    <linearGradient
-       id="linearGradient2780">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0;"
-         offset="0"
-         id="stop2782" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0.58823532;"
-         offset="1"
-         id="stop2784" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2780"
-       id="linearGradient5897"
-       x1="15.570325"
-       y1="14.152994"
-       x2="15.570325"
-       y2="-0.0031868482"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.0153383,0,-32)" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#868686"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="14.78125"
-     inkscape:cx="21.046807"
-     inkscape:cy="23.346497"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1016"
-     inkscape:window-height="695"
-     inkscape:window-x="0"
-     inkscape:window-y="28" />
-  <metadata
-     id="metadata1877">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <rect
-       style="fill:url(#linearGradient5897);fill-opacity:1;stroke:none;stroke-width:0.96682161;stroke-linecap:square;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect1880"
-       width="32"
-       height="32"
-       x="0"
-       y="-32"
-       rx="1.9319962"
-       ry="1.8775963"
-       transform="scale(1,-1)" />
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/null.svg b/mac/Cillop/gtk-2.0/null.svg
deleted file mode 100644
index 2872d25..0000000
--- a/mac/Cillop/gtk-2.0/null.svg
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="48"
-   height="48"
-   id="svg1307"
-   sodipodi:version="0.32"
-   inkscape:version="0.43"
-   sodipodi:docbase="/home/emrah/.themes/Polycarbonate-0.5/gtk-2.0"
-   sodipodi:docname="null.svg"
-   version="1.0">
-  <defs
-     id="defs1309" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="8.0000005"
-     inkscape:cx="38.653926"
-     inkscape:cy="25.803528"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1270"
-     inkscape:window-height="930"
-     inkscape:window-x="0"
-     inkscape:window-y="27"
-     borderlayer="top" />
-  <metadata
-     id="metadata1312">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer" />
-</svg>
diff --git a/mac/Cillop/gtk-2.0/pbtroughh.svg b/mac/Cillop/gtk-2.0/pbtroughh.svg
deleted file mode 100644
index d2e12be..0000000
--- a/mac/Cillop/gtk-2.0/pbtroughh.svg
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg1307"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/Desktop/Cillop-Mediterranean/gtk-2.0"
-   sodipodi:docname="pbtroughh.svg"
-   version="1.0"
-   inkscape:export-filename="/home/emrah/.themes/Polycarbonate-0.5/gtk-2.0/trough2.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs1309">
-    <linearGradient
-       id="linearGradient5808">
-      <stop
-         style="stop-color:#969696;stop-opacity:1;"
-         offset="0"
-         id="stop5810" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="1"
-         id="stop5812" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient16819">
-      <stop
-         id="stop16821"
-         offset="0"
-         style="stop-color:#ffffff;stop-opacity:0.19607843;" />
-      <stop
-         id="stop16823"
-         offset="1"
-         style="stop-color:#000000;stop-opacity:0.19607843;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient16819"
-       id="linearGradient4913"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8654669,0,0,0.1605019,-0.9417338,2.1849467)"
-       x1="-13.393001"
-       y1="30.000002"
-       x2="-0.59684116"
-       y2="30.000002" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5808"
-       id="linearGradient4915"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8654669,0,0,0.1605019,-0.9417338,2.1849467)"
-       x1="-0.56191593"
-       y1="35.137894"
-       x2="-12.579332"
-       y2="35.0508" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="11.483333"
-     inkscape:cx="6.9999998"
-     inkscape:cy="5.6168359"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1012"
-     inkscape:window-height="698"
-     inkscape:window-x="4"
-     inkscape:window-y="42"
-     borderlayer="top" />
-  <metadata
-     id="metadata1312">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <g
-       id="g4909"
-       transform="matrix(0.9603408,0,0,0.9603408,0.2776142,0.2776142)">
-      <rect
-         transform="matrix(0,-1,1,0,0,0)"
-         ry="4.7064815"
-         rx="4.7064824"
-         y="2.2935202"
-         x="-11.706485"
-         height="9.4129629"
-         width="9.4129658"
-         id="rect4896"
-         style="fill:url(#linearGradient4913);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4915);stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.56000004;stroke-opacity:1" />
-      <rect
-         style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.56000004;stroke-opacity:0.20209973"
-         id="rect2230"
-         width="7.8454762"
-         height="7.8454738"
-         x="-10.92274"
-         y="3.0772645"
-         rx="3.9227378"
-         ry="3.9227369"
-         transform="matrix(0,-1,1,0,0,0)" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/pbtroughv.svg b/mac/Cillop/gtk-2.0/pbtroughv.svg
deleted file mode 100644
index 9e6703a..0000000
--- a/mac/Cillop/gtk-2.0/pbtroughv.svg
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg1307"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0"
-   sodipodi:docname="pbtroughv.svg"
-   version="1.0"
-   inkscape:export-filename="/home/emrah/.themes/Polycarbonate-0.5/gtk-2.0/trough2.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs1309">
-    <linearGradient
-       id="linearGradient5808">
-      <stop
-         style="stop-color:#969696;stop-opacity:1;"
-         offset="0"
-         id="stop5810" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="1"
-         id="stop5812" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient16819">
-      <stop
-         id="stop16821"
-         offset="0"
-         style="stop-color:#ffffff;stop-opacity:0.19607843;" />
-      <stop
-         id="stop16823"
-         offset="1"
-         style="stop-color:#000000;stop-opacity:0.19607843;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5808"
-       id="linearGradient5814"
-       x1="-0.56191593"
-       y1="35.137894"
-       x2="-12.579332"
-       y2="35.0508"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8654669,0,0,0.1605019,-0.9417338,2.1849467)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient16819"
-       id="linearGradient5816"
-       x1="-13.393001"
-       y1="30.000002"
-       x2="-0.59684116"
-       y2="30.000002"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8654669,0,0,0.1605019,-0.9417338,2.1849467)" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#dddddd"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="11.483333"
-     inkscape:cx="6.9999998"
-     inkscape:cy="5.6168359"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1012"
-     inkscape:window-height="654"
-     inkscape:window-x="4"
-     inkscape:window-y="46"
-     borderlayer="top" />
-  <metadata
-     id="metadata1312">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <g
-       id="g3279"
-       transform="matrix(0,-1,1,0,-2.3841858e-7,14.000004)">
-      <rect
-         transform="matrix(0,-1,1,0,0,0)"
-         ry="4.7064815"
-         rx="4.7064824"
-         y="2.2935202"
-         x="-11.706485"
-         height="9.4129629"
-         width="9.4129658"
-         id="rect4896"
-         style="fill:url(#linearGradient5816);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5814);stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.56000004;stroke-opacity:1" />
-      <rect
-         style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.56000004;stroke-opacity:0.20209973"
-         id="rect2230"
-         width="7.8454762"
-         height="7.8454738"
-         x="-10.92274"
-         y="3.0772645"
-         rx="3.9227378"
-         ry="3.9227369"
-         transform="matrix(0,-1,1,0,0,0)" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/rangegrip-h.png b/mac/Cillop/gtk-2.0/rangegrip-h.png
deleted file mode 100644
index 310b58e..0000000
Binary files a/mac/Cillop/gtk-2.0/rangegrip-h.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/rangegrip-h.svg b/mac/Cillop/gtk-2.0/rangegrip-h.svg
deleted file mode 100644
index 59e6178..0000000
--- a/mac/Cillop/gtk-2.0/rangegrip-h.svg
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="12"
-   height="8"
-   id="svg2160"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   version="1.0"
-   sodipodi:docbase="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0"
-   sodipodi:docname="rangegrip-h.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   inkscape:export-filename="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0/rangegrip-h.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs2162">
-    <linearGradient
-       id="linearGradient3143">
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0.47058824;"
-         offset="0"
-         id="stop3145" />
-      <stop
-         style="stop-color:#000000;stop-opacity:0.22147651;"
-         offset="1"
-         id="stop3147" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3143"
-       id="linearGradient2363"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.7927787,0,0,0.5208771,0.964286,1.4999998)"
-       x1="3.6274586"
-       y1="2.3718197"
-       x2="6.3548536"
-       y2="2.3718197" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3143"
-       id="linearGradient2431"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.7927787,0,0,0.5208771,0.964286,5.4999998)"
-       x1="3.6274586"
-       y1="2.3718197"
-       x2="6.3548536"
-       y2="2.3718197" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3143"
-       id="linearGradient2435"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.7927787,0,0,0.5208771,0.964286,9.4999998)"
-       x1="3.6274586"
-       y1="2.3718197"
-       x2="6.3548536"
-       y2="2.3718197" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:current-layer="svg2160"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1016"
-     inkscape:window-height="653"
-     inkscape:window-x="6"
-     inkscape:window-y="49" />
-  <metadata
-     id="metadata2165">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer" />
-  <rect
-     style="opacity:0.38642297;fill:#ffffff;fill-opacity:0.45595853;stroke:url(#linearGradient2363);stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-     id="rect3185"
-     width="2"
-     height="1"
-     x="3"
-     y="1.5"
-     rx="0"
-     ry="0"
-     transform="matrix(0,1,1,0,0,0)" />
-  <rect
-     transform="matrix(0,1,1,0,0,0)"
-     ry="0"
-     rx="0"
-     y="5.5"
-     x="3"
-     height="1"
-     width="2"
-     id="rect2429"
-     style="opacity:0.38642297;fill:#ffffff;fill-opacity:0.45595853;stroke:url(#linearGradient2431);stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-  <rect
-     style="opacity:0.38642297;fill:#ffffff;fill-opacity:0.45595853;stroke:url(#linearGradient2435);stroke-width:2;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-     id="rect2433"
-     width="2"
-     height="1"
-     x="3"
-     y="9.5"
-     rx="0"
-     ry="0"
-     transform="matrix(0,1,1,0,0,0)" />
-</svg>
diff --git a/mac/Cillop/gtk-2.0/rangegrip-v.png b/mac/Cillop/gtk-2.0/rangegrip-v.png
deleted file mode 100644
index 2dab166..0000000
Binary files a/mac/Cillop/gtk-2.0/rangegrip-v.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/rangeslider-ins.svg b/mac/Cillop/gtk-2.0/rangeslider-ins.svg
deleted file mode 100644
index a11d9df..0000000
--- a/mac/Cillop/gtk-2.0/rangeslider-ins.svg
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg3804"
-   sodipodi:version="0.32"
-   inkscape:version="0.45"
-   sodipodi:docbase="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0"
-   sodipodi:docname="rangeslider-ins.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0"
-   sodipodi:modified="true">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="7.7007336"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1008"
-     inkscape:window-height="678"
-     inkscape:window-x="488"
-     inkscape:window-y="214" />
-  <defs
-     id="defs3806">
-    <linearGradient
-       id="linearGradient3665">
-      <stop
-         offset="0"
-         id="stop3667"
-         style="stop-color:#ebebeb;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop3669"
-         style="stop-color:#a5a5a5;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4704-951-989">
-      <stop
-         offset="0"
-         id="stop6373"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop6375"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient4879"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-2.0143772,0,0,-1.0472177,43.790224,13.986294)"
-       cx="14.527122"
-       cy="6.8330836"
-       fx="14.527122"
-       fy="6.8330836"
-       r="7.3700495" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient4881"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-  </defs>
-  <metadata
-     id="metadata3809">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <g
-       id="g4875"
-       transform="matrix(0.8576401,0,0,0.8588311,0.9975735,0.9886584)">
-      <path
-         transform="matrix(0,0.9506982,-0.9402534,0,13.68145,0.2959886)"
-         d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-         sodipodi:ry="6.937624"
-         sodipodi:rx="6.8700495"
-         sodipodi:cy="7.1074257"
-         sodipodi:cx="7.0502477"
-         id="path4881"
-         style="fill:url(#radialGradient4879);fill-opacity:1;fill-rule:nonzero;stroke:#848484;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         transform="matrix(0,0.5993913,-0.6482327,0,11.197098,1.1010356)"
-         d="M 8.4693069 6.4767327 A 4.0769801 6.171782 0 1 1  0.31534672,6.4767327 A 4.0769801 6.171782 0 1 1  8.4693069 6.4767327 z"
-         sodipodi:ry="6.171782"
-         sodipodi:rx="4.0769801"
-         sodipodi:cy="6.4767327"
-         sodipodi:cx="4.3923268"
-         id="path6875"
-         style="fill:url(#radialGradient4881);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/rangeslider-pre.svg b/mac/Cillop/gtk-2.0/rangeslider-pre.svg
deleted file mode 100644
index 08cea94..0000000
--- a/mac/Cillop/gtk-2.0/rangeslider-pre.svg
+++ /dev/null
@@ -1,125 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg3804"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="rangeslider-pre.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="7.7007336"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1008"
-     inkscape:window-height="698"
-     inkscape:window-x="8"
-     inkscape:window-y="52" />
-  <defs
-     id="defs3806">
-    <radialGradient
-       inkscape:collect="always"
-       id="radialGradient2171-951"
-       r="7.3700495"
-       gradientTransform="matrix(-1.1290972,0,0,-1.2063514,30.929654,15.073668)"
-       cx="13.594742"
-       cy="6.8330836"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient3665-855"
-       fy="6.8330836"
-       fx="13.594742" />
-    <linearGradient
-       id="linearGradient3665-855">
-      <stop
-         offset="0"
-         id="stop2226"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop2228"
-         style="stop-color:#b0b6bd;stop-opacity:0.94117647;" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       id="radialGradient2173-31"
-       r="4.0769801"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient4704-951-989-495"
-       fy="6.4767327"
-       fx="0.31534672" />
-    <linearGradient
-       id="linearGradient4704-951-989-495">
-      <stop
-         offset="0"
-         id="stop2232"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop2234"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-  </defs>
-  <metadata
-     id="metadata3809">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <g
-       id="g2167">
-      <path
-         id="path4881"
-         sodipodi:cx="7.0502477"
-         sodipodi:cy="7.1074257"
-         transform="matrix(0,0.8141794,-0.8066345,0,12.731763,1.2584802)"
-         d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-         sodipodi:type="arc"
-         style="fill:url(#radialGradient2171-951);fill-opacity:1;fill-rule:nonzero;stroke:#6e6e6e;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:ry="6.937624"
-         sodipodi:rx="6.8700495" />
-      <path
-         id="path6875"
-         sodipodi:cx="4.3923268"
-         sodipodi:cy="6.4767327"
-         transform="matrix(0,0.5133196,-0.5561127,0,10.600461,1.9479236)"
-         d="M 8.4693069 6.4767327 A 4.0769801 6.171782 0 1 1  0.31534672,6.4767327 A 4.0769801 6.171782 0 1 1  8.4693069 6.4767327 z"
-         sodipodi:type="arc"
-         style="fill:url(#radialGradient2173-31);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:ry="6.171782"
-         sodipodi:rx="4.0769801" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/rangeslider-v-ins.svg b/mac/Cillop/gtk-2.0/rangeslider-v-ins.svg
deleted file mode 100644
index 6e6a5b3..0000000
--- a/mac/Cillop/gtk-2.0/rangeslider-v-ins.svg
+++ /dev/null
@@ -1,126 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg3804"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="rangeslider-v-ins.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="7.7007336"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1008"
-     inkscape:window-height="698"
-     inkscape:window-x="8"
-     inkscape:window-y="42" />
-  <defs
-     id="defs3806">
-    <linearGradient
-       id="linearGradient3665">
-      <stop
-         offset="0"
-         id="stop3667"
-         style="stop-color:#ebebeb;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop3669"
-         style="stop-color:#a5a5a5;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4704-951-989">
-      <stop
-         offset="0"
-         id="stop6373"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop6375"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient4879"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-2.0143772,0,0,-1.0472177,43.790224,13.986294)"
-       cx="14.527122"
-       cy="6.8330836"
-       fx="14.527122"
-       fy="6.8330836"
-       r="7.3700495" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient4881"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-  </defs>
-  <metadata
-     id="metadata3809">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <g
-       id="g4875"
-       transform="matrix(0,-0.8576401,0.8588311,0,0.9892574,13.001653)">
-      <path
-         transform="matrix(0,0.9506982,-0.9402534,0,13.68145,0.2959886)"
-         d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-         sodipodi:ry="6.937624"
-         sodipodi:rx="6.8700495"
-         sodipodi:cy="7.1074257"
-         sodipodi:cx="7.0502477"
-         id="path4881"
-         style="fill:url(#radialGradient4879);fill-opacity:1;fill-rule:nonzero;stroke:#848484;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         transform="matrix(0,0.5993913,-0.6482327,0,11.197098,1.1010356)"
-         d="M 8.4693069 6.4767327 A 4.0769801 6.171782 0 1 1  0.31534672,6.4767327 A 4.0769801 6.171782 0 1 1  8.4693069 6.4767327 z"
-         sodipodi:ry="6.171782"
-         sodipodi:rx="4.0769801"
-         sodipodi:cy="6.4767327"
-         sodipodi:cx="4.3923268"
-         id="path6875"
-         style="fill:url(#radialGradient4881);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/rangeslider-v-pre.svg b/mac/Cillop/gtk-2.0/rangeslider-v-pre.svg
deleted file mode 100644
index fdf17ac..0000000
--- a/mac/Cillop/gtk-2.0/rangeslider-v-pre.svg
+++ /dev/null
@@ -1,192 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg3804"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="rangeslider-v-pre.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="7.7007336"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1008"
-     inkscape:window-height="698"
-     inkscape:window-x="8"
-     inkscape:window-y="42" />
-  <defs
-     id="defs3806">
-    <linearGradient
-       id="linearGradient3665">
-      <stop
-         offset="0"
-         id="stop3667"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop3669"
-         style="stop-color:#9ea4aa;stop-opacity:0.94117647;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4704-951-989">
-      <stop
-         offset="0"
-         id="stop6373"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop6375"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       id="radialGradient4879"
-       r="7.3700495"
-       gradientTransform="matrix(-1.1290972,0,0,-1.2063514,30.929654,15.073668)"
-       cx="13.594742"
-       cy="6.8330836"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient3665"
-       fy="6.8330836"
-       fx="13.594742" />
-    <radialGradient
-       inkscape:collect="always"
-       id="radialGradient4881"
-       r="4.0769801"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient4704-951-989"
-       fy="6.4767327"
-       fx="0.31534672" />
-    <radialGradient
-       inkscape:collect="always"
-       id="radialGradient2171"
-       r="7.3700495"
-       gradientTransform="matrix(-1.1290972,0,0,-1.2063514,30.929654,15.073668)"
-       cx="13.594742"
-       cy="6.8330836"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient3665"
-       fy="6.8330836"
-       fx="13.594742" />
-    <radialGradient
-       inkscape:collect="always"
-       id="radialGradient2173"
-       r="4.0769801"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient4704-951-989"
-       fy="6.4767327"
-       fx="0.31534672" />
-    <radialGradient
-       inkscape:collect="always"
-       id="radialGradient2171-951"
-       r="7.3700495"
-       gradientTransform="matrix(-1.1290972,0,0,-1.2063514,30.929654,15.073668)"
-       cx="13.594742"
-       cy="6.8330836"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient3665-855"
-       fy="6.8330836"
-       fx="13.594742" />
-    <linearGradient
-       id="linearGradient3665-855">
-      <stop
-         offset="0"
-         id="stop2226"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop2228"
-         style="stop-color:#b0b6bd;stop-opacity:0.94117647;" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       id="radialGradient2173-31"
-       r="4.0769801"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       gradientUnits="userSpaceOnUse"
-       xlink:href="#linearGradient4704-951-989-495"
-       fy="6.4767327"
-       fx="0.31534672" />
-    <linearGradient
-       id="linearGradient4704-951-989-495">
-      <stop
-         offset="0"
-         id="stop2232"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop2234"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-  </defs>
-  <metadata
-     id="metadata3809">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <g
-       transform="matrix(0,-1,1,0,2.1615327e-5,13.997315)"
-       id="g2167">
-      <path
-         id="path4881"
-         sodipodi:cx="7.0502477"
-         sodipodi:cy="7.1074257"
-         transform="matrix(0,0.8141794,-0.8066345,0,12.731763,1.2584802)"
-         d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-         sodipodi:type="arc"
-         style="fill:url(#radialGradient2171-951);fill-opacity:1;fill-rule:nonzero;stroke:#6e6e6e;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:ry="6.937624"
-         sodipodi:rx="6.8700495" />
-      <path
-         id="path6875"
-         sodipodi:cx="4.3923268"
-         sodipodi:cy="6.4767327"
-         transform="matrix(0,0.5133196,-0.5561127,0,10.600461,1.9479236)"
-         d="M 8.4693069 6.4767327 A 4.0769801 6.171782 0 1 1  0.31534672,6.4767327 A 4.0769801 6.171782 0 1 1  8.4693069 6.4767327 z"
-         sodipodi:type="arc"
-         style="fill:url(#radialGradient2173-31);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:ry="6.171782"
-         sodipodi:rx="4.0769801" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/rangeslider-v.svg b/mac/Cillop/gtk-2.0/rangeslider-v.svg
deleted file mode 100644
index 3b67cdf..0000000
--- a/mac/Cillop/gtk-2.0/rangeslider-v.svg
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg3804"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="rangeslider-v.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="7.7007336"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1008"
-     inkscape:window-height="698"
-     inkscape:window-x="8"
-     inkscape:window-y="42" />
-  <defs
-     id="defs3806">
-    <linearGradient
-       id="linearGradient3665">
-      <stop
-         offset="0"
-         id="stop3667"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop3669"
-         style="stop-color:#8e9499;stop-opacity:0.94117647;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4704-951-989">
-      <stop
-         offset="0"
-         id="stop6373"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop6375"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient4879"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-1.1290972,0,0,-1.2063514,30.929654,15.073668)"
-       cx="13.594742"
-       cy="6.8330836"
-       fx="13.594742"
-       fy="6.8330836"
-       r="7.3700495" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient4881"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient2171"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-1.1290972,0,0,-1.2063514,30.929654,15.073668)"
-       cx="13.594742"
-       cy="6.8330836"
-       fx="13.594742"
-       fy="6.8330836"
-       r="7.3700495" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient2173"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-  </defs>
-  <metadata
-     id="metadata3809">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <g
-       id="g2167"
-       transform="matrix(0,-1,1,0,2.1615327e-5,13.997315)">
-      <path
-         transform="matrix(0,0.8141794,-0.8066345,0,12.731763,1.2584802)"
-         d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-         sodipodi:ry="6.937624"
-         sodipodi:rx="6.8700495"
-         sodipodi:cy="7.1074257"
-         sodipodi:cx="7.0502477"
-         id="path4881"
-         style="fill:url(#radialGradient2171);fill-opacity:1;fill-rule:nonzero;stroke:#636363;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         transform="matrix(0,0.5133196,-0.5561127,0,10.600461,1.9479236)"
-         d="M 8.4693069 6.4767327 A 4.0769801 6.171782 0 1 1  0.31534672,6.4767327 A 4.0769801 6.171782 0 1 1  8.4693069 6.4767327 z"
-         sodipodi:ry="6.171782"
-         sodipodi:rx="4.0769801"
-         sodipodi:cy="6.4767327"
-         sodipodi:cx="4.3923268"
-         id="path6875"
-         style="fill:url(#radialGradient2173);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/rangeslider.svg b/mac/Cillop/gtk-2.0/rangeslider.svg
deleted file mode 100644
index 8dc2faa..0000000
--- a/mac/Cillop/gtk-2.0/rangeslider.svg
+++ /dev/null
@@ -1,125 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg3804"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="rangeslider.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="7.7007336"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1008"
-     inkscape:window-height="698"
-     inkscape:window-x="8"
-     inkscape:window-y="52" />
-  <defs
-     id="defs3806">
-    <linearGradient
-       id="linearGradient3665">
-      <stop
-         offset="0"
-         id="stop3667"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop3669"
-         style="stop-color:#8e9499;stop-opacity:0.94117647;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4704-951-989">
-      <stop
-         offset="0"
-         id="stop6373"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop6375"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient2171"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-1.1290972,0,0,-1.2063514,30.929654,15.073668)"
-       cx="13.594742"
-       cy="6.8330836"
-       fx="13.594742"
-       fy="6.8330836"
-       r="7.3700495" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient2173"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-  </defs>
-  <metadata
-     id="metadata3809">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <g
-       id="g2167">
-      <path
-         transform="matrix(0,0.8141794,-0.8066345,0,12.731763,1.2584802)"
-         d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-         sodipodi:ry="6.937624"
-         sodipodi:rx="6.8700495"
-         sodipodi:cy="7.1074257"
-         sodipodi:cx="7.0502477"
-         id="path4881"
-         style="fill:url(#radialGradient2171);fill-opacity:1;fill-rule:nonzero;stroke:#636363;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         transform="matrix(0,0.5133196,-0.5561127,0,10.600461,1.9479236)"
-         d="M 8.4693069 6.4767327 A 4.0769801 6.171782 0 1 1  0.31534672,6.4767327 A 4.0769801 6.171782 0 1 1  8.4693069 6.4767327 z"
-         sodipodi:ry="6.171782"
-         sodipodi:rx="4.0769801"
-         sodipodi:cy="6.4767327"
-         sodipodi:cx="4.3923268"
-         id="path6875"
-         style="fill:url(#radialGradient2173);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/rangetrough-focus.png b/mac/Cillop/gtk-2.0/rangetrough-focus.png
deleted file mode 100644
index 47a3429..0000000
Binary files a/mac/Cillop/gtk-2.0/rangetrough-focus.png and /dev/null differ
diff --git a/mac/Cillop/gtk-2.0/rangetrough-focus.svg b/mac/Cillop/gtk-2.0/rangetrough-focus.svg
deleted file mode 100644
index 545fb36..0000000
--- a/mac/Cillop/gtk-2.0/rangetrough-focus.svg
+++ /dev/null
@@ -1,174 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg1307"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0"
-   sodipodi:docname="rangetrough-focus.svg"
-   version="1.0"
-   inkscape:export-filename="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0/rangetrough-focus.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs1309">
-    <linearGradient
-       id="linearGradient5808">
-      <stop
-         style="stop-color:#969696;stop-opacity:1;"
-         offset="0"
-         id="stop5810" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:1;"
-         offset="1"
-         id="stop5812" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient16819">
-      <stop
-         id="stop16821"
-         offset="0"
-         style="stop-color:#ffffff;stop-opacity:0.19607843;" />
-      <stop
-         id="stop16823"
-         offset="1"
-         style="stop-color:#000000;stop-opacity:0.19607843;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5808"
-       id="linearGradient5814"
-       x1="-0.56191593"
-       y1="35.137894"
-       x2="-12.579332"
-       y2="35.0508"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8654669,0,0,0.1605019,-0.9417338,2.1849467)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient16819"
-       id="linearGradient5816"
-       x1="-13.393001"
-       y1="30.000002"
-       x2="-0.59684116"
-       y2="30.000002"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8654669,0,0,0.1605019,-0.9417338,2.1849467)" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient16819"
-       id="linearGradient4913"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8654669,0,0,0.1605019,-0.9417338,2.1849467)"
-       x1="-13.393001"
-       y1="30.000002"
-       x2="-0.59684116"
-       y2="30.000002" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5808"
-       id="linearGradient4915"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8654669,0,0,0.1605019,-0.9417338,2.1849467)"
-       x1="-0.56191593"
-       y1="35.137894"
-       x2="-12.579332"
-       y2="35.0508" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient16819"
-       id="linearGradient4921"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8654669,0,0,0.1605019,-0.9417338,2.1849467)"
-       x1="-13.393001"
-       y1="30.000002"
-       x2="-0.59684116"
-       y2="30.000002" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5808"
-       id="linearGradient4923"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.8654669,0,0,0.1605019,-0.9417338,2.1849467)"
-       x1="-0.56191593"
-       y1="35.137894"
-       x2="-12.579332"
-       y2="35.0508" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient16819"
-       id="linearGradient5896"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1636007,0,0,0.215791,1.1452032,0.5262733)"
-       x1="-13.393001"
-       y1="30.000002"
-       x2="-0.59684116"
-       y2="30.000002" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5808"
-       id="linearGradient5898"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1636007,0,0,0.215791,1.1452032,0.5262733)"
-       x1="-0.56191593"
-       y1="35.137894"
-       x2="-12.579332"
-       y2="35.0508" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="11.483333"
-     inkscape:cx="6.9999998"
-     inkscape:cy="5.6168359"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1012"
-     inkscape:window-height="689"
-     inkscape:window-x="341"
-     inkscape:window-y="94"
-     borderlayer="top" />
-  <metadata
-     id="metadata1312">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <rect
-       transform="matrix(0,-1,1,0,0,0)"
-       ry="6.3277531"
-       rx="6.3277593"
-       y="0.67224783"
-       x="-13.327762"
-       height="12.655506"
-       width="12.655519"
-       id="rect4917"
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#6889a6;stroke-width:1.34447694;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.56000004;stroke-opacity:1" />
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/slider-h-ins.svg b/mac/Cillop/gtk-2.0/slider-h-ins.svg
deleted file mode 100644
index 797162e..0000000
--- a/mac/Cillop/gtk-2.0/slider-h-ins.svg
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg3804"
-   sodipodi:version="0.32"
-   inkscape:version="0.45"
-   sodipodi:docbase="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0"
-   sodipodi:docname="slider-h-ins.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0"
-   sodipodi:modified="true">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="7.7007336"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1008"
-     inkscape:window-height="678"
-     inkscape:window-x="488"
-     inkscape:window-y="214" />
-  <defs
-     id="defs3806">
-    <linearGradient
-       id="linearGradient3665">
-      <stop
-         offset="0"
-         id="stop3667"
-         style="stop-color:#ebebeb;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop3669"
-         style="stop-color:#a5a5a5;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4704-951-989">
-      <stop
-         offset="0"
-         id="stop6373"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop6375"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient7267"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-2.0143772,0,0,-1.0472177,43.790224,13.986294)"
-       cx="14.527122"
-       cy="6.8330836"
-       fx="14.527122"
-       fy="6.8330836"
-       r="7.3700495" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient7269"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-  </defs>
-  <metadata
-     id="metadata3809">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <g
-       id="g7263"
-       transform="matrix(0,1,-1,0,13.997315,-2.2298696e-5)">
-      <path
-         transform="matrix(0.9506982,0,0,0.9402534,0.2960109,0.3158652)"
-         d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-         sodipodi:ry="6.937624"
-         sodipodi:rx="6.8700495"
-         sodipodi:cy="7.1074257"
-         sodipodi:cx="7.0502477"
-         id="path4881"
-         style="fill:url(#radialGradient7267);fill-opacity:1;fill-rule:nonzero;stroke:#848484;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         transform="matrix(0.5993913,0,0,0.6482327,1.1010579,2.8002167)"
-         d="M 8.4693069 6.4767327 A 4.0769801 6.171782 0 1 1  0.31534672,6.4767327 A 4.0769801 6.171782 0 1 1  8.4693069 6.4767327 z"
-         sodipodi:ry="6.171782"
-         sodipodi:rx="4.0769801"
-         sodipodi:cy="6.4767327"
-         sodipodi:cx="4.3923268"
-         id="path6875"
-         style="fill:url(#radialGradient7269);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/slider-h-pre.svg b/mac/Cillop/gtk-2.0/slider-h-pre.svg
deleted file mode 100644
index 7421e8b..0000000
--- a/mac/Cillop/gtk-2.0/slider-h-pre.svg
+++ /dev/null
@@ -1,221 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg3804"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="slider-h-pre.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="9.8375039"
-     inkscape:cy="5.8987534"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1008"
-     inkscape:window-height="698"
-     inkscape:window-x="8"
-     inkscape:window-y="42" />
-  <defs
-     id="defs3806">
-    <linearGradient
-       id="linearGradient12110">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop12112" />
-      <stop
-         id="stop12118"
-         offset="0.5"
-         style="stop-color:#ffffff;stop-opacity:0.49803922;" />
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="1"
-         id="stop12114" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2788">
-      <stop
-         style="stop-color:#c5d0a0;stop-opacity:1;"
-         offset="0"
-         id="stop2790" />
-      <stop
-         id="stop2783"
-         offset="1"
-         style="stop-color:#b5c385;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient7212">
-      <stop
-         style="stop-color:#6889a6;stop-opacity:0.94117647;"
-         offset="0"
-         id="stop7214" />
-      <stop
-         style="stop-color:#6889a6;stop-opacity:0.56470591;"
-         offset="1"
-         id="stop7216" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3665">
-      <stop
-         offset="0"
-         id="stop3667"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop3669"
-         style="stop-color:#8e9499;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4704-951-989">
-      <stop
-         offset="0"
-         id="stop6373"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop6375"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient7046"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-2.0143772,0,0,-1.0472177,43.790224,13.986294)"
-       cx="14.527122"
-       cy="6.8330836"
-       fx="14.527122"
-       fy="6.8330836"
-       r="7.3700495" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient7048"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2788"
-       id="linearGradient4348"
-       x1="-0.075772679"
-       y1="6.9986464"
-       x2="14.07311"
-       y2="6.9986464"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient12110"
-       id="linearGradient12116"
-       x1="-1.2000418"
-       y1="7.1074257"
-       x2="15.300537"
-       y2="7.1074257"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient13094"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-2.0143772,0,0,-1.0472177,43.790224,13.986294)"
-       cx="14.527122"
-       cy="6.8330836"
-       fx="14.527122"
-       fy="6.8330836"
-       r="7.3700495" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient12110"
-       id="linearGradient13096"
-       gradientUnits="userSpaceOnUse"
-       x1="-1.2000418"
-       y1="7.1074257"
-       x2="15.300537"
-       y2="7.1074257" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient13098"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-  </defs>
-  <metadata
-     id="metadata3809">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <g
-       id="g3158">
-      <path
-         transform="matrix(0,0.9506982,-0.9402534,0,13.68145,0.2959884)"
-         d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-         sodipodi:ry="6.937624"
-         sodipodi:rx="6.8700495"
-         sodipodi:cy="7.1074257"
-         sodipodi:cx="7.0502477"
-         id="path4881"
-         style="fill:url(#radialGradient13094);fill-opacity:1;fill-rule:nonzero;stroke:#646464;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         sodipodi:type="arc"
-         style="opacity:0.5;fill:url(#linearGradient13096);fill-opacity:1;fill-rule:nonzero;stroke:#f0ede4;stroke-width:2.76047993;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="path3365"
-         sodipodi:cx="7.0502477"
-         sodipodi:cy="7.1074257"
-         sodipodi:rx="6.8700495"
-         sodipodi:ry="6.937624"
-         d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-         transform="matrix(-0.728533,0,0,-0.7205127,12.135007,12.119637)" />
-      <path
-         transform="matrix(0,0.5993913,-0.6482327,0,11.197098,1.1010354)"
-         d="M 8.4693069 6.4767327 A 4.0769801 6.171782 0 1 1  0.31534672,6.4767327 A 4.0769801 6.171782 0 1 1  8.4693069 6.4767327 z"
-         sodipodi:ry="6.171782"
-         sodipodi:rx="4.0769801"
-         sodipodi:cy="6.4767327"
-         sodipodi:cx="4.3923268"
-         id="path6875"
-         style="fill:url(#radialGradient13098);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/slider-h.svg b/mac/Cillop/gtk-2.0/slider-h.svg
deleted file mode 100644
index 8f03045..0000000
--- a/mac/Cillop/gtk-2.0/slider-h.svg
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg3804"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="slider-h.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="7.7007336"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1008"
-     inkscape:window-height="698"
-     inkscape:window-x="8"
-     inkscape:window-y="42" />
-  <defs
-     id="defs3806">
-    <linearGradient
-       id="linearGradient3665">
-      <stop
-         offset="0"
-         id="stop3667"
-         style="stop-color:#eaecec;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop3669"
-         style="stop-color:#81888d;stop-opacity:0.94117647;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4704-951-989">
-      <stop
-         offset="0"
-         id="stop6373"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop6375"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient7061"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-2.0143772,0,0,-1.0472177,43.790224,13.986294)"
-       cx="14.527122"
-       cy="6.8330836"
-       fx="14.527122"
-       fy="6.8330836"
-       r="7.3700495" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient7063"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient2171"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-2.0143772,0,0,-1.0472177,43.790224,13.986294)"
-       cx="14.527122"
-       cy="6.8330836"
-       fx="14.527122"
-       fy="6.8330836"
-       r="7.3700495" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient2173"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-  </defs>
-  <metadata
-     id="metadata3809">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <g
-       id="g2167"
-       transform="matrix(0,1,-1,0,13.997315,-2.2298696e-5)">
-      <path
-         transform="matrix(0.9506982,0,0,0.9402534,0.2960109,0.3158652)"
-         d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-         sodipodi:ry="6.937624"
-         sodipodi:rx="6.8700495"
-         sodipodi:cy="7.1074257"
-         sodipodi:cx="7.0502477"
-         id="path4881"
-         style="fill:url(#radialGradient2171);fill-opacity:1;fill-rule:nonzero;stroke:#646464;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         transform="matrix(0.5993913,0,0,0.6482327,1.1010579,2.8002167)"
-         d="M 8.4693069 6.4767327 A 4.0769801 6.171782 0 1 1  0.31534672,6.4767327 A 4.0769801 6.171782 0 1 1  8.4693069 6.4767327 z"
-         sodipodi:ry="6.171782"
-         sodipodi:rx="4.0769801"
-         sodipodi:cy="6.4767327"
-         sodipodi:cx="4.3923268"
-         id="path6875"
-         style="fill:url(#radialGradient2173);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/slider-v-ins.svg b/mac/Cillop/gtk-2.0/slider-v-ins.svg
deleted file mode 100644
index 8ca1011..0000000
--- a/mac/Cillop/gtk-2.0/slider-v-ins.svg
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg3804"
-   sodipodi:version="0.32"
-   inkscape:version="0.45"
-   sodipodi:docbase="/home/emrah/.themes/Cillop-Mediterranean/gtk-2.0"
-   sodipodi:docname="slider-v-ins.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0"
-   sodipodi:modified="true">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="7.7007336"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1008"
-     inkscape:window-height="678"
-     inkscape:window-x="488"
-     inkscape:window-y="214" />
-  <defs
-     id="defs3806">
-    <linearGradient
-       id="linearGradient3665">
-      <stop
-         offset="0"
-         id="stop3667"
-         style="stop-color:#ebebeb;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop3669"
-         style="stop-color:#a5a5a5;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4704-951-989">
-      <stop
-         offset="0"
-         id="stop6373"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop6375"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient7061"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-2.0143772,0,0,-1.0472177,43.790224,13.986294)"
-       cx="14.527122"
-       cy="6.8330836"
-       fx="14.527122"
-       fy="6.8330836"
-       r="7.3700495" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient7063"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-  </defs>
-  <metadata
-     id="metadata3809">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <path
-       sodipodi:type="arc"
-       style="fill:url(#radialGradient7061);fill-opacity:1;fill-rule:nonzero;stroke:#848484;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4881"
-       sodipodi:cx="7.0502477"
-       sodipodi:cy="7.1074257"
-       sodipodi:rx="6.8700495"
-       sodipodi:ry="6.937624"
-       d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-       transform="matrix(0.9506982,0,0,0.9402534,0.2960109,0.3158652)" />
-    <path
-       sodipodi:type="arc"
-       style="fill:url(#radialGradient7063);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path6875"
-       sodipodi:cx="4.3923268"
-       sodipodi:cy="6.4767327"
-       sodipodi:rx="4.0769801"
-       sodipodi:ry="6.171782"
-       d="M 8.4693069 6.4767327 A 4.0769801 6.171782 0 1 1  0.31534672,6.4767327 A 4.0769801 6.171782 0 1 1  8.4693069 6.4767327 z"
-       transform="matrix(0.5993913,0,0,0.6482327,1.1010579,2.8002167)" />
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/slider-v-pre.svg b/mac/Cillop/gtk-2.0/slider-v-pre.svg
deleted file mode 100644
index 3f3c9a2..0000000
--- a/mac/Cillop/gtk-2.0/slider-v-pre.svg
+++ /dev/null
@@ -1,160 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg3804"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="slider-v-pre.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="9.8375039"
-     inkscape:cy="5.8987534"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1008"
-     inkscape:window-height="698"
-     inkscape:window-x="8"
-     inkscape:window-y="52" />
-  <defs
-     id="defs3806">
-    <linearGradient
-       id="linearGradient12110">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop12112" />
-      <stop
-         id="stop12118"
-         offset="0.5"
-         style="stop-color:#ffffff;stop-opacity:0.49803922;" />
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="1"
-         id="stop12114" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3665">
-      <stop
-         offset="0"
-         id="stop3667"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop3669"
-         style="stop-color:#8e9499;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4704-951-989">
-      <stop
-         offset="0"
-         id="stop6373"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop6375"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient3163"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-2.0143772,0,0,-1.0472177,43.790224,13.986294)"
-       cx="14.527122"
-       cy="6.8330836"
-       fx="14.527122"
-       fy="6.8330836"
-       r="7.3700495" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient12110"
-       id="linearGradient3165"
-       gradientUnits="userSpaceOnUse"
-       x1="-1.2000418"
-       y1="7.1074257"
-       x2="15.300537"
-       y2="7.1074257" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient3167"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-  </defs>
-  <metadata
-     id="metadata3809">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <g
-       id="g3158"
-       transform="matrix(0,-1,1,0,2.2661333e-5,13.997315)">
-      <path
-         transform="matrix(0,0.9506982,-0.9402534,0,13.68145,0.2959884)"
-         d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-         sodipodi:ry="6.937624"
-         sodipodi:rx="6.8700495"
-         sodipodi:cy="7.1074257"
-         sodipodi:cx="7.0502477"
-         id="path4881"
-         style="fill:url(#radialGradient3163);fill-opacity:1;fill-rule:nonzero;stroke:#646464;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-      <path
-         sodipodi:type="arc"
-         style="opacity:0.5;fill:url(#linearGradient3165);fill-opacity:1;fill-rule:nonzero;stroke:#f0ede4;stroke-width:2.76047993;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="path3365"
-         sodipodi:cx="7.0502477"
-         sodipodi:cy="7.1074257"
-         sodipodi:rx="6.8700495"
-         sodipodi:ry="6.937624"
-         d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-         transform="matrix(-0.728533,0,0,-0.7205127,12.135007,12.119637)" />
-      <path
-         transform="matrix(0,0.5993913,-0.6482327,0,11.197098,1.1010354)"
-         d="M 8.4693069 6.4767327 A 4.0769801 6.171782 0 1 1  0.31534672,6.4767327 A 4.0769801 6.171782 0 1 1  8.4693069 6.4767327 z"
-         sodipodi:ry="6.171782"
-         sodipodi:rx="4.0769801"
-         sodipodi:cy="6.4767327"
-         sodipodi:cx="4.3923268"
-         id="path6875"
-         style="fill:url(#radialGradient3167);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         sodipodi:type="arc" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/slider-v.svg b/mac/Cillop/gtk-2.0/slider-v.svg
deleted file mode 100644
index 02986ef..0000000
--- a/mac/Cillop/gtk-2.0/slider-v.svg
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg3804"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="slider-v.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   version="1.0">
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="22.197802"
-     inkscape:cx="8"
-     inkscape:cy="7.7007336"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1008"
-     inkscape:window-height="698"
-     inkscape:window-x="8"
-     inkscape:window-y="42" />
-  <defs
-     id="defs3806">
-    <linearGradient
-       id="linearGradient3665">
-      <stop
-         offset="0"
-         id="stop3667"
-         style="stop-color:#eaecec;stop-opacity:1;" />
-      <stop
-         offset="1"
-         id="stop3669"
-         style="stop-color:#81888d;stop-opacity:0.94117647;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient4704-951-989">
-      <stop
-         offset="0"
-         id="stop6373"
-         style="stop-color:#ffffff;stop-opacity:1" />
-      <stop
-         offset="1"
-         id="stop6375"
-         style="stop-color:#ffffff;stop-opacity:0" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3665"
-       id="radialGradient7061"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(-2.0143772,0,0,-1.0472177,43.790224,13.986294)"
-       cx="14.527122"
-       cy="6.8330836"
-       fx="14.527122"
-       fy="6.8330836"
-       r="7.3700495" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4704-951-989"
-       id="radialGradient7063"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.1811017,0,0,2.4431506,-0.3724566,-9.3469007)"
-       cx="0.31534672"
-       cy="6.4767327"
-       fx="0.31534672"
-       fy="6.4767327"
-       r="4.0769801" />
-  </defs>
-  <metadata
-     id="metadata3809">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer1"
-     inkscape:label="Layer 1">
-    <path
-       sodipodi:type="arc"
-       style="fill:url(#radialGradient7061);fill-opacity:1;fill-rule:nonzero;stroke:#646464;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4881"
-       sodipodi:cx="7.0502477"
-       sodipodi:cy="7.1074257"
-       sodipodi:rx="6.8700495"
-       sodipodi:ry="6.937624"
-       d="M 13.920297 7.1074257 A 6.8700495 6.937624 0 1 1  0.18019819,7.1074257 A 6.8700495 6.937624 0 1 1  13.920297 7.1074257 z"
-       transform="matrix(0.9506982,0,0,0.9402534,0.2960109,0.3158652)" />
-    <path
-       sodipodi:type="arc"
-       style="fill:url(#radialGradient7063);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path6875"
-       sodipodi:cx="4.3923268"
-       sodipodi:cy="6.4767327"
-       sodipodi:rx="4.0769801"
-       sodipodi:ry="6.171782"
-       d="M 8.4693069 6.4767327 A 4.0769801 6.171782 0 1 1  0.31534672,6.4767327 A 4.0769801 6.171782 0 1 1  8.4693069 6.4767327 z"
-       transform="matrix(0.5993913,0,0,0.6482327,1.1010579,2.8002167)" />
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/trough2-h.svg b/mac/Cillop/gtk-2.0/trough2-h.svg
deleted file mode 100644
index 090eabb..0000000
--- a/mac/Cillop/gtk-2.0/trough2-h.svg
+++ /dev/null
@@ -1,140 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg1307"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="trough2-h.svg"
-   version="1.0"
-   inkscape:export-filename="/home/emrah/.themes/Polycarbonate-0.5/gtk-2.0/trough2.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs1309">
-    <linearGradient
-       id="linearGradient5808">
-      <stop
-         style="stop-color:#000000;stop-opacity:0.43055555;"
-         offset="0"
-         id="stop5810" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0.47058824;"
-         offset="1"
-         id="stop5812" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient16819">
-      <stop
-         id="stop16821"
-         offset="0"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         id="stop16823"
-         offset="1"
-         style="stop-color:#c0c1bb;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient16819"
-       id="linearGradient2182"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1929542,0,0,0.2212349,1.3506792,-13.637044)"
-       x1="-13.393001"
-       y1="30.000002"
-       x2="-0.59684116"
-       y2="30.000002" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5808"
-       id="linearGradient2184"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1929542,0,0,0.2212349,1.3506792,-13.637044)"
-       x1="-0.56191593"
-       y1="35.137894"
-       x2="-12.579332"
-       y2="35.0508" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5808"
-       id="linearGradient2186"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0113854,0,0,0.1875627,14.079697,-12.626879)"
-       x1="-0.56191593"
-       y1="35.137894"
-       x2="-12.579332"
-       y2="35.0508" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#dddddd"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="1"
-     inkscape:pageshadow="2"
-     inkscape:zoom="32.142857"
-     inkscape:cx="7"
-     inkscape:cy="7"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1024"
-     inkscape:window-height="689"
-     inkscape:window-x="2"
-     inkscape:window-y="52"
-     borderlayer="top"
-     showguides="true"
-     inkscape:guide-bbox="true" />
-  <metadata
-     id="metadata1312">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <g
-       id="g2178"
-       transform="matrix(0,1,1,0,0,0)">
-      <rect
-         transform="scale(-1,-1)"
-         ry="6.4873867"
-         rx="6.4873862"
-         y="-13.487387"
-         x="-13.487387"
-         height="12.974773"
-         width="12.974773"
-         id="rect4896"
-         style="fill:url(#linearGradient2182);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2184);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.56000004;stroke-opacity:1" />
-      <rect
-         style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2186);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.56000004;stroke-opacity:1"
-         id="rect3294"
-         width="11"
-         height="11"
-         x="1.5"
-         y="-12.5"
-         rx="5.4999995"
-         ry="5.5"
-         transform="scale(1,-1)" />
-    </g>
-  </g>
-</svg>
diff --git a/mac/Cillop/gtk-2.0/trough2.svg b/mac/Cillop/gtk-2.0/trough2.svg
deleted file mode 100644
index 3f0745e..0000000
--- a/mac/Cillop/gtk-2.0/trough2.svg
+++ /dev/null
@@ -1,136 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://web.resource.org/cc/"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="14"
-   height="14"
-   id="svg1307"
-   sodipodi:version="0.32"
-   inkscape:version="0.45.1"
-   sodipodi:docbase="/home/emrah/.themes/Cillop/gtk-2.0"
-   sodipodi:docname="trough2.svg"
-   version="1.0"
-   inkscape:export-filename="/home/emrah/.themes/Polycarbonate-0.5/gtk-2.0/trough2.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs1309">
-    <linearGradient
-       id="linearGradient5808">
-      <stop
-         style="stop-color:#000000;stop-opacity:0.43055555;"
-         offset="0"
-         id="stop5810" />
-      <stop
-         style="stop-color:#ffffff;stop-opacity:0.47058824;"
-         offset="1"
-         id="stop5812" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient16819">
-      <stop
-         id="stop16821"
-         offset="0"
-         style="stop-color:#ffffff;stop-opacity:1;" />
-      <stop
-         id="stop16823"
-         offset="1"
-         style="stop-color:#c0c1bb;stop-opacity:1;" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient16819"
-       id="linearGradient3290"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1929542,0,0,0.2212349,1.3506792,-13.637044)"
-       x1="-13.393001"
-       y1="30.000002"
-       x2="-0.59684116"
-       y2="30.000002" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5808"
-       id="linearGradient3292"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.1929542,0,0,0.2212349,1.3506792,-13.637044)"
-       x1="-0.56191593"
-       y1="35.137894"
-       x2="-12.579332"
-       y2="35.0508" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5808"
-       id="linearGradient3298"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.0113854,0,0,0.1875627,14.079697,-12.626879)"
-       x1="-0.56191593"
-       y1="35.137894"
-       x2="-12.579332"
-       y2="35.0508" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#dddddd"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="1"
-     inkscape:pageshadow="2"
-     inkscape:zoom="45.933332"
-     inkscape:cx="8.0984692"
-     inkscape:cy="7.229651"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     inkscape:window-width="1024"
-     inkscape:window-height="716"
-     inkscape:window-x="0"
-     inkscape:window-y="52"
-     borderlayer="top"
-     showguides="true"
-     inkscape:guide-bbox="true" />
-  <metadata
-     id="metadata1312">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <rect
-       style="fill:url(#linearGradient3290);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3292);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.56000004;stroke-opacity:1"
-       id="rect4896"
-       width="12.974773"
-       height="12.974773"
-       x="-13.487387"
-       y="-13.487387"
-       rx="6.4873862"
-       ry="6.4873867"
-       transform="scale(-1,-1)" />
-    <rect
-       transform="scale(1,-1)"
-       ry="5.5"
-       rx="5.4999995"
-       y="-12.5"
-       x="1.5"
-       height="11"
-       width="11"
-       id="rect3294"
-       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3298);stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.56000004;stroke-opacity:1" />
-  </g>
-</svg>
diff --git a/mac/README b/mac/README
deleted file mode 100644
index 9c91503..0000000
--- a/mac/README
+++ /dev/null
@@ -1,7 +0,0 @@
-* VLC: bien verifier que dans libtool, shrext_cmds n'a pas ete substitue par shrext (cf extra/contrib/src/Makefile, faad)
-
-* Suite a MAJ pango/cairo: pb avec la fonte Verdana. On supprime sa reference dans fonts.conf, mais faudrait verifier de temps a autre si c'est encore necessaire
-
-* Generation des gst-dependencies:
-perl -lne 'print $1 if /@executable_path\/f\/([\w\d.-]+)/' /tmp/l
-
diff --git a/mac/advene.dsstore b/mac/advene.dsstore
deleted file mode 100644
index d886202..0000000
Binary files a/mac/advene.dsstore and /dev/null differ
diff --git a/mac/background.tiff b/mac/background.tiff
deleted file mode 100755
index 7c59269..0000000
Binary files a/mac/background.tiff and /dev/null differ
diff --git a/mac/create_app_bundle b/mac/create_app_bundle
deleted file mode 100755
index fb7ac3e..0000000
--- a/mac/create_app_bundle
+++ /dev/null
@@ -1,156 +0,0 @@
-#! /bin/sh
-
-THEMENAME=Cillop
-
-# Ensure that we can access /opt
-sudo chmod 755 /opt
-
-# py2app's modulegraph uses file extensions to determine their nature. So, the fact
-# that the advene main script is without extension prevents it from determining it is python code.
-# There is a hack in the setup.py file that will use the alternate name advene_gui.py on MacOS X.
-# We cannot simply use bin/advene.py, since it would conflict with the advene/ package directory name
-# when importing
-cp bin/advene bin/advene_gui.py
-
-# Update the version date
-./scripts/update_version
-
-Basedir=./dist/Advene.app
-Frameworks=${Basedir}/Contents/Frameworks
-Resources=${Basedir}/Contents/Resources
-MacOS=${Basedir}/Contents/MacOS
-
-rm -rf build dist
-/opt/local/bin/python setup.py py2app
-
-# Make sure that all .py files are compiled (esp. advene/plugins/__init__.py)
-/opt/local/bin/python -m compileall lib/advene
-
-# Add advene, simpletal and cherrypy, which do not seem to be taken into account automatically. Should investigate this...
-(cd lib ; zip -r ../dist/Advene.app/Contents/Resources/lib/python2.6/site-packages.zip  advene  simpletal cherrypy -i \*.pyc )
-# Now try to copy the necessary gtk/pango data files (etc, lib)
-
-# Let us put pango and pixbuf loader modules in the same modules directory
-mkdir -p ${Frameworks}/modules
-
-echo "Copying all Pango modules ..."
-cp -R /opt/local/lib/pango/1.6.0/modules/*.so $Frameworks/modules
-
-echo "Copying GTK modules"
-cp -r /opt/local/lib/gtk-2.0 $Resources/lib
-# Remove printbackends, there are issues when otool-ing them
-rm ${Resources}/lib/gtk-2.0/2.10.0/printbackends/*
-
-# generate new pango.modules file
-cat > pangorc <<EOF 
-[Pango]
-ModulesPath=/opt/local/lib/pango/1.6.0/modules
-EOF
-env PANGO_RC_FILE=pangorc /opt/local/bin/pango-querymodules | sed "s?/opt/local/lib/pango/1.6.0/modules/?@executable_path/../Frameworks/modules/?" > $Resources/pango.modules.in
-rm pangorc
-
-# Generate a pangorc pointing to the relocated directory
-cat > $Resources/pangorc.in <<EOF 
-[Pango]
-ModuleFiles=@userconf/pango.modules
-ModulesPath=@executable_path/../Frameworks/modules
-EOF
-
-# Copy the fonts.conf file
-cp /opt/local/etc/fonts/fonts.conf $Resources/fonts.conf
-
-# Remove any reference to Verdana, since it makes Pango unusable
-perl -pi -e 's/.*verdana.*//i' $Resources/fonts.conf
-
-# Copy pixbuf loaders to gtk 2.10 dir
-cp -r /opt/local/lib/gdk-pixbuf-2.0/2.10.0/loaders ${Resources}/lib/gtk-2.0/2.10.0
-
-# generate a new GDK pixbufs loaders file
-sed "s?/opt/local/lib/gdk-pixbuf-2.0/2.10.0/loaders/?@executable_path/../Resources/lib/gtk-2.0/2.10.0/loaders/?" < /opt/local/etc/gtk-2.0/gdk-pixbuf.loaders > $Resources/gdk-pixbuf.loaders.in
-
-# Copy the theme
-[ ! -z "$THEMENAME" ] && cp -r mac/${THEMENAME} ${Resources}/theme
-
-# Some libraries (pixbufloader-gif, pixbufloader-xpm, svg_loader) have too large dependencies. 
-# Use a workaround to shorten @executable_path/../Frameworks 
-ln -s ../Frameworks ${MacOS}/f
-
-# RSVG hack: include librsvg-2.2.dylib and its dependencies (last time I checked 2007/12/17, there was no need of recursively find dependencies from the dependencies)
-cp /opt/local/lib/librsvg-2.2.dylib ${MacOS}/f
-otool -L ${MacOS}/f/librsvg-2.2.dylib  | perl -lne 'print $1 if m!/opt/local/lib/(.+?) !' | while read a ; do if [ ! -e ${MacOS}/f/$a ]; then cp /opt/local/lib/$a ${MacOS}/f ; chmod 755 ${MacOS}/f/$a ; fi ; done
-
-
-# Copy gtk python modules. This will override the py2app way (creating a _gtk.pyc wrapper in the site-packages.zip, which tries to load _gtk.so from lib-dynload, but it crashes)
-#cp -r /opt/local/lib/python2.6/site-packages/gtk-2.0/* $Resources/lib/python2.6
-# FIXME: now in /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/gtk-2.0/
-cp -r  /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/gtk-2.0/* $Resources/lib/python2.6
-
-
-# Copy gstreamer libs
-cp /opt/local/lib/libgst*-0.10.0.dylib ${Frameworks}
-
-# Copy gstreamer plugins and dependencies
-( for n in `cat mac/gst-plugins.txt` 
-do
-   echo "gst plugin $n" >&2
-   cp -r /opt/local/lib/gstreamer-0.10/${p} ${Resources}/gst-plugins
-   otool -L /opt/local/lib/gstreamer-0.10/${n} | perl -lne 'print $1 if m!/opt/local/lib/(.+?\.dylib)!'
-done) | sort -u | ( while read a
-do
-  echo "Copying $a dep" 
-  cp /opt/local/lib/${a} ${Frameworks}
-done )
-
-echo "Fixing library names ..."
-# fix the libraries we include
-for dylib in $Frameworks/*.dylib $Frameworks/modules/*.so $Resources/lib/gtk-2.0/2.10.0/*/*.so $Resources/lib/python2.6/*.so $Resources/lib/python2.6/*/*.so ${Resources}/gst-plugins/*.so
-#for dylib in $Frameworks/*.dylib $Frameworks/modules/*.so $Resources/lib/gtk-2.0/2.10.0/*/*.so $Resources/lib/python2.6/*/*.so ${Resources}/gst-plugins/*.so
-do
-    # skip symlinks
-    if test ! -L $dylib ; then
-	
-	# change all the dependencies
-
-	changes=""
-	for lib in `otool -L $dylib | egrep "(/opt/local|/local/|libs/)" | awk '{print $1}'` ; do
-	    base=`basename $lib`
-	    #changes="$changes -change $lib @executable_path/../Frameworks/$base"
-	    changes="$changes -change $lib @executable_path/f/$base"
-	done
-
-	if test "x$changes" != x ; then
-	    if  install_name_tool $changes $dylib ; then
-		:
-	    else
-                echo "Error for $dylib"
-		#exit 1
-	    fi
-	fi
-
-	# now the change what the library thinks its own name is
-
-	base=`basename $dylib`
-	#install_name_tool -id @executable_path/../Frameworks/$base $dylib
-	install_name_tool -id @executable_path/f/$base $dylib
-    fi
-done
-
-# Copy french gtk2.0 locale
-cp -r /opt/local/share/locale/fr/LC_MESSAGES/*.mo ${Resources}/locale/fr/LC_MESSAGES
-
-# Copy the x11 vlc output module
-# FIXME: to update
-##cp mac/libx11_plugin.dylib ${Resources}
-
-# Fix shotdetect permissions
-chmod 755 ${Resources}/share/shotdetect
-
-# Use the shell wrapper
-mv ${MacOS}/Advene ${MacOS}/Advene.bin
-cp mac/Advene.wrapper ${MacOS}/Advene
-chmod 755 ${MacOS}/Advene
-
-
-# Hide the /opt directory, to make sure that we do not reuse something from there inadvertently
-sudo chmod 000 /opt
-
diff --git a/mac/create_dmg b/mac/create_dmg
deleted file mode 100755
index 676cee6..0000000
--- a/mac/create_dmg
+++ /dev/null
@@ -1,19 +0,0 @@
-#! /bin/sh
-
-relnum=$1
-if [ -z "$relnum" ]
-then
-  echo "Syntaxe: $0 release-number"
-  exit 1
-fi
-
-version=`./scripts/version`
-VERNUM=${version}.${relnum}
-
-echo "Creating image Advene-${VERNUM}.dmg"
-
-ln -s /Applications dist/Applications
-
-`dirname $0`/pkg-dmg --target "Advene-${VERNUM}.dmg" --source dist --volname Advene-${VERNUM} --mkdir /.background --copy mac/background.tiff:/.background  --icon share/pixmaps/advene.icns --copy mac/advene.dsstore:/.DS_Store
-
-# /usr/bin/hdiutil create -fs HFS+ -format UDZO -imagekey zlib-level=9 -srcfolder dist/Advene.app  -volname Advene-${VERNUM} Advene-${VERNUM}.dmg
diff --git a/mac/gst-plugins.txt b/mac/gst-plugins.txt
deleted file mode 100644
index 98b3a9c..0000000
--- a/mac/gst-plugins.txt
+++ /dev/null
@@ -1,147 +0,0 @@
-libgsta52dec.so
-libgstadder.so
-libgstadpcmdec.so
-libgstadpcmenc.so
-libgstaiff.so
-libgstalaw.so
-libgstalpha.so
-libgstalphacolor.so
-libgstapp.so
-libgstasf.so
-libgstasfmux.so
-libgstaudioconvert.so
-libgstaudiofx.so
-libgstaudioparsersbad.so
-libgstaudiorate.so
-libgstaudioresample.so
-libgstaudiotestsrc.so
-libgstauparse.so
-libgstautoconvert.so
-libgstautodetect.so
-libgstavi.so
-libgstbz2.so
-libgstcairo.so
-libgstcamerabin.so
-libgstcdxaparse.so
-libgstcog.so
-libgstcoreelements.so
-libgstcoreindexers.so
-libgstcutter.so
-libgstdataurisrc.so
-libgstdebug.so
-libgstdebugutilsbad.so
-libgstdecodebin.so
-libgstdecodebin2.so
-libgstdeinterlace.so
-libgstdirac.so
-libgstdtsdec.so
-libgstdv.so
-libgstdvdlpcmdec.so
-libgstdvdread.so
-libgstdvdspu.so
-libgstdvdsub.so
-libgstequalizer.so
-libgstfaac.so
-libgstfaad.so
-libgstffmpeg.so
-libgstffmpegcolorspace.so
-libgstffmpegscale.so
-libgstflac.so
-libgstflv.so
-libgstflxdec.so
-libgstfreeze.so
-libgstgdkpixbuf.so
-libgstgdp.so
-libgstgio.so
-libgsth264parse.so
-libgsthdvparse.so
-libgsticydemux.so
-libgstid3demux.so
-libgstid3tag.so
-libgstiec958.so
-libgstinterleave.so
-libgstjp2k.so
-libgstjpeg.so
-libgstjpegformat.so
-libgstlame.so
-libgstlevel.so
-libgstliveadder.so
-libgstmad.so
-libgstmatroska.so
-libgstmms.so
-libgstmpeg2dec.so
-libgstmpeg4videoparse.so
-libgstmpegaudioparse.so
-libgstmpegdemux.so
-libgstmpegpsmux.so
-libgstmpegstream.so
-libgstmpegtsmux.so
-libgstmpegvideoparse.so
-libgstmulaw.so
-libgstmultifile.so
-libgstmultipart.so
-libgstmve.so
-libgstmxf.so
-libgstnavigationtest.so
-libgstneonhttpsrc.so
-libgstnsf.so
-libgstnuvdemux.so
-libgstogg.so
-libgstoss4audio.so
-libgstosxaudio.so
-libgstosxvideosink.so
-libgstosxvideosrc.so
-libgstpango.so
-libgstpcapparse.so
-libgstplaybin.so
-libgstpng.so
-libgstpnm.so
-libgstpostproc.so
-libgstqtdemux.so
-libgstqtmux.so
-libgstrawparse.so
-libgstreal.so
-libgstreplaygain.so
-libgstrfbsrc.so
-libgstrmdemux.so
-libgstrsvg.so
-libgstrtp.so
-libgstrtpmanager.so
-libgstrtpmux.so
-libgstrtsp.so
-libgstscaletempoplugin.so
-libgstsdpelem.so
-libgstshapewipe.so
-libgstshout2.so
-libgstsiren.so
-libgstsmpte.so
-libgstsndfile.so
-libgstspectrum.so
-libgstspeed.so
-libgststereo.so
-libgstsubenc.so
-libgstsubparse.so
-libgsttcp.so
-libgsttheora.so
-libgsttta.so
-libgsttwolame.so
-libgsttypefindfunctions.so
-libgstudp.so
-libgstvideobox.so
-libgstvideocrop.so
-libgstvideomeasure.so
-libgstvideomixer.so
-libgstvideorate.so
-libgstvideoscale.so
-libgstvideosignal.so
-libgstvideotestsrc.so
-libgstvolume.so
-libgstvorbis.so
-libgstwavenc.so
-libgstwavpack.so
-libgstwavparse.so
-libgstx264.so
-libgstximagesink.so
-libgstximagesrc.so
-libgstxvid.so
-libgsty4menc.so
diff --git a/mac/hack_update b/mac/hack_update
deleted file mode 100755
index d6d05f9..0000000
--- a/mac/hack_update
+++ /dev/null
@@ -1,33 +0,0 @@
-#! /bin/sh
-
-SRC=${HOME}/src/advene
-APP=${SRC}/dist/Advene.app
-LIBDIR=${SRC}/lib/advene
-PYDIR=${APP}/Contents/Resources/lib/python2.5
-SITE=${PYDIR}/site-packages.zip
-
-if [ ! -d ${APP} ]
-then
-  echo "Need an uncompressed $APP"
-  exit 1
-fi
-
-if [ ! -d /opt/local/bin ]
-then
-  echo "Need to chmod /opt/local/bin"
-  exit 1
-fi
-
-# Cleanup old .pyc
-find ${LIBDIR} -name \*.pyc | xargs rm
-/opt/local/bin/python2.5 -mcompileall ${LIBDIR}
-
-# Extract site-packages
-[ -d ${PYDIR}/t ] && /bin/rm -rf ${PYDIR}/t
-mkdir ${PYDIR}/t || exit 1
-unzip -d ${PYDIR}/t ${SITE}
-rsync -av --exclude=\*.py --exclude=.svn ${LIBDIR}/ ${PYDIR}/t/advene/
-/bin/rm ${SITE}
-(cd ${PYDIR}/t ; zip -r ${SITE} .)
-/bin/rm -rf ${PYDIR}/t
-
diff --git a/mac/pangohack.c b/mac/pangohack.c
deleted file mode 100644
index 55c89f4..0000000
--- a/mac/pangohack.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* gcc -g -Wall -W pangohack.c -nostartfiles -shared -fPIC -Wl,-soname,pangohack.so.0 -o libpangohack.dylib */
-
-/* gcc -o libpangohack.dylib -dynamiclib pangohack.c -Wall -Wl,-v */
-/*
-  Copyright (C) Tollef Fog Heen <tfheen at canonical.com> 
-
-  Modified by Olivier Aubert <olivier.aubert at liris.cnrs.fr>
-
-  Based on code copyright (C) 2002 Per Kristian Gjermshus <pergj at ifi.uio.no>
-
-  This program is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
-  (at your option) any later version.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program; if not, write to the Free Software
-  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-#include <stdlib.h>
-#include <stdio.h>
-
-const char * pango_get_sysconf_subdirectory (void) {
-  char * d;
-
-  d = getenv("PANGO_SYSCONF_DIR");
-  if ( ! d )
-      d = "/etc/pango32";
-  fprintf(stderr, "Pangohack: using sysconf dir %s\n", d);
-  return d;
-}
-
-const char * pango_get_lib_subdirectory (void) {
-  char * d;
-
-  d = getenv("PANGO_LIB_DIR");
-  if ( ! d )
-      d = "/usr/lib32/pango";
-  fprintf(stderr, "Pangohack: using lib dir %s\n", d);
-  return d;
-}
diff --git a/mac/patch-pango_utils.diff b/mac/patch-pango_utils.diff
deleted file mode 100644
index bf58009..0000000
--- a/mac/patch-pango_utils.diff
+++ /dev/null
@@ -1,32 +0,0 @@
---- pango/pango-utils.c.ORI	2008-11-24 15:03:04.000000000 +0100
-+++ pango/pango-utils.c	2008-11-24 15:04:28.000000000 +0100
-@@ -703,7 +703,13 @@
-     }
-   return result;
- #else
--  return SYSCONFDIR "/pango";
-+  char * d;
-+
-+  d = getenv("PANGO_SYSCONF_DIR");
-+  if ( ! d )
-+      d = SYSCONFDIR "/pango";
-+  fprintf(stderr, "Pango: using sysconf dir %s\n", d);
-+  return d;
- #endif
- }
- 
-@@ -732,7 +738,13 @@
-     }
-   return result;
- #else
--  return LIBDIR "/pango";
-+  char * d;
-+
-+  d = getenv("PANGO_LIB_DIR");
-+  if ( ! d )
-+      d = LIBDIR "/pango";
-+  fprintf(stderr, "Pango: using lib dir %s\n", d);
-+  return d;
- #endif
- }
- 
diff --git a/mac/pkg-dmg b/mac/pkg-dmg
deleted file mode 100755
index 6530ac5..0000000
--- a/mac/pkg-dmg
+++ /dev/null
@@ -1,1447 +0,0 @@
-#!/usr/bin/perl -w
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is pkg-dmg, a Mac OS X disk image (.dmg) packager
-#
-# The Initial Developer of the Original Code is
-# Mark Mentovai <mark at moxienet.com>.
-# Portions created by the Initial Developer are Copyright (C) 2005
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL or the LGPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK *****
-
-use strict;
-use warnings;
-
-=pod
-
-=head1 NAME
-
-B<pkg-dmg> - Mac OS X disk image (.dmg) packager
-
-=head1 SYNOPSIS
-
-B<pkg-dmg>
-B<--source> I<source-folder>
-B<--target> I<target-image>
-[B<--format> I<format>]
-[B<--volname> I<volume-name>]
-[B<--tempdir> I<temp-dir>]
-[B<--mkdir> I<directory>]
-[B<--copy> I<source>[:I<dest>]]
-[B<--license> I<file>]
-[B<--resource> I<file>]
-[B<--icon> I<icns-file>]
-[B<--attribute> I<a>:I<file>[:I<file>...]
-[B<--idme>]
-[B<--sourcefile>]
-[B<--verbosity> I<level>]
-[B<--dry-run>]
-
-=head1 DESCRIPTION
-
-I<pkg-dmg> takes a directory identified by I<source-folder> and transforms
-it into a disk image stored as I<target-image>.  The disk image will
-occupy the least space possible for its format, or the least space that the
-authors have been able to figure out how to achieve.
-
-=head1 OPTIONS
-
-=over 5
-
-==item B<--source> I<source-folder>
-
-Identifies the directory that will be packaged up.  This directory is not
-touched, a copy will be made in a temporary directory for staging purposes.
-See B<--tempdir>.
-
-==item B<--target> I<target-image>
-
-The disk image to create.  If it exists and is not in use, it will be
-overwritten.  If I<target-image> already contains a suitable extension,
-it will be used unmodified.  If no extension is present, or the extension
-is incorrect for the selected format, the proper extension will be added.
-See B<--format>.
-
-==item B<--format> I<format>
-
-The format to create the disk image in.  Valid values for I<format> are:
-     - UDZO - zlib-compressed, read-only; extension I<.dmg>
-     - UDRW - read-write; extension I<.dmg>
-     - UDSP - read-write, sparse; extension I<.sparseimage>
-
-UDZO is the default format.
-
-See L<hdiutil(1)> for a description of these formats.
-
-=item B<--volname> I<volume-name>
-
-The name of the volume in the disk image.  If not specified, I<volume-name>
-defaults to the name of the source directory from B<--source>.
-
-=item B<--tempdir> I<temp-dir>
-
-A temporary directory to stage intermediate files in.  I<temp-dir> must
-have enough space available to accommodate twice the size of the files
-being packaged.  If not specified, defaults to the same directory that
-the I<target-image> is to be placed in.  B<pkg-dmg> will remove any
-temporary files it places in I<temp-dir>.
-
-=item B<--mkdir> I<directory>
-
-Specifies a directory that should be created in the disk image.
-I<directory> and any ancestor directories will be created.  This is
-useful in conjunction with B<--copy>, when copying files to directories
-that may not exist in I<source-folder>.  B<--mkdir> may appear multiple
-times.
-
-=item B<--copy> I<source>[:I<dest>]
-
-Additional files to copy into the disk image.  If I<dest> is
-specified, I<source> is copied to the location I<dest> identifies,
-otherwise, I<source> is copied to the root of the new volume.  B<--copy>
-provides a way to package up a I<source-folder> by adding files to it
-without modifying the original I<source-folder>.  B<--copy> may appear
-multiple times.
-
-This option is useful for adding .DS_Store files and window backgrounds
-to disk images.
-
-=item B<--license> I<file>
-
-A plain text file containing a license agreement to be displayed before
-the disk image is mounted.  English is the only supported language.  To
-include license agreements in other languages, in multiple languages,
-or to use formatted text, prepare a resource and use L<--resource>.
-
-=item B<--resource> I<file>
-
-A resource file to merge into I<target-image>.  If I<format> is UDZO,
-the disk image will be flattened to a single-fork file that contains
-the resource but may be freely transferred without any special encodings.
-I<file> must be in a format suitable for L<Rez(1)>.  See L<Rez(1)> for a
-description of the format, and L<hdiutil(1)> for a discussion on flattened
-disk images.  B<--resource> may appear multiple times.
-
-This option is useful for adding license agreements and other messages
-to disk images.
-
-=item B<--icon> I<icns-file>
-
-Specifies an I<icns> file that will be used as the icon for the root of
-the volume.  This file will be copied to the new volume and the custom
-icon attribute will be set on the root folder.
-
-=item B<--attribute> I<a>:I<file>[:I<file>...]
-
-Sets the attributes of I<file> to the attribute list in I<a>.  See
-L<SetFile(1)>
-
-=item B<--idme>
-
-Enable IDME to make the disk image "Internet-enabled."  The first time
-the image is mounted, if IDME processing is enabled on the system, the
-contents of the image will be copied out of the image and the image will
-be placed in the trash with IDME disabled.
-
-=item B<--sourcefile>
-
-If this option is present, I<source-folder> is treated as a file, and is
-placed as a file within the volume's root folder.  Without this option,
-I<source-folder> is treated as the volume root itself.
-
-=item B<--verbosity> I<level>
-
-Adjusts the level of loudness of B<pkg-dmg>.  The possible values for
-I<level> are:
-     0 - Only error messages are displayed.
-     1 - Print error messages and command invocations.
-     2 - Print everything, including command output.
-
-The default I<level> is 2.
-
-=item B<--dry-run>
-
-When specified, the commands that would be executed are printed, without
-actually executing them.  When commands depend on the output of previous
-commands, dummy values are displayed.
-
-=back
-
-=head1 NON-OPTIONS
-
-=over 5
-
-=item
-
-Resource forks aren't copied.
-
-=item
-
-The root folder of the created volume is designated as the folder
-to open when the volume is mounted.  See L<bless(8)>.
-
-=item
-
-All files in the volume are set to be world-readable, only writable
-by the owner, and world-executable when appropriate.  All other
-permissions bits are cleared.
-
-=item
-
-When possible, disk images are created without any partition tables.  This
-is what L<hdiutil(1)> refers to as I<-layout NONE>, and saves a handful of
-kilobytes.  The alternative, I<SPUD>, contains a partition table that
-is not terribly handy on disk images that are not intended to represent any
-physical disk.
-
-=item
-
-Read-write images are created with journaling off.  Any read-write image
-created by this tool is expected to be transient, and the goal of this tool
-is to create images which consume a minimum of space.
-
-=back
-
-=head1 EXAMPLE
-
-pkg-dmg --source /Applications/DeerPark.app --target ~/DeerPark.dmg
-  --sourcefile --volname DeerPark --icon ~/DeerPark.icns
-  --mkdir /.background
-  --copy DeerParkBackground.png:/.background/background.png
-  --copy DeerParkDSStore:/.DS_Store
-
-=head1 REQUIREMENTS
-
-I<pkg-dmg> has been tested with Mac OS X releases 10.2 ("Jaguar")
-through 10.4 ("Panther").  Certain adjustments to behavior are made
-depending on the host system's release.  Mac OS X 10.3 ("Panther") or
-later are recommended.
-
-=head1 LICENSE
-
-MPL 1.1/GPL 2.0/LGPL 2.1.  Your choice.
-
-=head1 AUTHOR
-
-Mark Mentovai
-
-=head1 SEE ALSO
-
-L<bless(8)>, L<diskutil(8)>, L<hdid(8)>, L<hdiutil(1)>, L<Rez(1)>,
-L<rsync(1)>, L<SetFile(1)>
-
-=cut
-
-use Fcntl;
-use POSIX;
-use Getopt::Long;
-
-sub argumentEscape(@);
-sub cleanupDie($);
-sub command(@);
-sub commandInternal($@);
-sub commandInternalVerbosity($$@);
-sub commandOutput(@);
-sub commandOutputVerbosity($@);
-sub commandVerbosity($@);
-sub diskImageMaker($$$$$$$$);
-sub giveExtension($$);
-sub hdidMountImage($@);
-sub licenseMaker($$);
-sub pathSplit($);
-sub setAttributes($@);
-sub trapSignal($);
-sub usage();
-
-# Variables used as globals
-my(@gCleanup, %gConfig, $gDarwinMajor, $gDryRun, $gVerbosity);
-
-# Use the commands by name if they're expected to be in the user's
-# $PATH (/bin:/sbin:/usr/bin:/usr/sbin).  Otherwise, go by absolute
-# path.  These may be overridden with --config.
-%gConfig = ('cmd_bless'          => 'bless',
-            'cmd_chmod'          => 'chmod',
-            'cmd_diskutil'       => 'diskutil',
-            'cmd_du'             => 'du',
-            'cmd_hdid'           => 'hdid',
-            'cmd_hdiutil'        => 'hdiutil',
-            'cmd_mkdir'          => 'mkdir',
-            'cmd_mktemp'         => 'mktemp',
-            'cmd_Rez'            => '/Developer/Tools/Rez',
-            'cmd_rm'             => 'rm',
-            'cmd_rsync'          => 'rsync',
-            'cmd_SetFile'        => '/Developer/Tools/SetFile',
-
-            # create_directly indicates whether hdiutil create supports
-            # -srcfolder and -srcdevice.  It does on >= 10.3 (Panther).
-            # This is fixed up for earlier systems below.  If false,
-            # hdiutil create is used to create empty disk images that
-            # are manually filled.
-            'create_directly'    => 1,
-
-            # If hdiutil attach -mountpoint exists, use it to avoid
-            # mounting disk images in the default /Volumes.  This reduces
-            # the likelihood that someone will notice a mounted image and
-            # interfere with it.  Only available on >= 10.3 (Panther),
-            # fixed up for earlier systems below.
-            #
-            # This is presently turned off for all systems, because there
-            # is an infrequent synchronization problem during ejection.
-            # diskutil eject might return before the image is actually
-            # unmounted.  If pkg-dmg then attempts to clean up its
-            # temporary directory, it could remove items from a read-write
-            # disk image or attempt to remove items from a read-only disk
-            # image (or a read-only item from a read-write image) and fail,
-            # causing pkg-dmg to abort.  This problem is experienced
-            # under Tiger, which appears to eject asynchronously where
-            # previous systems treated it as a synchronous operation.
-            # Using hdiutil attach -mountpoint didn't always keep images
-            # from showing up on the desktop anyway.
-            'hdiutil_mountpoint' => 0,
-
-            # hdiutil makehybrid results in optimized disk images that
-            # consume less space and mount more quickly.  Use it when
-            # it's available, but that's only on >= 10.3 (Panther).
-            # If false, hdiutil create is used instead.  Fixed up for
-            # earlier systems below.
-            'makehybrid'         => 1,
-
-            # hdiutil create doesn't allow specifying a folder to open
-            # at volume mount time, so those images are mounted and
-            # their root folders made holy with bless -openfolder.  But
-            # only on >= 10.3 (Panther).  Earlier systems are out of luck.
-            # Even on Panther, bless refuses to run unless root.
-            # Fixed up below.
-            'openfolder_bless'   => 1,
-
-            # It's possible to save a few more kilobytes by including the
-            # partition only without any partition table in the image.
-            # This is a good idea on any system, so turn this option off.
-            #
-            # Except it's buggy.  "-layout NONE" seems to be creating
-            # disk images with more data than just the partition table
-            # stripped out.  You might wind up losing the end of the
-            # filesystem - the last file (or several) might be incomplete.
-            'partition_table'    => 1,
-
-            # To create a partition table-less image from something
-            # created by makehybrid, the hybrid image needs to be
-            # mounted and a new image made from the device associated
-            # with the relevant partition.  This requires >= 10.4
-            # (Tiger), presumably because earlier systems have
-            # problems creating images from devices themselves attached
-            # to images.  If this is false, makehybrid images will
-            # have partition tables, regardless of the partition_table
-            # setting.  Fixed up for earlier systems below.
-            'recursive_access'   => 1);
-
-# --verbosity
-$gVerbosity = 2;
-
-# --dry-run
-$gDryRun = 0;
-
-# %gConfig fix-ups based on features and bugs present in certain releases.
-my($ignore, $uname_r, $uname_s);
-($uname_s, $ignore, $uname_r, $ignore, $ignore) = POSIX::uname();
-if($uname_s eq 'Darwin') {
-  ($gDarwinMajor, $ignore) = split(/\./, $uname_r, 2);
-
-  # $major is the Darwin major release, which for our purposes, is 4 higher
-  # than the interesting digit in a Mac OS X release.
-  if($gDarwinMajor <= 6) {
-    # <= 10.2 (Jaguar)
-    # hdiutil create does not support -srcfolder or -srcdevice
-    $gConfig{'create_directly'} = 0;
-    # hdiutil attach does not support -mountpoint
-    $gConfig{'hdiutil_mountpoint'} = 0;
-    # hdiutil mkhybrid does not exist
-    $gConfig{'makehybrid'} = 0;
-  }
-  if($gDarwinMajor <= 7) {
-    # <= 10.3 (Panther)
-    # Can't mount a disk image and then make a disk image from the device
-    $gConfig{'recursive_access'} = 0;
-    # bless does not support -openfolder on 10.2 (Jaguar) and must run
-    # as root under 10.3 (Panther)
-    $gConfig{'openfolder_bless'} = 0;
-  }
-}
-else {
-  # If it's not Mac OS X, just assume all of those good features are
-  # available.  They're not, but things will fail long before they
-  # have a chance to make a difference.
-  #
-  # Now, if someone wanted to document some of these private formats...
-  print STDERR ($0.": warning, not running on Mac OS X, ".
-   "this could be interesting.\n");
-}
-
-# Non-global variables used in Getopt
-my(@attributes, @copyFiles, $iconFile, $idme, $licenseFile, @makeDirs,
- $outputFormat, @resourceFiles, $sourceFile, $sourceFolder, $targetImage,
- $tempDir, $volumeName);
-
-# --format
-$outputFormat = 'UDZO';
-
-# --idme
-$idme = 0;
-
-# --sourcefile
-$sourceFile = 0;
-
-# Leaving this might screw up the Apple tools.
-delete $ENV{'NEXT_ROOT'};
-
-# This script can get pretty messy, so trap a few signals.
-$SIG{'INT'} = \&trapSignal;
-$SIG{'HUP'} = \&trapSignal;
-$SIG{'TERM'} = \&trapSignal;
-
-Getopt::Long::Configure('pass_through');
-GetOptions('source=s'    => \$sourceFolder,
-           'target=s'    => \$targetImage,
-           'volname=s'   => \$volumeName,
-           'format=s'    => \$outputFormat,
-           'tempdir=s'   => \$tempDir,
-           'mkdir=s'     => \@makeDirs,
-           'copy=s'      => \@copyFiles,
-           'license=s'   => \$licenseFile,
-           'resource=s'  => \@resourceFiles,
-           'icon=s'      => \$iconFile,
-           'attribute=s' => \@attributes,
-           'idme'        => \$idme,
-           'sourcefile'  => \$sourceFile,
-           'verbosity=i' => \$gVerbosity,
-           'dry-run'     => \$gDryRun,
-           'config=s'    => \%gConfig); # "hidden" option not in usage()
-
-if(@ARGV) {
-  # All arguments are parsed by Getopt
-  usage();
-  exit(1);
-}
-
-if($gVerbosity<0 || $gVerbosity>2) {
-  usage();
-  exit(1);
-}
-
-if(!defined($sourceFolder) || $sourceFolder eq '' ||
- !defined($targetImage) || $targetImage eq '') {
-  # --source and --target are required arguments
-  usage();
-  exit(1);
-}
-
-# Make sure $sourceFolder doesn't contain trailing slashes.  It messes with
-# rsync.
-while(substr($sourceFolder, -1) eq '/') {
-  chop($sourceFolder);
-}
-
-if(!defined($volumeName)) {
-  # Default volumeName is the name of the source directory.
-  my(@components);
-  @components = pathSplit($sourceFolder);
-  $volumeName = pop(@components);
-}
-
-my(@tempDirComponents, $targetImageFilename);
- at tempDirComponents = pathSplit($targetImage);
-$targetImageFilename = pop(@tempDirComponents);
-
-if(defined($tempDir)) {
-  @tempDirComponents = pathSplit($tempDir);
-}
-else {
-  # Default tempDir is the same directory as what is specified for
-  # targetImage
-  $tempDir = join('/', @tempDirComponents);
-}
-
-# Ensure that the path of the target image has a suitable extension.  If
-# it didn't, hdiutil would add one, and we wouldn't be able to find the
-# file.
-#
-# Note that $targetImageFilename is not being reset.  This is because it's
-# used to build other names below, and we don't need to be adding all sorts
-# of extra unnecessary extensions to the name.
-my($originalTargetImage, $requiredExtension);
-$originalTargetImage = $targetImage;
-if($outputFormat eq 'UDSP') {
-  $requiredExtension = '.sparseimage';
-}
-else {
-  $requiredExtension = '.dmg';
-}
-$targetImage = giveExtension($originalTargetImage, $requiredExtension);
-
-if($targetImage ne $originalTargetImage) {
-  print STDERR ($0.": warning: target image extension is being added\n");
-  print STDERR ('  The new filename is '.
-   giveExtension($targetImageFilename,$requiredExtension)."\n");
-}
-
-# Make a temporary directory in $tempDir for our own nefarious purposes.
-my(@output, $tempSubdir, $tempSubdirTemplate);
-$tempSubdirTemplate=join('/', @tempDirComponents,
- 'pkg-dmg.'.$$.'.XXXXXXXX');
-if(!(@output = commandOutput($gConfig{'cmd_mktemp'}, '-d',
- $tempSubdirTemplate)) || $#output != 0) {
-  cleanupDie('mktemp failed');
-}
-
-if($gDryRun) {
-  (@output)=($tempSubdirTemplate);
-}
-
-($tempSubdir) = @output;
-
-push(@gCleanup,
- sub {commandVerbosity(0, $gConfig{'cmd_rm'}, '-rf', $tempSubdir);});
-
-my($tempMount, $tempRoot, @tempsToMake);
-$tempRoot = $tempSubdir.'/stage';
-$tempMount = $tempSubdir.'/mount';
-push(@tempsToMake, $tempRoot);
-if($gConfig{'hdiutil_mountpoint'}) {
-  push(@tempsToMake, $tempMount);
-}
-
-if(command($gConfig{'cmd_mkdir'}, @tempsToMake) != 0) {
-  cleanupDie('mkdir tempRoot/tempMount failed');
-}
-
-# This cleanup object is not strictly necessary, because $tempRoot is inside
-# of $tempSubdir, but the rest of the script relies on this object being
-# on the cleanup stack and expects to remove it.
-push(@gCleanup,
- sub {commandVerbosity(0, $gConfig{'cmd_rm'}, '-rf', $tempRoot);});
-
-# If $sourceFile is true, it means that $sourceFolder is to be treated as
-# a file and placed as a file within the volume root, as opposed to being
-# treated as the volume root itself.  rsync will do this by default, if no
-# trailing '/' is present.  With a trailing '/', $sourceFolder becomes
-# $tempRoot, instead of becoming an entry in $tempRoot.
-if(command($gConfig{'cmd_rsync'}, '-a', '--links',
- $sourceFolder.($sourceFile?'':'/'),$tempRoot) != 0) {
-  cleanupDie('rsync failed');
-}
-
-if(@makeDirs) {
-  my($makeDir, @tempDirsToMake);
-  foreach $makeDir (@makeDirs) {
-    if($makeDir =~ /^\//) {
-      push(@tempDirsToMake, $tempRoot.$makeDir);
-    }
-    else {
-      push(@tempDirsToMake, $tempRoot.'/'.$makeDir);
-    }
-  }
-  if(command($gConfig{'cmd_mkdir'}, '-p', @tempDirsToMake) != 0) {
-    cleanupDie('mkdir failed');
-  }
-}
-
-my($copyFile);
-foreach $copyFile (@copyFiles) {
-  my($copySource, $copyDestination);
-  ($copySource, $copyDestination) = split(/:/, $copyFile);
-  if(!defined($copyDestination)) {
-    $copyDestination = $tempRoot;
-  }
-  elsif($copyDestination =~ /^\//) {
-    $copyDestination = $tempRoot.$copyDestination;
-  }
-  else {
-    $copyDestination = $tempRoot.'/'.$copyDestination;
-  }
-  if(command($gConfig{'cmd_rsync'}, '-a', '--links',
-   $copySource, $copyDestination) != 0) {
-    cleanupDie('rsync failed for item copy');
-  }
-}
-
-if($gConfig{'create_directly'}) {
-  # If create_directly is false, the contents will be rsynced into a
-  # disk image and they would lose their attributes.
-  setAttributes($tempRoot, @attributes);
-}
-
-if(defined($iconFile)) {
-  if(command($gConfig{'cmd_rsync'}, '-a', '--links', $iconFile,
-   $tempRoot.'/.VolumeIcon.icns') != 0) {
-    cleanupDie('rsync failed for volume icon');
-  }
-
-  # It's pointless to set the attributes of the root when diskutil create
-  # -srcfolder is being used.  In that case, the attributes will be set
-  # later, after the image is already created.
-  if($outputFormat eq 'UDZO' &&
-   (command($gConfig{'cmd_SetFile'}, '-a', 'C', $tempRoot) != 0)) {
-    cleanupDie('SetFile failed');
-  }
-}
-
-if(command($gConfig{'cmd_chmod'}, '-R', 'a+rX,a-st,u+w,go-w',
- $tempRoot) != 0) {
-  cleanupDie('chmod failed');
-}
-
-my($unflattenable);
-if($outputFormat eq 'UDZO') {
-  $unflattenable = 1;
-}
-else {
-  $unflattenable = 0;
-}
-
-diskImageMaker($tempRoot, $targetImage, $outputFormat, $volumeName,
- $tempSubdir, $tempMount, $targetImageFilename, defined($iconFile));
-
-if(defined($licenseFile) && $licenseFile ne '') {
-  my($licenseResource);
-  $licenseResource = $tempSubdir.'/license.r';
-  if(!licenseMaker($licenseFile, $licenseResource)) {
-    cleanupDie('licenseMaker failed');
-  }
-  push(@resourceFiles, $licenseResource);
-  # Don't add a cleanup object because licenseResource is in tempSubdir.
-}
-
-if(@resourceFiles) {
-  # Add resources, such as a license agreement.
-
-  # Only unflatten read-only and compressed images.  It's not supported
-  # on other image times.
-  if($unflattenable &&
-   (command($gConfig{'cmd_hdiutil'}, 'unflatten', $targetImage)) != 0) {
-    cleanupDie('hdiutil unflatten failed');
-  }
-  # Don't push flatten onto the cleanup stack.  If we fail now, we'll be
-  # removing $targetImage anyway.
-
-  # Type definitions come from Carbon.r.
-  if(command($gConfig{'cmd_Rez'}, 'Carbon.r', @resourceFiles, '-a', '-o',
-   $targetImage) != 0) {
-    cleanupDie('Rez failed');
-  }
-
-  # Flatten.  This merges the resource fork into the data fork, so no
-  # special encoding is needed to transfer the file.
-  if($unflattenable &&
-   (command($gConfig{'cmd_hdiutil'}, 'flatten', $targetImage)) != 0) {
-    cleanupDie('hdiutil flatten failed');
-  }
-}
-
-# $tempSubdir is no longer needed.  It's buried on the stack below the
-# rm of the fresh image file.  Splice in this fashion is equivalent to
-# pop-save, pop, push-save.
-splice(@gCleanup, -2, 1);
-# No need to remove licenseResource separately, it's in tempSubdir.
-if(command($gConfig{'cmd_rm'}, '-rf', $tempSubdir) != 0) {
-  cleanupDie('rm -rf tempSubdir failed');
-}
-
-if($idme) {
-  if(command($gConfig{'cmd_hdiutil'}, 'internet-enable', '-yes',
-   $targetImage) != 0) {
-    cleanupDie('hdiutil internet-enable failed');
-  }
-}
-
-# Done.
-
-exit(0);
-
-# argumentEscape(@arguments)
-#
-# Takes a list of @arguments and makes them shell-safe.
-sub argumentEscape(@) {
-  my(@arguments);
-  @arguments = @_;
-  my($argument, @argumentsOut);
-  foreach $argument (@arguments) {
-    $argument =~ s%([^A-Za-z0-9_\-/.=+,])%\\$1%g;
-    push(@argumentsOut, $argument);
-  }
-  return @argumentsOut;
-}
-
-# cleanupDie($message)
-#
-# Displays $message as an error message, and then runs through the
-# @gCleanup stack, performing any cleanup operations needed before
-# exiting.  Does not return, exits with exit status 1.
-sub cleanupDie($) {
-  my($message);
-  ($message) = @_;
-  print STDERR ($0.': '.$message.(@gCleanup?' (cleaning up)':'')."\n");
-  while(@gCleanup) {
-    my($subroutine);
-    $subroutine = pop(@gCleanup);
-    &$subroutine;
-  }
-  exit(1);
-}
-
-# command(@arguments)
-#
-# Runs the specified command at the verbosity level defined by $gVerbosity.
-# Returns nonzero on failure, returning the exit status if appropriate.
-# Discards command output.
-sub command(@) {
-  my(@arguments);
-  @arguments = @_;
-  return commandVerbosity($gVerbosity, at arguments);
-}
-
-# commandInternal($command, @arguments)
-#
-# Removes the files specified by @arguments with a verbosity level specified
-# by $gVerbosity.
-sub commandInternal($@) {
-  my(@arguments, $command);
-  ($command, @arguments) = @_;
-  return commandInternalVerbosity($gVerbosity, $command, @arguments);
-}
-
-# commandInternalVerbosity($verbosity, $command, @arguments)
-#
-# Run an internal command, printing a bogus command invocation message if
-# $verbosity is true.
-#
-# If $command is unlink:
-# Removes the files specified by @arguments.  Wraps unlink.
-#
-# If $command is mkdir:
-# Creates the directory specified by @arguments, with an optional mask
-# argument, wrapping mkdir.
-sub commandInternalVerbosity($$@) {
-  my(@arguments, $command, $verbosity);
-  ($verbosity, $command, @arguments) = @_;
-  if($command eq 'unlink') {
-    if($verbosity || $gDryRun) {
-      print(join(' ', 'rm', '-f', argumentEscape(@arguments))."\n");
-    }
-    if($gDryRun) {
-      return $#arguments+1;
-    }
-    return unlink(@arguments);
-  }
-}
-
-# commandOutput(@arguments)
-#
-# Runs the specified command at the verbosity level defined by $gVerbosity.
-# Output is returned in an array of lines.  undef is returned on failure.
-# The exit status is available in $?.
-sub commandOutput(@) {
-  my(@arguments);
-  @arguments = @_;
-  return commandOutputVerbosity($gVerbosity, @arguments);
-}
-
-# commandOutputVerbosity($verbosity, @arguments)
-#
-# Runs the specified command at the verbosity level defined by the
-# $verbosity argument.  Output is returned in an array of lines.  undef is
-# returned on failure.  The exit status is available in $?.
-#
-# If an error occurs in fork or exec, an error message is printed to
-# stderr and undef is returned.
-#
-# If $verbosity is 0, the command invocation is not printed, and its
-# stdout is not echoed back to stdout.
-#
-# If $verbosity is 1, the command invocation is printed.
-#
-# If $verbosity is 2, the command invocation is printed and the output
-# from stdout is echoed back to stdout.
-#
-# Regardless of $verbosity, stderr is left connected.
-sub commandOutputVerbosity($@) {
-  my(@arguments, $verbosity);
-  ($verbosity, @arguments) = @_;
-  my($pid);
-  if($verbosity || $gDryRun) {
-    print(join(' ', argumentEscape(@arguments))."\n");
-  }
-  if($gDryRun) {
-    return(1);
-  }
-  if (!defined($pid = open(*COMMAND, '-|'))) {
-    printf STDERR ($0.': fork: '.$!."\n");
-    return undef;
-  }
-  elsif ($pid) {
-    # parent
-    my(@lines);
-    while(!eof(*COMMAND)) {
-      my($line);
-      chop($line = <COMMAND>);
-      if($verbosity > 1) {
-        print($line."\n");
-      }
-      push(@lines, $line);
-    }
-    close(*COMMAND);
-    if ($? == -1) {
-      printf STDERR ($0.': fork: '.$!."\n");
-      return undef;
-    }
-    elsif ($? & 127) {
-      printf STDERR ($0.': exited on signal '.($? & 127).
-       ($? & 128 ? ', core dumped' : '')."\n");
-      return undef;
-    }
-    return @lines;
-  }
-  else {
-    # child; this form of exec is immune to shell games
-    if(!exec {$arguments[0]} (@arguments)) {
-      printf STDERR ($0.': exec: '.$!."\n");
-      exit(-1);
-    }
-  }
-}
-
-# commandVerbosity($verbosity, @arguments)
-#
-# Runs the specified command at the verbosity level defined by the
-# $verbosity argument.  Returns nonzero on failure, returning the exit
-# status if appropriate.  Discards command output.
-sub commandVerbosity($@) {
-  my(@arguments, $verbosity);
-  ($verbosity, @arguments) = @_;
-  if(!defined(commandOutputVerbosity($verbosity, @arguments))) {
-    return -1;
-  }
-  return $?;
-}
-
-# diskImageMaker($source, $destination, $format, $name, $tempDir, $tempMount,
-#  $baseName, $setRootIcon)
-#
-# Creates a disk image in $destination of format $format corresponding to the
-# source directory $source.  $name is the volume name.  $tempDir is a good
-# place to write temporary files, which should be empty (aside from the other
-# things that this script might create there, like stage and mount).
-# $tempMount is a mount point for temporary disk images.  $baseName is the
-# name of the disk image, and is presently unused.  $setRootIcon is true if
-# a volume icon was added to the staged $source and indicates that the
-# custom volume icon bit on the volume root needs to be set.
-sub diskImageMaker($$$$$$$$) {
-  my($baseName, $destination, $format, $name, $setRootIcon, $source,
-   $tempDir, $tempMount);
-  ($source, $destination, $format, $name, $tempDir, $tempMount,
-   $baseName, $setRootIcon) = @_;
-  if($format eq 'UDZO') {
-    my($uncompressedImage);
-
-    if($gConfig{'makehybrid'}) {
-      my($hybridImage);
-      $hybridImage = giveExtension($tempDir.'/hybrid', '.dmg');
-
-      if(command($gConfig{'cmd_hdiutil'}, 'makehybrid', '-hfs',
-       '-hfs-volume-name', $name, '-hfs-openfolder', $source, '-ov',
-       $source, '-o', $hybridImage) != 0) {
-        cleanupDie('hdiutil makehybrid failed');
-      }
-
-      $uncompressedImage = $hybridImage;
-
-      # $source is no longer needed and will be removed before anything
-      # else can fail.  splice in this form is the same as pop/push.
-      splice(@gCleanup, -1, 1,
-       sub {commandInternalVerbosity(0, 'unlink', $hybridImage);});
-
-      if(command($gConfig{'cmd_rm'}, '-rf', $source) != 0) {
-        cleanupDie('rm -rf failed');
-      }
-
-      if(!$gConfig{'partition_table'} && $gConfig{'recursive_access'}) {
-        # Even if we do want to create disk images without partition tables,
-        # it's impossible unless recursive_access is set.
-        my($rootDevice, $partitionDevice, $partitionMountPoint);
-
-        if(!(($rootDevice, $partitionDevice, $partitionMountPoint) =
-         hdidMountImage($tempMount, '-readonly', $hybridImage))) {
-          cleanupDie('hdid mount failed');
-        }
-
-        push(@gCleanup, sub {commandVerbosity(0,
-         $gConfig{'cmd_diskutil'}, 'eject', $rootDevice);});
-
-        my($udrwImage);
-        $udrwImage = giveExtension($tempDir.'/udrw', '.dmg');
-
-        if(command($gConfig{'cmd_hdiutil'}, 'create', '-format', 'UDRW',
-         '-ov', '-srcdevice', $partitionDevice, $udrwImage) != 0) {
-          cleanupDie('hdiutil create failed');
-        }
-
-        $uncompressedImage = $udrwImage;
-
-        # Going to eject before anything else can fail.  Get the eject off
-        # the stack.
-        pop(@gCleanup);
-
-        # $hybridImage will be removed soon, but until then, it needs to
-        # stay on the cleanup stack.  It needs to wait until after
-        # ejection.  $udrwImage is staying around.  Make it appear as
-        # though it's been done before $hybridImage.
-        #
-        # splice in this form is the same as popping one element to
-        # @tempCleanup and pushing the subroutine.
-        my(@tempCleanup);
-        @tempCleanup = splice(@gCleanup, -1, 1,
-         sub {commandInternalVerbosity(0, 'unlink', $udrwImage);});
-        push(@gCleanup, @tempCleanup);
-
-        if(command($gConfig{'cmd_diskutil'}, 'eject', $rootDevice) != 0) {
-          cleanupDie('diskutil eject failed');
-        }
-
-        # Pop unlink of $uncompressedImage
-        pop(@gCleanup);
-
-        if(commandInternal('unlink', $hybridImage) != 1) {
-          cleanupDie('unlink hybridImage failed: '.$!);
-        }
-      }
-    }
-    else {
-      # makehybrid is not available, fall back to making a UDRW and
-      # converting to UDZO.  It ought to be possible to do a UDZO directly,
-      # but those come out far too large (journaling?) and need to be
-      # read-write to fix up the volume icon anyway.  Luckily, we can
-      # take advantage of a single call back into this function.
-      my($udrwImage);
-      $udrwImage = giveExtension($tempDir.'/udrw', '.dmg');
-
-      diskImageMaker($source, $udrwImage, 'UDRW', $name, $tempDir,
-       $tempMount, $baseName, $setRootIcon);
-
-      # The call back into diskImageMaker already removed $source.
-
-      $uncompressedImage = $udrwImage;
-    }
-
-    # The uncompressed disk image is now in its final form.  Compress it.
-    # Jaguar doesn't support hdiutil convert -ov, but it always allows
-    # overwriting.
-    if(command($gConfig{'cmd_hdiutil'}, 'convert', '-format', 'UDZO',
-     '-imagekey', 'zlib-level=9', 
-     (defined($gDarwinMajor) && $gDarwinMajor <= 6 ? () : ('-ov')),
-     $uncompressedImage, '-o', $destination) != 0) {
-      cleanupDie('hdiutil convert failed');
-    }
-
-    # $uncompressedImage is going to be unlinked before anything else can
-    # fail.  splice in this form is the same as pop/push.
-    splice(@gCleanup, -1, 1,
-     sub {commandInternalVerbosity(0, 'unlink', $destination);});
-
-    if(commandInternal('unlink', $uncompressedImage) != 1) {
-      cleanupDie('unlink uncompressedImage failed: '.$!);
-    }
-
-    # At this point, the only thing that the UDZO block has added to the
-    # cleanup stack is the removal of $destination.  $source has already
-    # been removed, and its cleanup entry has been removed as well.
-  }
-  elsif($format eq 'UDRW' || $format eq 'UDSP') {
-    my(@extraArguments);
-    if(!$gConfig{'partition_table'}) {
-      @extraArguments = ('-layout', 'NONE');
-    }
-
-    if($gConfig{'create_directly'}) {
-      # Use -fs HFS+ to suppress the journal.
-      if(command($gConfig{'cmd_hdiutil'}, 'create', '-format', $format,
-       @extraArguments, '-fs', 'HFS+', '-volname', $name,
-       '-ov', '-srcfolder', $source, $destination) != 0) {
-        cleanupDie('hdiutil create failed');
-      }
-
-      # $source is no longer needed and will be removed before anything
-      # else can fail.  splice in this form is the same as pop/push.
-      splice(@gCleanup, -1, 1,
-       sub {commandInternalVerbosity(0, 'unlink', $destination);});
-
-      if(command($gConfig{'cmd_rm'}, '-rf', $source) != 0) {
-        cleanupDie('rm -rf failed');
-      }
-    }
-    else {
-      # hdiutil create does not support -srcfolder or -srcdevice, it only
-      # knows how to create blank images.  Figure out how large an image
-      # is needed, create it, and fill it.  This is needed for Jaguar.
-
-      # Use native block size for hdiutil create -sectors.
-      delete $ENV{'BLOCKSIZE'};
-
-      my(@duOutput, $ignore, $sizeBlocks, $sizeOverhead, $sizeTotal, $type);
-      if(!(@output = commandOutput($gConfig{'cmd_du'}, '-s', $tempRoot)) ||
-       $? != 0) {
-        cleanupDie('du failed');
-      }
-      ($sizeBlocks, $ignore) = split(' ', $output[0], 2);
-
-      # The filesystem itself takes up 152 blocks of its own blocks for the
-      # filesystem up to 8192 blocks, plus 64 blocks for every additional
-      # 4096 blocks or portion thereof.
-      $sizeOverhead = 152 + 64 * POSIX::ceil(
-       (($sizeBlocks - 8192) > 0) ? (($sizeBlocks - 8192) / (4096 - 64)) : 0);
-
-      # The number of blocks must be divisible by 8.
-      my($mod);
-      if($mod = ($sizeOverhead % 8)) {
-        $sizeOverhead += 8 - $mod;
-      }
-
-      # sectors is taken as the size of a disk, not a filesystem, so the
-      # partition table eats into it.
-      if($gConfig{'partition_table'}) {
-        $sizeOverhead += 80;
-      }
-
-      # That was hard.  Leave some breathing room anyway.  Use 1024 sectors
-      # (512kB).  These read-write images wouldn't be useful if they didn't
-      # have at least a little free space.
-      $sizeTotal = $sizeBlocks + $sizeOverhead + 1024;
-
-      # Minimum sizes - these numbers are larger on Jaguar than on later
-      # systems.  Just use the Jaguar numbers, since it's unlikely to wind
-      # up here on any other release.
-      if($gConfig{'partition_table'} && $sizeTotal < 8272) {
-        $sizeTotal = 8272;
-      }
-      if(!$gConfig{'partition_table'} && $sizeTotal < 8192) {
-        $sizeTotal = 8192;
-      }
-
-      # hdiutil create without -srcfolder or -srcdevice will not accept
-      # -format.  It uses -type.  Fortunately, the two supported formats
-      # here map directly to the only two supported types.
-      if ($format eq 'UDSP') {
-        $type = 'SPARSE';
-      }
-      else {
-        $type = 'UDIF';
-      }
-
-      if(command($gConfig{'cmd_hdiutil'}, 'create', '-type', $type,
-       @extraArguments, '-fs', 'HFS+', '-volname', $name,
-       '-ov', '-sectors', $sizeTotal, $destination) != 0) {
-        cleanupDie('hdiutil create failed');
-      }
-
-      push(@gCleanup,
-       sub {commandInternalVerbosity(0, 'unlink', $destination);});
-
-      # The rsync will occur shortly.
-    }
-
-    my($mounted, $rootDevice, $partitionDevice, $partitionMountPoint);
-
-    $mounted=0;
-    if(!$gConfig{'create_directly'} || $gConfig{'openfolder_bless'} ||
-     $setRootIcon) {
-      # The disk image only needs to be mounted if:
-      #  create_directly is false, because the content needs to be copied
-      #  openfolder_bless is true, because bless -openfolder needs to run
-      #  setRootIcon is true, because the root needs its attributes set.
-      if(!(($rootDevice, $partitionDevice, $partitionMountPoint) =
-       hdidMountImage($tempMount, $destination))) {
-        cleanupDie('hdid mount failed');
-      }
-
-      $mounted=1;
-
-      push(@gCleanup, sub {commandVerbosity(0,
-       $gConfig{'cmd_diskutil'}, 'eject', $rootDevice);});
-    }
-
-    if(!$gConfig{'create_directly'}) {
-      # Couldn't create and copy directly in one fell swoop.  Now that
-      # the volume is mounted, copy the files.  --copy-unsafe-links is
-      # unnecessary since it was used to copy everything to the staging
-      # area.  There can be no more unsafe links.
-      if(command($gConfig{'cmd_rsync'}, '-a',
-       $source.'/',$partitionMountPoint) != 0) {
-        cleanupDie('rsync to new volume failed');
-      }
-
-      # We need to get the rm -rf of $source off the stack, because it's
-      # being cleaned up here.  There are two items now on top of it:
-      # removing the target image and, above that, ejecting it.  Splice it
-      # out.
-      my(@tempCleanup);
-      @tempCleanup = splice(@gCleanup, -2);
-      # The next splice is the same as popping once and pushing @tempCleanup.
-      splice(@gCleanup, -1, 1, @tempCleanup);
-
-      if(command($gConfig{'cmd_rm'}, '-rf', $source) != 0) {
-        cleanupDie('rm -rf failed');
-      }
-    }
-
-    if($gConfig{'openfolder_bless'}) {
-      # On Tiger, the bless docs say to use --openfolder, but only
-      # --openfolder is accepted on Panther.  Tiger takes it with a single
-      # dash too.  Jaguar is out of luck.
-      if(command($gConfig{'cmd_bless'}, '-openfolder',
-       $partitionMountPoint) != 0) {
-        cleanupDie('bless failed');
-      }
-    }
-
-    setAttributes($partitionMountPoint, @attributes);
-
-    if($setRootIcon) {
-      # When "hdiutil create -srcfolder" is used, the root folder's
-      # attributes are not copied to the new volume.  Fix up.
-
-      if(command($gConfig{'cmd_SetFile'}, '-a', 'C',
-       $partitionMountPoint) != 0) {
-        cleanupDie('SetFile failed');
-      }
-    }
-
-    if($mounted) {
-      # Pop diskutil eject
-      pop(@gCleanup);
-
-      if(command($gConfig{'cmd_diskutil'}, 'eject', $rootDevice) != 0) {
-        cleanupDie('diskutil eject failed');
-      }
-    }
-
-    # End of UDRW/UDSP section.  At this point, $source has been removed
-    # and its cleanup entry has been removed from the stack.
-  }
-  else {
-    cleanupDie('unrecognized format');
-    print STDERR ($0.": unrecognized format\n");
-    exit(1);
-  }
-}
-
-# giveExtension($file, $extension)
-#
-# If $file does not end in $extension, $extension is added.  The new
-# filename is returned.
-sub giveExtension($$) {
-  my($extension, $file);
-  ($file, $extension) = @_;
-  if(substr($file, -length($extension)) ne $extension) {
-    return $file.$extension;
-  }
-  return $file;
-}
-
-# hdidMountImage($mountPoint, @arguments)
-#
-# Runs the hdid command with arguments specified by @arguments.
-# @arguments may be a single-element array containing the name of the
-# disk image to mount.  Returns a three-element array, with elements
-# corresponding to:
-#  - The root device of the mounted image, suitable for ejection
-#  - The device corresponding to the mounted partition
-#  - The mounted partition's mount point
-#
-# If running on a system that supports easy mounting at points outside
-# of the default /Volumes with hdiutil attach, it is used instead of hdid,
-# and $mountPoint is used as the mount point.
-#
-# The root device will differ from the partition device when the disk
-# image contains a partition table, otherwise, they will be identical.
-#
-# If hdid fails, undef is returned.
-sub hdidMountImage($@) {
-  my(@arguments, @command, $mountPoint);
-  ($mountPoint, @arguments) = @_;
-  my(@output);
-
-  if($gConfig{'hdiutil_mountpoint'}) {
-    @command=($gConfig{'cmd_hdiutil'}, 'attach', @arguments,
-     '-mountpoint', $mountPoint);
-  }
-  else {
-    @command=($gConfig{'cmd_hdid'}, @arguments);
-  }
-
-  if(!(@output = commandOutput(@command)) ||
-   $? != 0) {
-    return undef;
-  }
-
-  if($gDryRun) {
-    return('/dev/diskX','/dev/diskXsY','/Volumes/'.$volumeName);
-  }
-
-  my($line, $restOfLine, $rootDevice);
-
-  foreach $line (@output) {
-    my($device, $mountpoint);
-    if($line !~ /^\/dev\//) {
-      # Consider only lines that correspond to /dev entries
-      next;
-    }
-    ($device, $restOfLine) = split(' ', $line, 2);
-
-    if(!defined($rootDevice) || $rootDevice eq '') {
-      # If this is the first device seen, it's the root device to be
-      # used for ejection.  Keep it.
-      $rootDevice = $device;
-    }
-
-    if($restOfLine =~ /(\/.*)/) {
-      # The first partition with a mount point is the interesting one.  It's
-      # usually Apple_HFS and usually the last one in the list, but beware of
-      # the possibility of other filesystem types and the Apple_Free partition.
-      # If the disk image contains no partition table, the partition will not
-      # have a type, so look for the mount point by looking for a slash.
-      $mountpoint = $1;
-      return($rootDevice, $device, $mountpoint);
-    }
-  }
-
-  # No mount point?  This is bad.  If there's a root device, eject it.
-  if(defined($rootDevice) && $rootDevice ne '') {
-    # Failing anyway, so don't care about failure
-    commandVerbosity(0, $gConfig{'cmd_diskutil'}, 'eject', $rootDevice);
-  }
-
-  return undef;
-}
-
-# licenseMaker($text, $resource)
-#
-# Takes a plain text file at path $text and creates a license agreement
-# resource containing the text at path $license.  English-only, and
-# no special formatting.  This is the bare-bones stuff.  For more
-# intricate license agreements, create your own resource.
-#
-# ftp://ftp.apple.com/developer/Development_Kits/SLAs_for_UDIFs_1.0.dmg
-sub licenseMaker($$) {
-  my($resource, $text);
-  ($text, $resource) = @_;
-  if(!sysopen(*TEXT, $text, O_RDONLY)) {
-    print STDERR ($0.': licenseMaker: sysopen text: '.$!."\n");
-    return 0;
-  }
-  if(!sysopen(*RESOURCE, $resource, O_WRONLY|O_CREAT|O_EXCL)) {
-    print STDERR ($0.': licenseMaker: sysopen resource: '.$!."\n");
-    return 0;
-  }
-  print RESOURCE << '__EOT__';
-// See /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers/Script.h for language IDs.
-data 'LPic' (5000) {
-  // Default language ID, 0 = English
-  $"0000"
-  // Number of entries in list
-  $"0001"
-
-  // Entry 1
-  // Language ID, 0 = English
-  $"0000"
-  // Resource ID, 0 = STR#/TEXT/styl 5000
-  $"0000"
-  // Multibyte language, 0 = no
-  $"0000"
-};
-
-resource 'STR#' (5000, "English") {
-  {
-    // Language (unused?) = English
-    "English",
-    // Agree
-    "Agree",
-    // Disagree
-    "Disagree",
-__EOT__
-    # This stuff needs double-quotes for interpolations to work.
-    print RESOURCE ("    // Print, ellipsis is 0xC9\n");
-    print RESOURCE ("    \"Print\xc9\",\n");
-    print RESOURCE ("    // Save As, ellipsis is 0xC9\n");
-    print RESOURCE ("    \"Save As\xc9\",\n");
-    print RESOURCE ('    // Descriptive text, curly quotes are 0xD2 and 0xD3'.
-     "\n");
-    print RESOURCE ('    "If you agree to the terms of this license '.
-     "agreement, click \xd2Agree\xd3 to access the software.  If you ".
-     "do not agree, press \xd2Disagree.\xd3\"\n");
-print RESOURCE << '__EOT__';
-  };
-};
-
-// Beware of 1024(?) byte (character?) line length limitation.  Split up long
-// lines.
-// If straight quotes are used ("), remember to escape them (\").
-// Newline is \n, to leave a blank line, use two of them.
-// 0xD2 and 0xD3 are curly double-quotes ("), 0xD4 and 0xD5 are curly
-//   single quotes ('), 0xD5 is also the apostrophe.
-data 'TEXT' (5000, "English") {
-__EOT__
-
-  while(!eof(*TEXT)) {
-    my($line);
-    chop($line = <TEXT>);
-
-    while(defined($line)) {
-      my($chunk);
-
-      # Rez doesn't care for lines longer than (1024?) characters.  Split
-      # at less than half of that limit, in case everything needs to be
-      # backwhacked.
-      if(length($line)>500) {
-        $chunk = substr($line, 0, 500);
-        $line = substr($line, 500);
-      }
-      else {
-        $chunk = $line;
-        $line = undef;
-      }
-
-      if(length($chunk) > 0) {
-        # Unsafe characters are the double-quote (") and backslash (\), escape
-        # them with backslashes.
-        $chunk =~ s/(["\\])/\\$1/g;
-
-        print RESOURCE '  "'.$chunk.'"'."\n";
-      }
-    }
-    print RESOURCE '  "\n"'."\n";
-  }
-  close(*TEXT);
-
-  print RESOURCE << '__EOT__';
-};
-
-data 'styl' (5000, "English") {
-  // Number of styles following = 1
-  $"0001"
-
-  // Style 1.  This is used to display the first two lines in bold text.
-  // Start character = 0
-  $"0000 0000"
-  // Height = 16
-  $"0010"
-  // Ascent = 12
-  $"000C"
-  // Font family = 1024 (Lucida Grande)
-  $"0400"
-  // Style bitfield, 0x1=bold 0x2=italic 0x4=underline 0x8=outline
-  // 0x10=shadow 0x20=condensed 0x40=extended
-  $"00"
-  // Style, unused?
-  $"02"
-  // Size = 12 point
-  $"000C"
-  // Color, RGB
-  $"0000 0000 0000"
-};
-__EOT__
-  close(*RESOURCE);
-
-  return 1;
-}
-
-# pathSplit($pathname)
-#
-# Splits $pathname into an array of path components.
-sub pathSplit($) {
-  my($pathname);
-  ($pathname) = @_;
-  return split(/\//, $pathname);
-}
-
-# setAttributes($root, @attributeList)
-#
-# @attributeList is an array, each element of which must be in the form
-# <a>:<file>.  <a> is a list of attributes, per SetFile.  <file> is a file
-# which is taken as relative to $root (even if it appears as an absolute
-# path.)  SetFile is called to set the attributes on each file in
-# @attributeList.
-sub setAttributes($@) {
-  my(@attributes, $root);
-  ($root, @attributes) = @_;
-  my($attribute);
-  foreach $attribute (@attributes) {
-    my($attrList, $file, @fileList, @fixedFileList);
-    ($attrList, @fileList) = split(/:/, $attribute);
-    if(!defined($attrList) || !@fileList) {
-      cleanupDie('--attribute requires <attributes>:<file>');
-    }
-    @fixedFileList=();
-    foreach $file (@fileList) {
-      if($file =~ /^\//) {
-        push(@fixedFileList, $root.$file);
-      }
-      else {
-        push(@fixedFileList, $root.'/'.$file);
-      }
-    }
-    if(command($gConfig{'cmd_SetFile'}, '-a', $attrList, @fixedFileList)) {
-      cleanupDie('SetFile failed to set attributes');
-    }
-  }
-  return;
-}
-
-sub trapSignal($) {
-  my($signalName);
-  ($signalName) = @_;
-  cleanupDie('exiting on SIG'.$signalName);
-}
-
-sub usage() {
-  print STDERR (
-"usage: pkg-dmg --source <source-folder>\n".
-"               --target <target-image>\n".
-"              [--format <format>]        (default: UDZO)\n".
-"              [--volname <volume-name>]  (default: same name as source)\n".
-"              [--tempdir <temp-dir>]     (default: same dir as target)\n".
-"              [--mkdir <directory>]      (make directory in image)\n".
-"              [--copy <source>[:<dest>]] (extra files to add)\n".
-"              [--license <file>]         (plain text license agreement)\n".
-"              [--resource <file>]        (flat .r files to merge)\n".
-"              [--icon <icns-file>]       (volume icon)\n".
-"              [--attribute <a>:<file>]   (set file attributes)\n".
-"              [--idme]                   (make an Internet-enabled image)\n".
-"              [--sourcefile]             (treat --source as a file)\n".
-"              [--verbosity <level>]      (0, 1, 2; default=2)\n".
-"              [--dry-run]                (print what would be done)\n");
-  return;
-}
diff --git a/po/Makefile b/po/Makefile
index 6e346b8..49116e9 100644
--- a/po/Makefile
+++ b/po/Makefile
@@ -9,7 +9,7 @@ POTFILES: FORCE
 FORCE:
 
 pot: POTFILES
-	xgettext -d $(DOMAIN) -o $(DOMAIN).pot -f POTFILES
+	xgettext --from-code=utf-8 -d $(DOMAIN) -o $(DOMAIN).pot -f POTFILES
 
 update-po:
 	for po in *.po; do \
diff --git a/po/POTFILES b/po/POTFILES
index 9db036f..52588d2 100644
--- a/po/POTFILES
+++ b/po/POTFILES
@@ -1,90 +1,88 @@
-../lib/advene/model/zippackage.py
 ../lib/advene/model/bundle.py
-../lib/advene/core/controller.py
-../lib/advene/core/webcherry.py
-../lib/advene/util/website_export.py
-../lib/advene/util/importer.py
-../lib/advene/util/helper.py
-../lib/advene/plugins/cinelab.py
-../lib/advene/plugins/shotdetectapp.py
-../lib/advene/plugins/youtubeannotations.py
-../lib/advene/plugins/brltty.py
-../lib/advene/plugins/goodshotdetector.py
-../lib/advene/plugins/anvil.py
-../lib/advene/plugins/annotationgraph.py
-../lib/advene/plugins/fcp.py
-../lib/advene/plugins/tracebuilder.py
-../lib/advene/plugins/dcp.py
-../lib/advene/plugins/ttl.py
-../lib/advene/plugins/aeidon_import.py
-../lib/advene/plugins/soundenveloppe.py
-../lib/advene/plugins/cutter.py
-../lib/advene/plugins/montagerenderer.py
-../lib/advene/plugins/mpeg7.py
-../lib/advene/plugins/transcriber.py
-../lib/advene/plugins/featuredetect.py
-../lib/advene/plugins/pocketsphinx.py
-../lib/advene/plugins/barcode.py
-../lib/advene/plugins/nerd_plugin.py
-../lib/advene/plugins/ted.py
-../lib/advene/plugins/shotdetect.py
-../lib/advene/plugins/tts.py
-../lib/advene/player/gstreamer.py
-../lib/advene/rules/importer.py
-../lib/advene/rules/actions.py
-../lib/advene/rules/elements.py
-../lib/advene/gui/util/initialconfig.py
-../lib/advene/gui/util/__init__.py
-../lib/advene/gui/util/dialog.py
+../lib/advene/model/zippackage.py
+../lib/advene/gui/widget.py
+../lib/advene/gui/main.py
 ../lib/advene/gui/plugins/shotvalidation.py
+../lib/advene/gui/plugins/eventaccumulator.py
+../lib/advene/gui/plugins/htmlcontenhandler.py
 ../lib/advene/gui/plugins/tracetimeline.py
-../lib/advene/gui/plugins/kinect.py
+../lib/advene/gui/plugins/logmessages.py
 ../lib/advene/gui/plugins/actions.py
-../lib/advene/gui/plugins/eventaccumulator.py
+../lib/advene/gui/plugins/kinect.py
 ../lib/advene/gui/plugins/contenthandlers.py
-../lib/advene/gui/plugins/videoplayer.py
 ../lib/advene/gui/plugins/tracepreview.py
-../lib/advene/gui/plugins/htmlcontenhandler.py
-../lib/advene/gui/plugins/logmessages.py
-../lib/advene/gui/edit/dvdselect.py
-../lib/advene/gui/edit/merge.py
-../lib/advene/gui/edit/properties.py
-../lib/advene/gui/edit/importer.py
-../lib/advene/gui/edit/schemaeditor.py
-../lib/advene/gui/edit/rules.py
-../lib/advene/gui/edit/shapewidget.py
-../lib/advene/gui/edit/timeadjustment.py
-../lib/advene/gui/edit/create.py
-../lib/advene/gui/edit/imports.py
-../lib/advene/gui/edit/montage.py
-../lib/advene/gui/edit/frameselector.py
-../lib/advene/gui/edit/transcribe.py
-../lib/advene/gui/edit/elements.py
-../lib/advene/gui/views/browser.py
-../lib/advene/gui/views/accumulatorpopup.py
-../lib/advene/gui/views/editionhistory.py
-../lib/advene/gui/views/logwindow.py
+../lib/advene/gui/plugins/videoplayer.py
+../lib/advene/gui/views/singletonpopup.py
+../lib/advene/gui/views/caption.py
+../lib/advene/gui/views/html.py
+../lib/advene/gui/views/annotationdisplay.py
+../lib/advene/gui/views/relationdisplay.py
+../lib/advene/gui/views/viewplugin.py
 ../lib/advene/gui/views/checker.py
-../lib/advene/gui/views/tagbag.py
-../lib/advene/gui/views/transcription.py
-../lib/advene/gui/views/activebookmarks.py
+../lib/advene/gui/views/table.py
+../lib/advene/gui/views/accumulatorpopup.py
 ../lib/advene/gui/views/bookmarks.py
-../lib/advene/gui/views/viewplugin.py
-../lib/advene/gui/views/interactivequery.py
-../lib/advene/gui/views/relationdisplay.py
-../lib/advene/gui/views/html.py
 ../lib/advene/gui/views/viewbook.py
-../lib/advene/gui/views/singletonpopup.py
+../lib/advene/gui/views/transcription.py
+../lib/advene/gui/views/browser.py
 ../lib/advene/gui/views/timeline.py
-../lib/advene/gui/views/tree.py
-../lib/advene/gui/views/editaccumulator.py
 ../lib/advene/gui/views/relation.py
-../lib/advene/gui/views/caption.py
-../lib/advene/gui/views/scroller.py
-../lib/advene/gui/views/finder.py
-../lib/advene/gui/views/annotationdisplay.py
+../lib/advene/gui/views/editionhistory.py
+../lib/advene/gui/views/tagbag.py
 ../lib/advene/gui/views/__init__.py
-../lib/advene/gui/views/table.py
-../lib/advene/gui/widget.py
-../lib/advene/gui/main.py
+../lib/advene/gui/views/finder.py
+../lib/advene/gui/views/editaccumulator.py
+../lib/advene/gui/views/activebookmarks.py
+../lib/advene/gui/views/scroller.py
+../lib/advene/gui/views/logwindow.py
+../lib/advene/gui/views/interactivequery.py
 ../lib/advene/gui/popup.py
+../lib/advene/gui/util/initialconfig.py
+../lib/advene/gui/util/__init__.py
+../lib/advene/gui/util/dialog.py
+../lib/advene/gui/edit/rules.py
+../lib/advene/gui/edit/properties.py
+../lib/advene/gui/edit/frameselector.py
+../lib/advene/gui/edit/create.py
+../lib/advene/gui/edit/imports.py
+../lib/advene/gui/edit/shapewidget.py
+../lib/advene/gui/edit/importer.py
+../lib/advene/gui/edit/dvdselect.py
+../lib/advene/gui/edit/merge.py
+../lib/advene/gui/edit/montage.py
+../lib/advene/gui/edit/timeadjustment.py
+../lib/advene/gui/edit/elements.py
+../lib/advene/gui/edit/transcribe.py
+../lib/advene/core/webcherry.py
+../lib/advene/core/controller.py
+../lib/advene/plugins/featuredetect.py
+../lib/advene/plugins/ted.py
+../lib/advene/plugins/cutter.py
+../lib/advene/plugins/ttl.py
+../lib/advene/plugins/shotdetect.py
+../lib/advene/plugins/pocketsphinx.py
+../lib/advene/plugins/brltty.py
+../lib/advene/plugins/transcript.py
+../lib/advene/plugins/aeidon_import.py
+../lib/advene/plugins/anvil.py
+../lib/advene/plugins/fcp.py
+../lib/advene/plugins/hpi.py
+../lib/advene/plugins/goodshotdetector.py
+../lib/advene/plugins/montagerenderer.py
+../lib/advene/plugins/transcriber.py
+../lib/advene/plugins/tts.py
+../lib/advene/plugins/soundenveloppe.py
+../lib/advene/plugins/barcode.py
+../lib/advene/plugins/dcp.py
+../lib/advene/plugins/annotationgraph.py
+../lib/advene/plugins/shotdetectapp.py
+../lib/advene/plugins/mpeg7.py
+../lib/advene/plugins/cinelab.py
+../lib/advene/plugins/owl_import.py
+../lib/advene/player/gstreamer.py
+../lib/advene/rules/actions.py
+../lib/advene/rules/importer.py
+../lib/advene/rules/elements.py
+../lib/advene/util/helper.py
+../lib/advene/util/website_export.py
+../lib/advene/util/importer.py
diff --git a/po/advene.pot b/po/advene.pot
index 7129fe0..cf490f8 100644
--- a/po/advene.pot
+++ b/po/advene.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-07-09 17:25+0200\n"
+"POT-Creation-Date: 2017-10-12 22:02+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -17,3049 +17,2716 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../lib/advene/model/zippackage.py:187 ../lib/advene/model/zippackage.py:189
-#: ../lib/advene/util/helper.py:538 ../lib/advene/util/helper.py:540
+#: ../lib/advene/model/bundle.py:292
 #, python-format
-msgid "File %s is not an Advene zip package."
+msgid "%s not in bundle"
+msgstr ""
+
+#: ../lib/advene/model/bundle.py:358
+msgid "List of non-typed elements"
 msgstr ""
 
-#: ../lib/advene/model/zippackage.py:243
+#: ../lib/advene/model/bundle.py:363
 #, python-format
-msgid "Directory %s is not an extracted Advene zip package."
+msgid "List of %s elements"
 msgstr ""
 
-#: ../lib/advene/model/bundle.py:296
+#: ../lib/advene/model/zippackage.py:161 ../lib/advene/model/zippackage.py:163
 #, python-format
-msgid "%s not in bundle"
+msgid "File %s is not an Advene zip package."
 msgstr ""
 
-#: ../lib/advene/model/bundle.py:362
-msgid "List of non-typed elements"
+#: ../lib/advene/model/zippackage.py:219
+#, python-format
+msgid "Directory %s is not an extracted Advene zip package."
 msgstr ""
 
-#: ../lib/advene/model/bundle.py:367
+#: ../lib/advene/gui/widget.py:295
 #, python-format
-msgid "List of %s elements"
+msgid "Set of %s annotations"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:263 ../lib/advene/rules/actions.py:36
-#: ../lib/advene/gui/plugins/actions.py:40
-msgid "Display a message"
+#: ../lib/advene/gui/widget.py:1006
+#: ../lib/advene/gui/views/transcription.py:459
+#: ../lib/advene/gui/edit/montage.py:60
+msgid "Play"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:264
-#: ../lib/advene/gui/plugins/actions.py:41
-#: ../lib/advene/gui/plugins/actions.py:53
-#: ../lib/advene/gui/plugins/actions.py:71
-#: ../lib/advene/gui/plugins/actions.py:86
-#: ../lib/advene/gui/plugins/actions.py:102
-#: ../lib/advene/gui/plugins/actions.py:203
-msgid "String to display."
+#: ../lib/advene/gui/widget.py:1010 ../lib/advene/gui/edit/timeadjustment.py:77
+msgid "Refresh snapshot"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:362
-msgid "Exception (traceback in console):"
+#: ../lib/advene/gui/widget.py:1014
+msgid "Save as..."
 msgstr ""
 
-#: ../lib/advene/core/controller.py:393
-msgid "No available GUI"
+#: ../lib/advene/gui/widget.py:1019
+msgid "Use current player position"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:412
-msgid "No available event handler"
+#: ../lib/advene/gui/widget.py:1025
+msgid "Adjust timestamp"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:420
-msgid "No available gui"
+#: ../lib/advene/gui/main.py:200 ../lib/advene/gui/main.py:314
+msgid "_Select player"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:436
-#, python-format
-msgid "Warning: redefining an existing feature %s"
+#: ../lib/advene/gui/main.py:202 ../lib/advene/gui/main.py:299
+msgid "_View"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:568
-msgid "All annotations"
+#: ../lib/advene/gui/main.py:204 ../lib/advene/gui/main.py:316
+msgid "Packages"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:569 ../lib/advene/gui/edit/rules.py:358
-#, python-format
-msgid "Annotations of type %s"
+#: ../lib/advene/gui/main.py:207 ../lib/advene/gui/main.py:258
+msgid "Open recent"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:570 ../lib/advene/gui/edit/imports.py:129
-#: ../lib/advene/gui/edit/imports.py:130
-msgid "Views"
+#: ../lib/advene/gui/main.py:252
+msgid "Input from the keyboard (function keys)"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:570 ../lib/advene/gui/edit/elements.py:521
-msgid "Tags"
+#: ../lib/advene/gui/main.py:255
+msgid "_File"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:570
-msgid "Ids"
+#: ../lib/advene/gui/main.py:256
+msgid "_New package"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:747
-#, python-format
-msgid ""
-"Cannot start the webserver\n"
-"The following processes seem to use the %(port)s port: %(processes)s"
+#: ../lib/advene/gui/main.py:256
+msgid "Create a new package"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:797 ../lib/advene/core/controller.py:808
-#, python-format
-msgid "Loaded %(uri)s as %(alias)s"
+#: ../lib/advene/gui/main.py:257
+msgid "_Open package"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:799 ../lib/advene/core/controller.py:811
-#, python-format
-msgid "Cannot load package from file %(uri)s: %(error)s"
+#: ../lib/advene/gui/main.py:257
+msgid "Open a package"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:850
-msgid "Deactivating web server"
+#: ../lib/advene/gui/main.py:258
+msgid "Show recently opened packages"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:970
-#, python-format
-msgid "Cannot get audio volume: %s"
+#: ../lib/advene/gui/main.py:259
+msgid "_Save package"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1020
-#, python-format
-msgid "Cannot open Advene URL %s: the webserver is not running."
+#: ../lib/advene/gui/main.py:259
+msgid "Save the package"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1128 ../lib/advene/gui/edit/merge.py:272
-msgid "None"
+#: ../lib/advene/gui/main.py:260
+msgid "Save package as..."
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1222
-#, python-format
-msgid "Found matching video file in moviepath: %s"
+#: ../lib/advene/gui/main.py:260
+msgid "Save the package as..."
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1263 ../lib/advene/core/controller.py:1265
-msgid "Analysis of "
+#: ../lib/advene/gui/main.py:261
+msgid "Close package"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1465
-msgid "Cannot split the annotation: the given position is outside."
+#: ../lib/advene/gui/main.py:261
+msgid "Close the package"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1630
-#, python-format
-msgid "Cannot find the template package %(filename)s: %(error)s"
+#: ../lib/advene/gui/main.py:263
+msgid "Save session"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1672
-#, python-format
-msgid "Cannot read the imported package %(uri)s: %(error)s"
+#: ../lib/advene/gui/main.py:263
+msgid "Save the current session (list of opened packages)"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1907
-msgid "Package URI has changed. Reloading package with new URI."
+#: ../lib/advene/gui/main.py:264
+msgid "Save workspace"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1925
-msgid ""
-"Cannot load package: the following annotations do not have Millisecond "
-"fragments:"
+#: ../lib/advene/gui/main.py:265
+msgid "...as package view"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1952
-#, python-format
-msgid "Cannot handle master attribute, the package %s is not imported."
+#: ../lib/advene/gui/main.py:266
+msgid "...as standard workspace"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1954
-#, python-format
-msgid "Checking master package %s for not yet imported elements."
+#: ../lib/advene/gui/main.py:266
+msgid "Use the current layout as standard workspace in the future"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1994
-msgid "Standard summary"
+#: ../lib/advene/gui/main.py:268
+msgid "Associate a video _File"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1999
-msgid "Default view"
+#: ../lib/advene/gui/main.py:268
+msgid "Associate a video file"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2041
-#, python-format
-msgid ""
-"Infinite loop in STBV %(name)s: the %(imp)s view is invoked multiple times."
+#: ../lib/advene/gui/main.py:269
+msgid "Associate a _DVD"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2131
-#, python-format
-msgid "Got exception %s when stopping player."
+#: ../lib/advene/gui/main.py:269
+msgid "Associate a chapter from a DVD"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2214
-#, python-format
-msgid "Raised exception in update_status: %s"
+#: ../lib/advene/gui/main.py:270
+msgid "Associate a _Video stream"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2241
-msgid "Unable to start the player."
+#: ../lib/advene/gui/main.py:270
+msgid "Enter a video stream address"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2448
-#, python-format
-msgid "Comment on set of %d annotations"
+#: ../lib/advene/gui/main.py:272
+msgid "_Import File"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2450
-#, python-format
-msgid "Comment on %s"
+#: ../lib/advene/gui/main.py:272
+msgid "Import data from an external source"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2454
-#, python-format
-msgid ""
-"<h1>Comment on %(title)s</h1>\n"
-"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
-"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
-"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
-"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
-"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
-"\"%(imgurl)s\" ></img></a></span>"
+#: ../lib/advene/gui/main.py:273
+msgid "_Process video"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2464
-#, python-format
-msgid "List of %s annotations"
+#: ../lib/advene/gui/main.py:273
+msgid "Import data from video processing algorithms"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2499
-#, python-format
-msgid "Cannot export to %(filename)s: %(e)s"
+#: ../lib/advene/gui/main.py:275
+msgid "Merge package"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2514 ../lib/advene/core/controller.py:2523
-#, python-format
-msgid "Error when exporting: %s"
+#: ../lib/advene/gui/main.py:275
+msgid "Merge elements from another package"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2525 ../lib/advene/gui/views/table.py:406
-#: ../lib/advene/gui/views/table.py:536
-#, python-format
-msgid "Data exported to %s"
+#: ../lib/advene/gui/main.py:276
+msgid "Import _DVD chapters"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:51
-msgid "The webserver requires version 3.0 of CherryPy at least."
+#: ../lib/advene/gui/main.py:276
+msgid "Create annotations based on DVD chapters"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:167
-#, python-format
-msgid ""
-"\n"
-"            <p>\n"
-"            <a href=\"/admin\">Server administration</a> |\n"
-"            <a href=\"/media\">Media control</a> |\n"
-"            <a href=\"%(path)s?mode=raw\">Raw view</a>\n"
-"            </p>\n"
-"            Location: %(locationbar)s\n"
-"            <hr>\n"
-"            "
+#: ../lib/advene/gui/main.py:278
+msgid "_Export..."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:227
-msgid "Unspecified Error"
+#: ../lib/advene/gui/main.py:278
+msgid "Export data to another format"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:228
-#, python-format
-msgid ""
-"\n"
-"        <h1>Error</h1>\n"
-"        <p>An error occurred:</p>\n"
-"        %s\n"
-"        "
+#: ../lib/advene/gui/main.py:279
+msgid "_Website export..."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:261
-msgid "<h1>No available mediaplayer</h1>"
+#: ../lib/advene/gui/main.py:279
+msgid "Export views to a website"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:265
-#, python-format
-msgid ""
-"\n"
-"            <h1>Current STBV: %(currentstbv)s</h1>\n"
-"\n"
-"            <h1>Player status</h1>\n"
-"            <table border=\"1\">\n"
-"            <tr>\n"
-"            <td>Current position</td><td>%(position)s</td>\n"
-"            <td>Duration</td><td>%(duration)s</td>\n"
-"            <td>Player status</td><td>%(status)s</td>\n"
-"            </tr>\n"
-"            </table>\n"
-"            "
+#: ../lib/advene/gui/main.py:281
+msgid "_Quit"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:284
-msgid "<h1>No playlist</h1>"
+#: ../lib/advene/gui/main.py:283
+msgid "_Edit"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:286
-#, python-format
-msgid ""
-"<h1>Current playlist</h1>\n"
-"                <ul>%s</ul>"
+#: ../lib/advene/gui/main.py:284
+msgid "_Undo"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:288
-msgid ""
-"\n"
-"                <form action=\"/media/play\" method=\"GET\">\n"
-"                Starting pos: <input type=\"text\" name=\"position\" value="
-"\"0\">\n"
-"                <input type=\"submit\" value=\"Play\">\n"
-"                </form>\n"
-"                <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
-"\">Pause</a><br>\n"
-"                "
+#: ../lib/advene/gui/main.py:285
+msgid "_Find"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:295
-msgid ""
-"<hr />\n"
-"            <form action=\"/media/load\" method=\"GET\">\n"
-"            Add a new file (<em>dvd</em> to play a DVD):\n"
-"            <input type=\"text\" name=\"filename\">\n"
-"            <input type=\"submit\" value=\"Add\">\n"
-"            </form>"
+#: ../lib/advene/gui/main.py:286
+msgid "_Delete"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:301
-msgid ""
-"<h3><a href=\"/media/snapshot\">Access to current packages snapshots</h3>"
+#: ../lib/advene/gui/main.py:287
+msgid "Create"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:310
-#, python-format
-msgid "Unknown STBV identifier: %s"
+#: ../lib/advene/gui/main.py:288 ../lib/advene/gui/main.py:3337
+#: ../lib/advene/util/helper.py:411
+msgid "Schema"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:385
-msgid "Media information"
+#: ../lib/advene/gui/main.py:289 ../lib/advene/gui/edit/rules.py:1086
+#: ../lib/advene/rules/actions.py:238 ../lib/advene/util/helper.py:414
+msgid "View"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:398
-msgid "File added"
+#: ../lib/advene/gui/main.py:290 ../lib/advene/gui/popup.py:488
+#: ../lib/advene/util/helper.py:415
+msgid "Query"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:399
-#, python-format
-msgid "<p><strong>%s has been added to the playlist</strong></p>"
+#: ../lib/advene/gui/main.py:291 ../lib/advene/util/helper.py:412
+msgid "Annotation Type"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:410 ../lib/advene/core/webcherry.py:472
-msgid "Access to packages snapshots"
+#: ../lib/advene/gui/main.py:292 ../lib/advene/util/helper.py:413
+msgid "Relation Type"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:420 ../lib/advene/core/webcherry.py:482
-msgid "Unknown package alias"
+#: ../lib/advene/gui/main.py:296
+msgid "P_ackage properties"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:426
-#, python-format
-msgid "Available snapshots for %s"
+#: ../lib/advene/gui/main.py:296
+msgid "Edit package properties"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:432
-#, python-format
-msgid ""
-"<p><a href=\"/media/snapshot/%s?mode=inline\">Display with inline images</"
-"a></p>"
+#: ../lib/advene/gui/main.py:297
+msgid "P_references"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:439
-msgid "Done"
+#: ../lib/advene/gui/main.py:297
+msgid "Interface preferences"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:441
-msgid "Pending"
+#: ../lib/advene/gui/main.py:301
+msgid "_Start Web Browser"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:487
-#, python-format
-msgid "Unknown annotation id: %s"
+#: ../lib/advene/gui/main.py:301
+msgid "Start the web browser"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:610 ../lib/advene/core/webcherry.py:728
-#, python-format
-msgid "Cannot activate stbvid %(stbvid)s: %(error)s"
+#: ../lib/advene/gui/main.py:303
+msgid "Simplify interface"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:675
-msgid "<p>No GUI is available."
+#: ../lib/advene/gui/main.py:303
+msgid "Simplify the application interface (toggle)"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:677
-#, python-format
-msgid "<p>Opened adhoc views: %s</p>"
+#: ../lib/advene/gui/main.py:304
+msgid "Evaluator"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:678
-msgid "<p>Available adhoc views:</p><ul>"
+#: ../lib/advene/gui/main.py:304
+msgid "Open python evaluator window"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:699
-#, python-format
-msgid "<p>Current stbv: %s</p>"
+#: ../lib/advene/gui/main.py:305 ../lib/advene/gui/main.py:4096
+msgid "Webserver log"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:700
-#, python-format
-msgid "<p>You can activate the following STBV:</p><ul>%s</ul>"
+#: ../lib/advene/gui/main.py:307
+msgid "_Player"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:702
-msgid "Activate and play"
+#: ../lib/advene/gui/main.py:308
+msgid "Go to _Time"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:708
-msgid "Application information"
+#: ../lib/advene/gui/main.py:308
+msgid "Goto a specified time code"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:778
-msgid "Missing element id parameter"
+#: ../lib/advene/gui/main.py:309
+msgid "Save _ImageCache"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:782
-#, python-format
-msgid "No existing element with id %s"
+#: ../lib/advene/gui/main.py:309
+msgid "Save the contents of the ImageCache to disk"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:791
-#, python-format
-msgid "<p>The GUI view %s does not exist.</p>"
+#: ../lib/advene/gui/main.py:310
+msgid "Reset ImageCache"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:798
-msgid "Invalid request"
+#: ../lib/advene/gui/main.py:310
+msgid "Reset the ImageCache"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:803
-msgid "Invalid configuration variable name"
+#: ../lib/advene/gui/main.py:311
+msgid "_Restart player"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:815
-msgid "Invalid value"
+#: ../lib/advene/gui/main.py:311
+msgid "Restart the player"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:819
-#, python-format
-msgid "Unsupported method %s"
+#: ../lib/advene/gui/main.py:312
+msgid "Display _Media information"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:845
-#, python-format
-msgid ""
-"\n"
-"        <h1>Authorized hosts</h1>\n"
-"        <table border=\"1\">\n"
-"        <tr><th>Host</th><th>IP Addr</th><th>Action</th></tr>\n"
-"        %s\n"
-"        </table>\n"
-"        <form method=\"GET\">\n"
-"        Add a new hostname to the list :<br>\n"
-"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
-"\"Add\">\n"
-"        </form>\n"
-"        "
+#: ../lib/advene/gui/main.py:312
+msgid "Display information about the current media"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:859
-msgid "Access control"
+#: ../lib/advene/gui/main.py:313
+msgid "Update annotation screenshots"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:864
-msgid "Access control - add a hostname"
+#: ../lib/advene/gui/main.py:313
+msgid "Update screenshots for annotation bounds"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:872 ../lib/advene/core/webcherry.py:886
-#, python-format
-msgid "<strong>Error: %s is an invalid hostname.</strong>"
+#: ../lib/advene/gui/main.py:314
+msgid "Select the player plugin"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:875
-#, python-format
-msgid "<p>Added %s to authorized hosts list.</p>"
+#: ../lib/advene/gui/main.py:317
+msgid "No package"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:881
-msgid "Access control - delete a hostname"
+#: ../lib/advene/gui/main.py:319
+msgid "_Help"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:889
-msgid "<strong>Cannot remove the localhost access.</strong>"
+#: ../lib/advene/gui/main.py:320
+msgid "Help"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:894
-#, python-format
-msgid "<p>Removed %s from authorized hosts list.</p>"
+#: ../lib/advene/gui/main.py:321
+msgid "Get support"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:896
-#, python-format
-msgid "<p>%s is not in authorized hosts list.</p>"
+#: ../lib/advene/gui/main.py:322
+msgid "Check for updates"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:945
-msgid "Server Administration"
+#: ../lib/advene/gui/main.py:323
+msgid "Display shortcuts"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:953
-#, python-format
-msgid ""
-"\n"
-"        <p><a href=\"/admin/access\">Update the access list</a></p>\n"
-"        <p><a href=\"/admin/methods\">List available TALES methods</a></p>\n"
-"        <p><a href=\"/action\">List available actions</a></p>\n"
-"        <p><a href=\"/admin/reset\">Reset the server</a></p>\n"
-"        <p><a href=\"/media\">Media control</a></p>\n"
-"        <p><a href=\"/application\">Display GUI status</a></p>\n"
-"        <p><a href=\"/admin/list\">List available files</a></p>\n"
-"        <p><a href=\"/packages\">List loaded packages</a> (%(packagelist)s)</"
-"p>\n"
-"        <p>Display mode : %(displaymode)s</p>\n"
-"        <hr>\n"
-"        <p>Load a package :\n"
-"        <form action=\"/admin/load\" method=\"GET\">\n"
-"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
-"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
-"        <input type=\"submit\" value=\"Load\" />\n"
-"        </form>\n"
-"        </body></html>\n"
-"        "
+#: ../lib/advene/gui/main.py:324
+msgid "Display logfile"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:983
-msgid "Available files"
+#: ../lib/advene/gui/main.py:324
+msgid "Display log messages"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1009
-msgid "You should specify an alias"
+#: ../lib/advene/gui/main.py:325
+msgid "Open logfile folder"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1014
-msgid "You should specify an uri"
+#: ../lib/advene/gui/main.py:325
+msgid ""
+"Display logfile folder. It can help when sending the advene.log file by e-"
+"mail."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1020
-#, python-format
-msgid "Package %s loaded"
+#: ../lib/advene/gui/main.py:326
+msgid "_About"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1021 ../lib/advene/core/webcherry.py:1057
-#, python-format
-msgid ""
-"<p>Go to the <a href=\"/packages/%(alias)s\">%(alias)s</a> package, or to "
-"the <a href=\"/packages\">package list</a>."
+#: ../lib/advene/gui/main.py:352
+msgid "Open a package file"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1024
-#, python-format
-msgid "<p>Cannot load package %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:353
+msgid "Save the current package"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1035
-#, python-format
-msgid "Package %s deleted"
+#: ../lib/advene/gui/main.py:354
+msgid "Save the package with a new name"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1036
-msgid "<p>Go to the <a href=\"/packages\">package list</a>."
+#: ../lib/advene/gui/main.py:355
+msgid "Select movie file..."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1039
-#, python-format
-msgid "<p>Cannot delete package %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:356
+msgid "Select DVD"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1056
-#, python-format
-msgid "Package %s saved"
+#: ../lib/advene/gui/main.py:358
+#: ../lib/advene/gui/plugins/shotvalidation.py:260
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:810
+#: ../lib/advene/gui/edit/transcribe.py:1178
+msgid "Undo"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1060
-#, python-format
-msgid "<p>Cannot save package %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:360
+msgid "Create a text annotation"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1070
-msgid "Server reset"
+#: ../lib/advene/gui/main.py:361
+msgid "Create a graphical annotation"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1076
-msgid "Available TALES methods"
+#: ../lib/advene/gui/main.py:367
+msgid "List recently opened packages"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1117
-msgid "Loaded package(s)"
+#: ../lib/advene/gui/main.py:397
+msgid "Snapshotter activity"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1119
-msgid ""
-"\n"
-"        <h1>Loaded package(s)</h1>\n"
-"        <table border=\"1\" width=\"50%\">\n"
-"        <tr>\n"
-"        <th>Alias</th>\n"
-"        <th>Action</th>\n"
-"        <th>URI</th>\n"
-"        <th>Annotations</th>\n"
-"        </tr>\n"
-"        "
+#: ../lib/advene/gui/main.py:399
+#, python-format
+msgid "%d queued requests"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1131
-#, python-format
-msgid ""
-"<tr>\n"
-"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
-"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
-"%(uri)s\">Reload</a>|<a href=\"/admin/delete?alias=%(alias)s\">Drop</a>|<a "
-"href=\"/admin/save?alias=%(alias)s\">Save</a></td>\n"
-"            <td>%(uri)s</td>\n"
-"            <td>%(size)d</td>\n"
-"            </tr>\n"
-"            "
+#: ../lib/advene/gui/main.py:400
+msgid "Cancel all requests"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1204 ../lib/advene/core/webcherry.py:1279
-#: ../lib/advene/core/webcherry.py:1288 ../lib/advene/core/webcherry.py:1296
-#: ../lib/advene/core/webcherry.py:1454 ../lib/advene/core/webcherry.py:1462
-#: ../lib/advene/core/webcherry.py:1470 ../lib/advene/core/webcherry.py:2032
-#: ../lib/advene/core/webcherry.py:2039
-msgid "Error"
+#: ../lib/advene/gui/main.py:405
+msgid "No snapshotter"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1205
-#, python-format
-msgid "The TALES expression %s is not valid."
+#: ../lib/advene/gui/main.py:427
+msgid "No snapshotting activity"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1256
-msgid "Content mode not available on non-content data"
+#: ../lib/advene/gui/main.py:431
+msgid "Snapshotting"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1280 ../lib/advene/core/webcherry.py:1289
-#: ../lib/advene/core/webcherry.py:1297 ../lib/advene/core/webcherry.py:1317
-#: ../lib/advene/core/webcherry.py:1321 ../lib/advene/core/webcherry.py:1455
-#: ../lib/advene/core/webcherry.py:1463 ../lib/advene/core/webcherry.py:1471
-#: ../lib/advene/core/webcherry.py:1530 ../lib/advene/core/webcherry.py:1607
-#: ../lib/advene/core/webcherry.py:1727 ../lib/advene/core/webcherry.py:1777
-msgid "<h1>Error</h1>"
+#: ../lib/advene/gui/main.py:447
+msgid "Display application log messages"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1281 ../lib/advene/core/webcherry.py:1322
-#, python-format
-msgid ""
-"<p>There was an error in the template code.</p>\n"
-"                <p>Tag name: <strong>%(tagname)s</strong></p>\n"
-"                <p>Error message: <em>%(message)s</em></p>"
+#: ../lib/advene/gui/main.py:488
+msgid "Quicksearch lists"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1290
-#, python-format
-msgid ""
-"<p>An invalid character is in the Context:</p>\n"
-"                <p>Error message: <em>%(error)s</em></p><pre>%(message)s</"
-"pre>"
+#: ../lib/advene/gui/main.py:494
+msgid "Please specify the lists of elements to be searched."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1298
+#: ../lib/advene/gui/main.py:513
 #, python-format
 msgid ""
-"<p>There was an error in the TALES expression.</p>\n"
-"                <pre>%s</pre>"
+"Searching on %s.\n"
+"Left click to launch the search, right-click to set the quicksearch options"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1318
+#: ../lib/advene/gui/main.py:514
 #, python-format
-msgid ""
-"<p>There was an error.</p>\n"
-"                <pre>%s</pre>"
+msgid "String to search in %s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1342
-#, python-format
-msgid ""
-"\n"
-"            <hr>\n"
-"            <p>\n"
-"            Location: %(location)s<br>\n"
-"            <form name=\"navigation\" method=\"GET\">\n"
-"            <a href=\"%(levelup)s\">Up one level</a> |\n"
-"            Next level :\n"
-"            <select name=\"path\" onchange=\"submit()\">\n"
-"            "
+#: ../lib/advene/gui/main.py:527 ../lib/advene/gui/main.py:531
+msgid "Tracing : "
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1360
-msgid ""
-"\n"
-"            </select> View: <select name=\"view\" onchange=\"submit()\">\n"
-"            <option selected></option>\n"
-"            "
+#: ../lib/advene/gui/main.py:527
+msgid "off"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1378
-#, python-format
-msgid ""
-"<hr>\n"
-"            <p>Evaluating expression \"<strong>%(expression)s</strong>\" on "
-"package %(uri)s returns %(value)s</p>\n"
-"            "
+#: ../lib/advene/gui/main.py:531
+msgid "on"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1414
-#, python-format
-msgid "<p>Package <strong>%s</strong> not loaded</p>"
+#: ../lib/advene/gui/main.py:543
+#: ../lib/advene/gui/views/interactivequery.py:410
+msgid "String to search"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1456
-#, python-format
-msgid ""
-"<p>There was an error in the template code.</p>\n"
-"            <p>Tag name: <strong>%(tagname)s</strong></p>\n"
-"            <p>Error message: <em>%(message)s</em></p>"
+#: ../lib/advene/gui/main.py:551
+msgid "Launch search"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1464
-#, python-format
-msgid ""
-"<p>There was an error in the expression.</p>\n"
-"            <pre>%s</pre>"
+#: ../lib/advene/gui/main.py:556
+msgid "Ignore case"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1472
-#, python-format
-msgid ""
-"<p>Cannot resolve TALES expression %(expr)s on package %(package)s<p><pre>\n"
-"            %(type)s\n"
-"            %(value)s\n"
-"            %(traceback)s</pre>"
+#: ../lib/advene/gui/main.py:561
+msgid "Searched elements"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1531 ../lib/advene/core/webcherry.py:1728
-msgid "<p>Cannot set the value : invalid path</p>"
+#: ../lib/advene/gui/main.py:645
+msgid "Playing"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1593 ../lib/advene/core/webcherry.py:1846
-#, python-format
-msgid ""
-"<h1>Error</h1><p>When creating resource %(path)s, the resource folder "
-"%(folder)s could not be created.</p>"
+#: ../lib/advene/gui/main.py:646
+msgid "Pause"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1602 ../lib/advene/core/webcherry.py:1856
-msgid "Resource successfuly created/updated"
+#: ../lib/advene/gui/main.py:647
+msgid "Init"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1611
-msgid "Value successfuly updated"
+#: ../lib/advene/gui/main.py:648 ../lib/advene/gui/views/table.py:314
+#: ../lib/advene/gui/edit/elements.py:1809
+msgid "End"
+msgstr ""
+
+#: ../lib/advene/gui/main.py:649
+msgid "Undefined"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1613
+#: ../lib/advene/gui/main.py:660
 #, python-format
 msgid ""
-"Unable to update the attribute %(attribute)s for element %(element)s: "
-"%(error)s."
+"Wrong player shortcut modifier %s in configuration. Fallback on Control."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1724
-msgid "<p>Invalid request</p>."
+#: ../lib/advene/gui/main.py:679
+msgid "Exception in update_annotation"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1788 ../lib/advene/core/webcherry.py:1805
-msgid "Value updated"
+#: ../lib/advene/gui/main.py:707
+msgid "Exception in update_relation"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1789
-#, python-format
-msgid ""
-"\n"
-"                <h1>Value updated</h1>\n"
-"                The value of %(path)s has been updated to\n"
-"                <pre>\n"
-"                %(value)s\n"
-"                </pre>\n"
-"                "
+#: ../lib/advene/gui/main.py:729
+msgid "Exception in update_view"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1806
-#, python-format
-msgid ""
-"\n"
-"                    <h1>Value updated</h1>\n"
-"                    The value of %(path)s has been updated to\n"
-"                    <pre>\n"
-"                    %(value)s\n"
-"                    </pre>\n"
-"                    "
+#: ../lib/advene/gui/main.py:758
+msgid "Exception in update_query"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1817
-#, python-format
-msgid ""
-"Malformed request: cannot update the value of %(attribute)s in %(tales)s."
+#: ../lib/advene/gui/main.py:778
+msgid "Exception in update_resource"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1860
-msgid "Cannot create an element in something else than a package."
+#: ../lib/advene/gui/main.py:798
+msgid "Exception in update_schema"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1877
-#, python-format
-msgid "The identifier %s already exists."
+#: ../lib/advene/gui/main.py:818
+msgid "Exception in update_annotationtype"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1889
-#, python-format
-msgid "<p>Error while creating view %(id)s</p><pre>%(error)s</pre>"
+#: ../lib/advene/gui/main.py:845
+msgid "Exception in update_relationtype"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1895
-msgid "View created"
+#: ../lib/advene/gui/main.py:951
+msgid "Enter the new time value"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1896
+#: ../lib/advene/gui/main.py:975
 #, python-format
-msgid ""
-"\n"
-"                 <h1>View <em>%(id)s</em> created</h1>\n"
-"                 <p>The view <a href=\"%(url)s\">%(id)s</a> was successfully "
-"created.</p>\n"
-"                 "
+msgid "Replace content in %d elements"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1912
-#, python-format
-msgid "Missing %s parameter"
+#: ../lib/advene/gui/main.py:988
+msgid "Find word"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1915
-#, python-format
-msgid "Relation type %s does not exist"
+#: ../lib/advene/gui/main.py:995
+msgid "Replace by"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1922 ../lib/advene/core/webcherry.py:1925
+#: ../lib/advene/gui/main.py:1023
 #, python-format
-msgid "Annotation %s does not exist"
+msgid "%(search)s has been replaced by %(replace)s in %(count)d element(s)."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1928
-#, python-format
-msgid ""
-"<p>Cannot create relation between %(member1)s and %(member2)s: invalid type</"
-"p>"
+#: ../lib/advene/gui/main.py:1032
+msgid "The video extracting feature is not available."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1940
-#, python-format
-msgid ""
-"<p>Error while creating relation between %(member1)s and %(member2)s :</"
-"p><pre>%(error)s</pre>"
+#: ../lib/advene/gui/main.py:1035
+msgid "Video export"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1943
-msgid "Relation created"
+#: ../lib/advene/gui/main.py:1037
+#, python-format
+msgid "Exporting video montage/fragment to %%(filename)s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1944
-#, python-format
-msgid "<h1>Relation <em>%s</em> created</h1>"
+#: ../lib/advene/gui/main.py:1039
+msgid "Please choose a destination filename"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1954
-#, python-format
-msgid "Annotation type %s does not exist"
+#: ../lib/advene/gui/main.py:1117
+msgid ""
+"No media association is defined in the package. Please use the 'File/"
+"Associate a video file' menu item to associate a media file."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1971
+#: ../lib/advene/gui/main.py:1119
 #, python-format
 msgid ""
-"<p>Error while creating annotation of type %(type)s :<pre>\n"
-"                    %(errortype)s\n"
-"                    %(value)s\n"
-"                    %(traceback)s</pre>"
+"The associated media %s could not be found. Please use the 'File/Associate a "
+"video file' menu item to associate a media file."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1983
+#: ../lib/advene/gui/main.py:1121
 #, python-format
-msgid "Annotation %s created"
+msgid ""
+"You are now working with the following video:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1985
-#, python-format
-msgid "Error: Cannot create an object of type %s."
+#: ../lib/advene/gui/main.py:1217
+msgid "Open this view..."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1988
-#, python-format
-msgid ""
-"Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</"
-"code></p>"
+#: ../lib/advene/gui/main.py:1218 ../lib/advene/gui/plugins/actions.py:286
+#: ../lib/advene/gui/views/viewbook.py:130
+msgid "...in its own window"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2001
-msgid "Available actions"
+#: ../lib/advene/gui/main.py:1219 ../lib/advene/gui/plugins/actions.py:287
+#: ../lib/advene/gui/views/viewbook.py:131
+#: ../lib/advene/gui/views/__init__.py:398
+msgid "...embedded east of the video"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2010
-#, python-format
-msgid "<li>%(name)s: %(value)s"
+#: ../lib/advene/gui/main.py:1220 ../lib/advene/gui/plugins/actions.py:288
+#: ../lib/advene/gui/views/viewbook.py:132
+#: ../lib/advene/gui/views/__init__.py:399
+msgid "...embedded west of the video"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2033
-#, python-format
-msgid "<p>Unknown action</p><pre>Action: %s</pre>"
+#: ../lib/advene/gui/main.py:1221 ../lib/advene/gui/plugins/actions.py:289
+#: ../lib/advene/gui/views/viewbook.py:133
+#: ../lib/advene/gui/views/__init__.py:400
+msgid "...embedded south of the video"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2040
-msgid "Missing parameter(s) :<ul>"
+#: ../lib/advene/gui/main.py:1222 ../lib/advene/gui/plugins/actions.py:290
+#: ../lib/advene/gui/views/viewbook.py:134
+#: ../lib/advene/gui/views/__init__.py:401
+msgid "...embedded at the right of the window"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2076
-msgid "Advene web resources"
+#: ../lib/advene/gui/main.py:1234
+msgid "_All available views"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2082
-msgid "Advene webserver"
+#: ../lib/advene/gui/main.py:1250 ../lib/advene/gui/views/timeline.py:126
+msgid "Timeline"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2083
-#, python-format
-msgid ""
-"<p>Welcome on the <a href=\"http://liris.cnrs.fr/advene/\">Advene</a> "
-"webserver run by %(userid)s on %(serveraddress)s.</p>"
+#: ../lib/advene/gui/main.py:1251 ../lib/advene/gui/views/finder.py:808
+msgid "Package finder"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2090
-msgid ""
-" <p>No package is loaded. You can access the <a href=\"/admin\">server "
-"administration page</a>.<p>"
+#: ../lib/advene/gui/main.py:1252
+msgid "Transcription of annotations"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2100
-#, python-format
-msgid ""
-"the <a href=\"/packages/%(alias)s/view/%(view)s\">loaded package's default "
-"view</a>"
+#: ../lib/advene/gui/main.py:1253
+msgid "Annotation table"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2102
-#, python-format
-msgid "the <a href=\"/packages/%s\">loaded package's data</a>"
+#: ../lib/advene/gui/main.py:1256
+msgid "Note-taking editor"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2104
-msgid "the <a href=\"/packages\">loaded packages' data</a>"
+#: ../lib/advene/gui/main.py:1257
+msgid "Active bookmarks"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2105
-#, python-format
-msgid ""
-" <p>You can either access %s or the <a href=\"/admin\">server administration "
-"page</a>.<p>"
+#: ../lib/advene/gui/main.py:1260 ../lib/advene/gui/views/tagbag.py:57
+msgid "Bag of tags"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2107
-#, python-format
-msgid ""
-"<hr><p align=\"right\"><em>Document generated by <a href=\"http://liris.cnrs."
-"fr/advene/\">Advene</a> v. %s.</em></p>"
+#: ../lib/advene/gui/main.py:1261
+msgid "TALES explorer"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2189 ../lib/advene/core/webcherry.py:2198
-#, python-format
-msgid "Cannot start HTTP server: %s"
+#: ../lib/advene/gui/main.py:1262
+msgid "Dynamic montage"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:61
-#, python-format
-msgid "%s exists but is not a directory. Cancelling website export"
+#: ../lib/advene/gui/main.py:1263 ../lib/advene/gui/plugins/videoplayer.py:37
+msgid "Video player"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:67
-#, python-format
-msgid "%s does not exist"
+#: ../lib/advene/gui/main.py:1266
+msgid "Open a comment view in the web browser"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:422
-msgid "Starting export"
+#: ../lib/advene/gui/main.py:1267
+msgid "Create or open a comment view"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:451
-#, python-format
-msgid "Depth %d"
+#: ../lib/advene/gui/main.py:1270
+msgid ""
+"Edit window placeholder (annotation and relation edit windows will be put "
+"here)"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:455
-#, python-format
-msgid "Depth %(depth)d: processing %(url)s"
+#: ../lib/advene/gui/main.py:1271
+msgid "Display edition history"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:477
-msgid "Finalizing"
+#: ../lib/advene/gui/main.py:1300
+msgid "The webserver could not be started. Static views cannot be accessed."
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:511
+#: ../lib/advene/gui/main.py:1381
 #, python-format
 msgid ""
-"<p><strong>You should probably begin at <a href=\"%(href)s\">%(title)s</a>.</"
-"strong></p>"
+"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s has been "
+"released</b> on %(date)s, but you are running version %(current)s.\n"
+"You can download the latest version from the Advene website: http://advene."
+"org/</span>"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:554
-msgid "Export complete"
+#: ../lib/advene/gui/main.py:1386
+msgid "Go to the website"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:134
-msgid "Generic importer"
+#: ../lib/advene/gui/main.py:1392
+msgid "Advene release"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:161
-msgid "Usage: %prog [options] source-file destination-file"
+#: ../lib/advene/gui/main.py:1398
+#, python-format
+msgid "You are using a up-to-date version of Advene (%(current)s)."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:165
-msgid "Specify the offset in ms"
+#: ../lib/advene/gui/main.py:1398
+msgid "Advene is up-to-date"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:210
-msgid ""
-"Import filter error. The asynchronous API should be used, please report a "
-"bug."
+#: ../lib/advene/gui/main.py:1412
+msgid "Choose a color"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:212
-msgid ""
-"Import filter error. No conversion method is defined,  please report a bug."
+#: ../lib/advene/gui/main.py:1444
+msgid "Select an annotation to loop on it"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:344
+#: ../lib/advene/gui/main.py:1446
 #, python-format
-msgid "Converted from %s"
+msgid "Looping on %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:469
-msgid "ExternalApp importer"
+#: ../lib/advene/gui/main.py:1516 ../lib/advene/gui/main.py:2443
+msgid "No active dynamic view"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:483
-#, python-format
-msgid ""
-"The <b>%s</b> application does not seem to be installed. Please check that "
-"it is present and that its path is correctly specified in preferences."
+#: ../lib/advene/gui/main.py:1527
+msgid "Create a new dynamic view."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:485
-#, python-format
-msgid "The file %s does not seem to exist."
+#: ../lib/advene/gui/main.py:1546
+msgid "Edit the current dynamic view."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:507
-#, python-format
-msgid "Could not run %(appname)s: %(msg)s"
+#: ../lib/advene/gui/main.py:1558
+msgid "No dynamic view"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:509
-#, python-format
-msgid "Processing %s"
+#: ../lib/advene/gui/main.py:1589
+msgid "Playing rate"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:513
-msgid "Cleaning up..."
+#: ../lib/advene/gui/main.py:1737
+msgid "History"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:633
-msgid "Text importer"
+#: ../lib/advene/gui/main.py:1744
+msgid "Popups"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:646 ../lib/advene/util/importer.py:1176
-msgid "Specify the encoding of the input file (latin1, utf8...)"
+#: ../lib/advene/gui/main.py:1748
+msgid ""
+"You can drag and drop view icons (timeline, treeview, transcription...) in "
+"notebooks to embed various views."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:649
-msgid "Should the timestamps be encoded relative to the first timestamp?"
+#: ../lib/advene/gui/main.py:1748 ../lib/advene/gui/main.py:4123
+msgid "Information"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:652
-msgid "Unit to consider for integers"
+#: ../lib/advene/gui/main.py:2034
+msgid "Cannot create annotation. There is no schema to put it in."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:655
-msgid ""
-"What timestamps are present in a line (only begin, both begin and end, or "
-"automatic recognition)"
+#: ../lib/advene/gui/main.py:2043
+msgid "Default annotation type"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:798
-msgid "lsdvd importer"
+#: ../lib/advene/gui/main.py:2055
+msgid "Annotation created"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:825
-msgid "Processing data"
+#: ../lib/advene/gui/main.py:2088
+msgid "Play/Pause [Control-Tab / Control-Space]"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:843 ../lib/advene/util/importer.py:903
-msgid "DVD Chapter"
+#: ../lib/advene/gui/main.py:2092
+#, python-format
+msgid "Rewind (%.02f s) [Control-Left]"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:847
-msgid "Launching lsdvd..."
+#: ../lib/advene/gui/main.py:2096
+#, python-format
+msgid "Forward (%.02f s) [Control-Right]"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:859
-msgid "chaplin importer"
+#: ../lib/advene/gui/main.py:2100
+msgid "Previous frame [Control-Down]"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:917
-msgid "Xi importer"
+#: ../lib/advene/gui/main.py:2104
+msgid "Next frame [Control-Up]"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:986
-msgid "ELAN importer"
+#: ../lib/advene/gui/main.py:2108
+msgid "Fullscreen"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1039
+#: ../lib/advene/gui/main.py:2290
 #, python-format
-msgid "Converting tier %s"
+msgid "Screenshot saved to %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1140
-msgid "Processing time slots"
+#: ../lib/advene/gui/main.py:2292
+#, python-format
+msgid ""
+"Screenshot saved in\n"
+" %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1155
-msgid "Fixing forward references"
+#: ../lib/advene/gui/main.py:2294
+#, python-format
+msgid ""
+"Could not save screenshot:\n"
+" %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1157
-msgid "Creating relations"
+#: ../lib/advene/gui/main.py:2302
+msgid "Save screenshot to..."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1169
-msgid "Subtitle (SRT) importer"
+#: ../lib/advene/gui/main.py:2320
+msgid "Could not take snapshot with enough precision"
+msgstr ""
+
+#: ../lib/advene/gui/main.py:2358
+msgid "Export package data"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1238
+#: ../lib/advene/gui/main.py:2360
 #, python-format
-msgid "Subtitles from %s"
+msgid "Export annotation type %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1251
-msgid "PRAAT importer"
+#: ../lib/advene/gui/main.py:2362
+#, python-format
+msgid "Export element %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1341
-msgid "CMML importer"
+#: ../lib/advene/gui/main.py:2388
+msgid "Export format"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1404
-msgid "Parsing clip information"
+#: ../lib/advene/gui/main.py:2425
+msgid " (modified)"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1501
-#: ../lib/advene/plugins/transcriber.py:254
-msgid "Creating package"
+#: ../lib/advene/gui/main.py:2428
+#, python-format
+msgid "Activate %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1504
-msgid "Creating CMML schema"
+#: ../lib/advene/gui/main.py:2598
+msgid "Saved workspace"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1508
-#: ../lib/advene/plugins/transcriber.py:260
-msgid "Creating annotation types"
+#: ../lib/advene/gui/main.py:2651
+msgid "Restoring workspace..."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1514
-#: ../lib/advene/plugins/transcriber.py:265
-msgid "Parsing header information"
+#: ../lib/advene/gui/main.py:2657
+#, python-format
+msgid "Do you wish to restore the %s workspace ?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1528
-msgid "Parsing stream information"
+#: ../lib/advene/gui/main.py:2662
+msgid "Clear the current workspace"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1562
-msgid "IRI importer"
+#: ../lib/advene/gui/main.py:2683
+#, python-format
+msgid "View %s is not an adhoc view"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1571
-msgid "Generate one type per view"
+#: ../lib/advene/gui/main.py:2694
+#, python-format
+msgid "Cannot identify the adhoc view %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1591
+#: ../lib/advene/gui/main.py:2708
+msgid "Choose the annotation type to display as transcription."
+msgstr ""
+
+#: ../lib/advene/gui/main.py:2743
 #, python-format
-msgid "Parsing ensemble %s"
+msgid "Error: unable to find an edit popup for %(element)s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1602
+#: ../lib/advene/gui/main.py:2750
 #, python-format
-msgid "Parsing decoupage %s"
+msgid "Editing %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1638
-msgid "Parsing views"
+#: ../lib/advene/gui/main.py:2762
+#, python-format
+msgid "Comment view (%s)"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1686 ../lib/advene/util/importer.py:1775
-msgid "Initializing package"
+#: ../lib/advene/gui/main.py:2829
+#, python-format
+msgid "Package %(uri)s saved: %(annotations)s and %(relations)s."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1724
-msgid "IRIData importer"
+#: ../lib/advene/gui/main.py:2840
+#, python-format
+msgid "Activating package %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1738
-msgid "Parsing sound values"
+#: ../lib/advene/gui/main.py:2868
+#, python-format
+msgid "Package %(uri)s loaded: %(annotations)s and %(relations)s."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1750
-msgid "Creating annotations"
+#: ../lib/advene/gui/main.py:2900
+msgid "Do you want to restore the saved workspace ?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:402
-msgid "Package"
+#: ../lib/advene/gui/main.py:2907
+msgid "Advene"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:403
-msgid "Annotation"
+#: ../lib/advene/gui/main.py:2957
+#, python-format
+msgid "Video player error: %s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:404
-msgid "Relation"
+#: ../lib/advene/gui/main.py:3137 ../lib/advene/gui/main.py:3158
+msgid "Unknown"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:405 ../lib/advene/gui/edit/schemaeditor.py:111
-#: ../lib/advene/gui/main.py:276 ../lib/advene/gui/main.py:3270
-msgid "Schema"
+#: ../lib/advene/gui/main.py:3228
+#, python-format
+msgid ""
+"The package(s) %s are modified.\n"
+"Save them now?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:406 ../lib/advene/gui/main.py:279
-msgid "Annotation Type"
+#: ../lib/advene/gui/main.py:3252
+#: ../lib/advene/gui/views/interactivequery.py:376
+msgid "Empty quicksearch string"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:407 ../lib/advene/gui/main.py:280
-msgid "Relation Type"
+#: ../lib/advene/gui/main.py:3255
+#: ../lib/advene/gui/views/interactivequery.py:281
+#, python-format
+msgid "'%s'"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:408 ../lib/advene/rules/actions.py:236
-#: ../lib/advene/gui/edit/rules.py:1087 ../lib/advene/gui/main.py:277
-msgid "View"
+#: ../lib/advene/gui/main.py:3270
+msgid "Choose an annotation type."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:409 ../lib/advene/gui/main.py:278
-#: ../lib/advene/gui/popup.py:459
-msgid "Query"
+#: ../lib/advene/gui/main.py:3289 ../lib/advene/gui/views/timeline.py:3035
+#: ../lib/advene/gui/edit/transcribe.py:994
+msgid "Create a new annotation type"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:410
-msgid "Resource Folder"
+#: ../lib/advene/gui/main.py:3314
+msgid "No annotation type is defined."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:411 ../lib/advene/gui/edit/create.py:122
-msgid "Resource File"
+#: ../lib/advene/gui/main.py:3323
+msgid "Creating a new type."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:446
-msgid "---- Elements ----"
+#: ../lib/advene/gui/main.py:3327
+msgid "Title of the new type"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:452
-msgid "---- Attributes ----"
+#: ../lib/advene/gui/main.py:3328
+msgid ""
+"Id of the new type. It is generated from the title, but you may change it if "
+"necessary."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:455
-msgid "---- Methods ----"
+#: ../lib/advene/gui/main.py:3332
+msgid "Specify the content-type for the annotation type"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:531
-#, python-format
-msgid "Cannot read %(filename)s: %(error)s"
+#: ../lib/advene/gui/main.py:3334
+msgid "Content type"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:555
-#, python-format
-msgid ""
-"Error:\n"
-"%s"
+#: ../lib/advene/gui/main.py:3341 ../lib/advene/gui/main.py:3450
+msgid "Create a new schema"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:565
-#, python-format
-msgid ""
-"Package %(title)s:\n"
-"%(schema)s\n"
-"%(annotation)s in %(annotation_type)s\n"
-"%(relation)s in %(relation_type)s\n"
-"%(query)s\n"
-"%(view)s\n"
-"\n"
-"Description:\n"
-"%(description)s\n"
+#: ../lib/advene/gui/main.py:3354
+msgid "Choose an existing schema for the new type, or create a new one"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:592
-msgid "Min duration"
+#: ../lib/advene/gui/main.py:3357 ../lib/advene/gui/main.py:3465
+msgid "Specify the schema title"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:593
-msgid "Max duration"
+#: ../lib/advene/gui/main.py:3361
+msgid "Title of the new schema"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:594
-msgid "Mean duration"
+#: ../lib/advene/gui/main.py:3362
+msgid ""
+"Id of the new schema. It is generated from the title, but you may change it "
+"if necessary."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:595
-msgid "Total duration"
+#: ../lib/advene/gui/main.py:3385
+msgid ""
+"You specified a annotation-type identifier that already exists. Aborting."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:601
-msgid "schema"
+#: ../lib/advene/gui/main.py:3403
+msgid "You specified a existing schema identifier. Using the existing schema."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:601
-msgid "schemas"
+#: ../lib/advene/gui/main.py:3405
+msgid ""
+"You specified an existing identifier that does not reference a schema. "
+"Aborting."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:602
-msgid "annotation"
+#: ../lib/advene/gui/main.py:3432
+msgid "Choose a schema."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:602
-msgid "annotations"
+#: ../lib/advene/gui/main.py:3492
+msgid "You specified an existing identifier. Aborting."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:603 ../lib/advene/util/helper.py:604
-msgid "annotation type"
+#: ../lib/advene/gui/main.py:3512
+#, python-format
+msgid "Package %s modified"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:603 ../lib/advene/util/helper.py:604
-msgid "annotation types"
+#: ../lib/advene/gui/main.py:3513
+#, python-format
+msgid ""
+"The package %s has been modified but not saved.\n"
+"Save it now?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:605
-msgid "relation"
+#: ../lib/advene/gui/main.py:3523
+#, python-format
+msgid "%s snapshots"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:605
-msgid "relations"
+#: ../lib/advene/gui/main.py:3524
+#, python-format
+msgid "Do you want to save the snapshots for media %s?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:606 ../lib/advene/util/helper.py:607
-msgid "relation type"
+#: ../lib/advene/gui/main.py:3531 ../lib/advene/gui/main.py:3540
+#: ../lib/advene/gui/main.py:4541
+#, python-format
+msgid "Cannot save imagecache for %(media)s: %(e)s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:606 ../lib/advene/util/helper.py:607
-msgid "relation types"
+#: ../lib/advene/gui/main.py:3554
+msgid "first frame"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:608
-msgid "query"
+#: ../lib/advene/gui/main.py:3555
+msgid "last frame"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:608
-msgid "queries"
+#: ../lib/advene/gui/main.py:3563
+#, python-format
+msgid "Click on %(bound)s of %(annotation)s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:609
-msgid "view"
+#: ../lib/advene/gui/main.py:3566
+#, python-format
+msgid "Update %(bound)s of %(annotation)s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:609
-msgid "views"
+#: ../lib/advene/gui/main.py:3585
+msgid "Click on the frame corresponding to the timestamp value"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:610
-msgid "package"
+#: ../lib/advene/gui/main.py:3587
+msgid "Set new timestamp value"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:610
-msgid "packages"
+#: ../lib/advene/gui/main.py:3594
+msgid ""
+"<b>Annotation statistics</b>\n"
+"\n"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:622
-#, python-format
-msgid "No %s"
+#: ../lib/advene/gui/main.py:3666
+msgid "Text annotation"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:624
-#, python-format
-msgid "1 %s"
+#: ../lib/advene/gui/main.py:3674 ../lib/advene/gui/main.py:3699
+msgid "Cannot find an appropriate annotation type"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:626
-#, python-format
-msgid "%(count)d %(plural)s"
+#: ../lib/advene/gui/main.py:3676 ../lib/advene/gui/views/bookmarks.py:293
+msgid "Comment here"
 msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:76
-msgid "Cinelab importer"
+#: ../lib/advene/gui/main.py:3692
+msgid "Graphical annotation"
 msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:119 ../lib/advene/plugins/cinelab.py:121
-#, python-format
-msgid "File %s is not an Advene2 zip package."
+#: ../lib/advene/gui/main.py:3744
+msgid ""
+"An unsaved template package exists\n"
+"Save it first."
 msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:176
-msgid "Converting annotation types"
+#: ../lib/advene/gui/main.py:3753
+msgid "Package modified"
 msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:217
-msgid "Converting views"
+#: ../lib/advene/gui/main.py:3754
+msgid ""
+"The package that you want to close has been modified but not saved.\n"
+"Save it now?"
 msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:249
-#: ../lib/advene/plugins/youtubeannotations.py:72
-msgid "Importing annotations"
+#: ../lib/advene/gui/main.py:3787
+msgid "Load a package"
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:41
-msgid "ShotdetectApp importer"
+#: ../lib/advene/gui/main.py:3800
+msgid ""
+"A video file was selected. Pretend that the user selected 'Select a video "
+"file'..."
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:52
+#: ../lib/advene/gui/main.py:3805
+#, python-format
 msgid ""
-"Sensitivity of the algorithm. It should typically be between 50 and 80. If "
-"too many shots are detected, try to increase its value."
+"The file %s does not look like a valid Advene package. It should have a .azp "
+"or .xml extension. Try to open anyway?"
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:80
-#: ../lib/advene/plugins/goodshotdetector.py:78
-msgid "Detected shots"
+#: ../lib/advene/gui/main.py:3814
+msgid ""
+"You are trying to load a session file, but there are unsaved packages. "
+"Proceed anyway?"
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:140 ../lib/advene/gui/main.py:5130
+#: ../lib/advene/gui/main.py:3823
 #, python-format
-msgid "Detected shot #%(num)d at %(pos)s "
+msgid ""
+"Cannot load package %(filename)s:\n"
+"%(error)s"
 msgstr ""
 
-#: ../lib/advene/plugins/youtubeannotations.py:33
-msgid "Youtube XML annotations importer"
+#: ../lib/advene/gui/main.py:3843 ../lib/advene/gui/main.py:3899
+msgid "Do you want to save the current workspace ?"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:62
-msgid "Input from the braille table."
+#: ../lib/advene/gui/main.py:3858 ../lib/advene/gui/main.py:3914
+#, python-format
+msgid "Could not save the package: %s"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:66
-msgid "BrlTTY not installed. There will be no braille support."
+#: ../lib/advene/gui/main.py:3871
+#, python-format
+msgid "Save the package %s"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:78
-msgid "Could not initialize BrlTTY. No braille support."
+#: ../lib/advene/gui/main.py:3884
+msgid "Invalid file extension"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:84
-msgid "Display a message in Braille"
+#: ../lib/advene/gui/main.py:3885
+#, python-format
+msgid ""
+"Your package contains resources,\n"
+"the filename (%s) should have a .azp extension.\n"
+"Should I put the correct extension?"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:85
-msgid "Message to display."
+#: ../lib/advene/gui/main.py:3889
+msgid "OK, the resources will be lost."
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:88 ../lib/advene/plugins/tts.py:81
-#: ../lib/advene/rules/actions.py:40 ../lib/advene/rules/actions.py:107
-#: ../lib/advene/rules/actions.py:123 ../lib/advene/gui/plugins/actions.py:44
-#: ../lib/advene/gui/plugins/actions.py:58
-#: ../lib/advene/gui/plugins/actions.py:110
-#: ../lib/advene/gui/plugins/actions.py:399
-#: ../lib/advene/gui/plugins/actions.py:527
-#: ../lib/advene/gui/edit/rules.py:766
-msgid "The annotation content"
+#: ../lib/advene/gui/main.py:3891
+msgid "Aborting package saving"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:240 ../lib/advene/plugins/tts.py:110
-#: ../lib/advene/gui/plugins/actions.py:234
-msgid "Unknown rule"
+#: ../lib/advene/gui/main.py:3925
+msgid "Save the session in..."
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:241 ../lib/advene/plugins/tts.py:111
-#: ../lib/advene/gui/plugins/actions.py:235
+#: ../lib/advene/gui/main.py:3936
 #, python-format
-msgid ""
-"Rule %(rulename)s: Error in the evaluation of the parameter "
-"%(parametername)s:"
+msgid "Session saved in %s"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:256
-#, python-format
-msgid "BrlTTY connection error: %s"
+#: ../lib/advene/gui/main.py:3945
+msgid "Do you confirm the creation of annotations matching the DVD chapters?"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:273
-msgid "Braille display: "
+#: ../lib/advene/gui/main.py:3951
+msgid "Cannot import DVD chapters. Did you install the lsdvd software?"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:279
-msgid "No message"
+#: ../lib/advene/gui/main.py:3959
+msgid "The associated media is not a DVD."
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:45
-msgid "Shot detection (Delakis version)"
+#: ../lib/advene/gui/main.py:3970
+#, python-format
+msgid "Processing %s video"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:60
-msgid "Cache histogram alongside video files."
+#: ../lib/advene/gui/main.py:3973
+msgid "No associated video file"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:63
-msgid ""
-"Parameter profile: safe will detect less cuts, aggressive will detect more "
-"cuts (but more false ones too). default is a compromise."
+#: ../lib/advene/gui/main.py:4000
+msgid "Standard RuleSet"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:77
+#: ../lib/advene/gui/main.py:4112
 #, python-format
-msgid "Shot (%s profile)"
+msgid ""
+"Media information\n"
+"\n"
+"URI: %(uri)s\n"
+"Framerate: %(framerate_denom)d / %(framerate_num)d (%(framerate).02f )\n"
+"Duration: %(duration_formatted)s (%(duration)d ms) (cached: "
+"%(cached_duration_formatted)s)\n"
+"Current position: %(position_formatted)s (%(position)d ms)\n"
+"\n"
+"Original image size: %(width)d x %(height)d\n"
+"\n"
+"Image cache information: %(imagecache)s\n"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:83
-msgid "Loading histogram"
+#: ../lib/advene/gui/main.py:4137
+msgid "Visit the Advene web site for examples and documentation."
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:146
-msgid "Computing hdiff"
+#: ../lib/advene/gui/main.py:4170 ../lib/advene/gui/main.py:4258
+msgid "Select a movie file"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:153
-msgid "Detecting cuts"
+#: ../lib/advene/gui/main.py:4182
+msgid "Title/Chapter selection"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:180
-msgid "Detecting dissolves"
+#: ../lib/advene/gui/main.py:4224
+msgid "Select a video stream"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:265
-msgid "Extracting histogram"
+#: ../lib/advene/gui/main.py:4225
+msgid "Enter the address of a video stream"
 msgstr ""
 
-#: ../lib/advene/plugins/anvil.py:35
-msgid "Anvil importer"
+#: ../lib/advene/gui/main.py:4229
+#, python-format
+msgid "Successfully extracted the video stream address (%s) from the url.\n"
 msgstr ""
 
-#: ../lib/advene/plugins/annotationgraph.py:40
-msgid "AnnotationGraph importer"
+#: ../lib/advene/gui/main.py:4254
+msgid "Package properties"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:33
-msgid "Final Cut Pro XML importer"
+#: ../lib/advene/gui/main.py:4255 ../lib/advene/gui/edit/elements.py:516
+#: ../lib/advene/gui/edit/elements.py:565
+#: ../lib/advene/gui/edit/elements.py:652
+#: ../lib/advene/gui/edit/elements.py:732
+#: ../lib/advene/gui/edit/elements.py:789
+#: ../lib/advene/gui/edit/elements.py:881
+#: ../lib/advene/gui/edit/elements.py:950
+#: ../lib/advene/gui/edit/elements.py:1062
+#: ../lib/advene/gui/edit/elements.py:1124
+msgid "Author"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:55
-msgid "FCP clipitem"
+#: ../lib/advene/gui/main.py:4255
+msgid "Author name"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:75
-msgid "Importing subtitles"
+#: ../lib/advene/gui/main.py:4256 ../lib/advene/gui/edit/elements.py:517
+#: ../lib/advene/gui/edit/elements.py:566
+#: ../lib/advene/gui/edit/elements.py:653
+#: ../lib/advene/gui/edit/elements.py:733
+#: ../lib/advene/gui/edit/elements.py:790
+#: ../lib/advene/gui/edit/elements.py:882
+#: ../lib/advene/gui/edit/elements.py:951
+#: ../lib/advene/gui/edit/elements.py:1063
+#: ../lib/advene/gui/edit/elements.py:1125
+msgid "Date"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:90
-msgid "Importing clips"
+#: ../lib/advene/gui/main.py:4256
+msgid "Package creation date"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:93
-msgid "No clip"
+#: ../lib/advene/gui/main.py:4257 ../lib/advene/gui/views/table.py:681
+#: ../lib/advene/gui/util/dialog.py:391 ../lib/advene/gui/edit/imports.py:334
+#: ../lib/advene/gui/edit/dvdselect.py:75
+#: ../lib/advene/gui/edit/transcribe.py:1022
+msgid "Title"
 msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:219
-#, python-format
-msgid "Cannot export to %(fname)s: %(e)s"
+#: ../lib/advene/gui/main.py:4257
+msgid "Package title"
 msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:1129
-#: ../lib/advene/plugins/tracebuilder.py:1168
-#, python-format
-msgid "Cannot export to %(host)s:%(port)s %(error)s"
+#: ../lib/advene/gui/main.py:4258
+msgid "Associated media"
 msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:1143
-#, python-format
-msgid "Cannot send data to %(host)s:%(port)s %(error)s"
+#: ../lib/advene/gui/main.py:4259 ../lib/advene/gui/views/table.py:315
+msgid "Duration"
 msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:1191
-#, python-format
-msgid "Cannot send event %(nb)s to %(host)s:%(port)s %(error)s"
+#: ../lib/advene/gui/main.py:4259
+msgid "Media duration in ms"
 msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:1197
-#, python-format
-msgid "%(nb)s events sent to %(host)s:%(port)s during session."
+#: ../lib/advene/gui/main.py:4259
+#: ../lib/advene/gui/plugins/eventaccumulator.py:143
+msgid "Reset"
 msgstr ""
 
-#: ../lib/advene/plugins/dcp.py:65
-msgid "DCP importer"
+#: ../lib/advene/gui/main.py:4320 ../lib/advene/gui/views/timeline.py:3522
+#: ../lib/advene/gui/views/timeline.py:3677
+#: ../lib/advene/gui/views/tagbag.py:64
+#: ../lib/advene/gui/edit/properties.py:181
+#: ../lib/advene/gui/edit/transcribe.py:148
+#: ../lib/advene/gui/edit/transcribe.py:1162
+msgid "Preferences"
 msgstr ""
 
-#: ../lib/advene/plugins/dcp.py:120
-#, python-format
-msgid "Converting #%(num)d / %(count)d"
+#: ../lib/advene/gui/main.py:4322
+msgid "Paths"
 msgstr ""
 
-#: ../lib/advene/plugins/ttl.py:41
-msgid "TurTLe (RDF) importer"
+#: ../lib/advene/gui/main.py:4324
+msgid "Data"
 msgstr ""
 
-#: ../lib/advene/plugins/aeidon_import.py:48
-msgid "Aeidon (subtitles) importer"
+#: ../lib/advene/gui/main.py:4324
+msgid "Standard directory for data files"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:47
-#: ../lib/advene/plugins/soundenveloppe.py:143
-#: ../lib/advene/plugins/soundenveloppe.py:145
-msgid "Sound enveloppe"
+#: ../lib/advene/gui/main.py:4325
+msgid "Movie path"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:60
-msgid "Interval (in ms) at which to take samples."
+#: ../lib/advene/gui/main.py:4325
+#, python-format
+msgid ""
+"List of directories (separated by %s) to search for movie files (_ means "
+"package directory)"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:63
-msgid "Maximum number of samples per annotation."
+#: ../lib/advene/gui/main.py:4326
+msgid "Imagecache"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:66
-#: ../lib/advene/plugins/cutter.py:56
-msgid "Channel selection."
+#: ../lib/advene/gui/main.py:4326
+msgid "Directory for storing the snapshot cache"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:90
-#: ../lib/advene/plugins/pocketsphinx.py:119
-#: ../lib/advene/plugins/barcode.py:58
-msgid "Generating annotations"
+#: ../lib/advene/gui/main.py:4327
+msgid "Player"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:115
-#, python-format
-msgid "At %s"
+#: ../lib/advene/gui/main.py:4327
+msgid "Directory of the video player"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:162
-msgid "Extracting sound enveloppe"
+#: ../lib/advene/gui/main.py:4328
+msgid "Shotdetect"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:39
-msgid "Audio segmentation"
+#: ../lib/advene/gui/main.py:4328
+msgid "Shotdetect application"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:53
-msgid "Volume threshold (in dB, can be negative) before trigger."
+#: ../lib/advene/gui/main.py:4330
+msgid "GUI"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:101
-#, python-format
-msgid "Detected %(count)d segments until %(time)s"
+#: ../lib/advene/gui/main.py:4331
+msgid "Interface language (after restart)"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:119
-msgid "Sound segment"
+#: ../lib/advene/gui/main.py:4331
+msgid ""
+"Language used for the interface (necessitates to restart the application)"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:120
-#, python-format
-msgid ""
-"Sound segmentation with a threshold of %(threshold)d dB - channel: "
-"%(channel)s"
+#: ../lib/advene/gui/main.py:4332 ../lib/advene/gui/util/initialconfig.py:88
+msgid "System default"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:138
-msgid "Starting silence detection"
+#: ../lib/advene/gui/main.py:4337
+msgid "Record activity trace"
 msgstr ""
 
-#: ../lib/advene/plugins/montagerenderer.py:43
-msgid "Cannot register montage renderer: Gnonlin plugins are not present."
+#: ../lib/advene/gui/main.py:4338
+msgid "Expert mode"
 msgstr ""
 
-#: ../lib/advene/plugins/mpeg7.py:54
-msgid "MPEG7 importer"
+#: ../lib/advene/gui/main.py:4338
+msgid "Offer advanced possibilities"
 msgstr ""
 
-#: ../lib/advene/plugins/transcriber.py:40
-msgid "Transcriber importer"
+#: ../lib/advene/gui/main.py:4339
+msgid "Prefer WYSIWYG"
 msgstr ""
 
-#: ../lib/advene/plugins/transcriber.py:86
-msgid "Parsing section information"
+#: ../lib/advene/gui/main.py:4339
+msgid "Use WYSIWYG editors when possible (HTML, SVG)"
 msgstr ""
 
-#: ../lib/advene/plugins/transcriber.py:276
-msgid "Parsing topic and speaker tables information"
+#: ../lib/advene/gui/main.py:4340
+msgid "Player control modifier"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:42
-msgid "Feature detection (face...)"
+#: ../lib/advene/gui/main.py:4340
+msgid ""
+"Generic player control modifier: key used in combination with arrows/space/"
+"tab to control the player. Click the button and press key+space to choose "
+"the modifier."
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:57
-msgid "Sensitivity level."
+#: ../lib/advene/gui/main.py:4341
+msgid "Player control in edit popups"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:60
+#: ../lib/advene/gui/main.py:4341
 msgid ""
-"Scale. Original image size will be divided by this factor, in order to speed "
-"up detection."
+"Enable generic player controls in edit windows. This may be undesirable "
+"since it overloads some standard text-edition behaviours (esp. control-left/"
+"right)."
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:63
-msgid "Classifier"
+#: ../lib/advene/gui/main.py:4342
+msgid "Open popups"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:77
-#, python-format
-msgid "Feature %s"
+#: ../lib/advene/gui/main.py:4343
+msgid "Where should we open adhoc views?"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:79
-#, python-format
-msgid "Detected %s"
+#: ../lib/advene/gui/main.py:4344
+msgid "as a popup window"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:81
-msgid "Detection started"
+#: ../lib/advene/gui/main.py:4345
+msgid "embedded east of the video"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:171
-#, python-format
-msgid "Detected %(count)d feature(s) until %(time)s"
+#: ../lib/advene/gui/main.py:4346
+msgid "embedded west of the video"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:37
-msgid ""
-"Cannot register speech recognition: Pocketsphinx plugins not found. See "
-"http://cmusphinx.sourceforge.net/wiki/gstreamer for details."
+#: ../lib/advene/gui/main.py:4347
+msgid "embedded south of the video"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:41
-msgid "Speech recognition (PocketSphinx)"
+#: ../lib/advene/gui/main.py:4348
+msgid "embedded at the right of the window"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:61
-msgid "Filtering noise level [0..1]."
+#: ../lib/advene/gui/main.py:4351
+msgid "History size"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:65
-msgid ""
-"Minimum amount (in milliseconds) of silence required to terminate the "
-"current annotation and start a new one. Decreasing this length will result "
-"in a large amount of short annotations and increasing this length will "
-"result in a small amount of long annotations."
+#: ../lib/advene/gui/main.py:4351
+msgid "History filelist size limit"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:69
-msgid "Use default acoustic and language models."
+#: ../lib/advene/gui/main.py:4353
+msgid "Remember window size"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:73
-msgid "Acoustic model (directory)"
+#: ../lib/advene/gui/main.py:4353
+msgid "Remember the size of opened windows"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:77
-msgid "Phonetic dictionary (.dic file)"
+#: ../lib/advene/gui/main.py:4354
+msgid "Bookmark snapshot width"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:81
-msgid "Language model (.DMP file)"
+#: ../lib/advene/gui/main.py:4354
+msgid "Width of the snapshots representing bookmarks"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:144
-#: ../lib/advene/plugins/barcode.py:83
-#, python-format
-msgid "%(count)d utterances until %(time)s"
+#: ../lib/advene/gui/main.py:4355
+msgid "Bookmark snapshot precision"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:153
-msgid "Speech"
+#: ../lib/advene/gui/main.py:4355
+msgid "Precision (in ms) of the displayed bookmark snapshots."
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:155
-msgid "Recognized speech"
+#: ../lib/advene/gui/main.py:4357
+msgid "Frame selector (shotvalidation...)"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:191
-msgid "Recognizing speech"
+#: ../lib/advene/gui/main.py:4358
+msgid "Frameselector snapshot width"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:36
-msgid "Cannot register barcode extraction: zbar plugin not found."
+#: ../lib/advene/gui/main.py:4358
+msgid "Width of the snapshots in frameselector"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:40
-msgid "Barcode (qr-code) extraction"
+#: ../lib/advene/gui/main.py:4359
+msgid "Frameselector count"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:95
-msgid "Barcode"
+#: ../lib/advene/gui/main.py:4359
+msgid "Number of frames displayed in frameselector."
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:97
-msgid "Extracted barcode information"
+#: ../lib/advene/gui/main.py:4361
+msgid "General"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:115
-msgid "Extraction barcodes"
+#: ../lib/advene/gui/main.py:4362
+msgid "Weekly update check"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:47
-msgid "NERD (Named Entity Recognition and Disambiguation)"
+#: ../lib/advene/gui/main.py:4362 ../lib/advene/gui/util/initialconfig.py:90
+msgid "Weekly check for updates on the Advene website"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:68
-msgid "NERD API key"
+#: ../lib/advene/gui/main.py:4363
+msgid "On exit,"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:82
-msgid "NER service to use"
+#: ../lib/advene/gui/main.py:4364
+msgid "How to handle screenshots on exit"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:88
-msgid "Type of annotation to analyze"
+#: ../lib/advene/gui/main.py:4365
+msgid "never save screenshots"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:93
-msgid "Language to analyze"
+#: ../lib/advene/gui/main.py:4366
+msgid "always save screenshots"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:98
-msgid "Minimum confidence level (between 0.0 and 1.0)"
+#: ../lib/advene/gui/main.py:4367
+msgid "ask before saving screenshots"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:103
-msgid "Interpolate position of annotations"
+#: ../lib/advene/gui/main.py:4369
+msgid "Auto-save"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:108
-msgid "Split by entity type"
+#: ../lib/advene/gui/main.py:4370
+msgid "Data auto-save functionality"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:113
-msgid "Store results as markup in the annotation text"
+#: ../lib/advene/gui/main.py:4371
+msgid "is desactivated"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:118
-msgid "Create relations between the original annotations and the new ones"
+#: ../lib/advene/gui/main.py:4372
+msgid "is done automatically"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:150
-#, python-format
-msgid "NERD applied to %s"
+#: ../lib/advene/gui/main.py:4373
+msgid "is done after confirmation"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:208
-#, python-format
-msgid "NERD %s"
+#: ../lib/advene/gui/main.py:4375
+msgid "Auto-save interval (in s)"
 msgstr ""
 
-#: ../lib/advene/plugins/ted.py:39
-msgid "TED importer"
+#: ../lib/advene/gui/main.py:4375
+msgid "Interval (in seconds) between package auto-saves"
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetect.py:35
-msgid "Shotdetect importer"
+#: ../lib/advene/gui/main.py:4377
+msgid "Workspace"
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetect.py:79
-msgid "No shots"
+#: ../lib/advene/gui/main.py:4379
+msgid "On package saving,"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:77
-msgid "Pronounce a text"
+#: ../lib/advene/gui/main.py:4380
+msgid "Do you wish to save the default workspace with the package?"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:78
-msgid "String to pronounce."
+#: ../lib/advene/gui/main.py:4381
+msgid "never save the current workspace"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:131 ../lib/advene/gui/plugins/actions.py:259
-#: ../lib/advene/gui/plugins/actions.py:340
-#: ../lib/advene/gui/plugins/actions.py:358
-msgid "No message..."
+#: ../lib/advene/gui/main.py:4382
+msgid "always save the current workspace"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:156
-msgid "TTS disabled. Cannot find the application 'festival' in PATH"
+#: ../lib/advene/gui/main.py:4383
+msgid "ask before saving the current workspace"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:158
-msgid "TTS disabled. Cannot find the application 'aplay' in PATH"
+#: ../lib/advene/gui/main.py:4385
+msgid "Auto-validation of edited elements"
 msgstr ""
 
-#: ../lib/advene/player/gstreamer.py:434
-msgid "Cannot capture full-resolution snapshot, another capture is ongoing."
+#: ../lib/advene/gui/main.py:4385
+msgid "Automatically validate modified elements when saving the package."
 msgstr ""
 
-#: ../lib/advene/rules/importer.py:29
-msgid "Event history importer"
+#: ../lib/advene/gui/main.py:4387
+msgid "On package load,"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:37 ../lib/advene/rules/actions.py:102
-#: ../lib/advene/rules/actions.py:120
-msgid "Message to display"
+#: ../lib/advene/gui/main.py:4388
+msgid "Do you wish to load the workspace saved with the package?"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:48
-msgid "Start the player"
+#: ../lib/advene/gui/main.py:4389
+msgid "never load the saved workspace"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:49
-msgid "Start position (in ms)"
+#: ../lib/advene/gui/main.py:4390
+msgid "always load the saved workspace"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:52 ../lib/advene/rules/actions.py:384
-msgid "The movie start"
+#: ../lib/advene/gui/main.py:4391
+msgid "ask before loading the saved workspace"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:53 ../lib/advene/rules/actions.py:385
-msgid "The annotation begin"
+#: ../lib/advene/gui/main.py:4394
+msgid "Video Player"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:54 ../lib/advene/rules/actions.py:386
-msgid "The annotation end"
+#: ../lib/advene/gui/main.py:4395
+msgid "Autostart"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:63 ../lib/advene/gui/views/logwindow.py:129
-msgid "Go to the given position"
-msgstr ""
+#: ../lib/advene/gui/main.py:4395
+msgid ""
+"Automatically start the player when loading a media file (either directly or "
+"through a package)"
+msgstr ""
 
-#: ../lib/advene/rules/actions.py:64
-msgid "Goto position (in ms)"
+#: ../lib/advene/gui/main.py:4396
+msgid "Fulscreen timestamp"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:73
-msgid "Stop the player"
+#: ../lib/advene/gui/main.py:4396
+msgid "Display the timestamp over the video when in fullscreen mode"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:80
-msgid "Pause the player"
+#: ../lib/advene/gui/main.py:4397
+msgid "Enable captions"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:87
-msgid "Resume the player"
+#: ../lib/advene/gui/main.py:4397
+msgid "Enable captions over the video"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:94
-msgid "Take a snapshot"
+#: ../lib/advene/gui/main.py:4398
+msgid "Caption font"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:101
-msgid "Display a caption"
+#: ../lib/advene/gui/main.py:4398
+msgid "TrueType font for captions"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:103
-msgid "Duration of the caption"
+#: ../lib/advene/gui/main.py:4399
+msgid "Enable SVG"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:110 ../lib/advene/rules/actions.py:172
-#: ../lib/advene/gui/plugins/actions.py:61
-#: ../lib/advene/gui/plugins/actions.py:121
-#: ../lib/advene/gui/plugins/actions.py:403
-#: ../lib/advene/gui/plugins/actions.py:538
-msgid "1 second"
+#: ../lib/advene/gui/main.py:4399
+msgid "Enable SVG captions over the video"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:111 ../lib/advene/rules/actions.py:173
-#: ../lib/advene/gui/plugins/actions.py:62
-#: ../lib/advene/gui/plugins/actions.py:122
-#: ../lib/advene/gui/plugins/actions.py:404
-#: ../lib/advene/gui/plugins/actions.py:539
-#: ../lib/advene/gui/edit/rules.py:773
-msgid "The annotation duration"
+#: ../lib/advene/gui/main.py:4401
+msgid "Enable snapshots"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:119 ../lib/advene/gui/popup.py:718
-msgid "Caption the annotation"
+#: ../lib/advene/gui/main.py:4402
+msgid "Snapshot width"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:131
-msgid "Display a graphical shape"
+#: ../lib/advene/gui/main.py:4402
+msgid "Snapshot width in pixels."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:132
-msgid "Shape (square, circle, triangle)"
+#: ../lib/advene/gui/main.py:4403
+msgid "Verbosity"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:133
-#: ../lib/advene/gui/edit/shapewidget.py:342
-#: ../lib/advene/gui/edit/elements.py:891
-#: ../lib/advene/gui/edit/elements.py:971
-#: ../lib/advene/gui/edit/elements.py:1085
-#: ../lib/advene/gui/views/tagbag.py:138
-msgid "Color"
+#: ../lib/advene/gui/main.py:4403
+msgid "Verbosity level. -1 for no messages."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:134
-msgid "x-position (percentage of screen)"
+#: ../lib/advene/gui/main.py:4406
+msgid "Devices"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:135
-msgid "y-position (percentage of screen)"
+#: ../lib/advene/gui/main.py:4408
+msgid "Standard"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:136
-msgid "Size (arbitrary units)"
+#: ../lib/advene/gui/main.py:4410
+msgid "DVD drive"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:137
-msgid "Duration of the display in ms"
+#: ../lib/advene/gui/main.py:4410
+msgid "Drive letter for the DVD"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:145
-msgid "A square"
+#: ../lib/advene/gui/main.py:4411
+msgid "GDI"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:146
-msgid "A circle"
+#: ../lib/advene/gui/main.py:4412
+msgid "Direct X"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:147
-msgid "A triangle"
+#: ../lib/advene/gui/main.py:4414
+msgid "DVD device"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:150
-msgid "White"
+#: ../lib/advene/gui/main.py:4414
+msgid "Device for the DVD"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:151
-msgid "Black"
+#: ../lib/advene/gui/main.py:4415
+msgid "X11"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:152
-msgid "Red"
+#: ../lib/advene/gui/main.py:4416
+msgid "XVideo"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:153
-msgid "Green"
+#: ../lib/advene/gui/main.py:4417
+msgid "GL"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:154
-msgid "Blue"
+#: ../lib/advene/gui/main.py:4419
+msgid "Video output"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:155
-msgid "Yellow"
+#: ../lib/advene/gui/main.py:4419
+msgid "Video output module"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:158
-msgid "At the top of the screen"
+#: ../lib/advene/gui/main.py:4421
+msgid "Recorder options"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:159 ../lib/advene/rules/actions.py:164
-msgid "In the middle of the screen"
+#: ../lib/advene/gui/main.py:4422
+msgid "Audio input"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:160
-msgid "At the bottom of the screen"
+#: ../lib/advene/gui/main.py:4422
+msgid "Device name for audio input (with gstrecorder plugin)"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:163
-msgid "At the left of the screen"
+#: ../lib/advene/gui/main.py:4423
+msgid "Record video"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:167
-#: ../lib/advene/gui/edit/transcribe.py:1164
-#: ../lib/advene/gui/views/activebookmarks.py:547
-msgid "Small"
+#: ../lib/advene/gui/main.py:4423
+msgid "Record both video and audio"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:168
-#: ../lib/advene/gui/edit/transcribe.py:1165
-#: ../lib/advene/gui/views/activebookmarks.py:548
-msgid "Normal"
+#: ../lib/advene/gui/main.py:4426
+msgid "<i>Experimental</i>"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:169
-#: ../lib/advene/gui/edit/transcribe.py:1166
-#: ../lib/advene/gui/views/activebookmarks.py:549
-msgid "Large"
+#: ../lib/advene/gui/main.py:4427 ../lib/advene/gui/views/scroller.py:30
+msgid "Scroller"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:181
-msgid "Zero the volume during the annotation"
+#: ../lib/advene/gui/main.py:4427
+msgid "Embed the caption scroller below the video"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:188
-msgid "Zero the volume"
+#: ../lib/advene/gui/main.py:4428 ../lib/advene/gui/views/caption.py:29
+msgid "Caption"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:195
-msgid "Restore the volume"
+#: ../lib/advene/gui/main.py:4428
+msgid "Embed the caption view below the video"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:203
-msgid "Activate a STBV"
+#: ../lib/advene/gui/main.py:4430
+msgid "Time-related"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:204
-msgid "STBV id"
+#: ../lib/advene/gui/main.py:4431
+msgid "Time format"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:213
-msgid "Send a user event"
+#: ../lib/advene/gui/main.py:4431
+msgid "Format used to display timecodes"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:214
-msgid "Identifier"
+#: ../lib/advene/gui/main.py:4445
+msgid "Default FPS"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:215
-msgid "Delay in ms before sending the event."
+#: ../lib/advene/gui/main.py:4446
+msgid ""
+"Default FPS (frame-per-second) value, when the information cannot be read "
+"from the media."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:225
-msgid "Open a URL in the web browser"
+#: ../lib/advene/gui/main.py:4447
+msgid "Time increment"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:226 ../lib/advene/gui/plugins/actions.py:103
-#: ../lib/advene/gui/views/logwindow.py:159
-msgid "URL"
+#: ../lib/advene/gui/main.py:4447
+msgid ""
+"Skip duration, when using control-left/right or forward/rewind buttons (in "
+"ms)."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:235
-msgid "Open a static view"
+#: ../lib/advene/gui/main.py:4448
+msgid "Second time increment"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:246
-msgid "Set the audio volume"
+#: ../lib/advene/gui/main.py:4448
+msgid "Skip duration, when using control-shift-left/right (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:247
-msgid "Volume level (from 0 to 100)"
+#: ../lib/advene/gui/main.py:4449
+msgid "Third time increment"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:256
-msgid "Set the playing rate"
+#: ../lib/advene/gui/main.py:4449
+msgid "Skip duration, when using control-shift-up/down (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:257
-msgid "Rate (100: normal rate, 200: twice slower)"
+#: ../lib/advene/gui/main.py:4450
+msgid "Custom Up/Down"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:266
-msgid "Play a sound resource"
+#: ../lib/advene/gui/main.py:4450
+msgid ""
+"Use third time increment for up/down navigation without having to hold shift."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:267
-msgid "Clip id"
+#: ../lib/advene/gui/main.py:4452
+msgid "Scroll increment"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:268 ../lib/advene/rules/actions.py:282
-msgid "Volume (0..100)"
+#: ../lib/advene/gui/main.py:4452
+msgid ""
+"On most annotations, control+scrollwheel will increment/decrement their "
+"bounds by this value (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:269 ../lib/advene/rules/actions.py:283
-msgid "Left-right balance: -1 -> full left, 0 -> center, 1 -> full right"
+#: ../lib/advene/gui/main.py:4453
+msgid "Second scroll increment"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:280
-msgid "Play a sound file"
+#: ../lib/advene/gui/main.py:4453
+msgid ""
+"On most annotations, control+shift+scrollwheel will increment/decrement "
+"their bounds by this value (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:281
-msgid "Sound filename"
+#: ../lib/advene/gui/main.py:4455
+msgid "Player sync"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:293
-msgid "Set a state variable"
+#: ../lib/advene/gui/main.py:4455
+msgid ""
+"Interval (in ms) with which we synchronize slave players. Setting a too-low "
+"value could render the application unusable. Use 0 to disable continuous "
+"synchronization."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:294 ../lib/advene/rules/actions.py:306
-msgid "State variable name"
+#: ../lib/advene/gui/main.py:4456
+msgid "Timeline parameters"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:295
-msgid "State value"
+#: ../lib/advene/gui/main.py:4457 ../lib/advene/gui/edit/transcribe.py:156
+msgid "Font size"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:305
-msgid "Increment a state variable"
+#: ../lib/advene/gui/main.py:4457
+msgid "Font size for annotation widgets"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:315
-msgid "Clear all state variables"
+#: ../lib/advene/gui/main.py:4458
+msgid "Button height"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:330
-#, python-format
-msgid "Error in the evaluation of the parameter %s:"
+#: ../lib/advene/gui/main.py:4458
+msgid "Height of annotation widgets"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:389 ../lib/advene/gui/plugins/actions.py:247
-#, python-format
-msgid "The %s-related outgoing annotation"
+#: ../lib/advene/gui/main.py:4459
+msgid "Interline height"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:391 ../lib/advene/gui/plugins/actions.py:249
-#, python-format
-msgid "The %s-related incoming annotation"
+#: ../lib/advene/gui/main.py:4459
+msgid "Height of interlines"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:551
-#, python-format
-msgid "Cannot find the stbv %s"
+#: ../lib/advene/gui/main.py:4461
+msgid "Text content"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:615 ../lib/advene/gui/views/viewbook.py:263
-#, python-format
-msgid "Cannot find the view %s"
+#: ../lib/advene/gui/main.py:4462
+msgid "Completion mode"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:647
-msgid "The set_rate method is unavailable."
+#: ../lib/advene/gui/main.py:4462
+msgid "Enable dynamic completion mode"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:657
-msgid "No 'soundclips' resource folder in the package"
+#: ../lib/advene/gui/main.py:4463
+msgid "Predefined terms only"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:683
-msgid "Full volume"
+#: ../lib/advene/gui/main.py:4463
+msgid "If completion is enabled, complete only with predefined terms."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:684
-msgid "Left"
+#: ../lib/advene/gui/main.py:4464
+msgid "Abbreviation mode"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:685
-#: ../lib/advene/gui/edit/transcribe.py:1196
-msgid "Center"
+#: ../lib/advene/gui/main.py:4464
+msgid "Enable abbreviation mode"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:686
-msgid "Right"
+#: ../lib/advene/gui/main.py:4465
+msgid "Abbreviations"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:141
-msgid "is equal to"
+#: ../lib/advene/gui/main.py:4465
+msgid ""
+"Text abbreviations. 1 entry per line. Each line consists of the abbreviation "
+"followed by its replacement."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:142
-msgid "is different from"
+#: ../lib/advene/gui/main.py:4467
+msgid "Text-To-Speech"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:143
-msgid "contains"
+#: ../lib/advene/gui/main.py:4468
+msgid "TTS language"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:144
-msgid "is greater than"
+#: ../lib/advene/gui/main.py:4469
+msgid "What language settings should be used for text-to-speech"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:145
-msgid "is lower than"
+#: ../lib/advene/gui/main.py:4470
+msgid "English"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:146
-msgid "matches the regexp"
+#: ../lib/advene/gui/main.py:4471
+msgid "French"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:147
-msgid "is before"
+#: ../lib/advene/gui/main.py:4472
+msgid "Spanish"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:148
-msgid "meets"
+#: ../lib/advene/gui/main.py:4474
+msgid "TTS Encoding"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:149
-msgid "overlaps"
+#: ../lib/advene/gui/main.py:4475
+msgid "What encoding should be used to communicate with the TTS engine"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:150
-msgid "during"
+#: ../lib/advene/gui/main.py:4476
+msgid "TTS Engine"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:151
-msgid "starts"
+#: ../lib/advene/gui/main.py:4477
+msgid ""
+"Which TTS engine should be used (modification requires restarting Advene to "
+"take into account)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:152
-msgid "finishes"
+#: ../lib/advene/gui/main.py:4478
+msgid "Automatic"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:157
-msgid "is not true"
+#: ../lib/advene/gui/main.py:4479
+msgid "eSpeak"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:158
-msgid "is true"
+#: ../lib/advene/gui/main.py:4480
+msgid "Custom script with standard input"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:162
-msgid "Basic conditions"
+#: ../lib/advene/gui/main.py:4481
+msgid "Custom script with arguments"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:163
-msgid "Allen relations"
+#: ../lib/advene/gui/main.py:4482
+msgid "SAPI"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:226 ../lib/advene/rules/elements.py:232
-msgid "Unknown type for overlaps comparison"
+#: ../lib/advene/gui/main.py:4483
+msgid "MacOS X say"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:240 ../lib/advene/rules/elements.py:246
-msgid "Unknown type for during comparison"
+#: ../lib/advene/gui/main.py:4484
+msgid "Generic (text output)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:515 ../lib/advene/rules/elements.py:521
-#, python-format
-msgid "Unknown action %s"
+#: ../lib/advene/gui/main.py:4530
+msgid "You should restart Advene to take some options into account."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:522
+#: ../lib/advene/gui/main.py:4539
 #, python-format
-msgid "Unknown parameter %s"
+msgid "Imagecache saved to %s"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:527
-msgid "Unknown actions"
+#: ../lib/advene/gui/main.py:4552
+msgid "Restarting player..."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:972
-msgid "Start of the editing of an element"
+#: ../lib/advene/gui/main.py:4647 ../lib/advene/gui/views/timeline.py:1121
+#: ../lib/advene/rules/elements.py:1010
+msgid "Creation of a new annotation type"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:973
-msgid "Cancel of the editing of an element"
+#: ../lib/advene/gui/main.py:4655 ../lib/advene/gui/views/timeline.py:1150
+msgid ""
+"Select the schema where you want to\n"
+"create the new relation type."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:974
-msgid "Destruction of the edit window of an element"
+#: ../lib/advene/gui/main.py:4673
+msgid "Select the package to merge"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:975
-msgid "Validation of the editing of an element"
+#: ../lib/advene/gui/main.py:4694
+msgid "Saving workspace"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:976
-msgid "Ending editing of a package"
+#: ../lib/advene/gui/main.py:4697
+msgid "Enter a view name to save the workspace"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:977
-msgid "Beginning of an annotation"
+#: ../lib/advene/gui/main.py:4698
+msgid "Default workspace"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:978
-msgid "End of an annotation"
+#: ../lib/advene/gui/main.py:4699
+msgid "Open this workspace when opening the package"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:979
-msgid "Creation of a new annotation"
+#: ../lib/advene/gui/main.py:4722 ../lib/advene/gui/views/__init__.py:305
+#, python-format
+msgid "Error: the identifier %s contains invalid characters."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:980
-msgid "Ending editing of an annotation"
+#: ../lib/advene/gui/main.py:4733
+#, python-format
+msgid "Error: the view %s exists and is not a workspace view."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:981
-msgid "Suppression of an annotation"
+#: ../lib/advene/gui/main.py:4764
+#, python-format
+msgid "Cannot save default workspace: %s"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:982
-msgid "Activation of an annotation"
+#: ../lib/advene/gui/main.py:4774
+msgid "Standard workspace has been saved"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:983
-msgid "Deactivation of an annotation"
+#: ../lib/advene/gui/main.py:4781
+msgid "Website export"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:984
-msgid "Merging of two annotations"
+#: ../lib/advene/gui/main.py:4782
+msgid "Exporting views to a website"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:985
-msgid "Moving an annotation"
+#: ../lib/advene/gui/main.py:4785
+msgid "Output directory"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:986
-msgid "Activation of a relation"
+#: ../lib/advene/gui/main.py:4794
+msgid "Specify the output directory"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:987
-msgid "Deactivation of a relation"
+#: ../lib/advene/gui/main.py:4803
+msgid "Maximum recursion depth"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:988
-msgid "Creation of a new relation"
+#: ../lib/advene/gui/main.py:4810
+msgid "Video URL"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:989
-msgid "Ending editing of a relation"
+#: ../lib/advene/gui/main.py:4812
+msgid ""
+"URL for the video, if it is available on a sharing website (Only Youtube for "
+"the moment).\n"
+" It can also be a h264/ogg file, which will in this case be handled by the "
+"HTML5 video player."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:990
-msgid "Suppression of a relation"
+#: ../lib/advene/gui/main.py:4862
+msgid "Could not export data: "
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:991
-msgid "Creation of a new view"
+#: ../lib/advene/gui/main.py:4864
+#, python-format
+msgid "Website export to %s completed"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:992
-msgid "Ending editing of a view"
+#: ../lib/advene/gui/main.py:4903
+msgid "This video player is not able to grab specific screenshots"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:993
-msgid "Suppression of a view"
+#: ../lib/advene/gui/main.py:4909
+#, python-format
+msgid "Updating %d snapshots"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:994
-msgid "Creation of a new query"
+#: ../lib/advene/gui/main.py:4914
+msgid "No snapshot to update"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:995
-msgid "Ending editing of a query"
+#: ../lib/advene/gui/plugins/shotvalidation.py:37
+msgid "Shot validation view"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:996
-msgid "Suppression of a query"
+#: ../lib/advene/gui/plugins/shotvalidation.py:39
+msgid "Display shot validation interface"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:997
-msgid "Creation of a new schema"
+#: ../lib/advene/gui/plugins/shotvalidation.py:115
+#, python-format
+msgid "Merged #%(first)d-#%(second)d into #%(first)d"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:998
-msgid "Ending editing of a schema"
+#: ../lib/advene/gui/plugins/shotvalidation.py:145
+msgid "Last action undone"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:999
-msgid "Suppression of a schema"
+#: ../lib/advene/gui/plugins/shotvalidation.py:163
+#, python-format
+msgid "Split annotation #%(current)d into #%(current)d and #%(next)d"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1000
-#: ../lib/advene/gui/views/timeline.py:1029 ../lib/advene/gui/main.py:4555
-msgid "Creation of a new annotation type"
+#: ../lib/advene/gui/plugins/shotvalidation.py:168
+#, python-format
+msgid "Cannot split annotation #%(current)d: out of bounds."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1001
-msgid "Ending editing an annotation type"
+#: ../lib/advene/gui/plugins/shotvalidation.py:188
+#, python-format
+msgid "Changed cut between #%(first)d and %(second)d"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1002
-msgid "Suppression of an annotation type"
+#: ../lib/advene/gui/plugins/shotvalidation.py:191
+msgid "Changed begin time for first annotation"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1003
-msgid "Creation of a new relation type"
+#: ../lib/advene/gui/plugins/shotvalidation.py:197
+msgid "No annotations to adjust"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1004
-msgid "Ending editing a relation type"
+#: ../lib/advene/gui/plugins/shotvalidation.py:204
+msgid ""
+"Click on the frame just after the cut to adjust the cut time.\n"
+"Control-click on a frame to indicate a missing cut."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1005
-msgid "Suppression of a relation type"
+#: ../lib/advene/gui/plugins/shotvalidation.py:212
+#, python-format
+msgid "Begin of #%(index)d (title: %(content)s)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1006
-msgid "Creation of a new resource"
+#: ../lib/advene/gui/plugins/shotvalidation.py:226
+msgid "< Previous cut"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1007
-msgid "Ending editing of a resource"
+#: ../lib/advene/gui/plugins/shotvalidation.py:227
+msgid "Display previous cut"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1008
-msgid "Suppression of a resource"
+#: ../lib/advene/gui/plugins/shotvalidation.py:234
+msgid "Next cut >"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1009
-msgid "Modification of the tag"
+#: ../lib/advene/gui/plugins/shotvalidation.py:235
+msgid "Display next cut"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1010
-msgid "Activating a link"
+#: ../lib/advene/gui/plugins/shotvalidation.py:250
+#: ../lib/advene/gui/views/annotationdisplay.py:92
+#: ../lib/advene/gui/views/timeline.py:86
+msgid "Current time"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1011
-msgid "Player start"
+#: ../lib/advene/gui/plugins/shotvalidation.py:251
+msgid "Go to annotation containing current player time."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1012
-msgid "Player stop"
+#: ../lib/advene/gui/plugins/shotvalidation.py:255
+#: ../lib/advene/gui/edit/frameselector.py:200
+msgid "Refresh snapshots"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1013
-msgid "Player pause"
+#: ../lib/advene/gui/plugins/shotvalidation.py:256
+#: ../lib/advene/gui/edit/frameselector.py:201
+msgid "Refresh missing snapshots"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1014
-msgid "Player resume"
+#: ../lib/advene/gui/plugins/shotvalidation.py:261
+msgid "Undo last modification"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1015
-msgid "Going to a given position"
+#: ../lib/advene/gui/plugins/shotvalidation.py:267
+msgid "Merge with previous"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1016
-msgid "Loading a new package"
+#: ../lib/advene/gui/plugins/shotvalidation.py:268
+msgid "Merge with previous annotation, i.e. remove this bound."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1017
-msgid "Activating a package"
+#: ../lib/advene/gui/plugins/shotvalidation.py:273
+msgid "Close view."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1018
-msgid "Saving the package"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:44
+msgid "Activity trace"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1019
-msgid "Start of the dynamic view"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:74
+#: ../lib/advene/gui/plugins/eventaccumulator.py:75
+#: ../lib/advene/gui/plugins/tracetimeline.py:65
+#: ../lib/advene/gui/plugins/tracetimeline.py:66
+#: ../lib/advene/gui/plugins/tracepreview.py:72
+#: ../lib/advene/gui/plugins/tracepreview.py:73
+msgid "Beginning edition"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1020
-msgid "End of the dynamic view"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:76
+#: ../lib/advene/gui/plugins/eventaccumulator.py:77
+#: ../lib/advene/gui/plugins/eventaccumulator.py:78
+#: ../lib/advene/gui/plugins/tracetimeline.py:67
+#: ../lib/advene/gui/plugins/tracetimeline.py:68
+#: ../lib/advene/gui/plugins/tracetimeline.py:69
+#: ../lib/advene/gui/plugins/tracepreview.py:74
+#: ../lib/advene/gui/plugins/tracepreview.py:75
+#: ../lib/advene/gui/plugins/tracepreview.py:76
+msgid "Canceling edition"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1021
-msgid "Start of the application"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:79
+#: ../lib/advene/gui/plugins/tracetimeline.py:70
+#: ../lib/advene/gui/plugins/tracepreview.py:77
+msgid "Ending edition"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1022
-msgid "End of the application"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:135
+msgid " Trace : "
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1023
-msgid "User-defined event"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:139
+msgid " Filters"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1024
-msgid "Modification of the associated media"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:168
+msgid " Time : "
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1025
-msgid "Highlight a bookmark"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:178
+msgid " Max. : "
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1026
-msgid "Unhighlight a bookmark"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:187
+msgid "Export"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1027
-msgid "Updating duration of the movie"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:203
+#: ../lib/advene/gui/plugins/tracetimeline.py:665
+msgid "Exporting traces"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1028
-msgid "Displaying a popup"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:208
+#: ../lib/advene/gui/plugins/tracetimeline.py:670
+#, python-format
+msgid ""
+"Export done to\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1029
-msgid "Updating a snapshot"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:254
+msgid "Defining Filters"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1067
-msgid "Player control"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:560
+#: ../lib/advene/gui/plugins/eventaccumulator.py:615
+#: ../lib/advene/gui/plugins/tracepreview.py:214
+#, python-format
+msgid "of an annotation (%s)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1068
-msgid "Audio enrichment"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:562
+#: ../lib/advene/gui/plugins/eventaccumulator.py:617
+#: ../lib/advene/gui/plugins/tracepreview.py:216
+#, python-format
+msgid "of a relation (%s)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1069
-msgid "Image enrichment"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:564
+#: ../lib/advene/gui/plugins/eventaccumulator.py:619
+#: ../lib/advene/gui/plugins/tracepreview.py:218
+#, python-format
+msgid "of an annotation type (%s)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1070
-msgid "External display control"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:566
+#: ../lib/advene/gui/plugins/eventaccumulator.py:621
+#: ../lib/advene/gui/plugins/tracepreview.py:220
+#, python-format
+msgid "of a relation type (%s)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1071
-msgid "Popup"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:568
+#: ../lib/advene/gui/plugins/eventaccumulator.py:623
+#: ../lib/advene/gui/plugins/tracepreview.py:222
+#, python-format
+msgid "of a schema (%s)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1073
-msgid "State"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:570
+#: ../lib/advene/gui/plugins/eventaccumulator.py:625
+#: ../lib/advene/gui/plugins/tracepreview.py:224
+#, python-format
+msgid "of a view (%s)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1074
-msgid "GUI actions"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:572
+#: ../lib/advene/gui/plugins/eventaccumulator.py:627
+#: ../lib/advene/gui/plugins/tracepreview.py:226
+#, python-format
+msgid "of a package (%s)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1075
-msgid "Expert"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:574
+#: ../lib/advene/gui/plugins/eventaccumulator.py:629
+#: ../lib/advene/gui/plugins/tracepreview.py:228
+#, python-format
+msgid "of an unknown item (%s)"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:82
-msgid "Initial Advene configuration"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:382
+#, python-format
+msgid "Rendering type %(type)s as %(presentation)s"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:83
-msgid ""
-"<span size='large'><b>Welcome in Advene</b>\n"
-"This is the first time that you run Advene. Please answer some basic "
-"configuration questions. You will be able to modify these choices from the "
-"Advene interface, in the Edit/Preferences menu.</span>"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:527
+msgid "Snapshot only"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:84
-msgid "Interface language"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:528
+msgid "Overlayed snapshot only"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:84
-msgid "Language used for the interface"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:529
+msgid "Timestamp only"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:88 ../lib/advene/gui/main.py:4247
-msgid "System default"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:530
+msgid "Snapshot+timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:90
-msgid "Weekly check for Advene updates on the Advene website"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:531
+msgid "Annotation content"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:90 ../lib/advene/gui/main.py:4273
-msgid "Weekly check for updates on the Advene website"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:546
+msgid "as a list"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:92
-msgid "Preferred directory for data files"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:547
+msgid "as a grid"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:92
-msgid "Preferred directory for storing data files (Advene packages)"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:548
+msgid "as a table"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:94
-msgid "Directories to search for movies"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:549
+#: ../lib/advene/gui/views/viewbook.py:394
+msgid "as a transcription"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:94
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:667
+#: ../lib/advene/gui/views/transcription.py:448
 #, python-format
-msgid ""
-"List of directories (separated by %(pathsep)s) to search for movie files."
-msgstr ""
-
-#: ../lib/advene/gui/util/initialconfig.py:95
-msgid "First look for movie file in the same directory as the package"
-msgstr ""
-
-#: ../lib/advene/gui/util/initialconfig.py:95
-msgid ""
-"If checked, the movie file will be searched for in the same directory as the "
-"referencing package."
-msgstr ""
-
-#: ../lib/advene/gui/util/__init__.py:39
-#: ../lib/advene/gui/edit/schemaeditor.py:1081
-#: ../lib/advene/gui/edit/schemaeditor.py:1202
-#: ../lib/advene/gui/edit/create.py:106
-msgid "Plain text content"
-msgstr ""
-
-#: ../lib/advene/gui/util/__init__.py:40
-msgid "HTML content"
-msgstr ""
-
-#: ../lib/advene/gui/util/__init__.py:41
-#: ../lib/advene/gui/edit/schemaeditor.py:1082
-#: ../lib/advene/gui/edit/schemaeditor.py:1203
-#: ../lib/advene/gui/edit/create.py:107
-msgid "Simple-structured content"
-msgstr ""
-
-#: ../lib/advene/gui/util/__init__.py:42
-msgid "List of numeric values"
-msgstr ""
-
-#: ../lib/advene/gui/util/__init__.py:43
-#: ../lib/advene/gui/edit/schemaeditor.py:1083
-#: ../lib/advene/gui/edit/schemaeditor.py:1204
-#: ../lib/advene/gui/edit/create.py:108
-msgid "SVG graphics content"
-msgstr ""
-
-#: ../lib/advene/gui/util/__init__.py:459
-#, python-format
-msgid ""
-"Annotation Type %(title)s:\n"
-"%(count)s"
-msgstr ""
-
-#: ../lib/advene/gui/util/__init__.py:465
-#, python-format
-msgid ""
-"Relation Type %(title)s:\n"
-"%(count)s"
-msgstr ""
-
-#: ../lib/advene/gui/util/dialog.py:376 ../lib/advene/gui/edit/dvdselect.py:95
-#: ../lib/advene/gui/edit/imports.py:331
-#: ../lib/advene/gui/edit/transcribe.py:1055
-#: ../lib/advene/gui/views/table.py:557 ../lib/advene/gui/main.py:4176
-msgid "Title"
-msgstr ""
-
-#: ../lib/advene/gui/util/dialog.py:385 ../lib/advene/gui/edit/rules.py:1092
-#: ../lib/advene/gui/edit/imports.py:325
-#: ../lib/advene/gui/edit/elements.py:507
-#: ../lib/advene/gui/edit/elements.py:556
-#: ../lib/advene/gui/edit/elements.py:644
-#: ../lib/advene/gui/edit/elements.py:724
-#: ../lib/advene/gui/edit/elements.py:873
-#: ../lib/advene/gui/edit/elements.py:942
-#: ../lib/advene/gui/edit/elements.py:1054
-#: ../lib/advene/gui/edit/elements.py:1115
-#: ../lib/advene/gui/views/table.py:255 ../lib/advene/gui/views/table.py:559
-msgid "Id"
-msgstr ""
-
-#: ../lib/advene/gui/util/dialog.py:404 ../lib/advene/gui/util/dialog.py:443
-msgid "Name the element"
+msgid "Annotation %s"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:407 ../lib/advene/gui/util/dialog.py:444
-msgid "Choose a name for the element"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:668
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:687
+msgid "Play video"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:482
-msgid "Open a file"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:669
+msgid "Show timestamp only"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:507 ../lib/advene/gui/util/dialog.py:543
-msgid "N/C"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:670
+msgid "Show content only"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:512
-msgid "Alias"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:671
+msgid "Show snapshot only"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:532
-msgid ""
-"Press to\n"
-"display\n"
-"information"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:673
+msgid "Show overlayed timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:551
-msgid "Wait..."
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:674
+msgid "Show overlayed content"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:555
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:676
 #, python-format
-msgid "Error: %s"
-msgstr ""
-
-#: ../lib/advene/gui/util/dialog.py:575
-msgid "Any type of file"
-msgstr ""
-
-#: ../lib/advene/gui/util/dialog.py:577
-msgid "Advene files (.xml, .azp, .apl)"
-msgstr ""
-
-#: ../lib/advene/gui/util/dialog.py:579
-msgid "Advene session (.apl)"
-msgstr ""
-
-#: ../lib/advene/gui/util/dialog.py:580
-msgid "Audio files"
-msgstr ""
-
-#: ../lib/advene/gui/util/dialog.py:581
-msgid "Video files"
-msgstr ""
-
-#: ../lib/advene/gui/util/dialog.py:626
-#: ../lib/advene/gui/edit/properties.py:418
-msgid "Choose a directory"
-msgstr ""
-
-#: ../lib/advene/gui/util/dialog.py:679
-msgid "Select an element"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:32
-msgid "Shot validation view"
+msgid "Annotation type %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:34
-msgid "Display shot validation interface"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:677
+msgid "display as list"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:111
-#, python-format
-msgid "Merged #%(first)d-#%(second)d into #%(first)d"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:678
+msgid "display as grid"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:136
-msgid "Last action undone"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:679
+msgid "display as table"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:154
-#, python-format
-msgid "Split annotation #%(current)d into #%(current)d and #%(next)d"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:680
+msgid "display as transcription"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:159
-#, python-format
-msgid "Cannot split annotation #%(current)d: out of bounds."
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:689
+msgid "Open link"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:179
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:745
 #, python-format
-msgid "Changed cut between #%(first)d and %(second)d"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:182
-msgid "Changed begin time for first annotation"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:188
-msgid "No annotations to adjust"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:195
-msgid ""
-"Click on the frame just after the cut to adjust the cut time.\n"
-"Control-click on a frame to indicate a missing cut."
+msgid "HTML editor: cannot parse content (%s)"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:203
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:776
 #, python-format
-msgid "Begin of #%(index)d (title: %(content)s)"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:217
-msgid "< Previous cut"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:218
-msgid "Display previous cut"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:225
-msgid "Next cut >"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:226
-msgid "Display next cut"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:251
-#: ../lib/advene/gui/views/timeline.py:81
-#: ../lib/advene/gui/views/annotationdisplay.py:90
-msgid "Current time"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:252
-msgid "Go to annotation containing current player time."
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:256
-#: ../lib/advene/gui/edit/frameselector.py:193
-msgid "Refresh snapshots"
+msgid "Heading %d"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:257
-#: ../lib/advene/gui/edit/frameselector.py:194
-msgid "Refresh missing snapshots"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:787
+msgid "Bold"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:261
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:806
-#: ../lib/advene/gui/edit/transcribe.py:1211 ../lib/advene/gui/main.py:350
-msgid "Undo"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:788
+msgid "Italic"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:262
-msgid "Undo last modification"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:789
+msgid "Header"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:268
-msgid "Merge with previous"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:791
+msgid "Copy"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:269
-msgid "Merge with previous annotation, i.e. remove this bound."
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:792
+msgid "Cut"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:274
-msgid "Close view."
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:793
+msgid "Paste"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:60
-#: ../lib/advene/gui/plugins/tracetimeline.py:61
-#: ../lib/advene/gui/plugins/eventaccumulator.py:73
-#: ../lib/advene/gui/plugins/eventaccumulator.py:74
-#: ../lib/advene/gui/plugins/tracepreview.py:72
-#: ../lib/advene/gui/plugins/tracepreview.py:73
-msgid "Beginning edition"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:795
+#: ../lib/advene/gui/views/timeline.py:139
+msgid "Refresh"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:62
-#: ../lib/advene/gui/plugins/tracetimeline.py:63
-#: ../lib/advene/gui/plugins/tracetimeline.py:64
-#: ../lib/advene/gui/plugins/eventaccumulator.py:75
-#: ../lib/advene/gui/plugins/eventaccumulator.py:76
-#: ../lib/advene/gui/plugins/eventaccumulator.py:77
-#: ../lib/advene/gui/plugins/tracepreview.py:74
-#: ../lib/advene/gui/plugins/tracepreview.py:75
-#: ../lib/advene/gui/plugins/tracepreview.py:76
-msgid "Canceling edition"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:851
+msgid "WYSIWYG editor"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:65
-#: ../lib/advene/gui/plugins/eventaccumulator.py:78
-#: ../lib/advene/gui/plugins/tracepreview.py:77
-msgid "Ending edition"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:861
+msgid "Edit HTML source"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:66
+#: ../lib/advene/gui/plugins/tracetimeline.py:71
 #: ../lib/advene/gui/plugins/tracepreview.py:78
 msgid "Moving to"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:82
+#: ../lib/advene/gui/plugins/tracetimeline.py:87
 msgid "Traces"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:208
+#: ../lib/advene/gui/plugins/tracetimeline.py:213
 #, python-format
 msgid "%(name)s (%(index)d)"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:236
+#: ../lib/advene/gui/plugins/tracetimeline.py:241
 msgid "Search"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:249
-#: ../lib/advene/gui/plugins/tracetimeline.py:1224
+#: ../lib/advene/gui/plugins/tracetimeline.py:254
+#: ../lib/advene/gui/plugins/tracetimeline.py:1214
 #, python-format
 msgid "%(name)s (%(index)s)"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:421
-#: ../lib/advene/gui/edit/montage.py:439
-#: ../lib/advene/gui/views/timeline.py:3444
+#: ../lib/advene/gui/plugins/tracetimeline.py:426
+#: ../lib/advene/gui/views/timeline.py:3484
+#: ../lib/advene/gui/edit/montage.py:449
 msgid "Zoom out"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:426
-#: ../lib/advene/gui/edit/montage.py:444
-#: ../lib/advene/gui/views/timeline.py:3449
+#: ../lib/advene/gui/plugins/tracetimeline.py:431
+#: ../lib/advene/gui/views/timeline.py:3489
+#: ../lib/advene/gui/edit/montage.py:454
 msgid "Zoom in"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:431
+#: ../lib/advene/gui/plugins/tracetimeline.py:436
 msgid "Zoom 100%"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:435
+#: ../lib/advene/gui/plugins/tracetimeline.py:440
 msgid "Toggle links lock"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:443
+#: ../lib/advene/gui/plugins/tracetimeline.py:448
 msgid "Toggle link mode"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:450
+#: ../lib/advene/gui/plugins/tracetimeline.py:455
 msgid "Open a trace file"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:465
+#: ../lib/advene/gui/plugins/tracetimeline.py:470
 msgid "Toggle auto refresh"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:476
+#: ../lib/advene/gui/plugins/tracetimeline.py:481
 msgid "Open an existing trace"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:482
+#: ../lib/advene/gui/plugins/tracetimeline.py:487
 msgid "Save trace"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:487
+#: ../lib/advene/gui/plugins/tracetimeline.py:492
 msgid "Configuration"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:668
-#: ../lib/advene/gui/plugins/eventaccumulator.py:202
-msgid "Exporting traces"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:673
-#: ../lib/advene/gui/plugins/eventaccumulator.py:207
-#, python-format
-msgid ""
-"Export done to\n"
-"%s"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:951
+#: ../lib/advene/gui/plugins/tracetimeline.py:941
 msgid "Zoom and center on linked items"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:960
+#: ../lib/advene/gui/plugins/tracetimeline.py:950
 msgid "Edit item"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:964
+#: ../lib/advene/gui/plugins/tracetimeline.py:954
 msgid "Recreate item"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:980
-#: ../lib/advene/gui/plugins/tracetimeline.py:1001
-#: ../lib/advene/gui/edit/transcribe.py:502
-#: ../lib/advene/gui/views/timeline.py:2556 ../lib/advene/gui/popup.py:513
+#: ../lib/advene/gui/plugins/tracetimeline.py:970
+#: ../lib/advene/gui/plugins/tracetimeline.py:991
+#: ../lib/advene/gui/views/timeline.py:2595 ../lib/advene/gui/popup.py:542
+#: ../lib/advene/gui/edit/transcribe.py:495
 msgid "Go to..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:984
+#: ../lib/advene/gui/plugins/tracetimeline.py:974
 msgid "Zoom on action"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2030
-#: ../lib/advene/gui/edit/montage.py:535
-#: ../lib/advene/gui/views/timeline.py:3318
+#: ../lib/advene/gui/plugins/tracetimeline.py:2018
+#: ../lib/advene/gui/views/timeline.py:3362
+#: ../lib/advene/gui/edit/montage.py:544
 msgid "Inspector"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2035
+#: ../lib/advene/gui/plugins/tracetimeline.py:2023
 msgid "Item Id"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2038
+#: ../lib/advene/gui/plugins/tracetimeline.py:2026
 msgid "Item name or class"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2042
+#: ../lib/advene/gui/plugins/tracetimeline.py:2030
 msgid "Type or schema"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2045
+#: ../lib/advene/gui/plugins/tracetimeline.py:2033
 msgid "Operations"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2087
+#: ../lib/advene/gui/plugins/tracetimeline.py:2076
 msgid "Comment"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2119
+#: ../lib/advene/gui/plugins/tracetimeline.py:2108
 #: ../lib/advene/gui/edit/merge.py:191
 msgid "Action"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/kinect.py:41
-msgid "Kinect Controller"
+#: ../lib/advene/gui/plugins/logmessages.py:35
+msgid "Log Messages"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/kinect.py:43
-msgid "Kinect control interface"
+#: ../lib/advene/gui/plugins/actions.py:40 ../lib/advene/core/controller.py:307
+#: ../lib/advene/rules/actions.py:38
+msgid "Display a message"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/actions.py:41
+#: ../lib/advene/gui/plugins/actions.py:53
+#: ../lib/advene/gui/plugins/actions.py:71
+#: ../lib/advene/gui/plugins/actions.py:86
+#: ../lib/advene/gui/plugins/actions.py:102
+#: ../lib/advene/gui/plugins/actions.py:203
+#: ../lib/advene/core/controller.py:308
+msgid "String to display."
+msgstr ""
+
+#: ../lib/advene/gui/plugins/actions.py:44
+#: ../lib/advene/gui/plugins/actions.py:58
+#: ../lib/advene/gui/plugins/actions.py:110
+#: ../lib/advene/gui/plugins/actions.py:399
+#: ../lib/advene/gui/plugins/actions.py:527 ../lib/advene/gui/edit/rules.py:766
+#: ../lib/advene/plugins/brltty.py:90 ../lib/advene/plugins/tts.py:84
+#: ../lib/advene/rules/actions.py:42 ../lib/advene/rules/actions.py:109
+#: ../lib/advene/rules/actions.py:125
+msgid "The annotation content"
 msgstr ""
 
 #: ../lib/advene/gui/plugins/actions.py:52
@@ -3075,6 +2742,22 @@ msgstr ""
 msgid "Display duration in ms. Ignored if empty."
 msgstr ""
 
+#: ../lib/advene/gui/plugins/actions.py:61
+#: ../lib/advene/gui/plugins/actions.py:121
+#: ../lib/advene/gui/plugins/actions.py:403
+#: ../lib/advene/gui/plugins/actions.py:538 ../lib/advene/rules/actions.py:112
+#: ../lib/advene/rules/actions.py:174
+msgid "1 second"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/actions.py:62
+#: ../lib/advene/gui/plugins/actions.py:122
+#: ../lib/advene/gui/plugins/actions.py:404
+#: ../lib/advene/gui/plugins/actions.py:539 ../lib/advene/gui/edit/rules.py:773
+#: ../lib/advene/rules/actions.py:113 ../lib/advene/rules/actions.py:175
+msgid "The annotation duration"
+msgstr ""
+
 #: ../lib/advene/gui/plugins/actions.py:70
 msgid "Popup an entry box"
 msgstr ""
@@ -3107,6 +2790,11 @@ msgstr ""
 msgid "Display a popup linking to an URL"
 msgstr ""
 
+#: ../lib/advene/gui/plugins/actions.py:103
+#: ../lib/advene/gui/views/logwindow.py:159 ../lib/advene/rules/actions.py:228
+msgid "URL"
+msgstr ""
+
 #: ../lib/advene/gui/plugins/actions.py:106
 msgid "string:Display annotation in web browser"
 msgstr ""
@@ -3146,7 +2834,7 @@ msgid "Destination: popup, south, east"
 msgstr ""
 
 #: ../lib/advene/gui/plugins/actions.py:144
-#: ../lib/advene/gui/views/viewbook.py:308
+#: ../lib/advene/gui/views/viewbook.py:313
 msgid "Open a saved view"
 msgstr ""
 
@@ -3225,38 +2913,38 @@ msgstr ""
 msgid "Bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:276
-#, python-format
-msgid "Error: undefined GUI view %s"
+#: ../lib/advene/gui/plugins/actions.py:234 ../lib/advene/plugins/brltty.py:242
+#: ../lib/advene/plugins/tts.py:113
+msgid "Unknown rule"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:286
-#: ../lib/advene/gui/views/viewbook.py:124 ../lib/advene/gui/main.py:1189
-msgid "...in its own window"
+#: ../lib/advene/gui/plugins/actions.py:235 ../lib/advene/plugins/brltty.py:243
+#: ../lib/advene/plugins/tts.py:114
+#, python-format
+msgid ""
+"Rule %(rulename)s: Error in the evaluation of the parameter "
+"%(parametername)s:"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:287
-#: ../lib/advene/gui/views/viewbook.py:125
-#: ../lib/advene/gui/views/__init__.py:381 ../lib/advene/gui/main.py:1190
-msgid "...embedded east of the video"
+#: ../lib/advene/gui/plugins/actions.py:247 ../lib/advene/rules/actions.py:385
+#, python-format
+msgid "The %s-related outgoing annotation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:288
-#: ../lib/advene/gui/views/viewbook.py:126
-#: ../lib/advene/gui/views/__init__.py:382 ../lib/advene/gui/main.py:1191
-msgid "...embedded west of the video"
+#: ../lib/advene/gui/plugins/actions.py:249 ../lib/advene/rules/actions.py:387
+#, python-format
+msgid "The %s-related incoming annotation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:289
-#: ../lib/advene/gui/views/viewbook.py:127
-#: ../lib/advene/gui/views/__init__.py:383 ../lib/advene/gui/main.py:1192
-msgid "...embedded south of the video"
+#: ../lib/advene/gui/plugins/actions.py:259
+#: ../lib/advene/gui/plugins/actions.py:340
+#: ../lib/advene/gui/plugins/actions.py:358 ../lib/advene/plugins/tts.py:134
+msgid "No message..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:290
-#: ../lib/advene/gui/views/viewbook.py:128
-#: ../lib/advene/gui/views/__init__.py:384 ../lib/advene/gui/main.py:1193
-msgid "...embedded at the right of the window"
+#: ../lib/advene/gui/plugins/actions.py:276
+#, python-format
+msgid "Error: undefined GUI view %s"
 msgstr ""
 
 #: ../lib/advene/gui/plugins/actions.py:322
@@ -3345,100 +3033,19 @@ msgstr ""
 msgid "New bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:43
-msgid "Activity trace"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:134
-msgid " Trace : "
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:138
-msgid " Filters"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:142
-#: ../lib/advene/gui/main.py:4178
-msgid "Reset"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:167
-msgid " Time : "
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:177
-msgid " Max. : "
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:186
-msgid "Export"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:253
-msgid "Defining Filters"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:559
-#: ../lib/advene/gui/plugins/eventaccumulator.py:614
-#: ../lib/advene/gui/plugins/tracepreview.py:214
-#, python-format
-msgid "of an annotation (%s)"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:561
-#: ../lib/advene/gui/plugins/eventaccumulator.py:616
-#: ../lib/advene/gui/plugins/tracepreview.py:216
-#, python-format
-msgid "of a relation (%s)"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:563
-#: ../lib/advene/gui/plugins/eventaccumulator.py:618
-#: ../lib/advene/gui/plugins/tracepreview.py:218
-#, python-format
-msgid "of an annotation type (%s)"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:565
-#: ../lib/advene/gui/plugins/eventaccumulator.py:620
-#: ../lib/advene/gui/plugins/tracepreview.py:220
-#, python-format
-msgid "of a relation type (%s)"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:567
-#: ../lib/advene/gui/plugins/eventaccumulator.py:622
-#: ../lib/advene/gui/plugins/tracepreview.py:222
-#, python-format
-msgid "of a schema (%s)"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:569
-#: ../lib/advene/gui/plugins/eventaccumulator.py:624
-#: ../lib/advene/gui/plugins/tracepreview.py:224
-#, python-format
-msgid "of a view (%s)"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:571
-#: ../lib/advene/gui/plugins/eventaccumulator.py:626
-#: ../lib/advene/gui/plugins/tracepreview.py:226
-#, python-format
-msgid "of a package (%s)"
+#: ../lib/advene/gui/plugins/kinect.py:38
+msgid "Kinect Controller"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:573
-#: ../lib/advene/gui/plugins/eventaccumulator.py:628
-#: ../lib/advene/gui/plugins/tracepreview.py:228
-#, python-format
-msgid "of an unknown item (%s)"
+#: ../lib/advene/gui/plugins/kinect.py:40
+msgid "Kinect control interface"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:122
+#: ../lib/advene/gui/plugins/contenthandlers.py:127
 msgid "Label"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:172
+#: ../lib/advene/gui/plugins/contenthandlers.py:177
 #, python-format
 msgid ""
 "Error while parsing SVG content:\n"
@@ -3446,21 +3053,21 @@ msgid ""
 "%s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:247
+#: ../lib/advene/gui/plugins/contenthandlers.py:252
 msgid " created from "
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:315
+#: ../lib/advene/gui/plugins/contenthandlers.py:329
 msgid "Graphical editor"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:326
+#: ../lib/advene/gui/plugins/contenthandlers.py:340
 msgid "Edit XML"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:378
-#: ../lib/advene/gui/plugins/contenthandlers.py:434
-#: ../lib/advene/gui/edit/rules.py:186
+#: ../lib/advene/gui/plugins/contenthandlers.py:392
+#: ../lib/advene/gui/plugins/contenthandlers.py:448
+#: ../lib/advene/gui/edit/rules.py:188
 #, python-format
 msgid ""
 "The following items seem to be\n"
@@ -3469,37 +3076,43 @@ msgid ""
 "%s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:36 ../lib/advene/gui/main.py:1235
-msgid "Video player"
+#: ../lib/advene/gui/plugins/tracepreview.py:61
+msgid "Trace preview"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/tracepreview.py:99
+msgid "Full trace"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:38
+#: ../lib/advene/gui/plugins/tracepreview.py:100
+msgid "Open the trace timeline view fareast"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/videoplayer.py:39
 msgid "Complementary video player"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:44
-#: ../lib/advene/gui/edit/montage.py:54
-#: ../lib/advene/gui/edit/transcribe.py:85
-#: ../lib/advene/gui/views/transcription.py:56
-#: ../lib/advene/gui/views/bookmarks.py:245
-#: ../lib/advene/gui/views/timeline.py:135
+#: ../lib/advene/gui/plugins/videoplayer.py:45
+#: ../lib/advene/gui/views/bookmarks.py:246
+#: ../lib/advene/gui/views/transcription.py:59
+#: ../lib/advene/gui/views/timeline.py:140 ../lib/advene/gui/edit/montage.py:58
+#: ../lib/advene/gui/edit/transcribe.py:88
 msgid "Save view"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:45
-#: ../lib/advene/gui/edit/transcribe.py:86
-#: ../lib/advene/gui/views/tagbag.py:62
-#: ../lib/advene/gui/views/transcription.py:57
-#: ../lib/advene/gui/views/interactivequery.py:60
-#: ../lib/advene/gui/views/timeline.py:136
+#: ../lib/advene/gui/plugins/videoplayer.py:46
+#: ../lib/advene/gui/views/transcription.py:60
+#: ../lib/advene/gui/views/timeline.py:141 ../lib/advene/gui/views/tagbag.py:65
+#: ../lib/advene/gui/views/interactivequery.py:61
+#: ../lib/advene/gui/edit/transcribe.py:89
 msgid "Save default options"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:46
+#: ../lib/advene/gui/plugins/videoplayer.py:47
 msgid "Select video file"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:127
+#: ../lib/advene/gui/plugins/videoplayer.py:128
 msgid "Select a video file"
 msgstr ""
 
@@ -3507,5435 +3120,5766 @@ msgstr ""
 msgid "Synchronize"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:266
+#: ../lib/advene/gui/plugins/videoplayer.py:268
 msgid "Offset in ms"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:274
+#: ../lib/advene/gui/plugins/videoplayer.py:276
 msgid "Drag and drop to get player time"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracepreview.py:61
-msgid "Trace preview"
+#: ../lib/advene/gui/views/singletonpopup.py:32
+msgid "SingletonPopup"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracepreview.py:99
-msgid "Full trace"
+#: ../lib/advene/gui/views/caption.py:31
+msgid "Display a text caption below the video output"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracepreview.py:100
-msgid "Open the trace timeline view fareast"
+#: ../lib/advene/gui/views/html.py:90
+#, python-format
+msgid "%s%% loaded"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:376
+#: ../lib/advene/gui/views/html.py:93
 #, python-format
-msgid "Rendering type %(type)s as %(presentation)s"
+msgid "Title %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:521
-msgid "Snapshot only"
+#: ../lib/advene/gui/views/html.py:157
+msgid "HTML Viewer"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:522
-msgid "Overlayed snapshot only"
+#: ../lib/advene/gui/views/html.py:159
+msgid "Embedded HTML widget"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:523
-msgid "Timestamp only"
+#: ../lib/advene/gui/views/html.py:187
+msgid "No available HTML rendering component"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:524
-msgid "Snapshot+timestamp"
+#: ../lib/advene/gui/views/annotationdisplay.py:43
+msgid "AnnotationDisplay"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:525
-msgid "Annotation content"
+#: ../lib/advene/gui/views/annotationdisplay.py:45
+msgid "Display the contents of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:540
-msgid "as a list"
+#: ../lib/advene/gui/views/annotationdisplay.py:86
+#: ../lib/advene/util/helper.py:610
+msgid "No annotation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:541
-msgid "as a grid"
+#: ../lib/advene/gui/views/annotationdisplay.py:112
+#, python-format
+msgid ""
+"Schema %(schema)s (id %(id)s)\n"
+"%(description)s\n"
+"%(stats)s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:542
-msgid "as a table"
+#: ../lib/advene/gui/views/annotationdisplay.py:233
+msgid "Screenshot"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:543
-#: ../lib/advene/gui/views/viewbook.py:380
-msgid "as a transcription"
+#: ../lib/advene/gui/views/annotationdisplay.py:255
+#: ../lib/advene/gui/views/relationdisplay.py:104
+msgid "Contents"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:661
-#: ../lib/advene/gui/views/transcription.py:461
-#, python-format
-msgid "Annotation %s"
+#: ../lib/advene/gui/views/annotationdisplay.py:258
+#: ../lib/advene/gui/views/editaccumulator.py:74
+msgid "Validate"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:662
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:681
-msgid "Play video"
+#: ../lib/advene/gui/views/relationdisplay.py:34
+msgid "RelationDisplay"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:663
-msgid "Show timestamp only"
+#: ../lib/advene/gui/views/relationdisplay.py:36
+msgid "Display the contents of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:664
-msgid "Show content only"
+#: ../lib/advene/gui/views/relationdisplay.py:79
+msgid "No relation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:665
-msgid "Show snapshot only"
+#: ../lib/advene/gui/views/relationdisplay.py:113
+#: ../lib/advene/gui/edit/elements.py:588
+#: ../lib/advene/gui/edit/elements.py:1071
+msgid "Members"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:667
-msgid "Show overlayed timestamp"
+#: ../lib/advene/gui/views/viewplugin.py:60
+msgid "Generic view plugin"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:668
-msgid "Show overlayed content"
+#: ../lib/advene/gui/views/viewplugin.py:62
+msgid "You should not ever see this tooltip..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:670
-#, python-format
-msgid "Annotation type %s"
+#: ../lib/advene/gui/views/checker.py:37
+msgid "Checker"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:671
-msgid "display as list"
+#: ../lib/advene/gui/views/checker.py:39
+msgid "Check various package properties"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:672
-msgid "display as grid"
+#: ../lib/advene/gui/views/checker.py:89
+msgid "List of possible issues in the current package"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:673
-msgid "display as table"
+#: ../lib/advene/gui/views/checker.py:107
+msgid "Overlapping"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:674
-msgid "display as transcription"
+#: ../lib/advene/gui/views/table.py:61
+msgid "Annotation table view"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:683
-msgid "Open link"
+#: ../lib/advene/gui/views/table.py:63
+msgid "Display annotations in a table"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:739
-#, python-format
-msgid "HTML editor: cannot parse content (%s)"
+#: ../lib/advene/gui/views/table.py:74
+msgid "Export as CSV"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:772
-#, python-format
-msgid "Heading %d"
+#: ../lib/advene/gui/views/table.py:268 ../lib/advene/gui/views/table.py:550
+msgid "Snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:783
-msgid "Bold"
+#: ../lib/advene/gui/views/table.py:281
+#: ../lib/advene/gui/views/timeline.py:1745
+msgid "Cannot update the annotation, its representation is too complex"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:784
-msgid "Italic"
+#: ../lib/advene/gui/views/table.py:311 ../lib/advene/gui/edit/elements.py:606
+#: ../lib/advene/gui/edit/elements.py:683
+#: ../lib/advene/gui/edit/elements.py:743
+#: ../lib/advene/gui/edit/elements.py:1134
+msgid "Content"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:785
-msgid "Header"
+#: ../lib/advene/gui/views/table.py:312 ../lib/advene/gui/views/table.py:682
+#: ../lib/advene/gui/views/browser.py:368 ../lib/advene/gui/edit/create.py:94
+#: ../lib/advene/gui/edit/elements.py:514
+#: ../lib/advene/gui/edit/elements.py:563
+#: ../lib/advene/gui/edit/elements.py:665
+msgid "Type"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:787
-msgid "Copy"
+#: ../lib/advene/gui/views/table.py:313 ../lib/advene/gui/edit/elements.py:1800
+msgid "Begin"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:788
-msgid "Cut"
+#: ../lib/advene/gui/views/table.py:316 ../lib/advene/gui/views/table.py:683
+#: ../lib/advene/gui/util/dialog.py:400 ../lib/advene/gui/edit/rules.py:1091
+#: ../lib/advene/gui/edit/imports.py:328 ../lib/advene/gui/edit/elements.py:513
+#: ../lib/advene/gui/edit/elements.py:562
+#: ../lib/advene/gui/edit/elements.py:650
+#: ../lib/advene/gui/edit/elements.py:730
+#: ../lib/advene/gui/edit/elements.py:879
+#: ../lib/advene/gui/edit/elements.py:948
+#: ../lib/advene/gui/edit/elements.py:1060
+#: ../lib/advene/gui/edit/elements.py:1121
+msgid "Id"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:789
-msgid "Paste"
+#: ../lib/advene/gui/views/table.py:317 ../lib/advene/gui/views/finder.py:105
+#: ../lib/advene/util/helper.py:408
+msgid "Package"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:791
-#: ../lib/advene/gui/edit/schemaeditor.py:64
-#: ../lib/advene/gui/views/timeline.py:134 ../lib/advene/gui/views/tree.py:428
-msgid "Refresh"
+#: ../lib/advene/gui/views/table.py:455 ../lib/advene/gui/views/table.py:633
+msgid "Export data to file..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:847
-msgid "WYSIWYG editor"
+#: ../lib/advene/gui/views/table.py:464 ../lib/advene/gui/views/table.py:642
+#, python-format
+msgid "Error while exporting data to %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:857
-msgid "Edit HTML source"
+#: ../lib/advene/gui/views/table.py:475
+msgid "id"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/logmessages.py:35
-msgid "Log Messages"
+#: ../lib/advene/gui/views/table.py:475
+msgid "type"
 msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:73
-#: ../lib/advene/gui/edit/importer.py:143
-msgid "Stop"
+#: ../lib/advene/gui/views/table.py:475
+msgid "begin"
 msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:82
-#: ../lib/advene/gui/edit/dvdselect.py:112
-msgid "Preview"
+#: ../lib/advene/gui/views/table.py:475
+msgid "end"
 msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:91
-msgid ""
-"Select the correct\n"
-"title and chapter\n"
-"of the DVD"
+#: ../lib/advene/gui/views/table.py:475
+msgid "content"
 msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:104
-msgid "Chapter"
+#: ../lib/advene/gui/views/table.py:479 ../lib/advene/gui/views/table.py:658
+#: ../lib/advene/core/controller.py:2646
+#, python-format
+msgid "Data exported to %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:33
-msgid "Create element"
+#: ../lib/advene/gui/views/table.py:499
+#, python-format
+msgid "Set %(attr)s time to %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:34
-msgid "Create annotation (duplicate id)"
+#: ../lib/advene/gui/views/table.py:558
+msgid "Generic table view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:35
-msgid "Create relation (duplicate id)"
+#: ../lib/advene/gui/views/table.py:560
+msgid "Display Advene elements in a table."
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:36
-msgid "Update the color"
+#: ../lib/advene/gui/views/table.py:583
+#, python-format
+msgid "Error in source evaluation %(source)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:37
-msgid "Update the representation"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element title"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:38
-msgid "Update the description"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element type"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:39
-msgid "Update the title"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element id"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:40
-msgid "Update the mimetype"
+#: ../lib/advene/gui/views/accumulatorpopup.py:51
+msgid "PopupAccumulator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:41
-msgid "Update the begin time"
+#: ../lib/advene/gui/views/bookmarks.py:51
+msgid "Bookmarks importer"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:42
-msgid "Update the end time"
+#: ../lib/advene/gui/views/bookmarks.py:72
+msgid "Bookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:43
-msgid "Update the content"
+#: ../lib/advene/gui/views/bookmarks.py:74
+msgid "Bookmark timecodes with their corresponding screenshots"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:44
-msgid "Update the matchFilter"
+#: ../lib/advene/gui/views/bookmarks.py:80 ../lib/advene/gui/views/tagbag.py:63
+#: ../lib/advene/gui/views/activebookmarks.py:62
+#: ../lib/advene/gui/views/logwindow.py:50 ../lib/advene/gui/edit/montage.py:59
+msgid "Clear"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:45
-msgid "Update the member types"
+#: ../lib/advene/gui/views/bookmarks.py:145
+msgid "Select the annotation type to generate"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:46
-msgid "Update tags"
+#: ../lib/advene/gui/views/bookmarks.py:150
+msgid "Choose a duration"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:90
-msgid "Difference between original and merged elements"
+#: ../lib/advene/gui/views/bookmarks.py:151
+msgid "Enter the standard duration (in ms) of created annotations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:136
-msgid "Current element"
-msgstr ""
-
-#: ../lib/advene/gui/edit/merge.py:141
-msgid "Updated element"
+#: ../lib/advene/gui/views/bookmarks.py:168
+msgid "Converted from bookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:147
-msgid "Show diff"
+#: ../lib/advene/gui/views/bookmarks.py:172
+#: ../lib/advene/gui/edit/transcribe.py:1114
+#, python-format
+msgid ""
+"Conversion completed.\n"
+"%s annotations generated."
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:180
-msgid "Merge?"
+#: ../lib/advene/gui/views/bookmarks.py:226
+msgid "Drop a position here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:197
-msgid "Element"
+#: ../lib/advene/gui/views/bookmarks.py:244
+#: ../lib/advene/gui/views/activebookmarks.py:496
+msgid "Insert a bookmark for the current video time"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:230 ../lib/advene/gui/edit/imports.py:406
-#, python-format
-msgid "Package %s"
+#: ../lib/advene/gui/views/bookmarks.py:245
+msgid "Convert bookmarks to annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:230 ../lib/advene/gui/edit/imports.py:406
-msgid "No title"
+#: ../lib/advene/gui/views/viewbook.py:39
+msgid "ViewBook"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:267
-msgid "All"
+#: ../lib/advene/gui/views/viewbook.py:60
+#: ../lib/advene/gui/views/viewbook.py:67
+msgid "Cannot remove this widget, it is essential."
 msgstr ""
 
-#: ../lib/advene/gui/edit/properties.py:32
-#: ../lib/advene/gui/edit/shapewidget.py:1588
-msgid "Properties"
+#: ../lib/advene/gui/views/viewbook.py:141
+msgid "Detach"
 msgstr ""
 
-#: ../lib/advene/gui/edit/properties.py:46
-#: ../lib/advene/gui/edit/transcribe.py:147
-#: ../lib/advene/gui/edit/transcribe.py:1195
-#: ../lib/advene/gui/views/tagbag.py:61
-#: ../lib/advene/gui/views/timeline.py:3483
-#: ../lib/advene/gui/views/timeline.py:3624 ../lib/advene/gui/main.py:4235
-msgid "Preferences"
+#: ../lib/advene/gui/views/viewbook.py:145
+#: ../lib/advene/gui/views/editaccumulator.py:80
+msgid "Close"
 msgstr ""
 
-#: ../lib/advene/gui/edit/properties.py:371
-msgid "Choose a file"
+#: ../lib/advene/gui/views/viewbook.py:162
+msgid "Rename the view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:45
-msgid "Importer"
+#: ../lib/advene/gui/views/viewbook.py:163
+msgid "Please enter the new name of the view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:101
-#: ../lib/advene/gui/edit/importer.py:111
-msgid "Advene package importer"
+#: ../lib/advene/gui/views/viewbook.py:202
+msgid "Detach view in its own window, or drag-and-drop to another zone"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:115
-msgid "Not likely"
+#: ../lib/advene/gui/views/viewbook.py:216
+msgid "Close view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:137
+#: ../lib/advene/gui/views/viewbook.py:239
+#: ../lib/advene/gui/views/viewbook.py:245
+#: ../lib/advene/gui/edit/elements.py:336
 #, python-format
-msgid "Completed conversion: %(statistics)s"
-msgstr ""
-
-#: ../lib/advene/gui/edit/importer.py:253
-msgid "Choose the file to import"
-msgstr ""
-
-#: ../lib/advene/gui/edit/importer.py:272
-msgid "Filter"
+msgid "Edit %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:276
-msgid "Options"
+#: ../lib/advene/gui/views/viewbook.py:268 ../lib/advene/rules/actions.py:601
+#, python-format
+msgid "Cannot find the view %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:287
-msgid "Start"
+#: ../lib/advene/gui/views/viewbook.py:291
+#, python-format
+msgid "Open a new %s for..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:57
-msgid "Schema Editor"
+#: ../lib/advene/gui/views/viewbook.py:303
+msgid "Create a new comment view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:132
-msgid "Display"
+#: ../lib/advene/gui/views/viewbook.py:305
+msgid "Open a new view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:155
-#: ../lib/advene/gui/edit/shapewidget.py:1587 ../lib/advene/gui/popup.py:472
-#: ../lib/advene/gui/popup.py:476
-msgid "Delete"
+#: ../lib/advene/gui/views/viewbook.py:388
+#, python-format
+msgid "Use annotation-type %s :"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:762
-msgid "Remove relation type"
+#: ../lib/advene/gui/views/viewbook.py:392
+#: ../lib/advene/gui/views/viewbook.py:418
+msgid "to edit it"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:765
-#: ../lib/advene/gui/edit/schemaeditor.py:997
-msgid "Create HTML view"
+#: ../lib/advene/gui/views/viewbook.py:393
+#: ../lib/advene/gui/views/viewbook.py:419
+#: ../lib/advene/gui/views/viewbook.py:451
+msgid "to create a new static view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:831
-msgid "Remove annotation type"
+#: ../lib/advene/gui/views/viewbook.py:395
+msgid "in a timeline"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:834
-msgid "Create relation type between this one and..."
+#: ../lib/advene/gui/views/viewbook.py:396
+msgid "as a montage"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:969
-msgid "New schema"
+#: ../lib/advene/gui/views/viewbook.py:397
+#: ../lib/advene/gui/views/viewbook.py:450
+msgid "in a table"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:985 ../lib/advene/gui/popup.py:690
-#: ../lib/advene/gui/popup.py:750 ../lib/advene/gui/popup.py:803
-msgid "Select a color"
+#: ../lib/advene/gui/views/viewbook.py:398
+#: ../lib/advene/gui/views/viewbook.py:420
+msgid "in a query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:988
-msgid "New annotation type"
+#: ../lib/advene/gui/views/viewbook.py:398
+#: ../lib/advene/gui/views/viewbook.py:420
+#, python-format
+msgid "Query %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:991
-msgid "New relation type"
+#: ../lib/advene/gui/views/viewbook.py:399
+#: ../lib/advene/gui/views/viewbook.py:421
+msgid "in the TALES browser"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:994
-msgid "Hide this schema"
+#: ../lib/advene/gui/views/viewbook.py:399
+#, python-format
+msgid "Browsing %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:1000
-msgid "Export drawing to pdf"
+#: ../lib/advene/gui/views/viewbook.py:415
+#, python-format
+msgid "Use annotation %s :"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:1042
-msgid "Choose a filename to export the schema as PDF"
+#: ../lib/advene/gui/views/viewbook.py:421
+#, python-format
+msgid "Browse %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:84 ../lib/advene/gui/edit/rules.py:86
-#: ../lib/advene/gui/edit/create.py:252
-msgid "Rule"
+#: ../lib/advene/gui/views/viewbook.py:422
+msgid "to display its contents"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:95 ../lib/advene/gui/edit/create.py:242
-msgid "Subviews"
+#: ../lib/advene/gui/views/viewbook.py:422
+#, python-format
+msgid "%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:122
-msgid "Add a new rule"
+#: ../lib/advene/gui/views/viewbook.py:423
+msgid "as a bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:126
-msgid "Subview"
+#: ../lib/advene/gui/views/viewbook.py:441
+msgid "as the context for the query..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:129
-msgid "Add a subview list"
+#: ../lib/advene/gui/views/viewbook.py:445
+msgid "Set of annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:135
-msgid "Remove the current rule"
+#: ../lib/advene/gui/views/viewbook.py:446
+msgid "Use annotations:"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:275
-msgid "Source expression"
+#: ../lib/advene/gui/views/viewbook.py:449
+msgid "to edit them"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:277
-msgid "Return expression"
+#: ../lib/advene/gui/views/viewbook.py:452
+msgid "as bookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:351
-msgid "For all elements in "
+#: ../lib/advene/gui/views/transcription.py:51
+msgid "Transcription"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:352
-msgid "All annotations of the package"
+#: ../lib/advene/gui/views/transcription.py:53
+msgid "Display annotations as a text transcription"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:353
-msgid "All views of the package"
+#: ../lib/advene/gui/views/transcription.py:158
+msgid "Transcription options"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:354 ../lib/advene/gui/edit/rules.py:798
-msgid "The context annotations"
+#: ../lib/advene/gui/views/transcription.py:159
+msgid "Default representation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:355 ../lib/advene/gui/edit/rules.py:799
-msgid "The annotations of the context type"
+#: ../lib/advene/gui/views/transcription.py:159
+msgid "Use the default representation for annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:370
-msgid "Return "
+#: ../lib/advene/gui/views/transcription.py:160
+#: ../lib/advene/gui/edit/elements.py:988
+msgid "Representation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:372 ../lib/advene/gui/edit/rules.py:787
-msgid "The element"
+#: ../lib/advene/gui/views/transcription.py:160
+msgid ""
+"If default representation is unchecked,\n"
+"this TALES expression that will be used to format the annotations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:373 ../lib/advene/gui/edit/rules.py:788
-msgid "The element's content"
+#: ../lib/advene/gui/views/transcription.py:161
+msgid "Separator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:388
-msgid "If the element matches "
+#: ../lib/advene/gui/views/transcription.py:162
+msgid "This separator will be inserted between the annotations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:390
-msgid "Return the element if it matches "
+#: ../lib/advene/gui/views/transcription.py:163
+msgid "Whitespace"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:408 ../lib/advene/gui/edit/rules.py:617
-msgid "All conditions must be met"
+#: ../lib/advene/gui/views/transcription.py:164
+msgid "Newline"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:409 ../lib/advene/gui/edit/rules.py:618
-msgid "Any condition can be met"
+#: ../lib/advene/gui/views/transcription.py:165
+msgid "Tabulation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:493 ../lib/advene/gui/edit/rules.py:563
-#, python-format
-msgid "Rule <b>%s</b>"
+#: ../lib/advene/gui/views/transcription.py:166
+msgid "Dash"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:574
-msgid "Rule name"
+#: ../lib/advene/gui/views/transcription.py:167
+msgid "User defined"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:591
-msgid "Event"
+#: ../lib/advene/gui/views/transcription.py:169
+msgid "User-defined separator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:599
-msgid "If"
+#: ../lib/advene/gui/views/transcription.py:169
+msgid ""
+"Separator used if user-defined is selected.Use \\n for a newline and \\t for "
+"a tabulation."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:638
-msgid "Then"
+#: ../lib/advene/gui/views/transcription.py:170
+msgid "Display timestamps"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:683
-msgid "When the "
+#: ../lib/advene/gui/views/transcription.py:170
+msgid "Insert timestsamp values"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:696
-msgid " occurs,"
+#: ../lib/advene/gui/views/transcription.py:171
+msgid "Display annotation bounds"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:723 ../lib/advene/gui/edit/rules.py:726
+#: ../lib/advene/gui/views/transcription.py:231
 #, python-format
-msgid "Condition expression: %s"
-msgstr ""
-
-#: ../lib/advene/gui/edit/rules.py:765
-msgid "The annotation type"
+msgid ""
+"Cannot convert the following annotations,\n"
+"the representation pattern is too complex.\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:768
-#, python-format
-msgid "The value of the %s attribute"
+#: ../lib/advene/gui/views/transcription.py:242
+msgid ""
+"Cannot validate the update.\n"
+"The representation pattern is too complex."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:770
-msgid "The annotation fragment"
+#: ../lib/advene/gui/views/transcription.py:268
+msgid "Save transcription to a text file"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:771
-msgid "The annotation begin time"
+#: ../lib/advene/gui/views/transcription.py:269
+msgid "Apply the modifications"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:772
-msgid "The annotation end time"
+#: ../lib/advene/gui/views/transcription.py:270
+msgid "Find text"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:774
-msgid "The annotation MIME-type"
+#: ../lib/advene/gui/views/transcription.py:271
+msgid "Quickly switch display options"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:775
-msgid "The annotation's incoming relations"
+#: ../lib/advene/gui/views/transcription.py:272
+msgid "Refresh the transcription"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:776
-msgid "The annotation's outgoing relations"
+#: ../lib/advene/gui/views/transcription.py:273
+msgid "Edit preferences"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:779
+#: ../lib/advene/gui/views/transcription.py:692
 #, python-format
-msgid "The %s-related incoming annotations"
+msgid "Cannot write to %(filename)s: %(error)s:"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:783
+#: ../lib/advene/gui/views/transcription.py:698
+#: ../lib/advene/gui/edit/transcribe.py:859
 #, python-format
-msgid "The %s-related outgoing annotations"
+msgid "Transcription saved to %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:789
-msgid "The element fragment"
+#: ../lib/advene/gui/views/browser.py:169
+#: ../lib/advene/gui/views/browser.py:171
+msgid "TALES browser"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:790
-msgid "The element begin time"
+#: ../lib/advene/gui/views/browser.py:176
+msgid "Display result in table"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:791
-msgid "The element end time"
+#: ../lib/advene/gui/views/browser.py:199
+msgid "Insert path"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:792
-msgid "The element duration"
+#: ../lib/advene/gui/views/browser.py:200
+msgid "Insert value"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:793
-msgid "The element type"
+#: ../lib/advene/gui/views/browser.py:255
+msgid "Expression returned None (there was an exception)"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:794
-msgid "The element's incoming relations"
+#: ../lib/advene/gui/views/browser.py:308
+msgid "Result is not a list"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:795
-msgid "The element's outgoing relations"
+#: ../lib/advene/gui/views/browser.py:365
+#: ../lib/advene/gui/edit/shapewidget.py:944
+msgid "Path"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:796
-msgid "The context"
+#: ../lib/advene/gui/views/browser.py:372
+#: ../lib/advene/gui/edit/elements.py:2163
+msgid "Value"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:797
-msgid "The context fragment"
+#: ../lib/advene/gui/views/timeline.py:128
+msgid "Display annotations on a timeline"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:809
-#, python-format
-msgid "annotation-type %s"
+#: ../lib/advene/gui/views/timeline.py:142
+msgid "Limit display to current area"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:812
-#, python-format
-msgid "relation-type %s"
+#: ../lib/advene/gui/views/timeline.py:143
+#: ../lib/advene/gui/views/timeline.py:3307
+msgid "Display whole movie"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:834
-msgid "Select a condition"
+#: ../lib/advene/gui/views/timeline.py:173
+#, python-format
+msgid "Cannot find annotation type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:878
-#, python-format
-msgid "Parameter %s"
+#: ../lib/advene/gui/views/timeline.py:234
+msgid "No scrolling"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:992
-msgid "Select an action"
+#: ../lib/advene/gui/views/timeline.py:235
+msgid "Continuous scrolling"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:1083
-msgid "Activate?"
+#: ../lib/advene/gui/views/timeline.py:236
+msgid "Discrete scrolling"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:83
-msgid "Generic shape"
+#: ../lib/advene/gui/views/timeline.py:237
+msgid "Annotation scrolling"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:234
-#: ../lib/advene/gui/edit/shapewidget.py:741
+#: ../lib/advene/gui/views/timeline.py:582
 #, python-format
-msgid "Link to %s"
+msgid "%d annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:321
-#: ../lib/advene/gui/views/tagbag.py:132
-msgid "Name"
+#: ../lib/advene/gui/views/timeline.py:585
+msgid "Display all types"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:326
-#: ../lib/advene/gui/edit/shapewidget.py:1299
-msgid "Link"
+#: ../lib/advene/gui/views/timeline.py:587
+#, python-format
+msgid ""
+"There are %d annotations.\n"
+"The current timeline may take a long time to display them, so only the first "
+"two annotation types are displayed. Use the annotation type selector (second "
+"button in the timeline) to select other annotations types to display, or "
+"click on the 'Display all types' button below."
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:331
-msgid "Link label"
+#: ../lib/advene/gui/views/timeline.py:1055
+msgid "Split at current player position"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:349
-msgid "Linewidth"
+#: ../lib/advene/gui/views/timeline.py:1059
+msgid "Center and zoom"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:354
-msgid "Filled"
+#: ../lib/advene/gui/views/timeline.py:1163
+msgid "Create a relation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:362
-msgid "Opacity"
+#: ../lib/advene/gui/views/timeline.py:1173
+msgid "Create a new relation-type."
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:404
-#, python-format
-msgid "Properties of %s"
+#: ../lib/advene/gui/views/timeline.py:1199
+msgid "Merge with this annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:451
-msgid "Rectangle"
+#: ../lib/advene/gui/views/timeline.py:1208
+msgid "Align both begin times"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:532
-#: ../lib/advene/gui/edit/shapewidget.py:652
-msgid "Text"
+#: ../lib/advene/gui/views/timeline.py:1209
+msgid "Align both end times"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:663
-msgid "Textsize"
+#: ../lib/advene/gui/views/timeline.py:1210
+msgid "Align end time to selected begin time"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:677
-msgid "Image"
+#: ../lib/advene/gui/views/timeline.py:1211
+msgid "Align begin time to selected end time"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:761
-msgid "Href"
+#: ../lib/advene/gui/views/timeline.py:1212
+msgid "Align all times"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:771
-msgid "Line"
+#: ../lib/advene/gui/views/timeline.py:1250
+msgid "Cannot delete the annotation : it has relations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:872
-msgid "Draw an arrow"
+#: ../lib/advene/gui/views/timeline.py:1325
+msgid "Select the appropriate relation type"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:883
-msgid "Arrow size"
+#: ../lib/advene/gui/views/timeline.py:1344
+#, python-format
+msgid "Duplicate selection to type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:935
-#: ../lib/advene/gui/views/browser.py:359
-msgid "Path"
+#: ../lib/advene/gui/views/timeline.py:1347
+#, python-format
+msgid "Move selection to type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:1102
-msgid "Close path"
+#: ../lib/advene/gui/views/timeline.py:1356
+#, python-format
+msgid "Duplicate annotation to type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:1181
-msgid "Circle"
+#: ../lib/advene/gui/views/timeline.py:1360
+#, python-format
+msgid "Move annotation to type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:1239
-msgid "Ellipse"
+#: ../lib/advene/gui/views/timeline.py:1367
+#, python-format
+msgid "Duplicate to type %(type)s at %(position)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:1589
-msgid "SVG"
+#: ../lib/advene/gui/views/timeline.py:1373
+#, python-format
+msgid "Move to type %(type)s at %(position)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:2172
-msgid "Load SVG"
+#: ../lib/advene/gui/views/timeline.py:1383
+msgid "Duplicate and create a relation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:2178
-msgid "Save SVG"
+#: ../lib/advene/gui/views/timeline.py:1394
+#, python-format
+msgid "Duplicate at %s and create a relation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:74
-#: ../lib/advene/gui/widget.py:1063
-msgid "Refresh snapshot"
+#: ../lib/advene/gui/views/timeline.py:1425
+msgid "Annotation filter"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:102
-#, python-format
-msgid "Decrement value by %.2f s"
+#: ../lib/advene/gui/views/timeline.py:1426
+msgid "Enter the searched string"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:104
+#: ../lib/advene/gui/views/timeline.py:1534
 #, python-format
-msgid "Increment value by %.2f s"
+msgid "Duplicate all annotations to type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:130
-msgid ""
-"Click to play\n"
-"Control+click to set to current time\n"
-"Scroll to modify value (with control/shift)\n"
-"Right-click to invalidate screenshot"
+#: ../lib/advene/gui/views/timeline.py:1536
+#, python-format
+msgid "Move all annotations to type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:145
-msgid ""
-"Enter a timecode.\n"
-"An integer value will be considered as milliseconds.\n"
-"A float value (12.2) will be considered as seconds.\n"
-"HH:MM:SS.sss values are possible."
+#: ../lib/advene/gui/views/timeline.py:1538
+#, python-format
+msgid "Duplicate all annotations matching a string to type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:159
-msgid "Set to current player position"
+#: ../lib/advene/gui/views/timeline.py:1540
+#, python-format
+msgid "Move all annotations matching a string to type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:81
+#: ../lib/advene/gui/views/timeline.py:1542
 #, python-format
-msgid "%s creation"
+msgid "Align all annotation time codes using %s as reference."
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:82
+#: ../lib/advene/gui/views/timeline.py:1544
 #, python-format
-msgid ""
-"To create a new element of type %s,\n"
-"you must give the following information."
+msgid "Align all annotation contents using %s as reference"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:92 ../lib/advene/gui/edit/elements.py:508
-#: ../lib/advene/gui/edit/elements.py:557
-#: ../lib/advene/gui/edit/elements.py:659
-#: ../lib/advene/gui/views/browser.py:362 ../lib/advene/gui/views/table.py:251
-#: ../lib/advene/gui/views/table.py:558
-msgid "Type"
+#: ../lib/advene/gui/views/timeline.py:2038
+#: ../lib/advene/gui/views/timeline.py:2060
+#, python-format
+msgid "Displaying %(count)d / %(total)d annotations..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:111
-msgid "Dynamic view"
+#: ../lib/advene/gui/views/timeline.py:2049
+msgid "Displaying done."
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:112
-msgid "HTML template"
+#: ../lib/advene/gui/views/timeline.py:2478
+msgid "Create a new annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:113
-msgid "Plain XML"
+#: ../lib/advene/gui/views/timeline.py:2479
+msgid "Zoom on region"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:114
-msgid "SVG template"
+#: ../lib/advene/gui/views/timeline.py:2480
+msgid "Restrict display to region"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:115
-msgid "Plain text template"
+#: ../lib/advene/gui/views/timeline.py:2589
+#: ../lib/advene/gui/edit/transcribe.py:489
+#, python-format
+msgid "Position %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:118
-msgid "Simple query"
+#: ../lib/advene/gui/views/timeline.py:2599
+msgid "New annotation at player time"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:120
-msgid "Directory"
+#: ../lib/advene/gui/views/timeline.py:2603
+msgid "New annotation at mouse position"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:128
-msgid "No available type."
+#: ../lib/advene/gui/views/timeline.py:2607
+msgid "Selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:172
+#: ../lib/advene/gui/views/timeline.py:2728
 #, python-format
-msgid ""
-"The identifier %s is not valid.\n"
-"It must be composed of non-accentuated alphabetic characters\n"
-"Underscore is allowed."
+msgid "Cannot zoom more %f"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:177
+#: ../lib/advene/gui/views/timeline.py:2940
 #, python-format
-msgid "The identifier %s is already defined."
+msgid "From schema %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:310
-msgid "New resource data"
+#: ../lib/advene/gui/views/timeline.py:3003
+msgid "Restrict playing to this annotation-type"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:143 ../lib/advene/gui/edit/imports.py:144
-msgid "Schemas"
+#: ../lib/advene/gui/views/timeline.py:3010
+msgid "Goto previous annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:181 ../lib/advene/gui/edit/imports.py:182
-#: ../lib/advene/gui/views/interactivequery.py:464
-msgid "Annotations"
+#: ../lib/advene/gui/views/timeline.py:3021
+msgid "Goto next annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:195 ../lib/advene/gui/edit/imports.py:196
-#: ../lib/advene/gui/edit/elements.py:517
-msgid "Relations"
+#: ../lib/advene/gui/views/timeline.py:3032
+msgid "+"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:209 ../lib/advene/gui/edit/imports.py:210
-msgid "Queries"
+#: ../lib/advene/gui/views/timeline.py:3091
+msgid "Open an annotation display view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:320
-msgid "Imported?"
+#: ../lib/advene/gui/views/timeline.py:3098
+msgid "Open a slave montage view (coordinated zoom level)"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:337
-#: ../lib/advene/gui/edit/elements.py:509
-#: ../lib/advene/gui/edit/elements.py:558
-#: ../lib/advene/gui/edit/elements.py:645
-#: ../lib/advene/gui/edit/elements.py:725
-#: ../lib/advene/gui/edit/elements.py:782
-#: ../lib/advene/gui/edit/elements.py:874
-#: ../lib/advene/gui/edit/elements.py:943
-#: ../lib/advene/gui/edit/elements.py:1055
-#: ../lib/advene/gui/edit/elements.py:1117
-msgid "URI"
+#: ../lib/advene/gui/views/timeline.py:3133
+msgid ""
+"<b>Statistics about current selection</b>\n"
+"\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:359
-msgid "Choose the package to import, and its alias"
+#: ../lib/advene/gui/views/timeline.py:3156
+msgid "No selected annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:47
-msgid "Montage"
+#: ../lib/advene/gui/views/timeline.py:3160
+#, python-format
+msgid "%d selected annotation(s)"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:49
-msgid "Dynamic montage of annotations"
+#: ../lib/advene/gui/views/timeline.py:3167
+msgid "Unselect all annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:55
-#: ../lib/advene/gui/views/logwindow.py:50
-#: ../lib/advene/gui/views/tagbag.py:60
-#: ../lib/advene/gui/views/activebookmarks.py:59
-#: ../lib/advene/gui/views/bookmarks.py:77
-msgid "Clear"
+#: ../lib/advene/gui/views/timeline.py:3168
+msgid "Create a static view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:56
-#: ../lib/advene/gui/views/transcription.py:472
-#: ../lib/advene/gui/widget.py:1059
-msgid "Play"
+#: ../lib/advene/gui/views/timeline.py:3169
+msgid "Highlight selection in other views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:57
-msgid "Render"
+#: ../lib/advene/gui/views/timeline.py:3170
+#: ../lib/advene/gui/views/timeline.py:3766
+msgid "Tag selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:171
-msgid "Remove from montage"
+#: ../lib/advene/gui/views/timeline.py:3171
+msgid "Delete selected annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:303 ../lib/advene/gui/popup.py:444
-#, python-format
-msgid "Extracting %s"
+#: ../lib/advene/gui/views/timeline.py:3172
+msgid "Display selection in a table"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:304
-#, python-format
-msgid ""
-"Exporting montage %(title)s\n"
-"to %%(filename)s"
+#: ../lib/advene/gui/views/timeline.py:3173
+msgid "Center and zoom on selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:396
-msgid "Drop an annotation here to remove it from the list"
+#: ../lib/advene/gui/views/timeline.py:3174
+msgid "Edit selected annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:407
-msgid "Play the montage"
+#: ../lib/advene/gui/views/timeline.py:3175
+msgid "Merge annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:412
-msgid "Save the view in the package"
+#: ../lib/advene/gui/views/timeline.py:3176
+msgid "Display statistics"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:460
-msgid "Set zoom level"
+#: ../lib/advene/gui/views/timeline.py:3183
+msgid "Select all annotations of the same type in this time range"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:465
-msgid "Set 100% zoom"
+#: ../lib/advene/gui/views/timeline.py:3186
+msgid "Select all annotations in this time range"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:471
-#: ../lib/advene/gui/views/interactivequery.py:439
-msgid "Unhighlight annotations"
+#: ../lib/advene/gui/views/timeline.py:3300
+msgid "Goto previous page"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:475 ../lib/advene/gui/edit/montage.py:484
-#: ../lib/advene/gui/views/interactivequery.py:443
-#: ../lib/advene/gui/views/interactivequery.py:480
-msgid "Highlight annotations"
+#: ../lib/advene/gui/views/timeline.py:3312
+msgid "Goto next page"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:545
-msgid "Total duration:"
+#: ../lib/advene/gui/views/timeline.py:3368
+msgid "Inspector locked. Click here or in the timeline background to unlock."
 msgstr ""
 
-#: ../lib/advene/gui/edit/frameselector.py:43
-msgid "Click on a frame to select its time."
+#: ../lib/advene/gui/views/timeline.py:3395
+msgid ""
+"Delete the selected annotations or drop an annotation here to delete it."
 msgstr ""
 
-#: ../lib/advene/gui/edit/frameselector.py:177
-msgid "Select the appropriate snapshot"
+#: ../lib/advene/gui/views/timeline.py:3418
+msgid ""
+"Drag an annotation type here to remove it from display.\n"
+"Click to edit all displayed types"
 msgstr ""
 
-#: ../lib/advene/gui/edit/frameselector.py:230
-#: ../lib/advene/gui/edit/frameselector.py:283
-msgid "Click to see more frames or scroll with the mouse wheel"
+#: ../lib/advene/gui/views/timeline.py:3430
+msgid "Selection actions"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:67
-msgid "Transcription importer"
+#: ../lib/advene/gui/views/timeline.py:3441
+msgid "Display relations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:78
-msgid "Note taking"
+#: ../lib/advene/gui/views/timeline.py:3447
+msgid "Display all relations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:80
-msgid "Take notes on the fly as a timestamped transcription"
+#: ../lib/advene/gui/views/timeline.py:3523
+msgid "Center on current player position."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:87
-#: ../lib/advene/gui/views/activebookmarks.py:60
-msgid "Export as static view"
+#: ../lib/advene/gui/views/timeline.py:3539
+msgid "Automatically activate loop when clicking on an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:148
-msgid "Timestamp"
+#: ../lib/advene/gui/views/timeline.py:3563
+msgid "Displayed"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:148
-msgid "Click inserts timestamp marks"
+#: ../lib/advene/gui/views/timeline.py:3571
+msgid "Not displayed"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:149
-msgid "Insert on single-click"
+#: ../lib/advene/gui/views/timeline.py:3620
+msgid "< All <"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:149
-msgid "A single click will insert the mark (else a double click is needed)"
+#: ../lib/advene/gui/views/timeline.py:3624
+msgid "> All >"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:150
-msgid "Play on scroll"
+#: ../lib/advene/gui/views/timeline.py:3648
+msgid "Displayed annotation types"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:150
-msgid "Play the new position upon timestamp modification"
+#: ../lib/advene/gui/views/timeline.py:3678
+msgid "Relation type"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:151
-msgid "Generate empty annotations"
+#: ../lib/advene/gui/views/timeline.py:3678
+msgid "Display relation types"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:151
-msgid "If checked, generate annotations for empty text"
+#: ../lib/advene/gui/views/timeline.py:3679
+msgid "Relation content"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:152
-msgid "Reaction time"
+#: ../lib/advene/gui/views/timeline.py:3679
+msgid "Display relation content"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:152
-msgid ""
-"Reaction time (substracted from current player time, except when paused.)"
+#: ../lib/advene/gui/views/timeline.py:3680 ../lib/advene/gui/popup.py:545
+msgid "Highlight"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:153
-msgid "Auto-insert"
+#: ../lib/advene/gui/views/timeline.py:3680
+msgid "Highlight active annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:153
-msgid "Automatic timestamp mark insertion"
+#: ../lib/advene/gui/views/timeline.py:3767
+msgid "Enter the tag for the selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:154
-msgid "Automatic insertion delay"
+#: ../lib/advene/gui/views/timeline.py:3773
+#: ../lib/advene/gui/views/tagbag.py:165
+msgid "The tag contains invalid characters"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:154
-msgid ""
-"If autoinsert is active, timestamp marks will be automatically inserted when "
-"text is entered after no interaction since this delay (in ms).\n"
-"1000 is typically a good value."
+#: ../lib/advene/gui/views/relation.py:71
+msgid "Relations view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:155 ../lib/advene/gui/main.py:4368
-msgid "Font size"
+#: ../lib/advene/gui/views/editionhistory.py:40
+msgid "Edition History"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:155
-msgid "Font size for text (0 for standard size)"
+#: ../lib/advene/gui/views/editionhistory.py:42
+msgid "Access last edited/created elements"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:215
-#: ../lib/advene/gui/edit/transcribe.py:219
-#: ../lib/advene/gui/edit/transcribe.py:379
-#: ../lib/advene/gui/edit/transcribe.py:383
-msgid "Invalid timestamp mark"
+#: ../lib/advene/gui/views/editionhistory.py:102
+msgid "Created"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:496
-#: ../lib/advene/gui/views/timeline.py:2550
-#, python-format
-msgid "Position %s"
+#: ../lib/advene/gui/views/editionhistory.py:103
+msgid "Edited"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:506 ../lib/advene/gui/popup.py:456
-msgid "Edit"
+#: ../lib/advene/gui/views/tagbag.py:55
+msgid "Tag Bag"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:510
-msgid "Ignore the following text (toggle)"
+#: ../lib/advene/gui/views/tagbag.py:62
+msgid "New tag"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:514
-msgid "Remove mark"
+#: ../lib/advene/gui/views/tagbag.py:125
+msgid "New tag name"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:518
-msgid "Reaction-time offset"
+#: ../lib/advene/gui/views/tagbag.py:131
+msgid "Enter a new tag name and select its color."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:522
-msgid "-1 sec"
+#: ../lib/advene/gui/views/tagbag.py:135
+#: ../lib/advene/gui/edit/shapewidget.py:343
+msgid "Name"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:525
-msgid "-0.5 sec"
+#: ../lib/advene/gui/views/tagbag.py:141
+#: ../lib/advene/gui/edit/shapewidget.py:364
+#: ../lib/advene/gui/edit/elements.py:897
+#: ../lib/advene/gui/edit/elements.py:977
+#: ../lib/advene/gui/edit/elements.py:1091 ../lib/advene/rules/actions.py:135
+msgid "Color"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:528
-msgid "-0.1 sec"
+#: ../lib/advene/gui/views/tagbag.py:178
+msgid "Tag bag options"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:532
-msgid "+1 sec"
+#: ../lib/advene/gui/views/tagbag.py:179
+msgid "Update with new tags"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:535
-msgid "+0.5 sec"
+#: ../lib/advene/gui/views/tagbag.py:179
+msgid "Automatically display new defined tags"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:538
-msgid "+0.1 sec"
+#: ../lib/advene/gui/views/tagbag.py:228
+#, python-format
+msgid "Choose the color for tag %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:629
-msgid "Invalid timestamp"
+#: ../lib/advene/gui/views/tagbag.py:252
+msgid "Set color"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:762
-#, python-format
-msgid "Invalid timestamp mark in conversion: %s"
+#: ../lib/advene/gui/views/tagbag.py:253
+msgid "Remove"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:879
-#, python-format
-msgid "Cannot save the file: %s"
+#: ../lib/advene/gui/views/tagbag.py:326
+msgid "Drop a tag here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:884
-#: ../lib/advene/gui/views/transcription.py:703
-#, python-format
-msgid "Transcription saved to %s"
+#: ../lib/advene/gui/views/tagbag.py:336
+msgid "Save as adhoc view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:890
-#: ../lib/advene/gui/edit/transcribe.py:980
-msgid "This will overwrite the current textual content. Are you sure?"
+#: ../lib/advene/gui/views/tagbag.py:337
+msgid "Add a new tag"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:893
-msgid "Select transcription file to load"
+#: ../lib/advene/gui/views/tagbag.py:338
+msgid "Display all defined tags"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:910
-#, python-format
-msgid "Cannot open %(filename)s: %(error)s"
+#: ../lib/advene/gui/views/__init__.py:197
+msgid "Invalid view id"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:965
-msgid "Cannot import annotations: no existing interface"
+#: ../lib/advene/gui/views/__init__.py:243
+#, python-format
+msgid "Cannot save default options: %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:967
-msgid "Select the annotation type to import"
+#: ../lib/advene/gui/views/__init__.py:254
+#, python-format
+msgid "Default options saved for view %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:976
+#: ../lib/advene/gui/views/__init__.py:282
 #, python-format
-msgid "There are no annotations of type %s"
+msgid "Error in source evaluation %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1005
-msgid "Cannot convert the data: no associated package"
+#: ../lib/advene/gui/views/__init__.py:299
+#, python-format
+msgid "Saving %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1008
-msgid "Converting transcription"
+#: ../lib/advene/gui/views/__init__.py:302
+msgid "Enter a view name to save this parametered view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1014
-msgid "Choose the annotation-type where to create annotations.\n"
+#: ../lib/advene/gui/views/__init__.py:320
+#, python-format
+msgid "Error: the view %s is not an adhoc view."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1022
-msgid "Delete existing annotations in this type"
+#: ../lib/advene/gui/views/__init__.py:345
+msgid "HTML export"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1027
-#: ../lib/advene/gui/views/timeline.py:3009 ../lib/advene/gui/main.py:3222
-msgid "Create a new annotation type"
+#: ../lib/advene/gui/views/__init__.py:346
+msgid "Specify a name for the export view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1045
-msgid "Select type"
+#: ../lib/advene/gui/views/__init__.py:365
+#, python-format
+msgid ""
+"View successfully exported as %s.\n"
+"Open it in the web browser ?"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1049
-msgid "You want to create a new type. Please specify its schema and title."
+#: ../lib/advene/gui/views/__init__.py:444
+msgid "Actions"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1061
-msgid "Containing schema"
+#: ../lib/advene/gui/views/__init__.py:469
+msgid "Click or drag-and-drop to reattach view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1074
-msgid "Export options"
+#: ../lib/advene/gui/views/finder.py:106
+msgid "List of views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1079
-msgid "Generate annotations for empty contents"
+#: ../lib/advene/gui/views/finder.py:107
+msgid "Static views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1104
-#, python-format
-msgid "The %s identifier already exists. Choose another one."
+#: ../lib/advene/gui/views/finder.py:108
+msgid "Dynamic views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1143
-msgid "Notes converted"
+#: ../lib/advene/gui/views/finder.py:109
+msgid "Admin views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1147
-#: ../lib/advene/gui/views/bookmarks.py:169
-#, python-format
-msgid ""
-"Conversion completed.\n"
-"%s annotations generated."
+#: ../lib/advene/gui/views/finder.py:110
+msgid "Adhoc views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1163
-#: ../lib/advene/gui/views/activebookmarks.py:546
-msgid "Smallish"
+#: ../lib/advene/gui/views/finder.py:174
+msgid "No resources"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1167
-#: ../lib/advene/gui/views/activebookmarks.py:550
-msgid "Larger"
+#: ../lib/advene/gui/views/finder.py:551
+#, python-format
+msgid ""
+"View <b>%(title)s</b>\n"
+"Id: %(id)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1168
-#: ../lib/advene/gui/views/activebookmarks.py:551
-msgid "Huge"
+#: ../lib/advene/gui/views/finder.py:558
+msgid "Open in webbrowser"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1190
-msgid "Open"
+#: ../lib/advene/gui/views/finder.py:559
+#, python-format
+msgid "View applied to %s\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1191
-msgid "Save"
+#: ../lib/advene/gui/views/finder.py:564 ../lib/advene/gui/popup.py:525
+msgid "Activate"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1192
-msgid "Save As"
+#: ../lib/advene/gui/views/finder.py:567
+msgid "Open in GUI"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1193
-msgid "Import"
+#: ../lib/advene/gui/views/finder.py:569
+msgid "Unknown type of view??"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1193
-msgid "Import from annotations"
+#: ../lib/advene/gui/views/finder.py:597
+msgid "Edit view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1194
-msgid "Convert"
+#: ../lib/advene/gui/views/finder.py:606
+msgid "Open view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1194
-msgid "Convert to annotations"
+#: ../lib/advene/gui/views/finder.py:646 ../lib/advene/gui/views/finder.py:710
+#, python-format
+msgid ""
+"%(type)s <b>%(title)s</b>\n"
+"Id: %(id)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1196
-msgid "Center on the current mark"
+#: ../lib/advene/gui/views/finder.py:661
+#: ../lib/advene/gui/views/interactivequery.py:401
+msgid "Edit query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1197
-msgid "Find"
+#: ../lib/advene/gui/views/finder.py:669
+msgid "Try to apply the query on..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1197
-msgid "Search a string"
+#: ../lib/advene/gui/views/finder.py:687 ../lib/advene/gui/popup.py:860
+msgid "the package"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1198
-msgid "Scale"
+#: ../lib/advene/gui/views/finder.py:688 ../lib/advene/gui/popup.py:861
+msgid "all annotations of the package"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1198
-#: ../lib/advene/gui/views/activebookmarks.py:564
-msgid "Set the size of snaphots"
+#: ../lib/advene/gui/views/finder.py:689 ../lib/advene/gui/popup.py:862
+msgid "the first annotation of the package"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1221
-msgid "Automatically scroll to the mark position when playing"
+#: ../lib/advene/gui/views/finder.py:734
+msgid "Edit resource"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1223
-msgid "Autoscroll"
+#: ../lib/advene/gui/views/finder.py:769 ../lib/advene/util/helper.py:569
+#, python-format
+msgid ""
+"Package %(title)s:\n"
+"%(schema)s\n"
+"%(annotation)s in %(annotation_type)s\n"
+"%(relation)s in %(relation_type)s\n"
+"%(query)s\n"
+"%(view)s\n"
+"\n"
+"Description:\n"
+"%(description)s\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1230
-msgid "Autoinsert"
+#: ../lib/advene/gui/views/finder.py:790
+#, python-format
+msgid "%(type)s %(title)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1232
-msgid "Automatically insert marks"
+#: ../lib/advene/gui/views/finder.py:793 ../lib/advene/gui/edit/elements.py:519
+#: ../lib/advene/gui/edit/elements.py:568
+#: ../lib/advene/gui/edit/elements.py:655
+#: ../lib/advene/gui/edit/elements.py:735
+#: ../lib/advene/gui/edit/elements.py:793
+#: ../lib/advene/gui/edit/elements.py:884
+#: ../lib/advene/gui/edit/elements.py:954
+#: ../lib/advene/gui/edit/elements.py:1066
+msgid "Metadata"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:74
-#, python-format
-msgid "No edit popup available for element %s"
+#: ../lib/advene/gui/views/finder.py:810
+msgid "Column-based package finder"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:95
-msgid "Edit Window"
+#: ../lib/advene/gui/views/editaccumulator.py:46
+msgid "EditAccumulator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:134
-msgid "Apply changes and close the edit window"
+#: ../lib/advene/gui/views/activebookmarks.py:55
+#: ../lib/advene/gui/views/activebookmarks.py:57
+msgid "ActiveBookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:139
-msgid "Apply changes"
+#: ../lib/advene/gui/views/activebookmarks.py:63
+msgid "Export as static view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:273
-msgid "Content has been modified. Close anyway and lose data?"
+#: ../lib/advene/gui/views/activebookmarks.py:434
+msgid "Bookmark duration"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:331
-#: ../lib/advene/gui/views/viewbook.py:234
-#: ../lib/advene/gui/views/viewbook.py:240
-#, python-format
-msgid "Edit %s"
+#: ../lib/advene/gui/views/activebookmarks.py:435
+msgid "Enter the duration (in ms) to convert bookmarks into annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:333
-#, python-format
-msgid "View %s (read-only)"
+#: ../lib/advene/gui/views/activebookmarks.py:457
+msgid "User-specified duration"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:369
-#, python-format
-msgid "Display %s"
+#: ../lib/advene/gui/views/activebookmarks.py:458
+msgid "2s duration"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:453
-msgid "Apply changes and edit previous annotation of same type"
+#: ../lib/advene/gui/views/activebookmarks.py:459
+msgid "Complete coverage"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:457
-msgid "Apply changes and edit next annotation of same type"
+#: ../lib/advene/gui/views/activebookmarks.py:477
+msgid "Drop a bookmark here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:463
-msgid "Unhighlight annotation"
+#: ../lib/advene/gui/views/activebookmarks.py:504
+msgid "Type of the annotations that will be created"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:467
-msgid "Highlight annotation"
+#: ../lib/advene/gui/views/activebookmarks.py:522
+#: ../lib/advene/gui/edit/transcribe.py:1130
+msgid "Smallish"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:498
-msgid "Fragment"
+#: ../lib/advene/gui/views/activebookmarks.py:523
+#: ../lib/advene/gui/edit/transcribe.py:1131 ../lib/advene/rules/actions.py:169
+msgid "Small"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:510
-#: ../lib/advene/gui/edit/elements.py:559
-#: ../lib/advene/gui/edit/elements.py:646
-#: ../lib/advene/gui/edit/elements.py:726
-#: ../lib/advene/gui/edit/elements.py:783
-#: ../lib/advene/gui/edit/elements.py:875
-#: ../lib/advene/gui/edit/elements.py:944
-#: ../lib/advene/gui/edit/elements.py:1056
-#: ../lib/advene/gui/edit/elements.py:1118 ../lib/advene/gui/main.py:4174
-msgid "Author"
+#: ../lib/advene/gui/views/activebookmarks.py:524
+#: ../lib/advene/gui/edit/transcribe.py:1132 ../lib/advene/rules/actions.py:170
+msgid "Normal"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:511
-#: ../lib/advene/gui/edit/elements.py:560
-#: ../lib/advene/gui/edit/elements.py:647
-#: ../lib/advene/gui/edit/elements.py:727
-#: ../lib/advene/gui/edit/elements.py:784
-#: ../lib/advene/gui/edit/elements.py:876
-#: ../lib/advene/gui/edit/elements.py:945
-#: ../lib/advene/gui/edit/elements.py:1057
-#: ../lib/advene/gui/edit/elements.py:1119 ../lib/advene/gui/main.py:4175
-msgid "Date"
+#: ../lib/advene/gui/views/activebookmarks.py:525
+#: ../lib/advene/gui/edit/transcribe.py:1133 ../lib/advene/rules/actions.py:171
+msgid "Large"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:513
-#: ../lib/advene/gui/edit/elements.py:562
-#: ../lib/advene/gui/edit/elements.py:649
-#: ../lib/advene/gui/edit/elements.py:729
-#: ../lib/advene/gui/edit/elements.py:787
-#: ../lib/advene/gui/edit/elements.py:878
-#: ../lib/advene/gui/edit/elements.py:948
-#: ../lib/advene/gui/edit/elements.py:1060
-msgid "Metadata"
+#: ../lib/advene/gui/views/activebookmarks.py:526
+#: ../lib/advene/gui/edit/transcribe.py:1134
+msgid "Larger"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:582
-#: ../lib/advene/gui/edit/elements.py:1065
-#: ../lib/advene/gui/views/relationdisplay.py:113
-msgid "Members"
+#: ../lib/advene/gui/views/activebookmarks.py:527
+#: ../lib/advene/gui/edit/transcribe.py:1135
+msgid "Huge"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:600
-#: ../lib/advene/gui/edit/elements.py:677
-#: ../lib/advene/gui/edit/elements.py:737
-#: ../lib/advene/gui/edit/elements.py:1128
-#: ../lib/advene/gui/views/table.py:250
-msgid "Content"
+#: ../lib/advene/gui/views/activebookmarks.py:537
+msgid "Complete bookmarks into annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:617
-msgid "Apply changes and visualise in web browser"
+#: ../lib/advene/gui/views/activebookmarks.py:538
+msgid "Save the current state"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:622
-msgid "Apply changes and activate the view"
+#: ../lib/advene/gui/views/activebookmarks.py:539
+#: ../lib/advene/gui/edit/transcribe.py:1165
+msgid "Set the size of snaphots"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:630
-#: ../lib/advene/gui/edit/elements.py:711
-#: ../lib/advene/gui/edit/elements.py:768
-#: ../lib/advene/gui/edit/elements.py:859
-#: ../lib/advene/gui/edit/elements.py:928
-#: ../lib/advene/gui/edit/elements.py:1030
-msgid "Title (name)"
+#: ../lib/advene/gui/views/activebookmarks.py:806
+msgid "Remove end timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:634
-msgid "Name of the view"
+#: ../lib/advene/gui/views/activebookmarks.py:1014
+msgid ""
+"Error: cannot find an appropriate schema to create the Active-bookmark type."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:658
-msgid "Class"
+#: ../lib/advene/gui/views/activebookmarks.py:1019
+msgid "Active bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:661
-msgid "Match Filter"
+#: ../lib/advene/gui/views/activebookmarks.py:1057
+msgid "Validate the annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:699 ../lib/advene/gui/popup.py:821
-#, python-format
-msgid "Exception in query: %s"
+#: ../lib/advene/gui/views/activebookmarks.py:1201
+msgid "Duplicate bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:704
-msgid "Validate and run query on package"
+#: ../lib/advene/gui/views/activebookmarks.py:1202
+msgid "Remove bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:715
-msgid "Name of the query"
+#: ../lib/advene/gui/views/activebookmarks.py:1211
+msgid "Remove begin timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:772
-msgid "Name of the package"
+#: ../lib/advene/gui/views/activebookmarks.py:1218
+msgid "Complete bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:790
-#: ../lib/advene/gui/edit/elements.py:881
-#: ../lib/advene/gui/edit/elements.py:960
-#: ../lib/advene/gui/edit/elements.py:1074
-msgid "Description"
+#: ../lib/advene/gui/views/activebookmarks.py:1222
+msgid "Change type to"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:794
-#: ../lib/advene/gui/edit/elements.py:885
-#: ../lib/advene/gui/edit/elements.py:964
-#: ../lib/advene/gui/edit/elements.py:1078
-msgid "Textual description of the package"
+#: ../lib/advene/gui/views/logwindow.py:43
+msgid "Links"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:799
-msgid "Default dynamic view"
+#: ../lib/advene/gui/views/logwindow.py:45
+msgid "URL stack"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:803
-msgid "Dynamic view to activate on package load"
+#: ../lib/advene/gui/views/logwindow.py:123
+#, python-format
+msgid "Go to %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:808
-msgid "Default static view"
+#: ../lib/advene/gui/views/logwindow.py:129 ../lib/advene/rules/actions.py:65
+msgid "Go to the given position"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:812
-msgid "Static view to open on package load"
+#: ../lib/advene/gui/views/logwindow.py:157
+msgid "Push a URL on the stack"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:817
-msgid "Default adhoc view"
+#: ../lib/advene/gui/views/logwindow.py:158
+msgid "Description of the URL"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:821
-msgid "Adhoc view to open on package load"
+#: ../lib/advene/gui/views/interactivequery.py:52
+#: ../lib/advene/gui/views/interactivequery.py:100
+msgid "Interactive query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:826
-msgid "Cached duration"
+#: ../lib/advene/gui/views/interactivequery.py:54
+msgid "Interactive query dialog"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:830
-msgid "Cached duration in ms"
+#: ../lib/advene/gui/views/interactivequery.py:60
+#: ../lib/advene/gui/views/interactivequery.py:257
+msgid "Save query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:835
-msgid "Mediafile"
+#: ../lib/advene/gui/views/interactivequery.py:123
+#: ../lib/advene/gui/views/interactivequery.py:173
+#, python-format
+msgid ""
+"Invalid query.\n"
+"The following fields have an invalid value:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:839
-msgid "Location of associated media file"
+#: ../lib/advene/gui/views/interactivequery.py:137
+#: ../lib/advene/gui/views/interactivequery.py:297
+msgid "Saving the query..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:863
-msgid "Name of the schema"
+#: ../lib/advene/gui/views/interactivequery.py:138
+#: ../lib/advene/gui/views/interactivequery.py:298
+msgid "Give a title and identifier for saving the query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:895
-#: ../lib/advene/gui/edit/elements.py:975
-msgid "TALES expression returning a color for the element"
+#: ../lib/advene/gui/views/interactivequery.py:181
+msgid "Expert search"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:902
-#: ../lib/advene/gui/edit/elements.py:993
-msgid "Item color"
-msgstr ""
-
-#: ../lib/advene/gui/edit/elements.py:906
-#: ../lib/advene/gui/edit/elements.py:997
+#: ../lib/advene/gui/views/interactivequery.py:187
+#, python-format
 msgid ""
-"TALES expression returning a color for the items contained by the element"
-msgstr ""
-
-#: ../lib/advene/gui/edit/elements.py:932
-#: ../lib/advene/gui/edit/elements.py:1034
-msgid "Name of the type"
+"TALES error in interactive expression:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:950
-#: ../lib/advene/gui/edit/elements.py:1039
-#: ../lib/advene/gui/edit/elements.py:1308
-msgid "MIME Type"
+#: ../lib/advene/gui/views/interactivequery.py:248
+msgid "Interactive result"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:954
-#: ../lib/advene/gui/edit/elements.py:1043
-msgid "MIMEType of the content"
+#: ../lib/advene/gui/views/interactivequery.py:250
+msgid "Interactive result display"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:982
-#: ../lib/advene/gui/views/transcription.py:165
-msgid "Representation"
+#: ../lib/advene/gui/views/interactivequery.py:275
+msgid "Result of interactive query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:986
-msgid ""
-"TALES expression used to get a compact representation of the annotations"
+#: ../lib/advene/gui/views/interactivequery.py:279
+msgid "Result of a query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:987
+#: ../lib/advene/gui/views/interactivequery.py:334
 #, python-format
-msgid "Display %s key"
+msgid "Comment on annotations containing %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1003
-msgid "Completions"
+#: ../lib/advene/gui/views/interactivequery.py:353
+msgid "Choose the annotation type where annotations will be created."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1007
-msgid "Space-separated list of words used for content completion"
+#: ../lib/advene/gui/views/interactivequery.py:357
+#, python-format
+msgid "Copied result of the '%s' query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1013
-msgid "Advanced"
+#: ../lib/advene/gui/views/interactivequery.py:369
+#, python-format
+msgid "Search/replace content in %d elements"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1063
-msgid "Any annotation type"
+#: ../lib/advene/gui/views/interactivequery.py:397
+msgid "Edit query again"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1089
-msgid "TALES expression specifying a color"
+#: ../lib/advene/gui/views/interactivequery.py:411
+msgid "Search again"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1116
-msgid "MIMEType"
+#: ../lib/advene/gui/views/interactivequery.py:417
+msgid "Empty result"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1341
+#: ../lib/advene/gui/views/interactivequery.py:426
 #, python-format
-msgid "Error: cannot find a content handler for %s"
+msgid "Result is a list of %d annotations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1457
-#: ../lib/advene/gui/edit/elements.py:1682
+#: ../lib/advene/gui/views/interactivequery.py:428
 #, python-format
-msgid ""
-"Cannot read the data:\n"
-"%s"
+msgid "Result is a list of  %(number)d elements with %(elements)s."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1481
-#: ../lib/advene/gui/edit/elements.py:1707
-msgid "Save content to..."
+#: ../lib/advene/gui/views/interactivequery.py:440
+#: ../lib/advene/gui/edit/montage.py:481
+msgid "Unhighlight annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1492
-#: ../lib/advene/gui/edit/elements.py:1720
-#, python-format
-msgid ""
-"Cannot save the data:\n"
-"%s"
+#: ../lib/advene/gui/views/interactivequery.py:444
+#: ../lib/advene/gui/views/interactivequery.py:481
+#: ../lib/advene/gui/edit/montage.py:485 ../lib/advene/gui/edit/montage.py:494
+msgid "Highlight annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1511
-#: ../lib/advene/gui/edit/elements.py:1734
-msgid "Open a file (C-o)"
+#: ../lib/advene/gui/views/interactivequery.py:465
+#: ../lib/advene/gui/edit/imports.py:184 ../lib/advene/gui/edit/imports.py:185
+msgid "Annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1516
-#: ../lib/advene/gui/edit/elements.py:1739
-msgid "Save to a file (C-s)"
+#: ../lib/advene/gui/views/interactivequery.py:471
+msgid "Other elements"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1521
-#: ../lib/advene/gui/edit/elements.py:1744
-msgid "Reload the file (C-r)"
+#: ../lib/advene/gui/views/interactivequery.py:475
+msgid "Display annotations in timeline"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1527
-msgid "Insert a value from the browser (C-i)"
+#: ../lib/advene/gui/views/interactivequery.py:476
+msgid "Display annotations as transcription"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1773
-msgid "Begin time is greater than end time"
+#: ../lib/advene/gui/views/interactivequery.py:482
+#: ../lib/advene/gui/views/interactivequery.py:504
+msgid "Export table"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1803
-#: ../lib/advene/gui/views/table.py:252
-msgid "Begin"
+#: ../lib/advene/gui/views/interactivequery.py:483
+msgid "Create annotations from the result"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1812
-#: ../lib/advene/gui/views/table.py:253 ../lib/advene/gui/main.py:628
-msgid "End"
+#: ../lib/advene/gui/views/interactivequery.py:484
+msgid "Define a montage with the result"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2044
-msgid "Expecting an integer."
+#: ../lib/advene/gui/views/interactivequery.py:485
+msgid "Create a comment view with the result"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2076
-#, python-format
-msgid ""
-"The %(attribute)s attribute could not be updated:\n"
-"\n"
-"%(error)s\n"
-"\n"
-"Resetting to the original value."
+#: ../lib/advene/gui/views/interactivequery.py:486
+msgid "Search and replace strings in the annotations content"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2103
-#, python-format
-msgid ""
-"The following attributes cannot be updated:\n"
-"\n"
-"%s"
+#: ../lib/advene/gui/views/interactivequery.py:511
+msgid "Edit elements"
+msgstr ""
+
+#: ../lib/advene/gui/views/interactivequery.py:517
+msgid "Open in python evaluator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2143
+#: ../lib/advene/gui/views/interactivequery.py:520
 #, python-format
 msgid ""
-"The following attributes could not be updated:\n"
-"\n"
+"Result:\n"
 "%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2160
-msgid "Attribute"
-msgstr ""
-
-#: ../lib/advene/gui/edit/elements.py:2168
-#: ../lib/advene/gui/views/browser.py:366
-msgid "Value"
+#: ../lib/advene/gui/views/interactivequery.py:562
+msgid "Results of _interactive query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2259
-msgid "Insert an element"
+#: ../lib/advene/gui/popup.py:135
+msgid "Choose the file to insert"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2260
-msgid "Choose the element to insert."
+#: ../lib/advene/gui/popup.py:143
+msgid "Select a valid identifier"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2330
-#: ../lib/advene/gui/edit/elements.py:2373
+#: ../lib/advene/gui/popup.py:144
 #, python-format
-msgid "Some tags contain invalid characters: %s"
+msgid ""
+"The filename %s contains invalid characters\n"
+"that have been replaced.\n"
+"You can modify this identifier if necessary:"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2353
-msgid "Tags:"
+#: ../lib/advene/gui/popup.py:155
+msgid "Choose the soundclip to insert"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:163
-#: ../lib/advene/gui/views/browser.py:165
-msgid "TALES browser"
+#: ../lib/advene/gui/popup.py:159
+msgid "Choose the directory to insert"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:170
-msgid "Display result in table"
+#: ../lib/advene/gui/popup.py:171
+#, python-format
+msgid "Apply %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:193
-msgid "Insert path"
+#: ../lib/advene/gui/popup.py:175
+msgid ""
+"Give the offset to use\n"
+"on specified element.\n"
+"It is in ms and can be\n"
+"either positive or negative."
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:194
-msgid "Insert value"
+#: ../lib/advene/gui/popup.py:219
+#, python-format
+msgid "Replace content in %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:249
-msgid "Expression returned None (there was an exception)"
+#: ../lib/advene/gui/popup.py:222
+#, python-format
+msgid "Replace content in annotations of type %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:302
-msgid "Result is not a list"
+#: ../lib/advene/gui/popup.py:225
+msgid "Replace content in all annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/accumulatorpopup.py:49
-msgid "PopupAccumulator"
+#: ../lib/advene/gui/popup.py:318
+#, python-format
+msgid "Copy id %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:40
-msgid "Edition History"
+#: ../lib/advene/gui/popup.py:352
+#, python-format
+msgid ""
+"<b>Statistics about %s</b>\n"
+"\n"
 msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:42
-msgid "Access last edited/created elements"
+#: ../lib/advene/gui/popup.py:358
+#, python-format
+msgid "Renumbering annotations of type %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:102
-msgid "Created"
+#: ../lib/advene/gui/popup.py:365
+msgid ""
+"<b>Renumber all annotations according to their order.</b>\n"
+"\n"
+"<i>Note that this action cannot be undone.</i>\n"
+"Replace the first numeric value of the annotation content with the new "
+"annotation number.\n"
+"If no numeric value is found and the annotation is structured, it will "
+"insert the number.\n"
+"If no numeric value is found and the annotation is of type text/plain, it "
+"will overwrite the annotation content.\n"
+"The offset parameter allows you to renumber from a given annotation."
 msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:103
-msgid "Edited"
+#: ../lib/advene/gui/popup.py:371 ../lib/advene/gui/popup.py:513
+msgid "Offset"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:43
-msgid "Links"
+#: ../lib/advene/gui/popup.py:393
+#, python-format
+msgid "Renumbering %d annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:45
-msgid "URL stack"
+#: ../lib/advene/gui/popup.py:402
+#, python-format
+msgid "Annotation #%d"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:123
+#: ../lib/advene/gui/popup.py:433
 #, python-format
-msgid "Go to %s"
+msgid "Splitting package according to %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:157
-msgid "Push a URL on the stack"
+#: ../lib/advene/gui/popup.py:436
+#, python-format
+msgid ""
+"For each of the %(count)d annotations in %(atype)s, create a package named "
+"after the source package and the annotation content, copying only "
+"annotations contained in the reference annotation."
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:158
-msgid "Description of the URL"
+#: ../lib/advene/gui/popup.py:456
+msgid "Created %(name)s - %(n) annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:37
-msgid "Checker"
+#: ../lib/advene/gui/popup.py:473 ../lib/advene/gui/edit/montage.py:309
+#, python-format
+msgid "Extracting %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:39
-msgid "Check various package properties"
+#: ../lib/advene/gui/popup.py:474
+#, python-format
+msgid ""
+"Exporting annotation %(title)s\n"
+"from %(begin)s to %(end)s\n"
+"to %%(filename)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:90
-msgid "List of possible issues in the current package"
+#: ../lib/advene/gui/popup.py:485 ../lib/advene/gui/edit/transcribe.py:499
+msgid "Edit"
 msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:108
-msgid "Overlapping"
+#: ../lib/advene/gui/popup.py:487
+msgid "Browse"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:52
-msgid "Tag Bag"
+#: ../lib/advene/gui/popup.py:495 ../lib/advene/gui/popup.py:884
+msgid "Open in web browser"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:54 ../lib/advene/gui/main.py:1232
-msgid "Bag of tags"
+#: ../lib/advene/gui/popup.py:501 ../lib/advene/gui/popup.py:505
+#: ../lib/advene/gui/edit/shapewidget.py:1601
+msgid "Delete"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:59
-msgid "New tag"
+#: ../lib/advene/gui/popup.py:508
+msgid "Search/replace content"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:122
-msgid "New tag name"
+#: ../lib/advene/gui/popup.py:526
+msgid "Desactivate"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:128
-msgid "Enter a new tag name and select its color."
+#: ../lib/advene/gui/popup.py:543
+msgid "Loop"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:162
-#: ../lib/advene/gui/views/timeline.py:3720
-msgid "The tag contains invalid characters"
+#: ../lib/advene/gui/popup.py:544
+msgid "Duplicate"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:175
-msgid "Tag bag options"
+#: ../lib/advene/gui/popup.py:548
+msgid "Save snapshot..."
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:176
-msgid "Update with new tags"
+#: ../lib/advene/gui/popup.py:550
+msgid "Extract video fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:176
-msgid "Automatically display new defined tags"
+#: ../lib/advene/gui/popup.py:580
+msgid "Incoming"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:225
-#, python-format
-msgid "Choose the color for tag %s"
+#: ../lib/advene/gui/popup.py:596
+msgid "Outgoing"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:249
-msgid "Set color"
+#: ../lib/advene/gui/popup.py:611
+msgid "Related annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:250
-msgid "Remove"
+#: ../lib/advene/gui/popup.py:618
+msgid "Incoming relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:324
-msgid "Drop a tag here to remove it from the list"
+#: ../lib/advene/gui/popup.py:625
+msgid "Outgoing relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:333
-msgid "Save as adhoc view"
+#: ../lib/advene/gui/popup.py:642
+#, python-format
+msgid "Begin: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:334
-msgid "Add a new tag"
+#: ../lib/advene/gui/popup.py:644
+#, python-format
+msgid "End: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:335
-msgid "Display all defined tags"
+#: ../lib/advene/gui/popup.py:645
+#, python-format
+msgid "Duration: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:48
-msgid "Transcription"
+#: ../lib/advene/gui/popup.py:652
+msgid "Members:"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:50
-msgid "Display annotations as a text transcription"
+#: ../lib/advene/gui/popup.py:665
+msgid "Edit package properties..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:146
+#: ../lib/advene/gui/popup.py:666 ../lib/advene/gui/popup.py:787
 #, python-format
-msgid "Error in source evaluation %(source)s: %(error)s"
+msgid "%d annotations(s) - statistics"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:163
-msgid "Transcription options"
+#: ../lib/advene/gui/popup.py:668 ../lib/advene/gui/popup.py:895
+msgid "Create a new static view..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:164
-msgid "Default representation"
+#: ../lib/advene/gui/popup.py:669 ../lib/advene/gui/popup.py:896
+msgid "Create a new dynamic view..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:164
-msgid "Use the default representation for annotations"
+#: ../lib/advene/gui/popup.py:670 ../lib/advene/gui/popup.py:782
+msgid "Create a new annotation..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:165
-msgid ""
-"If default representation is unchecked,\n"
-"this TALES expression that will be used to format the annotations."
+#: ../lib/advene/gui/popup.py:672 ../lib/advene/gui/popup.py:898
+msgid "Create a new schema..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:166
-msgid "Separator"
+#: ../lib/advene/gui/popup.py:673 ../lib/advene/gui/popup.py:893
+msgid "Create a new query..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:167
-msgid "This separator will be inserted between the annotations."
-msgstr ""
-
-#: ../lib/advene/gui/views/transcription.py:168
-msgid "Whitespace"
+#: ../lib/advene/gui/popup.py:681
+msgid "Create a new folder..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:169
-msgid "Newline"
+#: ../lib/advene/gui/popup.py:682
+msgid "Create a new resource file..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:170
-msgid "Tabulation"
+#: ../lib/advene/gui/popup.py:683
+msgid "Insert a new resource file..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:171
-msgid "Dash"
+#: ../lib/advene/gui/popup.py:684
+msgid "Insert a new resource directory..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:172
-msgid "User defined"
+#: ../lib/advene/gui/popup.py:693 ../lib/advene/gui/popup.py:695
+msgid "Insert a soundclip..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:174
-msgid "User-defined separator"
+#: ../lib/advene/gui/popup.py:706
+msgid "Play sound"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:174
-msgid ""
-"Separator used if user-defined is selected.Use \\n for a newline and \\t for "
-"a tabulation."
+#: ../lib/advene/gui/popup.py:716
+msgid "Create a new annotation type..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:175
-msgid "Display timestamps"
+#: ../lib/advene/gui/popup.py:718
+msgid "Create a new relation type..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:175
-msgid "Insert timestsamp values"
+#: ../lib/advene/gui/popup.py:720 ../lib/advene/gui/popup.py:781
+#: ../lib/advene/gui/popup.py:834
+msgid "Select a color"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:176
-msgid "Display annotation bounds"
+#: ../lib/advene/gui/popup.py:729
+#, python-format
+msgid "A caption dynamic view for %s already seems to exist."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:236
+#: ../lib/advene/gui/popup.py:738
 #, python-format
-msgid ""
-"Cannot convert the following annotations,\n"
-"the representation pattern is too complex.\n"
-"%s"
+msgid "Caption %s annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:247
-msgid ""
-"Cannot validate the update.\n"
-"The representation pattern is too complex."
+#: ../lib/advene/gui/popup.py:748 ../lib/advene/rules/actions.py:121
+msgid "Caption the annotation"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:273
-msgid "Save transcription to a text file"
+#: ../lib/advene/gui/popup.py:770
+msgid "Create a comment view"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:274
-msgid "Apply the modifications"
+#: ../lib/advene/gui/popup.py:771
+msgid "Generate a caption dynamic view..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:275
-msgid "Find text"
+#: ../lib/advene/gui/popup.py:772
+msgid "Display as transcription"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:276
-msgid "Quickly switch display options"
+#: ../lib/advene/gui/popup.py:773
+msgid "Display annotations in table"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:277
-msgid "Refresh the transcription"
+#: ../lib/advene/gui/popup.py:774
+msgid "Export to another format..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:278
-msgid "Edit preferences"
+#: ../lib/advene/gui/popup.py:775
+msgid "Split according to annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:697
+#: ../lib/advene/gui/popup.py:777
 #, python-format
-msgid "Cannot write to %(filename)s: %(error)s:"
+msgid "Apply %s..."
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:52
-#: ../lib/advene/gui/views/activebookmarks.py:54
-msgid "ActiveBookmarks"
+#: ../lib/advene/gui/popup.py:783
+msgid "Delete all annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:441
-msgid "Chronological order"
+#: ../lib/advene/gui/popup.py:784
+msgid "Renumber annotations..."
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:442
-msgid "Completeness and chronological order"
+#: ../lib/advene/gui/popup.py:785
+msgid "Shot validation view..."
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:458
-msgid "Bookmark duration"
+#: ../lib/advene/gui/popup.py:797
+#, python-format
+msgid "A follow dynamic view for %s already seems to exist."
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:459
-msgid "Enter the duration (in ms) to convert bookmarks into annotations"
+#: ../lib/advene/gui/popup.py:806
+#, python-format
+msgid "Follow %s relation-type"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:481
-msgid "User-specified duration"
+#: ../lib/advene/gui/popup.py:815
+msgid "Follow the relation"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:482
-msgid "2s duration"
+#: ../lib/advene/gui/popup.py:835
+msgid "Delete all relations..."
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:483
-msgid "Complete coverage"
+#: ../lib/advene/gui/popup.py:836
+msgid "Create montage from related annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:501
-msgid "Drop a bookmark here to remove it from the list"
+#: ../lib/advene/gui/popup.py:837
+msgid "Create dynamic view following relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:520
-#: ../lib/advene/gui/views/bookmarks.py:243
-msgid "Insert a bookmark for the current video time"
+#: ../lib/advene/gui/popup.py:852 ../lib/advene/gui/edit/elements.py:705
+#, python-format
+msgid "Exception in query: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:528
-msgid "Type of the annotations that will be created"
+#: ../lib/advene/gui/popup.py:855
+msgid "Apply query on..."
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:561
-msgid "Reorder active bookmarks"
+#: ../lib/advene/gui/popup.py:880
+msgid "Activate view"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:562
-msgid "Complete bookmarks into annotations"
+#: ../lib/advene/gui/popup.py:882
+msgid "Open adhoc view"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:563
-msgid "Save the current state"
+#: ../lib/advene/gui/util/initialconfig.py:82
+msgid "Initial Advene configuration"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:863
-msgid "Remove end timestamp"
+#: ../lib/advene/gui/util/initialconfig.py:83
+msgid ""
+"<span size='large'><b>Welcome in Advene</b>\n"
+"This is the first time that you run Advene. Please answer some basic "
+"configuration questions. You will be able to modify these choices from the "
+"Advene interface, in the Edit/Preferences menu.</span>"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1071
-msgid ""
-"Error: cannot find an appropriate schema to create the Active-bookmark type."
+#: ../lib/advene/gui/util/initialconfig.py:84
+msgid "Interface language"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1076
-msgid "Active bookmark"
+#: ../lib/advene/gui/util/initialconfig.py:84
+msgid "Language used for the interface"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1114
-msgid "Validate the annotation"
+#: ../lib/advene/gui/util/initialconfig.py:90
+msgid "Weekly check for Advene updates on the Advene website"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1260
-msgid "Duplicate bookmark"
+#: ../lib/advene/gui/util/initialconfig.py:92
+msgid "Preferred directory for data files"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1261
-msgid "Remove bookmark"
+#: ../lib/advene/gui/util/initialconfig.py:92
+msgid "Preferred directory for storing data files (Advene packages)"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1270
-msgid "Remove begin timestamp"
+#: ../lib/advene/gui/util/initialconfig.py:94
+msgid "Directories to search for movies"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1277
-msgid "Complete bookmark"
+#: ../lib/advene/gui/util/initialconfig.py:94
+#, python-format
+msgid ""
+"List of directories (separated by %(pathsep)s) to search for movie files."
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1281
-msgid "Change type to"
+#: ../lib/advene/gui/util/initialconfig.py:95
+msgid "First look for movie file in the same directory as the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:48
-msgid "Bookmarks importer"
+#: ../lib/advene/gui/util/initialconfig.py:95
+msgid ""
+"If checked, the movie file will be searched for in the same directory as the "
+"referencing package."
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:69
-msgid "Bookmarks"
+#: ../lib/advene/gui/util/__init__.py:44 ../lib/advene/gui/edit/create.py:108
+msgid "Plain text content"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:71
-msgid "Bookmark timecodes with their corresponding screenshots"
+#: ../lib/advene/gui/util/__init__.py:45
+msgid "HTML content"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:142
-msgid "Select the annotation type to generate"
+#: ../lib/advene/gui/util/__init__.py:46 ../lib/advene/gui/edit/create.py:109
+msgid "Simple-structured content"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:147
-msgid "Choose a duration"
+#: ../lib/advene/gui/util/__init__.py:47
+msgid "List of numeric values"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:148
-msgid "Enter the standard duration (in ms) of created annotations."
+#: ../lib/advene/gui/util/__init__.py:48 ../lib/advene/gui/edit/create.py:110
+msgid "SVG graphics content"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:165
-msgid "Converted from bookmarks"
+#: ../lib/advene/gui/util/__init__.py:387
+#, python-format
+msgid ""
+"Annotation Type %(title)s:\n"
+"%(count)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:223
-msgid "Drop a position here to remove it from the list"
+#: ../lib/advene/gui/util/__init__.py:393
+#, python-format
+msgid ""
+"Relation Type %(title)s:\n"
+"%(count)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:244
-msgid "Convert bookmarks to annotations"
+#: ../lib/advene/gui/util/dialog.py:419 ../lib/advene/gui/util/dialog.py:458
+msgid "Name the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:292 ../lib/advene/gui/main.py:3609
-msgid "Comment here"
+#: ../lib/advene/gui/util/dialog.py:422 ../lib/advene/gui/util/dialog.py:459
+msgid "Choose a name for the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewplugin.py:60
-msgid "Generic view plugin"
+#: ../lib/advene/gui/util/dialog.py:497
+msgid "Open a file"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewplugin.py:62
-msgid "You should not ever see this tooltip..."
+#: ../lib/advene/gui/util/dialog.py:522 ../lib/advene/gui/util/dialog.py:560
+msgid "N/C"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:51
-#: ../lib/advene/gui/views/interactivequery.py:99
-msgid "Interactive query"
+#: ../lib/advene/gui/util/dialog.py:527
+msgid "Alias"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:53
-msgid "Interactive query dialog"
+#: ../lib/advene/gui/util/dialog.py:545
+msgid ""
+"Press to\n"
+"display\n"
+"information"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:59
-#: ../lib/advene/gui/views/interactivequery.py:256
-msgid "Save query"
+#: ../lib/advene/gui/util/dialog.py:568
+msgid "Wait..."
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:122
-#: ../lib/advene/gui/views/interactivequery.py:172
+#: ../lib/advene/gui/util/dialog.py:572
 #, python-format
-msgid ""
-"Invalid query.\n"
-"The following fields have an invalid value:\n"
-"%s"
+msgid "Error: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:136
-#: ../lib/advene/gui/views/interactivequery.py:296
-msgid "Saving the query..."
+#: ../lib/advene/gui/util/dialog.py:592
+msgid "Any type of file"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:137
-#: ../lib/advene/gui/views/interactivequery.py:297
-msgid "Give a title and identifier for saving the query"
+#: ../lib/advene/gui/util/dialog.py:594
+msgid "Advene files (.xml, .azp, .apl)"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:180
-msgid "Expert search"
+#: ../lib/advene/gui/util/dialog.py:596
+msgid "Advene session (.apl)"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:186
-#, python-format
-msgid ""
-"TALES error in interactive expression:\n"
-"%s"
+#: ../lib/advene/gui/util/dialog.py:597
+msgid "Audio files"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:247
-msgid "Interactive result"
+#: ../lib/advene/gui/util/dialog.py:598
+msgid "Video files"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:249
-msgid "Interactive result display"
+#: ../lib/advene/gui/util/dialog.py:637
+#: ../lib/advene/gui/edit/properties.py:578
+msgid "Choose a directory"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:274
-msgid "Result of interactive query"
+#: ../lib/advene/gui/util/dialog.py:690
+msgid "Select an element"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:278
-msgid "Result of a query"
+#: ../lib/advene/gui/edit/rules.py:88 ../lib/advene/gui/edit/rules.py:90
+#: ../lib/advene/gui/edit/create.py:254
+msgid "Rule"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:280
-#: ../lib/advene/gui/main.py:3188
-#, python-format
-msgid "'%s'"
+#: ../lib/advene/gui/edit/rules.py:99 ../lib/advene/gui/edit/create.py:244
+msgid "Subviews"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:333
-#, python-format
-msgid "Comment on annotations containing %s"
+#: ../lib/advene/gui/edit/rules.py:126
+msgid "Add a new rule"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:352
-msgid "Choose the annotation type where annotations will be created."
+#: ../lib/advene/gui/edit/rules.py:130
+msgid "Subview"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:356
-#, python-format
-msgid "Copied result of the '%s' query"
+#: ../lib/advene/gui/edit/rules.py:133
+msgid "Add a subview list"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:368
-#, python-format
-msgid "Search/replace content in %d elements"
+#: ../lib/advene/gui/edit/rules.py:139
+msgid "Remove the current rule"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:375
-#: ../lib/advene/gui/main.py:3185
-msgid "Empty quicksearch string"
+#: ../lib/advene/gui/edit/rules.py:275
+msgid "Source expression"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:396
-msgid "Edit query again"
+#: ../lib/advene/gui/edit/rules.py:277
+msgid "Return expression"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:400
-#: ../lib/advene/gui/views/finder.py:436
-msgid "Edit query"
+#: ../lib/advene/gui/edit/rules.py:351
+msgid "For all elements in "
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:409
-#: ../lib/advene/gui/main.py:537
-msgid "String to search"
+#: ../lib/advene/gui/edit/rules.py:352
+msgid "All annotations of the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:410
-msgid "Search again"
+#: ../lib/advene/gui/edit/rules.py:353
+msgid "All views of the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:416
-msgid "Empty result"
+#: ../lib/advene/gui/edit/rules.py:354 ../lib/advene/gui/edit/rules.py:798
+msgid "The context annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:425
-#, python-format
-msgid "Result is a list of %d annotations."
+#: ../lib/advene/gui/edit/rules.py:355 ../lib/advene/gui/edit/rules.py:799
+msgid "The annotations of the context type"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:427
+#: ../lib/advene/gui/edit/rules.py:358 ../lib/advene/core/controller.py:610
 #, python-format
-msgid "Result is a list of  %(number)d elements with %(elements)s."
+msgid "Annotations of type %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:470
-msgid "Other elements"
+#: ../lib/advene/gui/edit/rules.py:370
+msgid "Return "
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:474
-msgid "Display annotations in timeline"
+#: ../lib/advene/gui/edit/rules.py:372 ../lib/advene/gui/edit/rules.py:787
+msgid "The element"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:475
-msgid "Display annotations as transcription"
+#: ../lib/advene/gui/edit/rules.py:373 ../lib/advene/gui/edit/rules.py:788
+msgid "The element's content"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:481
-#: ../lib/advene/gui/views/interactivequery.py:503
-msgid "Export table"
+#: ../lib/advene/gui/edit/rules.py:388
+msgid "If the element matches "
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:482
-msgid "Create annotations from the result"
+#: ../lib/advene/gui/edit/rules.py:390
+msgid "Return the element if it matches "
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:483
-msgid "Define a montage with the result"
+#: ../lib/advene/gui/edit/rules.py:408 ../lib/advene/gui/edit/rules.py:617
+msgid "All conditions must be met"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:484
-msgid "Create a comment view with the result"
+#: ../lib/advene/gui/edit/rules.py:409 ../lib/advene/gui/edit/rules.py:618
+msgid "Any condition can be met"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:485
-msgid "Search and replace strings in the annotations content"
+#: ../lib/advene/gui/edit/rules.py:493 ../lib/advene/gui/edit/rules.py:563
+#, python-format
+msgid "Rule <b>%s</b>"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:510
-msgid "Edit elements"
+#: ../lib/advene/gui/edit/rules.py:574
+msgid "Rule name"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:516
-msgid "Open in python evaluator"
+#: ../lib/advene/gui/edit/rules.py:591
+msgid "Event"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:519
-#, python-format
-msgid ""
-"Result:\n"
-"%s"
+#: ../lib/advene/gui/edit/rules.py:599
+msgid "If"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:561
-msgid "Results of _interactive query"
+#: ../lib/advene/gui/edit/rules.py:638
+msgid "Then"
 msgstr ""
 
-#: ../lib/advene/gui/views/relationdisplay.py:34
-msgid "RelationDisplay"
+#: ../lib/advene/gui/edit/rules.py:683
+msgid "When the "
 msgstr ""
 
-#: ../lib/advene/gui/views/relationdisplay.py:36
-msgid "Display the contents of a relation"
+#: ../lib/advene/gui/edit/rules.py:696
+msgid " occurs,"
 msgstr ""
 
-#: ../lib/advene/gui/views/relationdisplay.py:79
-msgid "No relation"
+#: ../lib/advene/gui/edit/rules.py:723 ../lib/advene/gui/edit/rules.py:726
+#, python-format
+msgid "Condition expression: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/relationdisplay.py:104
-#: ../lib/advene/gui/views/annotationdisplay.py:253
-msgid "Contents"
+#: ../lib/advene/gui/edit/rules.py:765
+msgid "The annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:62
-msgid "Cannot go back: first item in history"
+#: ../lib/advene/gui/edit/rules.py:768
+#, python-format
+msgid "The value of the %s attribute"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:220
-#, python-format
-msgid "%s%% loaded"
+#: ../lib/advene/gui/edit/rules.py:770
+msgid "The annotation fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:223
-#, python-format
-msgid "Title %s"
+#: ../lib/advene/gui/edit/rules.py:771
+msgid "The annotation begin time"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:287
-msgid "HTML Viewer"
+#: ../lib/advene/gui/edit/rules.py:772
+msgid "The annotation end time"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:289
-msgid "Embedded HTML widget"
+#: ../lib/advene/gui/edit/rules.py:774
+msgid "The annotation MIME-type"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:319
-msgid "No available HTML rendering component"
+#: ../lib/advene/gui/edit/rules.py:775
+msgid "The annotation's incoming relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:36
-msgid "ViewBook"
+#: ../lib/advene/gui/edit/rules.py:776
+msgid "The annotation's outgoing relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:57
-#: ../lib/advene/gui/views/viewbook.py:64
-msgid "Cannot remove this widget, it is essential."
+#: ../lib/advene/gui/edit/rules.py:779
+#, python-format
+msgid "The %s-related incoming annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:135
-msgid "Detach"
+#: ../lib/advene/gui/edit/rules.py:783
+#, python-format
+msgid "The %s-related outgoing annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:139
-#: ../lib/advene/gui/views/editaccumulator.py:76
-msgid "Close"
+#: ../lib/advene/gui/edit/rules.py:789
+msgid "The element fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:157
-msgid "Rename the view"
+#: ../lib/advene/gui/edit/rules.py:790
+msgid "The element begin time"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:158
-msgid "Please enter the new name of the view"
+#: ../lib/advene/gui/edit/rules.py:791
+msgid "The element end time"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:197
-msgid "Detach view in its own window, or drag-and-drop to another zone"
+#: ../lib/advene/gui/edit/rules.py:792
+msgid "The element duration"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:211
-msgid "Close view"
+#: ../lib/advene/gui/edit/rules.py:793
+msgid "The element type"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:286
-msgid "Open a new transcription for..."
+#: ../lib/advene/gui/edit/rules.py:794
+msgid "The element's incoming relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:298
-msgid "Create a new comment view"
+#: ../lib/advene/gui/edit/rules.py:795
+msgid "The element's outgoing relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:300
-msgid "Open a new view"
+#: ../lib/advene/gui/edit/rules.py:796
+msgid "The context"
+msgstr ""
+
+#: ../lib/advene/gui/edit/rules.py:797
+msgid "The context fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:375
+#: ../lib/advene/gui/edit/rules.py:809
 #, python-format
-msgid "Use annotation-type %s :"
+msgid "annotation-type %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:378
-#: ../lib/advene/gui/views/viewbook.py:404
-msgid "to edit it"
+#: ../lib/advene/gui/edit/rules.py:812
+#, python-format
+msgid "relation-type %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:379
-#: ../lib/advene/gui/views/viewbook.py:405
-#: ../lib/advene/gui/views/viewbook.py:437
-msgid "to create a new static view"
+#: ../lib/advene/gui/edit/rules.py:834
+msgid "Select a condition"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:381
-msgid "in a timeline"
+#: ../lib/advene/gui/edit/rules.py:878
+#, python-format
+msgid "Parameter %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:382
-msgid "as a montage"
+#: ../lib/advene/gui/edit/rules.py:991
+msgid "Select an action"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:383
-#: ../lib/advene/gui/views/viewbook.py:436
-msgid "in a table"
+#: ../lib/advene/gui/edit/rules.py:1082
+msgid "Activate?"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:384
-#: ../lib/advene/gui/views/viewbook.py:406
-msgid "in a query"
+#: ../lib/advene/gui/edit/properties.py:110
+msgid "Please press the new key combination"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:384
-#: ../lib/advene/gui/views/viewbook.py:406
-#, python-format
-msgid "Query %s"
+#: ../lib/advene/gui/edit/properties.py:161
+msgid "Disabled"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:385
-#: ../lib/advene/gui/views/viewbook.py:407
-msgid "in the TALES browser"
+#: ../lib/advene/gui/edit/properties.py:167
+#: ../lib/advene/gui/edit/shapewidget.py:1602
+msgid "Properties"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:385
-#, python-format
-msgid "Browsing %s"
+#: ../lib/advene/gui/edit/properties.py:531
+msgid "Choose a file"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:401
-#, python-format
-msgid "Use annotation %s :"
+#: ../lib/advene/gui/edit/frameselector.py:46
+msgid "Click on a frame to select its time."
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:407
-#, python-format
-msgid "Browse %s"
+#: ../lib/advene/gui/edit/frameselector.py:184
+msgid "Select the appropriate snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:408
-msgid "to display its contents"
+#: ../lib/advene/gui/edit/frameselector.py:237
+#: ../lib/advene/gui/edit/frameselector.py:268
+msgid "Click to see more frames or scroll with the mouse wheel"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:408
+#: ../lib/advene/gui/edit/create.py:83
 #, python-format
-msgid "%s"
+msgid "%s creation"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:409
-msgid "as a bookmark"
+#: ../lib/advene/gui/edit/create.py:84
+#, python-format
+msgid ""
+"To create a new element of type %s,\n"
+"you must give the following information."
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:427
-msgid "as the context for the query..."
+#: ../lib/advene/gui/edit/create.py:113
+msgid "Dynamic view"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:431
-msgid "Set of annotations"
+#: ../lib/advene/gui/edit/create.py:114
+msgid "HTML template"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:432
-msgid "Use annotations:"
+#: ../lib/advene/gui/edit/create.py:115
+msgid "Plain XML"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:435
-msgid "to edit them"
+#: ../lib/advene/gui/edit/create.py:116
+msgid "SVG template"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:438
-msgid "as bookmarks"
+#: ../lib/advene/gui/edit/create.py:117
+msgid "Plain text template"
 msgstr ""
 
-#: ../lib/advene/gui/views/singletonpopup.py:32
-msgid "SingletonPopup"
+#: ../lib/advene/gui/edit/create.py:120
+msgid "Simple query"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:121 ../lib/advene/gui/main.py:1221
-msgid "Timeline"
+#: ../lib/advene/gui/edit/create.py:122
+msgid "Directory"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:123
-msgid "Display annotations on a timeline"
+#: ../lib/advene/gui/edit/create.py:124 ../lib/advene/util/helper.py:417
+msgid "Resource File"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:137
-msgid "Limit display to current area"
+#: ../lib/advene/gui/edit/create.py:130
+msgid "No available type."
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:138
-#: ../lib/advene/gui/views/timeline.py:3265
-msgid "Display whole movie"
+#: ../lib/advene/gui/edit/create.py:174
+#, python-format
+msgid ""
+"The identifier %s is not valid.\n"
+"It must be composed of non-accentuated alphabetic characters\n"
+"Underscore is allowed."
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:168
+#: ../lib/advene/gui/edit/create.py:179
 #, python-format
-msgid "Cannot find annotation type %s"
+msgid "The identifier %s is already defined."
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:218
-msgid "No scrolling"
+#: ../lib/advene/gui/edit/create.py:312
+msgid "New resource data"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:219
-msgid "Continuous scrolling"
+#: ../lib/advene/gui/edit/imports.py:132 ../lib/advene/gui/edit/imports.py:133
+#: ../lib/advene/core/controller.py:611
+msgid "Views"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:220
-msgid "Discrete scrolling"
+#: ../lib/advene/gui/edit/imports.py:146 ../lib/advene/gui/edit/imports.py:147
+msgid "Schemas"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:221
-msgid "Annotation scrolling"
+#: ../lib/advene/gui/edit/imports.py:198 ../lib/advene/gui/edit/imports.py:199
+#: ../lib/advene/gui/edit/elements.py:523
+msgid "Relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:483
-#, python-format
-msgid "%d annotations"
+#: ../lib/advene/gui/edit/imports.py:212 ../lib/advene/gui/edit/imports.py:213
+msgid "Queries"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:486
-msgid "Display all types"
+#: ../lib/advene/gui/edit/imports.py:323
+msgid "Imported?"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:488
-#, python-format
-msgid ""
-"There are %d annotations.\n"
-"The current timeline may take a long time to display them, so only the first "
-"two annotation types are displayed. Use the annotation type selector (second "
-"button in the timeline) to select other annotations types to display, or "
-"click on the 'Display all types' button below."
+#: ../lib/advene/gui/edit/imports.py:340 ../lib/advene/gui/edit/elements.py:515
+#: ../lib/advene/gui/edit/elements.py:564
+#: ../lib/advene/gui/edit/elements.py:651
+#: ../lib/advene/gui/edit/elements.py:731
+#: ../lib/advene/gui/edit/elements.py:788
+#: ../lib/advene/gui/edit/elements.py:880
+#: ../lib/advene/gui/edit/elements.py:949
+#: ../lib/advene/gui/edit/elements.py:1061
+#: ../lib/advene/gui/edit/elements.py:1123
+msgid "URI"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:963
-msgid "Split at current player position"
+#: ../lib/advene/gui/edit/imports.py:362
+msgid "Choose the package to import, and its alias"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:967
-msgid "Center and zoom"
+#: ../lib/advene/gui/edit/imports.py:408 ../lib/advene/gui/edit/merge.py:230
+#, python-format
+msgid "Package %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1058
-#: ../lib/advene/gui/views/tree.py:808 ../lib/advene/gui/main.py:4563
-msgid ""
-"Select the schema where you want to\n"
-"create the new relation type."
+#: ../lib/advene/gui/edit/imports.py:408 ../lib/advene/gui/edit/merge.py:230
+msgid "No title"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1071
-#: ../lib/advene/gui/views/tree.py:821
-msgid "Create a relation"
+#: ../lib/advene/gui/edit/shapewidget.py:91
+msgid "Generic shape"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1081
-#: ../lib/advene/gui/views/tree.py:831
-msgid "Create a new relation-type."
+#: ../lib/advene/gui/edit/shapewidget.py:256
+#: ../lib/advene/gui/edit/shapewidget.py:755
+#, python-format
+msgid "Link to %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1107
-msgid "Merge with this annotation"
+#: ../lib/advene/gui/edit/shapewidget.py:348
+#: ../lib/advene/gui/edit/shapewidget.py:1304
+msgid "Link"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1116
-msgid "Align both begin times"
+#: ../lib/advene/gui/edit/shapewidget.py:353
+msgid "Link label"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1117
-msgid "Align both end times"
+#: ../lib/advene/gui/edit/shapewidget.py:371
+msgid "Linewidth"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1118
-msgid "Align end time to selected begin time"
+#: ../lib/advene/gui/edit/shapewidget.py:376
+msgid "Filled"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1119
-msgid "Align begin time to selected end time"
+#: ../lib/advene/gui/edit/shapewidget.py:384
+msgid "Opacity"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1120
-msgid "Align all times"
+#: ../lib/advene/gui/edit/shapewidget.py:426
+#, python-format
+msgid "Properties of %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1158
-#: ../lib/advene/gui/views/tree.py:700
-msgid "Cannot delete the annotation : it has relations."
+#: ../lib/advene/gui/edit/shapewidget.py:473
+msgid "Rectangle"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1233
-msgid "Select the appropriate relation type"
+#: ../lib/advene/gui/edit/shapewidget.py:553
+#: ../lib/advene/gui/edit/shapewidget.py:666
+msgid "Text"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1252
-#: ../lib/advene/gui/views/tree.py:757
-#, python-format
-msgid "Duplicate selection to type %s"
+#: ../lib/advene/gui/edit/shapewidget.py:677
+msgid "Textsize"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1255
-#: ../lib/advene/gui/views/tree.py:760
-#, python-format
-msgid "Move selection to type %s"
+#: ../lib/advene/gui/edit/shapewidget.py:691
+msgid "Image"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1264
-#: ../lib/advene/gui/views/tree.py:769
-#, python-format
-msgid "Duplicate annotation to type %s"
+#: ../lib/advene/gui/edit/shapewidget.py:775
+msgid "Href"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1268
-#: ../lib/advene/gui/views/tree.py:773
-#, python-format
-msgid "Move annotation to type %s"
+#: ../lib/advene/gui/edit/shapewidget.py:785
+msgid "Line"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1275
-#, python-format
-msgid "Duplicate to type %(type)s at %(position)s"
+#: ../lib/advene/gui/edit/shapewidget.py:881
+msgid "Draw an arrow"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1281
-#, python-format
-msgid "Move to type %(type)s at %(position)s"
+#: ../lib/advene/gui/edit/shapewidget.py:892
+msgid "Arrow size"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1291
-#: ../lib/advene/gui/views/tree.py:784
-msgid "Duplicate and create a relation"
+#: ../lib/advene/gui/edit/shapewidget.py:1107
+msgid "Close path"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1302
-#, python-format
-msgid "Duplicate at %s and create a relation"
+#: ../lib/advene/gui/edit/shapewidget.py:1186
+msgid "Circle"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1333
-msgid "Annotation filter"
+#: ../lib/advene/gui/edit/shapewidget.py:1241
+msgid "Ellipse"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1334
-msgid "Enter the searched string"
+#: ../lib/advene/gui/edit/shapewidget.py:1603
+msgid "SVG"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1442
-#, python-format
-msgid "Duplicate all annotations to type %s"
+#: ../lib/advene/gui/edit/shapewidget.py:2162
+msgid "Load SVG"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1444
-#, python-format
-msgid "Move all annotations to type %s"
+#: ../lib/advene/gui/edit/shapewidget.py:2168
+msgid "Save SVG"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1446
-#, python-format
-msgid "Duplicate all annotations matching a string to type %s"
+#: ../lib/advene/gui/edit/importer.py:49
+msgid "Importer"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1448
-#, python-format
-msgid "Move all annotations matching a string to type %s"
+#: ../lib/advene/gui/edit/importer.py:108
+#: ../lib/advene/gui/edit/importer.py:118
+msgid "Advene package importer"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1450
-#, python-format
-msgid "Align all annotation time codes using %s as reference."
+#: ../lib/advene/gui/edit/importer.py:122
+msgid "Not likely"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1452
+#: ../lib/advene/gui/edit/importer.py:144
 #, python-format
-msgid "Align all annotation contents using %s as reference"
+msgid ""
+"Completed conversion: %(message)s\n"
+"%(statistics)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1642
-#: ../lib/advene/gui/views/table.py:240
-msgid "Cannot update the annotation, its representation is too complex"
+#: ../lib/advene/gui/edit/importer.py:151
+msgid "Stop"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1936
-#: ../lib/advene/gui/views/timeline.py:1965
+#: ../lib/advene/gui/edit/importer.py:190
 #, python-format
-msgid "Displaying %(count)d / %(total)d annotations..."
+msgid ""
+"The filter is not ready.\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1947
-msgid "Displaying done."
+#: ../lib/advene/gui/edit/importer.py:279
+msgid "Choose the file to import"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2439
-msgid "Create a new annotation"
+#: ../lib/advene/gui/edit/importer.py:299
+msgid "Filter"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2440
-msgid "Zoom on region"
+#: ../lib/advene/gui/edit/importer.py:308
+msgid "Options"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2441
-msgid "Restrict display to region"
+#: ../lib/advene/gui/edit/importer.py:318
+msgid "Start"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2560
-msgid "New annotation at player time"
+#: ../lib/advene/gui/edit/dvdselect.py:71
+msgid ""
+"Select the correct\n"
+"title and chapter\n"
+"of the DVD"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2564
-msgid "New annotation at mouse position"
+#: ../lib/advene/gui/edit/dvdselect.py:84
+msgid "Chapter"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2568
-msgid "Selection"
+#: ../lib/advene/gui/edit/merge.py:33
+msgid "Create element"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2694
-msgid "Cannot zoom more"
+#: ../lib/advene/gui/edit/merge.py:34
+msgid "Create annotation (duplicate id)"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2915
-#, python-format
-msgid "From schema %s"
+#: ../lib/advene/gui/edit/merge.py:35
+msgid "Create relation (duplicate id)"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2977
-msgid "Restrict playing to this annotation-type"
+#: ../lib/advene/gui/edit/merge.py:36
+msgid "Update the color"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2984
-msgid "Goto previous annotation"
+#: ../lib/advene/gui/edit/merge.py:37
+msgid "Update the representation"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2995
-msgid "Goto next annotation"
+#: ../lib/advene/gui/edit/merge.py:38
+msgid "Update the description"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3006
-msgid "+"
+#: ../lib/advene/gui/edit/merge.py:39
+msgid "Update the title"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3064
-msgid "Open an annotation display view"
+#: ../lib/advene/gui/edit/merge.py:40
+msgid "Update the mimetype"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3071
-msgid "Open a slave montage view (coordinated zoom level)"
+#: ../lib/advene/gui/edit/merge.py:41
+msgid "Update the begin time"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3106
-msgid ""
-"<b>Statistics about current selection</b>\n"
-"\n"
+#: ../lib/advene/gui/edit/merge.py:42
+msgid "Update the end time"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3113
-msgid "No selected annotation"
+#: ../lib/advene/gui/edit/merge.py:43
+msgid "Update the content"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3117
-#, python-format
-msgid "%d selected annotation(s)"
+#: ../lib/advene/gui/edit/merge.py:44
+msgid "Update the matchFilter"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3124
-msgid "Unselect all annotations"
+#: ../lib/advene/gui/edit/merge.py:45
+msgid "Update the member types"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3125
-msgid "Create a static view"
+#: ../lib/advene/gui/edit/merge.py:46
+msgid "Update tags"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3126
-msgid "Highlight selection in other views"
+#: ../lib/advene/gui/edit/merge.py:90
+msgid "Difference between original and merged elements"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3127
-#: ../lib/advene/gui/views/timeline.py:3713
-msgid "Tag selection"
+#: ../lib/advene/gui/edit/merge.py:136
+msgid "Current element"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3128
-msgid "Delete selected annotations"
+#: ../lib/advene/gui/edit/merge.py:141
+msgid "Updated element"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3129
-msgid "Display selection in a table"
+#: ../lib/advene/gui/edit/merge.py:147
+msgid "Show diff"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3130
-msgid "Center and zoom on selection"
+#: ../lib/advene/gui/edit/merge.py:180
+msgid "Merge?"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3131
-msgid "Edit selected annotations"
+#: ../lib/advene/gui/edit/merge.py:197
+msgid "Element"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3132
-msgid "Merge annotations"
+#: ../lib/advene/gui/edit/merge.py:215
+#, python-format
+msgid "Merge elements from %(source)s into %(dest)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3133
-msgid "Display statistics"
+#: ../lib/advene/gui/edit/merge.py:266
+msgid "All"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3258
-msgid "Goto previous page"
+#: ../lib/advene/gui/edit/merge.py:271 ../lib/advene/core/controller.py:1097
+msgid "None"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3270
-msgid "Goto next page"
+#: ../lib/advene/gui/edit/montage.py:51
+msgid "Montage"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3324
-msgid "Inspector locked. Click here or in the timeline background to unlock."
+#: ../lib/advene/gui/edit/montage.py:53
+msgid "Dynamic montage of annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3352
-msgid ""
-"Delete the selected annotations or drop an annotation here to delete it."
+#: ../lib/advene/gui/edit/montage.py:61
+msgid "Render"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3374
-msgid ""
-"Drag an annotation type here to remove it from display.\n"
-"Click to edit all displayed types"
+#: ../lib/advene/gui/edit/montage.py:176
+msgid "Remove from montage"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3386
-msgid "Selection actions"
+#: ../lib/advene/gui/edit/montage.py:310
+#, python-format
+msgid ""
+"Exporting montage %(title)s\n"
+"to %%(filename)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3401
-msgid "Display relations"
+#: ../lib/advene/gui/edit/montage.py:405
+msgid "Drop an annotation here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3407
-msgid "Display all relations"
+#: ../lib/advene/gui/edit/montage.py:417
+msgid "Play the montage"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3484
-msgid "Center on current player position."
+#: ../lib/advene/gui/edit/montage.py:422
+msgid "Save the view in the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3500
-msgid "Automatically activate loop when clicking on an annotation"
+#: ../lib/advene/gui/edit/montage.py:470
+msgid "Set zoom level"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3524
-msgid "Displayed"
+#: ../lib/advene/gui/edit/montage.py:475
+msgid "Set 100% zoom"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3532
-msgid "Not displayed"
+#: ../lib/advene/gui/edit/montage.py:554
+msgid "Total duration:"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3580
-msgid "< All <"
+#: ../lib/advene/gui/edit/timeadjustment.py:97
+#, python-format
+msgid "Decrement value by %.2f s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3584
-msgid "> All >"
+#: ../lib/advene/gui/edit/timeadjustment.py:99
+#, python-format
+msgid "Increment value by %.2f s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3600
-msgid "Displayed annotation types"
+#: ../lib/advene/gui/edit/timeadjustment.py:128
+msgid ""
+"Click to play\n"
+"Control+click to set to current time\n"
+"Scroll to modify value (with control/shift)\n"
+"Right-click to invalidate screenshot"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3625
-msgid "Relation type"
+#: ../lib/advene/gui/edit/timeadjustment.py:143
+msgid ""
+"Enter a timecode.\n"
+"An integer value will be considered as milliseconds.\n"
+"A float value (12.2) will be considered as seconds.\n"
+"HH:MM:SS.sss values are possible."
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3625
-msgid "Display relation types"
+#: ../lib/advene/gui/edit/timeadjustment.py:157
+msgid "Set to current player position"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3626
-msgid "Relation content"
+#: ../lib/advene/gui/edit/elements.py:80
+#, python-format
+msgid "No edit popup available for element %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3626
-msgid "Display relation content"
+#: ../lib/advene/gui/edit/elements.py:100
+msgid "Edit Window"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3627 ../lib/advene/gui/popup.py:516
-msgid "Highlight"
+#: ../lib/advene/gui/edit/elements.py:139
+msgid "Apply changes and close the edit window"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3627
-msgid "Highlight active annotations"
+#: ../lib/advene/gui/edit/elements.py:144
+msgid "Apply changes"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3714
-msgid "Enter the tag for the selection"
+#: ../lib/advene/gui/edit/elements.py:278
+msgid "Content has been modified. Close anyway and lose data?"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:248
-msgid "No children in on_iter_children()!"
+#: ../lib/advene/gui/edit/elements.py:338
+#, python-format
+msgid "View %s (read-only)"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:263
-msgid "No children in on_iter_nth_child()"
+#: ../lib/advene/gui/edit/elements.py:374
+#, python-format
+msgid "Display %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:317
-msgid "List of views"
+#: ../lib/advene/gui/edit/elements.py:459
+msgid "Apply changes and edit previous annotation of same type"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:318
-msgid "Static views"
+#: ../lib/advene/gui/edit/elements.py:463
+msgid "Apply changes and edit next annotation of same type"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:319
-msgid "Dynamic views"
+#: ../lib/advene/gui/edit/elements.py:469
+msgid "Unhighlight annotation"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:320
-msgid "Admin views"
+#: ../lib/advene/gui/edit/elements.py:473
+msgid "Highlight annotation"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:321
-msgid "Adhoc views"
+#: ../lib/advene/gui/edit/elements.py:504
+msgid "Fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:421 ../lib/advene/gui/main.py:1222
-msgid "Tree view"
+#: ../lib/advene/gui/edit/elements.py:527 ../lib/advene/core/controller.py:611
+msgid "Tags"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:453
-msgid "Package View"
+#: ../lib/advene/gui/edit/elements.py:623
+msgid "Apply changes and visualise in web browser"
 msgstr ""
 
-#: ../lib/advene/gui/views/editaccumulator.py:42
-msgid "EditAccumulator"
+#: ../lib/advene/gui/edit/elements.py:628
+msgid "Apply changes and activate the view"
 msgstr ""
 
-#: ../lib/advene/gui/views/editaccumulator.py:70
-#: ../lib/advene/gui/views/annotationdisplay.py:256
-msgid "Validate"
+#: ../lib/advene/gui/edit/elements.py:636
+#: ../lib/advene/gui/edit/elements.py:717
+#: ../lib/advene/gui/edit/elements.py:774
+#: ../lib/advene/gui/edit/elements.py:865
+#: ../lib/advene/gui/edit/elements.py:934
+#: ../lib/advene/gui/edit/elements.py:1036
+msgid "Title (name)"
 msgstr ""
 
-#: ../lib/advene/gui/views/relation.py:68
-msgid "Relations view"
+#: ../lib/advene/gui/edit/elements.py:640
+msgid "Name of the view"
 msgstr ""
 
-#: ../lib/advene/gui/views/caption.py:30 ../lib/advene/gui/main.py:4339
-msgid "Caption"
+#: ../lib/advene/gui/edit/elements.py:664
+msgid "Class"
 msgstr ""
 
-#: ../lib/advene/gui/views/caption.py:32
-msgid "Display a text caption below the video output"
+#: ../lib/advene/gui/edit/elements.py:667
+msgid "Match Filter"
 msgstr ""
 
-#: ../lib/advene/gui/views/scroller.py:29 ../lib/advene/gui/main.py:4338
-msgid "Scroller"
+#: ../lib/advene/gui/edit/elements.py:710
+msgid "Validate and run query on package"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:329
-#, python-format
-msgid ""
-"View <b>%(title)s</b>\n"
-"Id: %(id)s"
+#: ../lib/advene/gui/edit/elements.py:721
+msgid "Name of the query"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:336
-msgid "Open in webbrowser"
+#: ../lib/advene/gui/edit/elements.py:778
+msgid "Name of the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:337
-#, python-format
-msgid "View applied to %s\n"
+#: ../lib/advene/gui/edit/elements.py:796
+#: ../lib/advene/gui/edit/elements.py:887
+#: ../lib/advene/gui/edit/elements.py:966
+#: ../lib/advene/gui/edit/elements.py:1080
+msgid "Description"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:342 ../lib/advene/gui/popup.py:496
-msgid "Activate"
+#: ../lib/advene/gui/edit/elements.py:800
+#: ../lib/advene/gui/edit/elements.py:891
+#: ../lib/advene/gui/edit/elements.py:970
+#: ../lib/advene/gui/edit/elements.py:1084
+msgid "Textual description of the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:345
-msgid "Open in GUI"
+#: ../lib/advene/gui/edit/elements.py:805
+msgid "Default dynamic view"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:347
-msgid "Unknown type of view??"
+#: ../lib/advene/gui/edit/elements.py:809
+msgid "Dynamic view to activate on package load"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:372
-msgid "Edit view"
+#: ../lib/advene/gui/edit/elements.py:814
+msgid "Default static view"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:381
-msgid "Open view"
+#: ../lib/advene/gui/edit/elements.py:818
+msgid "Static view to open on package load"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:421 ../lib/advene/gui/views/finder.py:487
-#, python-format
-msgid ""
-"%(type)s <b>%(title)s</b>\n"
-"Id: %(id)s"
+#: ../lib/advene/gui/edit/elements.py:823
+msgid "Default adhoc view"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:444
-msgid "Try to apply the query on..."
+#: ../lib/advene/gui/edit/elements.py:827
+msgid "Adhoc view to open on package load"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:464 ../lib/advene/gui/popup.py:829
-msgid "the package"
+#: ../lib/advene/gui/edit/elements.py:832
+msgid "Cached duration"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:465 ../lib/advene/gui/popup.py:830
-msgid "all annotations of the package"
+#: ../lib/advene/gui/edit/elements.py:836
+msgid "Cached duration in ms"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:466 ../lib/advene/gui/popup.py:831
-msgid "the first annotation of the package"
+#: ../lib/advene/gui/edit/elements.py:841
+msgid "Mediafile"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:509
-msgid "Edit resource"
+#: ../lib/advene/gui/edit/elements.py:845
+msgid "Location of associated media file"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:523 ../lib/advene/gui/main.py:1223
-msgid "Package finder"
+#: ../lib/advene/gui/edit/elements.py:869
+msgid "Name of the schema"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:525
-msgid "Column-based package finder"
+#: ../lib/advene/gui/edit/elements.py:901
+#: ../lib/advene/gui/edit/elements.py:981
+msgid "TALES expression returning a color for the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:41
-msgid "AnnotationDisplay"
+#: ../lib/advene/gui/edit/elements.py:908
+#: ../lib/advene/gui/edit/elements.py:999
+msgid "Item color"
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:43
-msgid "Display the contents of an annotation"
+#: ../lib/advene/gui/edit/elements.py:912
+#: ../lib/advene/gui/edit/elements.py:1003
+msgid ""
+"TALES expression returning a color for the items contained by the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:84
-msgid "No annotation"
+#: ../lib/advene/gui/edit/elements.py:938
+#: ../lib/advene/gui/edit/elements.py:1040
+msgid "Name of the type"
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:110
-#, python-format
-msgid ""
-"Schema %(schema)s (id %(id)s)\n"
-"%(description)s\n"
-"%(stats)s"
+#: ../lib/advene/gui/edit/elements.py:956
+#: ../lib/advene/gui/edit/elements.py:1045
+#: ../lib/advene/gui/edit/elements.py:1314
+msgid "MIME Type"
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:231
-msgid "Screenshot"
+#: ../lib/advene/gui/edit/elements.py:960
+#: ../lib/advene/gui/edit/elements.py:1049
+msgid "MIMEType of the content"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:193
-msgid "Invalid view id"
+#: ../lib/advene/gui/edit/elements.py:992
+msgid ""
+"TALES expression used to get a compact representation of the annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:239
+#: ../lib/advene/gui/edit/elements.py:993
 #, python-format
-msgid "Cannot save default options: %s"
+msgid "Display %s key"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:250
-#, python-format
-msgid "Default options saved for view %s"
+#: ../lib/advene/gui/edit/elements.py:1009
+msgid "Completions"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:282
-#, python-format
-msgid "Saving %s"
+#: ../lib/advene/gui/edit/elements.py:1013
+msgid "Space-separated list of words used for content completion"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:285
-msgid "Enter a view name to save this parametered view"
+#: ../lib/advene/gui/edit/elements.py:1019
+msgid "Advanced"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:288 ../lib/advene/gui/main.py:4630
-#, python-format
-msgid "Error: the identifier %s contains invalid characters."
+#: ../lib/advene/gui/edit/elements.py:1069
+msgid "Any annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:303
-#, python-format
-msgid "Error: the view %s is not an adhoc view."
+#: ../lib/advene/gui/edit/elements.py:1095
+msgid "TALES expression specifying a color"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:328
-msgid "HTML export"
+#: ../lib/advene/gui/edit/elements.py:1122
+msgid "MIMEType"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:329
-msgid "Specify a name for the export view"
+#: ../lib/advene/gui/edit/elements.py:1347
+#, python-format
+msgid "Error: cannot find a content handler for %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:348
+#: ../lib/advene/gui/edit/elements.py:1466
+#: ../lib/advene/gui/edit/elements.py:1679
 #, python-format
 msgid ""
-"View successfully exported as %s.\n"
-"Open it in the web browser ?"
+"Cannot read the data:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:427
-msgid "Actions"
+#: ../lib/advene/gui/edit/elements.py:1479
+#: ../lib/advene/gui/edit/elements.py:1704
+msgid "Save content to..."
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:452
-msgid "Click or drag-and-drop to reattach view"
+#: ../lib/advene/gui/edit/elements.py:1493
+#: ../lib/advene/gui/edit/elements.py:1717
+#, python-format
+msgid ""
+"Cannot save the data:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:55
-msgid "Annotation table view"
+#: ../lib/advene/gui/edit/elements.py:1508
+#: ../lib/advene/gui/edit/elements.py:1731
+msgid "Open a file (C-o)"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:57
-msgid "Display annotations in a table"
+#: ../lib/advene/gui/edit/elements.py:1513
+#: ../lib/advene/gui/edit/elements.py:1736
+msgid "Save to a file (C-s)"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:227 ../lib/advene/gui/views/table.py:452
-msgid "Snapshot"
+#: ../lib/advene/gui/edit/elements.py:1518
+#: ../lib/advene/gui/edit/elements.py:1741
+msgid "Reload the file (C-r)"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:254 ../lib/advene/gui/main.py:4178
-msgid "Duration"
+#: ../lib/advene/gui/edit/elements.py:1524
+msgid "Insert a value from the browser (C-i)"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:382 ../lib/advene/gui/views/table.py:511
-msgid "Export data to file..."
+#: ../lib/advene/gui/edit/elements.py:1770
+msgid "Begin time is greater than end time"
+msgstr ""
+
+#: ../lib/advene/gui/edit/elements.py:2042
+msgid "Expecting an integer."
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:391 ../lib/advene/gui/views/table.py:520
+#: ../lib/advene/gui/edit/elements.py:2074
 #, python-format
-msgid "Error while exporting data to %(filename)s: %(error)s"
+msgid ""
+"The %(attribute)s attribute could not be updated:\n"
+"\n"
+"%(error)s\n"
+"\n"
+"Resetting to the original value."
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "id"
+#: ../lib/advene/gui/edit/elements.py:2100
+#, python-format
+msgid ""
+"The following attributes cannot be updated:\n"
+"\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "type"
+#: ../lib/advene/gui/edit/elements.py:2138
+#, python-format
+msgid ""
+"The following attributes could not be updated:\n"
+"\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "begin"
+#: ../lib/advene/gui/edit/elements.py:2155
+msgid "Attribute"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "end"
+#: ../lib/advene/gui/edit/elements.py:2254
+msgid "Insert an element"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "content"
+#: ../lib/advene/gui/edit/elements.py:2255
+msgid "Choose the element to insert."
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:460
-msgid "Generic table view"
+#: ../lib/advene/gui/edit/elements.py:2325
+#: ../lib/advene/gui/edit/elements.py:2368
+#, python-format
+msgid "Some tags contain invalid characters: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:462
-msgid "Display Advene elements in a table."
+#: ../lib/advene/gui/edit/elements.py:2348
+msgid "Tags:"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element title"
+#: ../lib/advene/gui/edit/transcribe.py:70
+msgid "Transcription importer"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element type"
+#: ../lib/advene/gui/edit/transcribe.py:81
+msgid "Note taking"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element id"
+#: ../lib/advene/gui/edit/transcribe.py:83
+msgid "Take notes on the fly as a timestamped transcription"
 msgstr ""
 
-#: ../lib/advene/gui/widget.py:327
-#, python-format
-msgid "Set of %s annotations"
+#: ../lib/advene/gui/edit/transcribe.py:149
+msgid "Timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/widget.py:1067
-msgid "Save as..."
+#: ../lib/advene/gui/edit/transcribe.py:149
+msgid "Click inserts timestamp marks"
 msgstr ""
 
-#: ../lib/advene/gui/widget.py:1072
-msgid "Use current player position"
+#: ../lib/advene/gui/edit/transcribe.py:150
+msgid "Insert on single-click"
 msgstr ""
 
-#: ../lib/advene/gui/widget.py:1078
-msgid "Adjust timestamp"
+#: ../lib/advene/gui/edit/transcribe.py:150
+msgid "A single click will insert the mark (else a double click is needed)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:193 ../lib/advene/gui/main.py:304
-msgid "_Select player"
+#: ../lib/advene/gui/edit/transcribe.py:151
+msgid "Play on scroll"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:195 ../lib/advene/gui/main.py:287
-msgid "_View"
+#: ../lib/advene/gui/edit/transcribe.py:151
+msgid "Play the new position upon timestamp modification"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:197 ../lib/advene/gui/main.py:306
-msgid "Packages"
+#: ../lib/advene/gui/edit/transcribe.py:152
+msgid "Generate empty annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:200 ../lib/advene/gui/main.py:246
-msgid "Open recent"
+#: ../lib/advene/gui/edit/transcribe.py:152
+msgid "If checked, generate annotations for empty text"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:239
-msgid "Input from the keyboard (function keys)"
+#: ../lib/advene/gui/edit/transcribe.py:153
+msgid "Reaction time"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:243
-msgid "_File"
+#: ../lib/advene/gui/edit/transcribe.py:153
+msgid ""
+"Reaction time (substracted from current player time, except when paused.)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:244
-msgid "_New package"
+#: ../lib/advene/gui/edit/transcribe.py:154
+msgid "Auto-insert"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:244
-msgid "Create a new package"
+#: ../lib/advene/gui/edit/transcribe.py:154
+msgid "Automatic timestamp mark insertion"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:245
-msgid "_Open package"
+#: ../lib/advene/gui/edit/transcribe.py:155
+msgid "Automatic insertion delay"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:245
-msgid "Open a package"
+#: ../lib/advene/gui/edit/transcribe.py:155
+msgid ""
+"If autoinsert is active, timestamp marks will be automatically inserted when "
+"text is entered after no interaction since this delay (in ms).\n"
+"1000 is typically a good value."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:246
-msgid "Show recently opened packages"
+#: ../lib/advene/gui/edit/transcribe.py:156
+msgid "Font size for text (0 for standard size)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:247
-msgid "_Save package"
+#: ../lib/advene/gui/edit/transcribe.py:216
+#: ../lib/advene/gui/edit/transcribe.py:220
+#: ../lib/advene/gui/edit/transcribe.py:378
+#: ../lib/advene/gui/edit/transcribe.py:382
+msgid "Invalid timestamp mark"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:247
-msgid "Save the package"
+#: ../lib/advene/gui/edit/transcribe.py:503
+msgid "Ignore the following text (toggle)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:248
-msgid "Save package as..."
+#: ../lib/advene/gui/edit/transcribe.py:507
+msgid "Remove mark"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:248
-msgid "Save the package as..."
+#: ../lib/advene/gui/edit/transcribe.py:511
+msgid "Reaction-time offset"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:249
-msgid "Close package"
+#: ../lib/advene/gui/edit/transcribe.py:515
+msgid "-1 sec"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:249
-msgid "Close the package"
+#: ../lib/advene/gui/edit/transcribe.py:518
+msgid "-0.5 sec"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:251
-msgid "Save session"
+#: ../lib/advene/gui/edit/transcribe.py:521
+msgid "-0.1 sec"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:251
-msgid "Save the current session (list of opened packages)"
+#: ../lib/advene/gui/edit/transcribe.py:525
+msgid "+1 sec"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:252
-msgid "Save workspace"
+#: ../lib/advene/gui/edit/transcribe.py:528
+msgid "+0.5 sec"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:253
-msgid "...as package view"
+#: ../lib/advene/gui/edit/transcribe.py:531
+msgid "+0.1 sec"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:254
-msgid "...as standard workspace"
+#: ../lib/advene/gui/edit/transcribe.py:618
+msgid "Invalid timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:254
-msgid "Use the current layout as standard workspace in the future"
+#: ../lib/advene/gui/edit/transcribe.py:738
+#, python-format
+msgid "Invalid timestamp mark in conversion: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:256
-msgid "Associate a video _File"
+#: ../lib/advene/gui/edit/transcribe.py:856
+#, python-format
+msgid "Cannot save the file: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:256
-msgid "Associate a video file"
+#: ../lib/advene/gui/edit/transcribe.py:865
+#: ../lib/advene/gui/edit/transcribe.py:947
+msgid "This will overwrite the current textual content. Are you sure?"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:257
-msgid "Associate a _DVD"
+#: ../lib/advene/gui/edit/transcribe.py:868
+msgid "Select transcription file to load"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:257
-msgid "Associate a chapter from a DVD"
+#: ../lib/advene/gui/edit/transcribe.py:885
+#, python-format
+msgid "Cannot open %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:258
-msgid "Associate a _Video stream"
+#: ../lib/advene/gui/edit/transcribe.py:932
+msgid "Cannot import annotations: no existing interface"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:258
-msgid "Enter a video stream address"
+#: ../lib/advene/gui/edit/transcribe.py:934
+msgid "Select the annotation type to import"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:260
-msgid "_Import File"
+#: ../lib/advene/gui/edit/transcribe.py:943
+#, python-format
+msgid "There are no annotations of type %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:260
-msgid "Import data from an external source"
+#: ../lib/advene/gui/edit/transcribe.py:972
+msgid "Cannot convert the data: no associated package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:261
-msgid "_Process video"
+#: ../lib/advene/gui/edit/transcribe.py:975
+msgid "Converting transcription"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:261
-msgid "Import data from video processing algorithms"
+#: ../lib/advene/gui/edit/transcribe.py:981
+msgid "Choose the annotation-type where to create annotations.\n"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:263
-msgid "Merge package"
+#: ../lib/advene/gui/edit/transcribe.py:989
+msgid "Delete existing annotations in this type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:263
-msgid "Merge elements from another package"
+#: ../lib/advene/gui/edit/transcribe.py:1012
+msgid "Select type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:264
-msgid "Import _DVD chapters"
+#: ../lib/advene/gui/edit/transcribe.py:1016
+msgid "You want to create a new type. Please specify its schema and title."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:264
-msgid "Create annotations based on DVD chapters"
+#: ../lib/advene/gui/edit/transcribe.py:1028
+msgid "Containing schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:266
-msgid "_Export..."
+#: ../lib/advene/gui/edit/transcribe.py:1041
+msgid "Export options"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:266
-msgid "Export data to another format"
+#: ../lib/advene/gui/edit/transcribe.py:1046
+msgid "Generate annotations for empty contents"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:267
-msgid "_Website export..."
+#: ../lib/advene/gui/edit/transcribe.py:1071
+#, python-format
+msgid "The %s identifier already exists. Choose another one."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:267
-msgid "Export views to a website"
+#: ../lib/advene/gui/edit/transcribe.py:1110
+msgid "Notes converted"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:269
-msgid "_Quit"
+#: ../lib/advene/gui/edit/transcribe.py:1157
+msgid "Open"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:271
-msgid "_Edit"
+#: ../lib/advene/gui/edit/transcribe.py:1158
+msgid "Save"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:272
-msgid "_Undo"
+#: ../lib/advene/gui/edit/transcribe.py:1159
+msgid "Save As"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:273
-msgid "_Find"
+#: ../lib/advene/gui/edit/transcribe.py:1160
+msgid "Import"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:274
-msgid "_Delete"
+#: ../lib/advene/gui/edit/transcribe.py:1160
+msgid "Import from annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:275
-msgid "Create"
+#: ../lib/advene/gui/edit/transcribe.py:1161
+msgid "Convert"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:284
-msgid "P_ackage properties"
+#: ../lib/advene/gui/edit/transcribe.py:1161
+msgid "Convert to annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:284
-msgid "Edit package properties"
+#: ../lib/advene/gui/edit/transcribe.py:1163 ../lib/advene/rules/actions.py:670
+msgid "Center"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:285
-msgid "P_references"
+#: ../lib/advene/gui/edit/transcribe.py:1163
+msgid "Center on the current mark"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:285
-msgid "Interface preferences"
+#: ../lib/advene/gui/edit/transcribe.py:1164
+msgid "Find"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:289
-msgid "_Start Web Browser"
+#: ../lib/advene/gui/edit/transcribe.py:1164
+msgid "Search a string"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:289
-msgid "Start the web browser"
+#: ../lib/advene/gui/edit/transcribe.py:1165
+msgid "Scale"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:291
-msgid "Simplify interface"
+#: ../lib/advene/gui/edit/transcribe.py:1188
+msgid "Automatically scroll to the mark position when playing"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:291
-msgid "Simplify the application interface (toggle)"
+#: ../lib/advene/gui/edit/transcribe.py:1190
+msgid "Autoscroll"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:292
-msgid "Evaluator"
+#: ../lib/advene/gui/edit/transcribe.py:1197
+msgid "Autoinsert"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:292
-msgid "Open python evaluator window"
+#: ../lib/advene/gui/edit/transcribe.py:1199
+msgid "Automatically insert marks"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:293 ../lib/advene/gui/main.py:4022
-msgid "Webserver log"
+#: ../lib/advene/core/webcherry.py:53
+msgid "The webserver requires version 3.0 of CherryPy at least."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:296
-msgid "_Player"
+#: ../lib/advene/core/webcherry.py:169
+#, python-format
+msgid ""
+"\n"
+"            <p>\n"
+"            <a href=\"/admin\">Server administration</a> |\n"
+"            <a href=\"/media\">Media control</a> |\n"
+"            <a href=\"%(path)s?mode=raw\">Raw view</a>\n"
+"            </p>\n"
+"            Location: %(locationbar)s\n"
+"            <hr>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:297
-msgid "Go to _Time"
+#: ../lib/advene/core/webcherry.py:229
+msgid "Unspecified Error"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:297
-msgid "Goto a specified time code"
+#: ../lib/advene/core/webcherry.py:230
+#, python-format
+msgid ""
+"\n"
+"        <h1>Error</h1>\n"
+"        <p>An error occurred:</p>\n"
+"        %s\n"
+"        "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:298
-msgid "Save _ImageCache"
+#: ../lib/advene/core/webcherry.py:263
+msgid "<h1>No available mediaplayer</h1>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:298
-msgid "Save the contents of the ImageCache to disk"
+#: ../lib/advene/core/webcherry.py:266
+#, python-format
+msgid ""
+"\n"
+"            <h1>Current STBV: %(currentstbv)s</h1>\n"
+"\n"
+"            <h1>Player status</h1>\n"
+"            <table border=\"1\">\n"
+"            <tr>\n"
+"            <td>Current media</td><td>%(uri)s</td>\n"
+"            <td>Current position</td><td>%(position)s</td>\n"
+"            <td>Duration</td><td>%(duration)s</td>\n"
+"            <td>Player status</td><td>%(status)s</td>\n"
+"            </tr>\n"
+"            </table>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:299
-msgid "Reset ImageCache"
+#: ../lib/advene/core/webcherry.py:279
+msgid "No media file"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:299
-msgid "Reset the ImageCache"
+#: ../lib/advene/core/webcherry.py:286
+msgid ""
+"\n"
+"            <form action=\"/media/play\" method=\"GET\">\n"
+"            Starting pos: <input type=\"text\" name=\"position\" value="
+"\"0\">\n"
+"            <input type=\"submit\" value=\"Play\">\n"
+"            </form>\n"
+"            <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
+"\">Pause</a><br>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:300
-msgid "_Restart player"
+#: ../lib/advene/core/webcherry.py:293
+msgid ""
+"<hr />\n"
+"            <form action=\"/media/load\" method=\"GET\">\n"
+"            Add a new file (<em>dvd</em> to play a DVD):\n"
+"            <input type=\"text\" name=\"filename\">\n"
+"            <input type=\"submit\" value=\"Add\">\n"
+"            </form>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:300
-msgid "Restart the player"
+#: ../lib/advene/core/webcherry.py:299
+msgid ""
+"<h3><a href=\"/media/snapshot\">Access to current packages snapshots</h3>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:302
-msgid "Update annotation screenshots"
+#: ../lib/advene/core/webcherry.py:308
+#, python-format
+msgid "Unknown STBV identifier: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:302
-msgid "Update screenshots for annotation bounds"
+#: ../lib/advene/core/webcherry.py:383
+msgid "Media information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:303
-msgid "Detect shots"
+#: ../lib/advene/core/webcherry.py:396
+msgid "File added"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:303
-msgid "Automatically detect shots"
+#: ../lib/advene/core/webcherry.py:397
+#, python-format
+msgid "<p><strong>%s has been loaded.</strong></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:304
-msgid "Select the player plugin"
+#: ../lib/advene/core/webcherry.py:408 ../lib/advene/core/webcherry.py:466
+msgid "Access to packages snapshots"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:307
-msgid "No package"
+#: ../lib/advene/core/webcherry.py:418 ../lib/advene/core/webcherry.py:476
+msgid "Unknown package alias"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:309
-msgid "_Help"
+#: ../lib/advene/core/webcherry.py:424
+#, python-format
+msgid "Available snapshots for %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:310
-msgid "Help"
+#: ../lib/advene/core/webcherry.py:430
+#, python-format
+msgid ""
+"<p><a href=\"/media/snapshot/%s?mode=inline\">Display with inline images</"
+"a></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:311
-msgid "Get support"
+#: ../lib/advene/core/webcherry.py:437
+msgid "Done"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:312
-msgid "Check for updates"
+#: ../lib/advene/core/webcherry.py:439
+msgid "Pending"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:313
-msgid "Display shortcuts"
+#: ../lib/advene/core/webcherry.py:481
+#, python-format
+msgid "Unknown annotation id: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:314
-msgid "Display logfile"
+#: ../lib/advene/core/webcherry.py:597 ../lib/advene/core/webcherry.py:715
+#, python-format
+msgid "Cannot activate stbvid %(stbvid)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:314
-msgid "Display log file"
+#: ../lib/advene/core/webcherry.py:662
+msgid "<p>No GUI is available."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:315
-msgid "Open logfile folder"
+#: ../lib/advene/core/webcherry.py:664
+#, python-format
+msgid "<p>Opened adhoc views: %s</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:665
+msgid "<p>Available adhoc views:</p><ul>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:686
+#, python-format
+msgid "<p>Current stbv: %s</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:687
+#, python-format
+msgid "<p>You can activate the following STBV:</p><ul>%s</ul>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:689
+msgid "Activate and play"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:695
+msgid "Application information"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:765
+msgid "Missing element id parameter"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:769
+#, python-format
+msgid "No existing element with id %s"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:778
+#, python-format
+msgid "<p>The GUI view %s does not exist.</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:785
+msgid "Invalid request"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:790
+msgid "Invalid configuration variable name"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:802
+msgid "Invalid value"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:806
+#, python-format
+msgid "Unsupported method %s"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:832
+#, python-format
+msgid ""
+"\n"
+"        <h1>Authorized hosts</h1>\n"
+"        <table border=\"1\">\n"
+"        <tr><th>Host</th><th>IP Addr</th><th>Action</th></tr>\n"
+"        %s\n"
+"        </table>\n"
+"        <form method=\"GET\">\n"
+"        Add a new hostname to the list :<br>\n"
+"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
+"\"Add\">\n"
+"        </form>\n"
+"        "
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:846
+msgid "Access control"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:851
+msgid "Access control - add a hostname"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:859 ../lib/advene/core/webcherry.py:873
+#, python-format
+msgid "<strong>Error: %s is an invalid hostname.</strong>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:862
+#, python-format
+msgid "<p>Added %s to authorized hosts list.</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:868
+msgid "Access control - delete a hostname"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:876
+msgid "<strong>Cannot remove the localhost access.</strong>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:881
+#, python-format
+msgid "<p>Removed %s from authorized hosts list.</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:883
+#, python-format
+msgid "<p>%s is not in authorized hosts list.</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:932
+msgid "Server Administration"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:940
+#, python-format
+msgid ""
+"\n"
+"        <p><a href=\"/admin/access\">Update the access list</a></p>\n"
+"        <p><a href=\"/admin/methods\">List available TALES methods</a></p>\n"
+"        <p><a href=\"/action\">List available actions</a></p>\n"
+"        <p><a href=\"/admin/reset\">Reset the server</a></p>\n"
+"        <p><a href=\"/media\">Media control</a></p>\n"
+"        <p><a href=\"/application\">Display GUI status</a></p>\n"
+"        <p><a href=\"/admin/list\">List available files</a></p>\n"
+"        <p><a href=\"/packages\">List loaded packages</a> (%(packagelist)s)</"
+"p>\n"
+"        <p>Display mode : %(displaymode)s</p>\n"
+"        <hr>\n"
+"        <p>Load a package :\n"
+"        <form action=\"/admin/load\" method=\"GET\">\n"
+"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
+"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
+"        <input type=\"submit\" value=\"Load\" />\n"
+"        </form>\n"
+"        </body></html>\n"
+"        "
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:970
+msgid "Available files"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:996
+msgid "You should specify an alias"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1001
+msgid "You should specify an uri"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1007
+#, python-format
+msgid "Package %s loaded"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1008 ../lib/advene/core/webcherry.py:1044
+#, python-format
+msgid ""
+"<p>Go to the <a href=\"/packages/%(alias)s\">%(alias)s</a> package, or to "
+"the <a href=\"/packages\">package list</a>."
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1011
+#, python-format
+msgid "<p>Cannot load package %(alias)s : %(error)s</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1022
+#, python-format
+msgid "Package %s deleted"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1023
+msgid "<p>Go to the <a href=\"/packages\">package list</a>."
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1026
+#, python-format
+msgid "<p>Cannot delete package %(alias)s : %(error)s</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1043
+#, python-format
+msgid "Package %s saved"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1047
+#, python-format
+msgid "<p>Cannot save package %(alias)s : %(error)s</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1057
+msgid "Server reset"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1063
+msgid "Available TALES methods"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1104
+msgid "Loaded package(s)"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1106
+msgid ""
+"\n"
+"        <h1>Loaded package(s)</h1>\n"
+"        <table border=\"1\" width=\"50%\">\n"
+"        <tr>\n"
+"        <th>Alias</th>\n"
+"        <th>Action</th>\n"
+"        <th>URI</th>\n"
+"        <th>Annotations</th>\n"
+"        </tr>\n"
+"        "
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1118
+#, python-format
+msgid ""
+"<tr>\n"
+"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
+"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
+"%(uri)s\">Reload</a>|<a href=\"/admin/delete?alias=%(alias)s\">Drop</a>|<a "
+"href=\"/admin/save?alias=%(alias)s\">Save</a></td>\n"
+"            <td>%(uri)s</td>\n"
+"            <td>%(size)d</td>\n"
+"            </tr>\n"
+"            "
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1191 ../lib/advene/core/webcherry.py:1267
+#: ../lib/advene/core/webcherry.py:1276 ../lib/advene/core/webcherry.py:1284
+#: ../lib/advene/core/webcherry.py:1444 ../lib/advene/core/webcherry.py:1452
+#: ../lib/advene/core/webcherry.py:1460 ../lib/advene/core/webcherry.py:2022
+#: ../lib/advene/core/webcherry.py:2029
+msgid "Error"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1192
+#, python-format
+msgid "The TALES expression %s is not valid."
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1244
+msgid "Content mode not available on non-content data"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1268 ../lib/advene/core/webcherry.py:1277
+#: ../lib/advene/core/webcherry.py:1285 ../lib/advene/core/webcherry.py:1306
+#: ../lib/advene/core/webcherry.py:1310 ../lib/advene/core/webcherry.py:1445
+#: ../lib/advene/core/webcherry.py:1453 ../lib/advene/core/webcherry.py:1461
+#: ../lib/advene/core/webcherry.py:1520 ../lib/advene/core/webcherry.py:1597
+#: ../lib/advene/core/webcherry.py:1717 ../lib/advene/core/webcherry.py:1767
+msgid "<h1>Error</h1>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1269 ../lib/advene/core/webcherry.py:1311
+#, python-format
+msgid ""
+"<p>There was an error in the template code.</p>\n"
+"                <p>Tag name: <strong>%(tagname)s</strong></p>\n"
+"                <p>Error message: <em>%(message)s</em></p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1278
+#, python-format
+msgid ""
+"<p>An invalid character is in the Context:</p>\n"
+"                <p>Error message: <em>%(error)s</em></p><pre>%(message)s</"
+"pre>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1286
+#, python-format
+msgid ""
+"<p>There was an error in the TALES expression.</p>\n"
+"                <pre>%s</pre>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1307
+#, python-format
+msgid ""
+"<p>There was an error.</p>\n"
+"                <pre>%s</pre>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1331
+#, python-format
+msgid ""
+"\n"
+"            <hr>\n"
+"            <p>\n"
+"            Location: %(location)s<br>\n"
+"            <form name=\"navigation\" method=\"GET\">\n"
+"            <a href=\"%(levelup)s\">Up one level</a> |\n"
+"            Next level :\n"
+"            <select name=\"path\" onchange=\"submit()\">\n"
+"            "
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1349
+msgid ""
+"\n"
+"            </select> View: <select name=\"view\" onchange=\"submit()\">\n"
+"            <option selected></option>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:315
+#: ../lib/advene/core/webcherry.py:1367
+#, python-format
 msgid ""
-"Display logfile folder. It can help when sending the advene.log file by e-"
-"mail."
+"<hr>\n"
+"            <p>Evaluating expression \"<strong>%(expression)s</strong>\" on "
+"package %(uri)s returns %(value)s</p>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:316
-msgid "_About"
+#: ../lib/advene/core/webcherry.py:1403
+#, python-format
+msgid "<p>Package <strong>%s</strong> not loaded</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:336 ../lib/advene/gui/main.py:3750
+#: ../lib/advene/core/webcherry.py:1446
 #, python-format
 msgid ""
-"Cannot load package %(filename)s:\n"
-"%(error)s"
+"<p>There was an error in the template code.</p>\n"
+"            <p>Tag name: <strong>%(tagname)s</strong></p>\n"
+"            <p>Error message: <em>%(message)s</em></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:344
-msgid "Open a package file"
+#: ../lib/advene/core/webcherry.py:1454
+#, python-format
+msgid ""
+"<p>There was an error in the expression.</p>\n"
+"            <pre>%s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:345
-msgid "Save the current package"
+#: ../lib/advene/core/webcherry.py:1462
+#, python-format
+msgid ""
+"<p>Cannot resolve TALES expression %(expr)s on package %(package)s<p><pre>\n"
+"            %(type)s\n"
+"            %(value)s\n"
+"            %(traceback)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:346
-msgid "Save the package with a new name"
+#: ../lib/advene/core/webcherry.py:1521 ../lib/advene/core/webcherry.py:1718
+msgid "<p>Cannot set the value : invalid path</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:347
-msgid "Select movie file..."
+#: ../lib/advene/core/webcherry.py:1583 ../lib/advene/core/webcherry.py:1836
+#, python-format
+msgid ""
+"<h1>Error</h1><p>When creating resource %(path)s, the resource folder "
+"%(folder)s could not be created.</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:348
-msgid "Select DVD"
+#: ../lib/advene/core/webcherry.py:1592 ../lib/advene/core/webcherry.py:1846
+msgid "Resource successfuly created/updated"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:352
-msgid "Create a text annotation"
+#: ../lib/advene/core/webcherry.py:1601
+msgid "Value successfuly updated"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:353
-msgid "Create a graphical annotation"
+#: ../lib/advene/core/webcherry.py:1603
+#, python-format
+msgid ""
+"Unable to update the attribute %(attribute)s for element %(element)s: "
+"%(error)s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:359
-msgid "List recently opened packages"
+#: ../lib/advene/core/webcherry.py:1714
+msgid "<p>Invalid request</p>."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:389
-msgid "Snapshotter activity"
+#: ../lib/advene/core/webcherry.py:1778 ../lib/advene/core/webcherry.py:1795
+msgid "Value updated"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:391
+#: ../lib/advene/core/webcherry.py:1779
 #, python-format
-msgid "%d queued requests"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:392
-msgid "Cancel all requests"
+msgid ""
+"\n"
+"                <h1>Value updated</h1>\n"
+"                The value of %(path)s has been updated to\n"
+"                <pre>\n"
+"                %(value)s\n"
+"                </pre>\n"
+"                "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:397
-msgid "No snapshotter"
+#: ../lib/advene/core/webcherry.py:1796
+#, python-format
+msgid ""
+"\n"
+"                    <h1>Value updated</h1>\n"
+"                    The value of %(path)s has been updated to\n"
+"                    <pre>\n"
+"                    %(value)s\n"
+"                    </pre>\n"
+"                    "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:419
-msgid "No snapshotting activity"
+#: ../lib/advene/core/webcherry.py:1807
+#, python-format
+msgid ""
+"Malformed request: cannot update the value of %(attribute)s in %(tales)s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:423
-msgid "Snapshotting"
+#: ../lib/advene/core/webcherry.py:1850
+msgid "Cannot create an element in something else than a package."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:440
-msgid "Display application log messages"
+#: ../lib/advene/core/webcherry.py:1867
+#, python-format
+msgid "The identifier %s already exists."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:482
-msgid "Quicksearch lists"
+#: ../lib/advene/core/webcherry.py:1879
+#, python-format
+msgid "<p>Error while creating view %(id)s</p><pre>%(error)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:488
-msgid "Please specify the lists of elements to be searched."
+#: ../lib/advene/core/webcherry.py:1885
+msgid "View created"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:507
+#: ../lib/advene/core/webcherry.py:1886
 #, python-format
 msgid ""
-"Searching on %s.\n"
-"Left click to launch the search, right-click to set the quicksearch options"
+"\n"
+"                 <h1>View <em>%(id)s</em> created</h1>\n"
+"                 <p>The view <a href=\"%(url)s\">%(id)s</a> was successfully "
+"created.</p>\n"
+"                 "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:508
+#: ../lib/advene/core/webcherry.py:1902
 #, python-format
-msgid "String to search in %s"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:521 ../lib/advene/gui/main.py:525
-msgid "Tracing : "
-msgstr ""
-
-#: ../lib/advene/gui/main.py:521
-msgid "off"
+msgid "Missing %s parameter"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:525
-msgid "on"
+#: ../lib/advene/core/webcherry.py:1905
+#, python-format
+msgid "Relation type %s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:545
-msgid "Launch search"
+#: ../lib/advene/core/webcherry.py:1912 ../lib/advene/core/webcherry.py:1915
+#, python-format
+msgid "Annotation %s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:550
-msgid "Ignore case"
+#: ../lib/advene/core/webcherry.py:1918
+#, python-format
+msgid ""
+"<p>Cannot create relation between %(member1)s and %(member2)s: invalid type</"
+"p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:555
-msgid "Searched elements"
+#: ../lib/advene/core/webcherry.py:1930
+#, python-format
+msgid ""
+"<p>Error while creating relation between %(member1)s and %(member2)s :</"
+"p><pre>%(error)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:625
-msgid "Playing"
+#: ../lib/advene/core/webcherry.py:1933
+msgid "Relation created"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:626
-msgid "Pause"
+#: ../lib/advene/core/webcherry.py:1934
+#, python-format
+msgid "<h1>Relation <em>%s</em> created</h1>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:627
-msgid "Init"
+#: ../lib/advene/core/webcherry.py:1944
+#, python-format
+msgid "Annotation type %s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:629
-msgid "Undefined"
+#: ../lib/advene/core/webcherry.py:1961
+#, python-format
+msgid ""
+"<p>Error while creating annotation of type %(type)s :<pre>\n"
+"                    %(errortype)s\n"
+"                    %(value)s\n"
+"                    %(traceback)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:901
-msgid "Enter the new time value"
+#: ../lib/advene/core/webcherry.py:1973
+#, python-format
+msgid "Annotation %s created"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:925
+#: ../lib/advene/core/webcherry.py:1975
 #, python-format
-msgid "Replace content in %d elements"
+msgid "Error: Cannot create an object of type %s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:938
-msgid "Find word"
+#: ../lib/advene/core/webcherry.py:1978
+#, python-format
+msgid ""
+"Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</"
+"code></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:945
-msgid "Replace by"
+#: ../lib/advene/core/webcherry.py:1991
+msgid "Available actions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:973
+#: ../lib/advene/core/webcherry.py:2000
 #, python-format
-msgid "%(search)s has been replaced by %(replace)s in %(count)d element(s)."
+msgid "<li>%(name)s: %(value)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:982
-msgid "The video extracting feature is not available."
+#: ../lib/advene/core/webcherry.py:2023
+#, python-format
+msgid "<p>Unknown action</p><pre>Action: %s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:985
-msgid "Video export"
+#: ../lib/advene/core/webcherry.py:2030
+msgid "Missing parameter(s) :<ul>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:987
-#, python-format
-msgid "Exporting video montage/fragment to %%(filename)s"
+#: ../lib/advene/core/webcherry.py:2066
+msgid "Advene web resources"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:989
-msgid "Please choose a destination filename"
+#: ../lib/advene/core/webcherry.py:2072
+msgid "Advene webserver"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1067
+#: ../lib/advene/core/webcherry.py:2073
+#, python-format
 msgid ""
-"No media association is defined in the package. Please use the 'File/"
-"Associate a video file' menu item to associate a media file."
+"<p>Welcome on the <a href=\"http://advene.org/\">Advene</a> webserver run by "
+"%(userid)s on %(serveraddress)s.</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1069
-#, python-format
+#: ../lib/advene/core/webcherry.py:2080
 msgid ""
-"The associated media %s could not be found. Please use the 'File/Associate a "
-"video file' menu item to associate a media file."
+" <p>No package is loaded. You can access the <a href=\"/admin\">server "
+"administration page</a>.<p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1071
+#: ../lib/advene/core/webcherry.py:2090
 #, python-format
 msgid ""
-"You are now working with the following video:\n"
-"%s"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:1188
-msgid "Open this view..."
-msgstr ""
-
-#: ../lib/advene/gui/main.py:1205
-msgid "_All available views"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:1224
-msgid "Transcription of annotations"
+"the <a href=\"/packages/%(alias)s/view/%(view)s\">loaded package's default "
+"view</a>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1227
-msgid "Note-taking editor"
+#: ../lib/advene/core/webcherry.py:2092
+#, python-format
+msgid "the <a href=\"/packages/%s\">loaded package's data</a>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1228
-msgid "Active bookmarks"
+#: ../lib/advene/core/webcherry.py:2094
+msgid "the <a href=\"/packages\">loaded packages' data</a>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1229
-msgid "Schema editor"
+#: ../lib/advene/core/webcherry.py:2095
+#, python-format
+msgid ""
+" <p>You can either access %s or the <a href=\"/admin\">server administration "
+"page</a>.<p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1233
-msgid "TALES explorer"
+#: ../lib/advene/core/webcherry.py:2097
+#, python-format
+msgid ""
+"<hr><p align=\"right\"><em>Document generated by <a href=\"http://advene.org/"
+"\">Advene</a> v. %s.</em></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1234
-msgid "Dynamic montage"
+#: ../lib/advene/core/webcherry.py:2182 ../lib/advene/core/webcherry.py:2191
+#, python-format
+msgid "Cannot start HTTP server: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1238
-msgid "Open a comment view in the web browser"
+#: ../lib/advene/core/controller.py:433
+msgid "No available GUI"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1239
-msgid "Create or open a comment view"
+#: ../lib/advene/core/controller.py:452
+msgid "No available event handler"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1242
-msgid ""
-"Edit window placeholder (annotation and relation edit windows will be put "
-"here)"
+#: ../lib/advene/core/controller.py:460
+msgid "No available gui"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1243
-msgid "Display edition history"
+#: ../lib/advene/core/controller.py:476
+#, python-format
+msgid "Warning: redefining an existing feature %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1244
-msgid "Visualise the activity trace preview"
+#: ../lib/advene/core/controller.py:608
+msgid "Annotations in current package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1245
-msgid "Visualise the activity trace as a timeline"
+#: ../lib/advene/core/controller.py:609
+msgid "Annotations in all packages"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1274
-msgid "The webserver could not be started. Static views cannot be accessed."
+#: ../lib/advene/core/controller.py:611
+msgid "Ids"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1352
+#: ../lib/advene/core/controller.py:803
 #, python-format
 msgid ""
-"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s has been "
-"released</b> on %(date)s, but you are running version %(current)s.\n"
-"You can download the latest version from the Advene website: http://liris."
-"cnrs.fr/advene/</span>"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:1357
-msgid "Go to the website"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:1363
-msgid "Advene release"
+"Cannot start the webserver\n"
+"The following processes seem to use the %(port)s port: %(processes)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1369
+#: ../lib/advene/core/controller.py:852 ../lib/advene/core/controller.py:863
 #, python-format
-msgid "You are using a up-to-date version of Advene (%(current)s)."
-msgstr ""
-
-#: ../lib/advene/gui/main.py:1369
-msgid "Advene is up-to-date"
+msgid "Loaded %(uri)s as %(alias)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1383
-msgid "Choose a color"
+#: ../lib/advene/core/controller.py:854 ../lib/advene/core/controller.py:866
+#, python-format
+msgid "Cannot load package from file %(uri)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1415
-msgid "Select an annotation to loop on it"
+#: ../lib/advene/core/controller.py:905
+msgid "Deactivating web server"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1417
+#: ../lib/advene/core/controller.py:1013
 #, python-format
-msgid "Looping on %s"
+msgid "Cannot get audio volume: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1476 ../lib/advene/gui/main.py:2367
-msgid "No active dynamic view"
+#: ../lib/advene/core/controller.py:1025
+#, python-format
+msgid "Cannot open Advene URL %s: the webserver is not running."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1487
-msgid "Create a new dynamic view."
+#: ../lib/advene/core/controller.py:1284
+#, python-format
+msgid "Found matching video file in moviepath: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1506
-msgid "Edit the current dynamic view."
+#: ../lib/advene/core/controller.py:1310 ../lib/advene/core/controller.py:1312
+msgid "Analysis of "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1518
-msgid "No dynamic view"
+#: ../lib/advene/core/controller.py:1536
+msgid "Cannot split the annotation: the given position is outside."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1550
-msgid "Playing rate"
+#: ../lib/advene/core/controller.py:1785
+#, python-format
+msgid "Cannot find the template package %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1698
-msgid "History"
+#: ../lib/advene/core/controller.py:1832
+#, python-format
+msgid "Cannot read the imported package %(uri)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1705
-msgid "Popups"
+#: ../lib/advene/core/controller.py:2064
+msgid "Package URI has changed. Reloading package with new URI."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1709
+#: ../lib/advene/core/controller.py:2082
 msgid ""
-"You can drag and drop view icons (timeline, treeview, transcription...) in "
-"notebooks to embed various views."
-msgstr ""
-
-#: ../lib/advene/gui/main.py:1709
-msgid "Information"
+"Cannot load package: the following annotations do not have Millisecond "
+"fragments:"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2004
-msgid "Cannot create annotation. There is no schema to put it in."
+#: ../lib/advene/core/controller.py:2108
+#, python-format
+msgid "Cannot handle master attribute, the package %s is not imported."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2013
-msgid "Default annotation type"
+#: ../lib/advene/core/controller.py:2110
+#, python-format
+msgid "Checking master package %s for not yet imported elements."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2025
-msgid "Annotation created"
+#: ../lib/advene/core/controller.py:2150
+msgid "Standard summary"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2057
-msgid "Play/Pause [Control-Tab / Control-Space]"
+#: ../lib/advene/core/controller.py:2155
+msgid "Default view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2058
+#: ../lib/advene/core/controller.py:2197
 #, python-format
-msgid "Rewind (%.02f s) [Control-Left]"
+msgid ""
+"Infinite loop in STBV %(name)s: the %(imp)s view is invoked multiple times."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2059
-#, python-format
-msgid "Forward (%.02f s) [Control-Right]"
+#: ../lib/advene/core/controller.py:2283
+msgid "Got exception when stopping player."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2060
-msgid "Previous frame [Control-Down]"
+#: ../lib/advene/core/controller.py:2335
+msgid "Video player problem"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2061
-msgid "Next frame [Control-Up]"
+#: ../lib/advene/core/controller.py:2362
+msgid "Unable to start the player."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2062
-msgid "Fullscreen"
+#: ../lib/advene/core/controller.py:2569
+#, python-format
+msgid "Comment on set of %d annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2214
+#: ../lib/advene/core/controller.py:2571
 #, python-format
-msgid "Screenshot saved to %s"
+msgid "Comment on %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2216
+#: ../lib/advene/core/controller.py:2575
 #, python-format
 msgid ""
-"Screenshot saved in\n"
-" %s"
+"<h1>Comment on %(title)s</h1>\n"
+"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
+"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
+"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
+"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
+"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
+"\"%(imgurl)s\" ></img></a></span>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2218
+#: ../lib/advene/core/controller.py:2585
 #, python-format
-msgid ""
-"Could not save screenshot:\n"
-" %s"
+msgid "List of %s annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2226
-msgid "Save screenshot to..."
+#: ../lib/advene/core/controller.py:2620
+#, python-format
+msgid "Cannot export to %(filename)s: %(e)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2244
-msgid "Could not take snapshot with enough precision"
+#: ../lib/advene/core/controller.py:2635
+msgid "Error when exporting text template"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2282
-msgid "Export package data"
+#: ../lib/advene/core/controller.py:2644
+msgid "Error when exporting XML template"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2284
-#, python-format
-msgid "Export annotation type %s"
+#: ../lib/advene/plugins/featuredetect.py:45
+msgid "Feature detection (face...)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2286
-#, python-format
-msgid "Export element %s"
+#: ../lib/advene/plugins/featuredetect.py:60
+msgid "Sensitivity level."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2312
-msgid "Export format"
+#: ../lib/advene/plugins/featuredetect.py:63
+msgid ""
+"Scale. Original image size will be divided by this factor, in order to speed "
+"up detection."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2349
-msgid " (modified)"
+#: ../lib/advene/plugins/featuredetect.py:66
+msgid "Classifier"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2352
+#: ../lib/advene/plugins/featuredetect.py:80
 #, python-format
-msgid "Activate %s"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:2523
-msgid "Saved workspace"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:2575
-msgid "Restoring workspace..."
+msgid "Feature %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2581
+#: ../lib/advene/plugins/featuredetect.py:82
 #, python-format
-msgid "Do you wish to restore the %s workspace ?"
+msgid "Detected %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2586
-msgid "Clear the current workspace"
+#: ../lib/advene/plugins/featuredetect.py:84
+msgid "Detection started"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2607
+#: ../lib/advene/plugins/featuredetect.py:175
 #, python-format
-msgid "View %s is not an adhoc view"
+msgid "Detected %(count)d feature(s) until %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2618
-#, python-format
-msgid "Cannot identify the adhoc view %s"
+#: ../lib/advene/plugins/ted.py:39
+msgid "TED importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2632
-msgid "Choose the annotation type to display as transcription."
+#: ../lib/advene/plugins/cutter.py:40
+msgid "Audio segmentation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2667
-#, python-format
-msgid ""
-"Error: unable to find an edit popup for %(element)s:\n"
-"%(error)s"
+#: ../lib/advene/plugins/cutter.py:55
+msgid "Volume threshold (in dB, can be negative) before trigger."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2675
-#, python-format
-msgid "Editing %s"
+#: ../lib/advene/plugins/cutter.py:58
+#: ../lib/advene/plugins/soundenveloppe.py:64
+msgid "Channel selection."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2687
-#, python-format
-msgid "Comment view (%s)"
+#: ../lib/advene/plugins/cutter.py:61
+msgid "Length (in ms) of drop below threshold before silence is detected"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2754
+#: ../lib/advene/plugins/cutter.py:104
 #, python-format
-msgid "Package %(uri)s saved: %(annotations)s and %(relations)s."
+msgid "Detected %(count)d segments until %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2765
-#, python-format
-msgid "Activating package %s"
+#: ../lib/advene/plugins/cutter.py:122
+msgid "Sound segment"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2793
+#: ../lib/advene/plugins/cutter.py:123
 #, python-format
-msgid "Package %(uri)s loaded: %(annotations)s and %(relations)s."
+msgid ""
+"Sound segmentation with a threshold of %(threshold)d dB - channel: "
+"%(channel)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2826
-msgid "Do you want to restore the saved workspace ?"
+#: ../lib/advene/plugins/cutter.py:141
+msgid "Starting silence detection"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2833
-msgid "Advene"
+#: ../lib/advene/plugins/ttl.py:41
+msgid "TurTLe (RDF) importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3038
-#, python-format
-msgid "Got exception %s. Trying to continue."
+#: ../lib/advene/plugins/shotdetect.py:38
+msgid "Shotdetect XML importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3062 ../lib/advene/gui/main.py:3083
-#: ../lib/advene/gui/main.py:4033
-msgid "Unknown"
+#: ../lib/advene/plugins/shotdetect.py:82
+msgid "No shots"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3153
-#, python-format
+#: ../lib/advene/plugins/pocketsphinx.py:44
 msgid ""
-"The package(s) %s are modified.\n"
-"Save them now?"
+"Cannot register speech recognition: Pocketsphinx plugins not found. See "
+"http://cmusphinx.sourceforge.net/wiki/gstreamer for details."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3203
-msgid "Choose an annotation type."
+#: ../lib/advene/plugins/pocketsphinx.py:48
+msgid "Speech recognition (PocketSphinx)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3247
-msgid "No annotation type is defined."
+#: ../lib/advene/plugins/pocketsphinx.py:68
+msgid "Filtering noise level [0..1]."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3256
-msgid "Creating a new type."
+#: ../lib/advene/plugins/pocketsphinx.py:72
+msgid ""
+"Minimum amount (in milliseconds) of silence required to terminate the "
+"current annotation and start a new one. Decreasing this length will result "
+"in a large amount of short annotations and increasing this length will "
+"result in a small amount of long annotations."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3260
-msgid "Title of the new type"
+#: ../lib/advene/plugins/pocketsphinx.py:76
+msgid "Use default acoustic and language models."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3261
-msgid ""
-"Id of the new type. It is generated from the title, but you may change it if "
-"necessary."
+#: ../lib/advene/plugins/pocketsphinx.py:80
+msgid "Acoustic model (directory)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3265
-msgid "Specify the content-type for the annotation type"
+#: ../lib/advene/plugins/pocketsphinx.py:84
+msgid "Phonetic dictionary (.dic file)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3267
-msgid "Content type"
+#: ../lib/advene/plugins/pocketsphinx.py:88
+msgid "Language model (.DMP file)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3274 ../lib/advene/gui/main.py:3383
-msgid "Create a new schema"
+#: ../lib/advene/plugins/pocketsphinx.py:107
+#: ../lib/advene/plugins/soundenveloppe.py:88
+#: ../lib/advene/plugins/barcode.py:62
+msgid "Generating annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3287
-msgid "Choose an existing schema for the new type, or create a new one"
+#: ../lib/advene/plugins/pocketsphinx.py:146
+#: ../lib/advene/plugins/barcode.py:87
+#, python-format
+msgid "%(count)d utterances until %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3290 ../lib/advene/gui/main.py:3398
-msgid "Specify the schema title"
+#: ../lib/advene/plugins/pocketsphinx.py:155
+msgid "Speech"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3294
-msgid "Title of the new schema"
+#: ../lib/advene/plugins/pocketsphinx.py:157
+msgid "Recognized speech"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3295
-msgid ""
-"Id of the new schema. It is generated from the title, but you may change it "
-"if necessary."
+#: ../lib/advene/plugins/pocketsphinx.py:186
+msgid "Recognizing speech"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3318
-msgid ""
-"You specified a annotation-type identifier that already exists. Aborting."
+#: ../lib/advene/plugins/brltty.py:64
+msgid "Input from the braille table."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3336
-msgid "You specified a existing schema identifier. Using the existing schema."
+#: ../lib/advene/plugins/brltty.py:68
+msgid "BrlTTY not installed. There will be no braille support."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3338
-msgid ""
-"You specified an existing identifier that does not reference a schema. "
-"Aborting."
+#: ../lib/advene/plugins/brltty.py:80
+msgid "Could not initialize BrlTTY. No braille support."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3365
-msgid "Choose a schema."
+#: ../lib/advene/plugins/brltty.py:86
+msgid "Display a message in Braille"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3425
-msgid "You specified an existing identifier. Aborting."
+#: ../lib/advene/plugins/brltty.py:87
+msgid "Message to display."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3445
+#: ../lib/advene/plugins/brltty.py:258
 #, python-format
-msgid "Package %s modified"
+msgid "BrlTTY connection error: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3446
-#, python-format
-msgid ""
-"The package %s has been modified but not saved.\n"
-"Save it now?"
+#: ../lib/advene/plugins/brltty.py:275
+msgid "Braille display: "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3456
-#, python-format
-msgid "%s snapshots"
+#: ../lib/advene/plugins/brltty.py:281
+msgid "No message"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3457
-#, python-format
-msgid "Do you want to save the snapshots for media %s?"
+#: ../lib/advene/plugins/transcript.py:34
+msgid "Youtube XML importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3464 ../lib/advene/gui/main.py:3473
-#: ../lib/advene/gui/main.py:4449
-#, python-format
-msgid "Cannot save imagecache for %(media)s: %(e)s"
+#: ../lib/advene/plugins/transcript.py:71
+msgid "Importing transcript"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3487
-msgid "first frame"
+#: ../lib/advene/plugins/aeidon_import.py:50
+msgid "Aeidon (subtitles) importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3488
-msgid "last frame"
+#: ../lib/advene/plugins/anvil.py:38
+msgid "Anvil importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3496
-#, python-format
-msgid "Click on %(bound)s of %(annotation)s"
+#: ../lib/advene/plugins/fcp.py:35
+msgid "Final Cut Pro XML importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3499
-#, python-format
-msgid "Update %(bound)s of %(annotation)s"
+#: ../lib/advene/plugins/fcp.py:57
+msgid "FCP clipitem"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3518
-msgid "Click on the frame corresponding to the timestamp value"
+#: ../lib/advene/plugins/fcp.py:77
+msgid "Importing subtitles"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3520
-msgid "Set new timestamp value"
+#: ../lib/advene/plugins/fcp.py:92
+msgid "Importing clips"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3527
-msgid ""
-"<b>Annotation statistics</b>\n"
-"\n"
+#: ../lib/advene/plugins/fcp.py:95
+msgid "No clip"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3599
-msgid "Text annotation"
+#: ../lib/advene/plugins/hpi.py:43
+msgid "HPI concept extraction"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3607 ../lib/advene/gui/main.py:3632
-msgid "Cannot find an appropriate annotation type"
+#: ../lib/advene/plugins/hpi.py:109
+msgid "Type of annotation to analyze"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3625
-msgid "Graphical annotation"
+#: ../lib/advene/plugins/hpi.py:114
+msgid "URL of the webservice"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3677
-msgid ""
-"An unsaved template package exists\n"
-"Save it first."
+#: ../lib/advene/plugins/hpi.py:119
+msgid "Minimum confidence level (between 0.0 and 1.0)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3686
-msgid "Package modified"
+#: ../lib/advene/plugins/hpi.py:124
+msgid "Use detected position for created annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3687
-msgid ""
-"The package that you want to close has been modified but not saved.\n"
-"Save it now?"
+#: ../lib/advene/plugins/hpi.py:129
+msgid "Split by entity type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3718
-msgid "Load a package"
+#: ../lib/advene/plugins/hpi.py:134
+msgid "Model to be used for detection"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3727
-msgid ""
-"A video file was selected. Pretend that the user selected 'Select a video "
-"file'..."
+#: ../lib/advene/plugins/hpi.py:139
+msgid "Create relations between the original annotations and the new ones"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3732
-#, python-format
-msgid ""
-"The file %s does not look like a valid Advene package. It should have a .azp "
-"or .xml extension. Try to open anyway?"
+#: ../lib/advene/plugins/hpi.py:167
+msgid "Cannot connect to VCD server. Check that it is running and accessible."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3741
-msgid ""
-"You are trying to load a session file, but there are unsaved packages. "
-"Proceed anyway?"
+#: ../lib/advene/plugins/hpi.py:179
+#, python-format
+msgid "%d / %d screenshots are missing. Wait for extraction to complete."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3769 ../lib/advene/gui/main.py:3825
-msgid "Do you want to save the current workspace ?"
+#: ../lib/advene/plugins/hpi.py:196
+#, python-format
+msgid "Concepts for %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3784 ../lib/advene/gui/main.py:3840
+#: ../lib/advene/plugins/hpi.py:264
 #, python-format
-msgid "Could not save the package: %s"
+msgid "Server error: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3797
-#, python-format
-msgid "Save the package %s"
+#: ../lib/advene/plugins/hpi.py:264
+msgid "Server transmission error."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3810
-msgid "Invalid file extension"
+#: ../lib/advene/plugins/hpi.py:272
+#, python-format
+msgid "Parsing %d results"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3811
+#: ../lib/advene/plugins/hpi.py:289
 #, python-format
-msgid ""
-"Your package contains resources,\n"
-"the filename (%s) should have a .azp extension.\n"
-"Should I put the correct extension?"
+msgid "%s concept"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3815
-msgid "OK, the resources will be lost."
+#: ../lib/advene/plugins/goodshotdetector.py:45
+msgid "Shot detection (Delakis version)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3817
-msgid "Aborting package saving"
+#: ../lib/advene/plugins/goodshotdetector.py:60
+msgid "Cache histogram alongside video files."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3851
-msgid "Save the session in..."
+#: ../lib/advene/plugins/goodshotdetector.py:63
+msgid ""
+"Parameter profile: safe will detect less cuts, aggressive will detect more "
+"cuts (but more false ones too). default is a compromise."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3862
+#: ../lib/advene/plugins/goodshotdetector.py:77
 #, python-format
-msgid "Session saved in %s"
+msgid "Shot (%s profile)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3871
-msgid "Do you confirm the creation of annotations matching the DVD chapters?"
+#: ../lib/advene/plugins/goodshotdetector.py:78
+#: ../lib/advene/plugins/shotdetectapp.py:84
+msgid "Detected shots"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3877
-msgid "Cannot import DVD chapters. Did you install the lsdvd software?"
+#: ../lib/advene/plugins/goodshotdetector.py:83
+msgid "Loading histogram"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3885
-msgid "The associated media is not a DVD."
+#: ../lib/advene/plugins/goodshotdetector.py:144
+msgid "Computing hdiff"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3896
-#, python-format
-msgid "Processing %s video"
+#: ../lib/advene/plugins/goodshotdetector.py:151
+msgid "Detecting cuts"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3899
-msgid "No associated video file"
+#: ../lib/advene/plugins/goodshotdetector.py:178
+msgid "Detecting dissolves"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3926
-msgid "Standard RuleSet"
+#: ../lib/advene/plugins/goodshotdetector.py:263
+msgid "Extracting histogram"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4042
-#, python-format
-msgid ""
-"Player not active - cached duration   : %(duration)s (%(durationms)d ms)"
+#: ../lib/advene/plugins/montagerenderer.py:43
+msgid "Cannot register montage renderer: Gnonlin plugins are not present."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4054
-msgid ""
-"GNU General Public License v. 2\n"
-"See http://www.gnu.org/copyleft/gpl.html for more details"
+#: ../lib/advene/plugins/transcriber.py:43
+msgid "Transcriber importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4056
-msgid "Visit the Advene web site for examples and documentation."
+#: ../lib/advene/plugins/transcriber.py:89
+msgid "Parsing section information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4089 ../lib/advene/gui/main.py:4177
-msgid "Select a movie file"
+#: ../lib/advene/plugins/transcriber.py:257 ../lib/advene/util/importer.py:1541
+msgid "Creating package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4101
-msgid "Title/Chapter selection"
+#: ../lib/advene/plugins/transcriber.py:263 ../lib/advene/util/importer.py:1548
+msgid "Creating annotation types"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4143
-msgid "Select a video stream"
+#: ../lib/advene/plugins/transcriber.py:268 ../lib/advene/util/importer.py:1554
+msgid "Parsing header information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4144
-msgid "Enter the address of a video stream"
+#: ../lib/advene/plugins/transcriber.py:279
+msgid "Parsing topic and speaker tables information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4148
-#, python-format
-msgid "Successfully extracted the video stream address (%s) from the url.\n"
+#: ../lib/advene/plugins/tts.py:80
+msgid "Pronounce a text"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4173
-msgid "Package properties"
+#: ../lib/advene/plugins/tts.py:81
+msgid "String to pronounce."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4174
-msgid "Author name"
+#: ../lib/advene/plugins/tts.py:159
+msgid "TTS disabled. Cannot find the application 'festival' in PATH"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4175
-msgid "Package creation date"
+#: ../lib/advene/plugins/tts.py:161
+msgid "TTS disabled. Cannot find the application 'aplay' in PATH"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4176
-msgid "Package title"
+#: ../lib/advene/plugins/soundenveloppe.py:42
+#: ../lib/advene/plugins/soundenveloppe.py:149
+#: ../lib/advene/plugins/soundenveloppe.py:151
+msgid "Sound enveloppe"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4177
-msgid "Associated media"
+#: ../lib/advene/plugins/soundenveloppe.py:58
+msgid "Interval (in ms) at which to take samples."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4178
-msgid "Media duration in ms"
+#: ../lib/advene/plugins/soundenveloppe.py:61
+msgid "Maximum number of samples per annotation."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4237
-msgid "Paths"
+#: ../lib/advene/plugins/soundenveloppe.py:121
+#, python-format
+msgid "At %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4239
-msgid "Data"
+#: ../lib/advene/plugins/soundenveloppe.py:168
+msgid "Extracting sound enveloppe"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4239
-msgid "Standard directory for data files"
+#: ../lib/advene/plugins/barcode.py:39
+msgid "Cannot register barcode extraction: zbar plugin not found."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4240
-msgid "Movie path"
+#: ../lib/advene/plugins/barcode.py:43
+msgid "Barcode (qr-code) extraction"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4240
-#, python-format
-msgid ""
-"List of directories (separated by %s) to search for movie files (_ means "
-"package directory)"
+#: ../lib/advene/plugins/barcode.py:99
+msgid "Barcode"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4241
-msgid "Imagecache"
+#: ../lib/advene/plugins/barcode.py:101
+msgid "Extracted barcode information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4241
-msgid "Directory for storing the snapshot cache"
+#: ../lib/advene/plugins/barcode.py:119
+msgid "Extraction barcodes"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4242
-msgid "Player"
+#: ../lib/advene/plugins/dcp.py:67
+msgid "DCP importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4242
-msgid "Directory of the video player"
+#: ../lib/advene/plugins/dcp.py:122
+#, python-format
+msgid "Converting #%(num)d / %(count)d"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4243
-msgid "Shotdetect"
+#: ../lib/advene/plugins/annotationgraph.py:43
+msgid "AnnotationGraph importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4243
-msgid "Shotdetect application"
+#: ../lib/advene/plugins/shotdetectapp.py:45
+msgid "ShotdetectApp importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4245
-msgid "GUI"
+#: ../lib/advene/plugins/shotdetectapp.py:56
+msgid ""
+"Sensitivity of the algorithm. It should typically be between 50 and 80. If "
+"too many shots are detected, try to increase its value."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4246
-msgid "Interface language (after restart)"
+#: ../lib/advene/plugins/shotdetectapp.py:139
+#, python-format
+msgid "Detected shot #%(num)d at %(pos)s "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4246
-msgid ""
-"Language used for the interface (necessitates to restart the application)"
+#: ../lib/advene/plugins/mpeg7.py:57
+msgid "MPEG7 importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4252
-msgid "Record activity trace"
+#: ../lib/advene/plugins/cinelab.py:76
+msgid "Cinelab importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4253
-msgid "Expert mode"
+#: ../lib/advene/plugins/cinelab.py:114 ../lib/advene/plugins/cinelab.py:116
+#, python-format
+msgid "File %s is not an Advene2 zip package."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4253
-msgid "Offer advanced possibilities"
+#: ../lib/advene/plugins/cinelab.py:171
+msgid "Converting annotation types"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4254
-msgid "Prefer WYSIWYG"
+#: ../lib/advene/plugins/cinelab.py:212
+msgid "Converting views"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4254
-msgid "Use WYSIWYG editors when possible (HTML, SVG)"
+#: ../lib/advene/plugins/cinelab.py:244
+msgid "Importing annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4255
-msgid "Player control in edit popups"
+#: ../lib/advene/plugins/owl_import.py:43
+msgid "OWL (schema) importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4255
-msgid ""
-"Enable generic player controls in edit windows. This may be undesirable "
-"since it overloads some standard text-edition behaviours (esp. control-left/"
-"right)."
+#: ../lib/advene/plugins/owl_import.py:62 ../lib/advene/util/importer.py:398
+#, python-format
+msgid "Converted from %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4257
-msgid "Open popups"
+#: ../lib/advene/player/gstreamer.py:344
+msgid "Problem when seeking into media"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4258
-msgid "Where should we open adhoc views?"
+#: ../lib/advene/player/gstreamer.py:385
+msgid "Cannot capture full-resolution snapshot, another capture is ongoing."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4259
-msgid "as a popup window"
+#: ../lib/advene/rules/actions.py:39 ../lib/advene/rules/actions.py:104
+#: ../lib/advene/rules/actions.py:122
+msgid "Message to display"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4260
-msgid "embedded east of the video"
+#: ../lib/advene/rules/actions.py:50
+msgid "Start the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4261
-msgid "embedded west of the video"
+#: ../lib/advene/rules/actions.py:51
+msgid "Start position (in ms)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4262
-msgid "embedded south of the video"
+#: ../lib/advene/rules/actions.py:54 ../lib/advene/rules/actions.py:380
+msgid "The movie start"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4263
-msgid "embedded at the right of the window"
+#: ../lib/advene/rules/actions.py:55 ../lib/advene/rules/actions.py:381
+msgid "The annotation begin"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4266
-msgid "History size"
+#: ../lib/advene/rules/actions.py:56 ../lib/advene/rules/actions.py:382
+msgid "The annotation end"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4266
-msgid "History filelist size limit"
+#: ../lib/advene/rules/actions.py:66
+msgid "Goto position (in ms)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4268
-msgid "Remember window size"
+#: ../lib/advene/rules/actions.py:75
+msgid "Stop the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4268
-msgid "Remember the size of opened windows"
+#: ../lib/advene/rules/actions.py:82
+msgid "Pause the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4269
-msgid "Bookmark snapshot width"
+#: ../lib/advene/rules/actions.py:89
+msgid "Resume the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4269
-msgid "Width of the snapshots representing bookmarks"
+#: ../lib/advene/rules/actions.py:96
+msgid "Take a snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4270
-msgid "Bookmark snapshot precision"
+#: ../lib/advene/rules/actions.py:103
+msgid "Display a caption"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4270
-msgid "Precision (in ms) of the displayed bookmark snapshots."
+#: ../lib/advene/rules/actions.py:105
+msgid "Duration of the caption"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4272
-msgid "General"
+#: ../lib/advene/rules/actions.py:133
+msgid "Display a graphical shape"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4273
-msgid "Weekly update check"
+#: ../lib/advene/rules/actions.py:134
+msgid "Shape (square, circle, triangle)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4274
-msgid "On exit,"
+#: ../lib/advene/rules/actions.py:136
+msgid "x-position (percentage of screen)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4275
-msgid "How to handle screenshots on exit"
+#: ../lib/advene/rules/actions.py:137
+msgid "y-position (percentage of screen)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4276
-msgid "never save screenshots"
+#: ../lib/advene/rules/actions.py:138
+msgid "Size (arbitrary units)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4277
-msgid "always save screenshots"
+#: ../lib/advene/rules/actions.py:139
+msgid "Duration of the display in ms"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4278
-msgid "ask before saving screenshots"
+#: ../lib/advene/rules/actions.py:147
+msgid "A square"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4280
-msgid "Auto-save"
+#: ../lib/advene/rules/actions.py:148
+msgid "A circle"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4281
-msgid "Data auto-save functionality"
+#: ../lib/advene/rules/actions.py:149
+msgid "A triangle"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4282
-msgid "is desactivated"
+#: ../lib/advene/rules/actions.py:152
+msgid "White"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4283
-msgid "is done automatically"
+#: ../lib/advene/rules/actions.py:153
+msgid "Black"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4284
-msgid "is done after confirmation"
+#: ../lib/advene/rules/actions.py:154
+msgid "Red"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4286
-msgid "Auto-save interval (in s)"
+#: ../lib/advene/rules/actions.py:155
+msgid "Green"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4286
-msgid "Interval (in seconds) between package auto-saves"
+#: ../lib/advene/rules/actions.py:156
+msgid "Blue"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4288
-msgid "Workspace"
+#: ../lib/advene/rules/actions.py:157
+msgid "Yellow"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4290
-msgid "On package saving,"
+#: ../lib/advene/rules/actions.py:160
+msgid "At the top of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4291
-msgid "Do you wish to save the default workspace with the package?"
+#: ../lib/advene/rules/actions.py:161 ../lib/advene/rules/actions.py:166
+msgid "In the middle of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4292
-msgid "never save the current workspace"
+#: ../lib/advene/rules/actions.py:162
+msgid "At the bottom of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4293
-msgid "always save the current workspace"
+#: ../lib/advene/rules/actions.py:165
+msgid "At the left of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4294
-msgid "ask before saving the current workspace"
+#: ../lib/advene/rules/actions.py:183
+msgid "Zero the volume during the annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4296
-msgid "Auto-validation of edited elements"
+#: ../lib/advene/rules/actions.py:190
+msgid "Zero the volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4296
-msgid "Automatically validate modified elements when saving the package."
+#: ../lib/advene/rules/actions.py:197
+msgid "Restore the volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4298
-msgid "On package load,"
+#: ../lib/advene/rules/actions.py:205
+msgid "Activate a STBV"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4299
-msgid "Do you wish to load the workspace saved with the package?"
+#: ../lib/advene/rules/actions.py:206
+msgid "STBV id"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4300
-msgid "never load the saved workspace"
+#: ../lib/advene/rules/actions.py:215
+msgid "Send a user event"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4301
-msgid "always load the saved workspace"
+#: ../lib/advene/rules/actions.py:216
+msgid "Identifier"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4302
-msgid "ask before loading the saved workspace"
+#: ../lib/advene/rules/actions.py:217
+msgid "Delay in ms before sending the event."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4305
-msgid "Video Player"
+#: ../lib/advene/rules/actions.py:227
+msgid "Open a URL in the web browser"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4306
-msgid "Autostart"
+#: ../lib/advene/rules/actions.py:237
+msgid "Open a static view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4306
-msgid ""
-"Automatically start the player when loading a media file (either directly or "
-"through a package)"
+#: ../lib/advene/rules/actions.py:248
+msgid "Set the audio volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4307
-msgid "Fulscreen timestamp"
+#: ../lib/advene/rules/actions.py:249
+msgid "Volume level (from 0 to 100)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4307
-msgid "Display the timestamp over the video when in fullscreen mode"
+#: ../lib/advene/rules/actions.py:258
+msgid "Set the playing rate"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4308
-msgid "Enable captions"
+#: ../lib/advene/rules/actions.py:259
+msgid "Rate (100: normal rate, 200: twice slower)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4308
-msgid "Enable captions over the video"
+#: ../lib/advene/rules/actions.py:268
+msgid "Play a sound resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4309
-msgid "Caption font"
+#: ../lib/advene/rules/actions.py:269
+msgid "Clip id"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4309
-msgid "TrueType font for captions"
+#: ../lib/advene/rules/actions.py:270 ../lib/advene/rules/actions.py:284
+msgid "Volume (0..100)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4310
-msgid "Enable SVG"
+#: ../lib/advene/rules/actions.py:271 ../lib/advene/rules/actions.py:285
+msgid "Left-right balance: -1 -> full left, 0 -> center, 1 -> full right"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4310
-msgid "Enable SVG captions over the video"
+#: ../lib/advene/rules/actions.py:282
+msgid "Play a sound file"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4312
-msgid "Enable snapshots"
+#: ../lib/advene/rules/actions.py:283
+msgid "Sound filename"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4313
-msgid "Snapshot width"
+#: ../lib/advene/rules/actions.py:295
+msgid "Set a state variable"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4313
-msgid "Snapshot width in pixels."
+#: ../lib/advene/rules/actions.py:296 ../lib/advene/rules/actions.py:308
+msgid "State variable name"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4314
-msgid "Verbosity"
+#: ../lib/advene/rules/actions.py:297
+msgid "State value"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4314
-msgid "Verbosity level. -1 for no messages."
+#: ../lib/advene/rules/actions.py:307
+msgid "Increment a state variable"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4317
-msgid "Devices"
+#: ../lib/advene/rules/actions.py:317
+msgid "Clear all state variables"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4319
-msgid "Standard"
+#: ../lib/advene/rules/actions.py:332
+#, python-format
+msgid "Error in the evaluation of the parameter %s:"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4321
-msgid "DVD drive"
+#: ../lib/advene/rules/actions.py:537
+#, python-format
+msgid "Cannot find the stbv %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4321
-msgid "Drive letter for the DVD"
+#: ../lib/advene/rules/actions.py:633
+msgid "The set_rate method is unavailable."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4322
-msgid "GDI"
+#: ../lib/advene/rules/actions.py:643
+msgid "No 'soundclips' resource folder in the package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4323
-msgid "Direct X"
+#: ../lib/advene/rules/actions.py:668
+msgid "Full volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4325
-msgid "DVD device"
+#: ../lib/advene/rules/actions.py:669
+msgid "Left"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4325
-msgid "Device for the DVD"
+#: ../lib/advene/rules/actions.py:671
+msgid "Right"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4326
-msgid "X11"
+#: ../lib/advene/rules/importer.py:29
+msgid "Event history importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4327
-msgid "XVideo"
+#: ../lib/advene/rules/elements.py:144
+msgid "is equal to"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4328
-msgid "GL"
+#: ../lib/advene/rules/elements.py:145
+msgid "is different from"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4330
-msgid "Video output"
+#: ../lib/advene/rules/elements.py:146
+msgid "contains"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4330
-msgid "Video output module"
+#: ../lib/advene/rules/elements.py:147
+msgid "is greater than"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4332
-msgid "Recorder options"
+#: ../lib/advene/rules/elements.py:148
+msgid "is lower than"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4333
-msgid "Audio input"
+#: ../lib/advene/rules/elements.py:149
+msgid "matches the regexp"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4333
-msgid "Device name for audio input (with gstrecorder plugin)"
+#: ../lib/advene/rules/elements.py:150
+msgid "is before"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4334
-msgid "Record video"
+#: ../lib/advene/rules/elements.py:151
+msgid "meets"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4334
-msgid "Record both video and audio"
+#: ../lib/advene/rules/elements.py:152
+msgid "overlaps"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4337
-msgid "<i>Experimental</i>"
+#: ../lib/advene/rules/elements.py:153
+msgid "during"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4338
-msgid "Embed the caption scroller below the video"
+#: ../lib/advene/rules/elements.py:154
+msgid "starts"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4339
-msgid "Embed the caption view below the video"
+#: ../lib/advene/rules/elements.py:155
+msgid "finishes"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4341
-msgid "Time-related"
+#: ../lib/advene/rules/elements.py:160
+msgid "is not true"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4342
-msgid "Time format"
+#: ../lib/advene/rules/elements.py:161
+msgid "is true"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4342
-msgid "Format used to display timecodes"
+#: ../lib/advene/rules/elements.py:165
+msgid "Basic conditions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4356
-msgid "Default FPS"
+#: ../lib/advene/rules/elements.py:166
+msgid "Allen relations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4357
-msgid ""
-"Default FPS (frame-per-second) value, when entering or displaying timestamps "
-"with frame numbers."
+#: ../lib/advene/rules/elements.py:229 ../lib/advene/rules/elements.py:235
+msgid "Unknown type for overlaps comparison"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4358
-msgid "Time increment"
+#: ../lib/advene/rules/elements.py:243 ../lib/advene/rules/elements.py:249
+msgid "Unknown type for during comparison"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4358
-msgid ""
-"Skip duration, when using control-left/right or forward/rewind buttons (in "
-"ms)."
+#: ../lib/advene/rules/elements.py:518 ../lib/advene/rules/elements.py:524
+#, python-format
+msgid "Unknown action %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4359
-msgid "Second time increment"
+#: ../lib/advene/rules/elements.py:525
+#, python-format
+msgid "Unknown parameter %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4359
-msgid "Skip duration, when using control-shift-left/right (in ms)."
+#: ../lib/advene/rules/elements.py:530
+msgid "Unknown actions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4360
-msgid "Third time increment"
+#: ../lib/advene/rules/elements.py:982
+msgid "Start of the editing of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4360
-msgid "Skip duration, when using control-shift-up/down (in ms)."
+#: ../lib/advene/rules/elements.py:983
+msgid "Cancel of the editing of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4361
-msgid "Custom Up/Down"
+#: ../lib/advene/rules/elements.py:984
+msgid "Destruction of the edit window of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4361
-msgid ""
-"Use third time increment for up/down navigation without having to hold shift."
+#: ../lib/advene/rules/elements.py:985
+msgid "Validation of the editing of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4363
-msgid "Scroll increment"
+#: ../lib/advene/rules/elements.py:986
+msgid "Ending editing of a package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4363
-msgid ""
-"On most annotations, control+scrollwheel will increment/decrement their "
-"bounds by this value (in ms)."
+#: ../lib/advene/rules/elements.py:987
+msgid "Beginning of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4364
-msgid "Second scroll increment"
+#: ../lib/advene/rules/elements.py:988
+msgid "End of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4364
-msgid ""
-"On most annotations, control+shift+scrollwheel will increment/decrement "
-"their bounds by this value (in ms)."
+#: ../lib/advene/rules/elements.py:989
+msgid "Creation of a new annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4366
-msgid "Player sync"
+#: ../lib/advene/rules/elements.py:990
+msgid "Ending editing of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4366
-msgid ""
-"Interval (in ms) with which we synchronize slave players. Setting a too-low "
-"value could render the application unusable. Use 0 to disable continuous "
-"synchronization."
+#: ../lib/advene/rules/elements.py:991
+msgid "Suppression of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4367
-msgid "Timeline parameters"
+#: ../lib/advene/rules/elements.py:992
+msgid "Activation of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4368
-msgid "Font size for annotation widgets"
+#: ../lib/advene/rules/elements.py:993
+msgid "Deactivation of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4369
-msgid "Button height"
+#: ../lib/advene/rules/elements.py:994
+msgid "Merging of two annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4369
-msgid "Height of annotation widgets"
+#: ../lib/advene/rules/elements.py:995
+msgid "Moving an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4370
-msgid "Interline height"
+#: ../lib/advene/rules/elements.py:996
+msgid "Activation of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4370
-msgid "Height of interlines"
+#: ../lib/advene/rules/elements.py:997
+msgid "Deactivation of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4372
-msgid "Text content"
+#: ../lib/advene/rules/elements.py:998
+msgid "Creation of a new relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4373
-msgid "Completion mode"
+#: ../lib/advene/rules/elements.py:999
+msgid "Ending editing of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4373
-msgid "Enable dynamic completion mode"
+#: ../lib/advene/rules/elements.py:1000
+msgid "Suppression of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4374
-msgid "Abbreviation mode"
+#: ../lib/advene/rules/elements.py:1001
+msgid "Creation of a new view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4374
-msgid "Enable abbreviation mode"
+#: ../lib/advene/rules/elements.py:1002
+msgid "Ending editing of a view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4375
-msgid "Abbreviations"
+#: ../lib/advene/rules/elements.py:1003
+msgid "Suppression of a view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4375
-msgid ""
-"Text abbreviations. 1 entry per line. Each line consists of the abbreviation "
-"followed by its replacement."
+#: ../lib/advene/rules/elements.py:1004
+msgid "Creation of a new query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4377
-msgid "Text-To-Speech"
+#: ../lib/advene/rules/elements.py:1005
+msgid "Ending editing of a query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4378
-msgid "TTS language"
+#: ../lib/advene/rules/elements.py:1006
+msgid "Suppression of a query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4379
-msgid "What language settings should be used for text-to-speech"
+#: ../lib/advene/rules/elements.py:1007
+msgid "Creation of a new schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4380
-msgid "English"
+#: ../lib/advene/rules/elements.py:1008
+msgid "Ending editing of a schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4381
-msgid "French"
+#: ../lib/advene/rules/elements.py:1009
+msgid "Suppression of a schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4382
-msgid "Spanish"
+#: ../lib/advene/rules/elements.py:1011
+msgid "Ending editing an annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4384
-msgid "TTS Encoding"
+#: ../lib/advene/rules/elements.py:1012
+msgid "Suppression of an annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4385
-msgid "What encoding should be used to communicate with the TTS engine"
+#: ../lib/advene/rules/elements.py:1013
+msgid "Creation of a new relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4386
-msgid "TTS Engine"
+#: ../lib/advene/rules/elements.py:1014
+msgid "Ending editing a relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4387
-msgid ""
-"Which TTS engine should be used (modification requires restarting Advene to "
-"take into account)"
+#: ../lib/advene/rules/elements.py:1015
+msgid "Suppression of a relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4388
-msgid "Automatic"
+#: ../lib/advene/rules/elements.py:1016
+msgid "Creation of a new resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4389
-msgid "eSpeak"
+#: ../lib/advene/rules/elements.py:1017
+msgid "Ending editing of a resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4390
-msgid "Custom script with standard input"
+#: ../lib/advene/rules/elements.py:1018
+msgid "Suppression of a resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4391
-msgid "Custom script with arguments"
+#: ../lib/advene/rules/elements.py:1019
+msgid "Modification of the tag"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4392
-msgid "SAPI"
+#: ../lib/advene/rules/elements.py:1020
+msgid "Activating a link"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4393
-msgid "MacOS X say"
+#: ../lib/advene/rules/elements.py:1021
+msgid "Player start"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4394
-msgid "Generic (text output)"
+#: ../lib/advene/rules/elements.py:1022
+msgid "Player stop"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4438
-msgid "You should restart Advene to take some options into account."
+#: ../lib/advene/rules/elements.py:1023
+msgid "Player pause"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4447
-#, python-format
-msgid "Imagecache saved to %s"
+#: ../lib/advene/rules/elements.py:1024
+msgid "Player resume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4460
-msgid "Restarting player..."
+#: ../lib/advene/rules/elements.py:1025
+msgid "Going to a given position"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4512
-msgid "Advene log"
+#: ../lib/advene/rules/elements.py:1026
+msgid "Loading a new package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4581
-msgid "Select the package to merge"
+#: ../lib/advene/rules/elements.py:1027
+msgid "Activating a package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4602
-msgid "Saving workspace"
+#: ../lib/advene/rules/elements.py:1028
+msgid "Saving the package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4605
-msgid "Enter a view name to save the workspace"
+#: ../lib/advene/rules/elements.py:1029
+msgid "Start of the dynamic view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4606
-msgid "Default workspace"
+#: ../lib/advene/rules/elements.py:1030
+msgid "End of the dynamic view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4607
-msgid "Open this workspace when opening the package"
+#: ../lib/advene/rules/elements.py:1031
+msgid "Start of the application"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4641
-#, python-format
-msgid "Error: the view %s exists and is not a workspace view."
+#: ../lib/advene/rules/elements.py:1032
+msgid "End of the application"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4672
-#, python-format
-msgid "Cannot save default workspace: %s"
+#: ../lib/advene/rules/elements.py:1033
+msgid "User-defined event"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4682
-msgid "Standard workspace has been saved"
+#: ../lib/advene/rules/elements.py:1034
+msgid "Modification of the associated media"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4689
-msgid "Website export"
+#: ../lib/advene/rules/elements.py:1035
+msgid "Highlight a bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4690
-msgid "Exporting views to a website"
+#: ../lib/advene/rules/elements.py:1036
+msgid "Unhighlight a bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4693
-msgid "Output directory"
+#: ../lib/advene/rules/elements.py:1037
+msgid "Updating duration of the movie"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4702
-msgid "Specify the output directory"
+#: ../lib/advene/rules/elements.py:1038
+msgid "Displaying a popup"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4711
-msgid "Maximum recursion depth"
+#: ../lib/advene/rules/elements.py:1039
+msgid "Updating a snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4718
-msgid "Video URL"
+#: ../lib/advene/rules/elements.py:1077
+msgid "Player control"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4720
-msgid ""
-"URL for the video, if it is available on a sharing website (Only Youtube for "
-"the moment).\n"
-" It can also be a h264/ogg file, which will in this case be handled by the "
-"HTML5 video player."
+#: ../lib/advene/rules/elements.py:1078
+msgid "Audio enrichment"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4770
-msgid "Could not export data: "
+#: ../lib/advene/rules/elements.py:1079
+msgid "Image enrichment"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4772
-#, python-format
-msgid "Website export to %s completed"
+#: ../lib/advene/rules/elements.py:1080
+msgid "External display control"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4811
-msgid "This video player is not able to grab specific screenshots"
+#: ../lib/advene/rules/elements.py:1081
+msgid "Popup"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4821
-#, python-format
-msgid "Updating %d snapshots"
+#: ../lib/advene/rules/elements.py:1083
+msgid "State"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4826
-msgid "No snapshot to update"
+#: ../lib/advene/rules/elements.py:1084
+msgid "GUI actions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4835 ../lib/advene/gui/main.py:4947
-msgid "You first must load a movie into Advene"
+#: ../lib/advene/rules/elements.py:1085
+msgid "Expert"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4838 ../lib/advene/gui/main.py:4950
-#, python-format
-msgid "The movie %s does not seem to exist."
+#: ../lib/advene/util/helper.py:409
+msgid "Annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4895
-msgid "Generating screenshots"
+#: ../lib/advene/util/helper.py:410
+msgid "Relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4900
-msgid ""
-"<b>Screenshot generation</b>\n"
-"\n"
-"Screenshots will be captured approximately every 500ms.\n"
-"\n"
-"If the movie was paused or playing, the capture will begin at the current "
-"position. Else, it will begin at the beginning of the movie.\n"
-"Note that the main interface will not be refreshed as long as this window is "
-"open."
+#: ../lib/advene/util/helper.py:416
+msgid "Resource Folder"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4941
-msgid ""
-"The <b>shotdetect</b> application does not seem to be installed. Please "
-"check that it is present and that its path is correctly specified in "
-"preferences."
+#: ../lib/advene/util/helper.py:452
+msgid "---- Elements ----"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4981
-msgid ""
-"Cannot import shotdetect output. Did you install the shotdetect software?"
+#: ../lib/advene/util/helper.py:458
+msgid "---- Attributes ----"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4998
-msgid "Incomplete shots"
+#: ../lib/advene/util/helper.py:461
+msgid "---- Methods ----"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5001
+#: ../lib/advene/util/helper.py:534
 #, python-format
-msgid "Detected %s shots"
+msgid "Cannot read %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5103
+#: ../lib/advene/util/helper.py:541
 #, python-format
-msgid "Could not run shotdetect: %s"
+msgid "File %s is not an Advene zip package - no mimetype."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5107
+#: ../lib/advene/util/helper.py:543
 #, python-format
-msgid "Detecting shots from %s"
+msgid "File %(fname)s is not an Advene zip package - wrong mimetype %(type)s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5160
-msgid "Shot detection"
+#: ../lib/advene/util/helper.py:559
+#, python-format
+msgid ""
+"Error:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5166
-msgid ""
-"<b>Shot detection</b>\n"
-"\n"
-"Advene will try to detect shots from the currently loaded movie. The "
-"threshold parameter is used to specify the sensitivity of the algorithm, and "
-"should typically be between 50 and 80. If too many shots are detected, try "
-"to augment its value."
+#: ../lib/advene/util/helper.py:641
+msgid "schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5182
-msgid "Sensitivity"
+#: ../lib/advene/util/helper.py:641
+msgid "schemas"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:138
-msgid "Choose the file to insert"
+#: ../lib/advene/util/helper.py:642
+msgid "annotation"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:146
-msgid "Select a valid identifier"
+#: ../lib/advene/util/helper.py:642
+msgid "annotations"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:147
-#, python-format
-msgid ""
-"The filename %s contains invalid characters\n"
-"that have been replaced.\n"
-"You can modify this identifier if necessary:"
+#: ../lib/advene/util/helper.py:643 ../lib/advene/util/helper.py:644
+msgid "annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:158
-msgid "Choose the soundclip to insert"
+#: ../lib/advene/util/helper.py:643 ../lib/advene/util/helper.py:644
+msgid "annotation types"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:162
-msgid "Choose the directory to insert"
+#: ../lib/advene/util/helper.py:645
+msgid "relation"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:177
-msgid "Named-Entity extraction using NERD"
+#: ../lib/advene/util/helper.py:645
+msgid "relations"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:181
-msgid ""
-"Give the offset to use\n"
-"on specified element.\n"
-"It is in ms and can be\n"
-"either positive or negative."
+#: ../lib/advene/util/helper.py:646 ../lib/advene/util/helper.py:647
+msgid "relation type"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:225
-#, python-format
-msgid "Replace content in %s"
+#: ../lib/advene/util/helper.py:646 ../lib/advene/util/helper.py:647
+msgid "relation types"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:228
-#, python-format
-msgid "Replace content in annotations of type %s"
+#: ../lib/advene/util/helper.py:648
+msgid "query"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:231
-msgid "Replace content in all annotations"
+#: ../lib/advene/util/helper.py:648
+msgid "queries"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:324
-#, python-format
-msgid "Copy id %s"
+#: ../lib/advene/util/helper.py:649
+msgid "view"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:358
-#, python-format
-msgid ""
-"<b>Statistics about %s</b>\n"
-"\n"
+#: ../lib/advene/util/helper.py:649
+msgid "views"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:364
-#, python-format
-msgid "Renumbering annotations of type %s"
+#: ../lib/advene/util/helper.py:650
+msgid "package"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:371
-msgid ""
-"<b>Renumber all annotations according to their order.</b>\n"
-"\n"
-"<i>Note that this action cannot be undone.</i>\n"
-"Replace the first numeric value of the annotation content with the new "
-"annotation number.\n"
-"If no numeric value is found and the annotation is structured, it will "
-"insert the number.\n"
-"If no numeric value is found and the annotation is of type text/plain, it "
-"will overwrite the annotation content.\n"
-"The offset parameter allows you to renumber from a given annotation."
+#: ../lib/advene/util/helper.py:650
+msgid "packages"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:377 ../lib/advene/gui/popup.py:484
-msgid "Offset"
+#: ../lib/advene/util/helper.py:662
+#, python-format
+msgid "No %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:399
+#: ../lib/advene/util/helper.py:664
 #, python-format
-msgid "Renumbering %d annotations"
+msgid "1 %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:408
+#: ../lib/advene/util/helper.py:666
 #, python-format
-msgid "Annotation #%d"
+msgid "%(count)d %(plural)s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:445
+#: ../lib/advene/util/website_export.py:63
 #, python-format
-msgid ""
-"Exporting annotation %(title)s\n"
-"from %(begin)s to %(end)s\n"
-"to %%(filename)s"
+msgid "%s exists but is not a directory. Cancelling website export"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:458
-msgid "Browse"
+#: ../lib/advene/util/website_export.py:69
+#, python-format
+msgid "%s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:466 ../lib/advene/gui/popup.py:853
-msgid "Open in web browser"
+#: ../lib/advene/util/website_export.py:423
+msgid "Starting export"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:479
-msgid "Search/replace content"
+#: ../lib/advene/util/website_export.py:452
+#, python-format
+msgid "Depth %d"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:497
-msgid "Desactivate"
+#: ../lib/advene/util/website_export.py:456
+#, python-format
+msgid "Depth %(depth)d: processing %(url)s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:514
-msgid "Loop"
+#: ../lib/advene/util/website_export.py:478
+msgid "Finalizing"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:515
-msgid "Duplicate"
+#: ../lib/advene/util/website_export.py:512
+#, python-format
+msgid ""
+"<p><strong>You should probably begin at <a href=\"%(href)s\">%(title)s</a>.</"
+"strong></p>"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:519
-msgid "Save snapshot..."
+#: ../lib/advene/util/website_export.py:555
+msgid "Export complete"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:521
-msgid "Extract video fragment"
+#: ../lib/advene/util/importer.py:134
+msgid "Generic importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:551
-msgid "Incoming"
+#: ../lib/advene/util/importer.py:188
+msgid "Usage: %prog [options] source-file destination-file"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:567
-msgid "Outgoing"
+#: ../lib/advene/util/importer.py:192
+msgid "Specify the offset in ms"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:582
-msgid "Related annotations"
+#: ../lib/advene/util/importer.py:264
+msgid ""
+"Import filter error. The asynchronous API should be used, please report a "
+"bug."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:589
-msgid "Incoming relations"
+#: ../lib/advene/util/importer.py:266
+msgid ""
+"Import filter error. No conversion method is defined,  please report a bug."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:596
-msgid "Outgoing relations"
+#: ../lib/advene/util/importer.py:532
+msgid "ExternalApp importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:612
+#: ../lib/advene/util/importer.py:546
 #, python-format
-msgid "Begin: %s"
+msgid ""
+"The <b>%s</b> application does not seem to be installed. Please check that "
+"it is present and that its path is correctly specified in preferences."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:614
+#: ../lib/advene/util/importer.py:548
 #, python-format
-msgid "End: %s"
+msgid "The file %s does not seem to exist."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:615
+#: ../lib/advene/util/importer.py:570
 #, python-format
-msgid "Duration: %s"
+msgid "Could not run %(appname)s: %(msg)s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:622
-msgid "Members:"
+#: ../lib/advene/util/importer.py:572
+#, python-format
+msgid "Processing %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:635
-msgid "Edit package properties..."
+#: ../lib/advene/util/importer.py:576
+msgid "Cleaning up..."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:636 ../lib/advene/gui/popup.py:756
-#, python-format
-msgid "%d annotations(s) - statistics"
+#: ../lib/advene/util/importer.py:687
+msgid "Text importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:638 ../lib/advene/gui/popup.py:864
-msgid "Create a new static view..."
+#: ../lib/advene/util/importer.py:700 ../lib/advene/util/importer.py:1225
+msgid "Specify the encoding of the input file (latin1, utf8...)"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:639 ../lib/advene/gui/popup.py:865
-msgid "Create a new dynamic view..."
+#: ../lib/advene/util/importer.py:703
+msgid "Should the timestamps be encoded relative to the first timestamp?"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:640 ../lib/advene/gui/popup.py:751
-msgid "Create a new annotation..."
+#: ../lib/advene/util/importer.py:706
+msgid "Unit to consider for integers"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:642 ../lib/advene/gui/popup.py:867
-msgid "Create a new schema..."
+#: ../lib/advene/util/importer.py:709
+msgid ""
+"What timestamps are present in a line (only begin, both begin and end, or "
+"automatic recognition)"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:643 ../lib/advene/gui/popup.py:862
-msgid "Create a new query..."
+#: ../lib/advene/util/importer.py:852
+msgid "lsdvd importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:651
-msgid "Create a new folder..."
+#: ../lib/advene/util/importer.py:879
+msgid "Processing data"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:652
-msgid "Create a new resource file..."
+#: ../lib/advene/util/importer.py:897 ../lib/advene/util/importer.py:957
+msgid "DVD Chapter"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:653
-msgid "Insert a new resource file..."
+#: ../lib/advene/util/importer.py:901
+msgid "Launching lsdvd..."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:654
-msgid "Insert a new resource directory..."
+#: ../lib/advene/util/importer.py:913
+msgid "chaplin importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:663 ../lib/advene/gui/popup.py:665
-msgid "Insert a soundclip..."
+#: ../lib/advene/util/importer.py:971
+msgid "Xi importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:676
-msgid "Play sound"
+#: ../lib/advene/util/importer.py:1039
+msgid "ELAN importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:686
-msgid "Create a new annotation type..."
+#: ../lib/advene/util/importer.py:1092
+#, python-format
+msgid "Converting tier %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:688
-msgid "Create a new relation type..."
+#: ../lib/advene/util/importer.py:1189
+msgid "Processing time slots"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:699
-#, python-format
-msgid "A caption dynamic view for %s already seems to exist."
+#: ../lib/advene/util/importer.py:1204
+msgid "Fixing forward references"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:708
-#, python-format
-msgid "Caption %s annotations"
+#: ../lib/advene/util/importer.py:1206
+msgid "Creating relations"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:740
-msgid "Create a comment view"
+#: ../lib/advene/util/importer.py:1218
+msgid "Subtitle (SRT) importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:741
-msgid "Generate a caption dynamic view..."
+#: ../lib/advene/util/importer.py:1276
+#, python-format
+msgid "Subtitles from %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:742
-msgid "Display as transcription"
+#: ../lib/advene/util/importer.py:1281
+msgid ""
+"Cannot decode subtitle file. Try to specify an encoding (latin1 perhaps?)."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:743
-msgid "Display annotations in table"
+#: ../lib/advene/util/importer.py:1292
+msgid "PRAAT importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:744
-msgid "Export to another format..."
+#: ../lib/advene/util/importer.py:1381
+msgid "CMML importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:746
-msgid "Extract Named Entities..."
+#: ../lib/advene/util/importer.py:1444
+msgid "Parsing clip information"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:752
-msgid "Delete all annotations"
+#: ../lib/advene/util/importer.py:1544
+msgid "Creating CMML schema"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:753
-msgid "Renumber annotations..."
+#: ../lib/advene/util/importer.py:1568
+msgid "Parsing stream information"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:754
-msgid "Shot validation view..."
+#: ../lib/advene/util/importer.py:1602
+msgid "IRI importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:766
-#, python-format
-msgid "A follow dynamic view for %s already seems to exist."
+#: ../lib/advene/util/importer.py:1611
+msgid "Generate one type per view"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:775
+#: ../lib/advene/util/importer.py:1630
 #, python-format
-msgid "Follow %s relation-type"
-msgstr ""
-
-#: ../lib/advene/gui/popup.py:784
-msgid "Follow the relation"
+msgid "Parsing ensemble %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:804
-msgid "Delete all relations..."
+#: ../lib/advene/util/importer.py:1641
+#, python-format
+msgid "Parsing decoupage %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:805
-msgid "Create montage from related annotations"
+#: ../lib/advene/util/importer.py:1676
+msgid "Parsing views"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:806
-msgid "Create dynamic view following relations"
+#: ../lib/advene/util/importer.py:1723 ../lib/advene/util/importer.py:1812
+msgid "Initializing package"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:824
-msgid "Apply query on..."
+#: ../lib/advene/util/importer.py:1761
+msgid "IRIData importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:849
-msgid "Activate view"
+#: ../lib/advene/util/importer.py:1775
+msgid "Parsing sound values"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:851
-msgid "Open adhoc view"
+#: ../lib/advene/util/importer.py:1787
+msgid "Creating annotations"
 msgstr ""
diff --git a/po/de.po b/po/de.po
index 3909547..127ebec 100644
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: advene\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-07-09 17:25+0200\n"
+"POT-Creation-Date: 2017-10-12 22:02+0200\n"
 "PO-Revision-Date: 2007-08-11 18:51+0000\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: German <de at li.org>\n"
@@ -18,3128 +18,2824 @@ msgstr ""
 "X-Launchpad-Export-Date: 2007-10-22 13:38+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
-#: ../lib/advene/model/zippackage.py:187 ../lib/advene/model/zippackage.py:189
-#: ../lib/advene/util/helper.py:538 ../lib/advene/util/helper.py:540
-#, python-format
-msgid "File %s is not an Advene zip package."
-msgstr ""
-
-#: ../lib/advene/model/zippackage.py:243
-#, python-format
-msgid "Directory %s is not an extracted Advene zip package."
-msgstr ""
-
-#: ../lib/advene/model/bundle.py:296
+#: ../lib/advene/model/bundle.py:292
 #, python-format
 msgid "%s not in bundle"
 msgstr ""
 
-#: ../lib/advene/model/bundle.py:362
+#: ../lib/advene/model/bundle.py:358
 msgid "List of non-typed elements"
 msgstr ""
 
-#: ../lib/advene/model/bundle.py:367
+#: ../lib/advene/model/bundle.py:363
 #, python-format
 msgid "List of %s elements"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:263 ../lib/advene/rules/actions.py:36
-#: ../lib/advene/gui/plugins/actions.py:40
-msgid "Display a message"
+#: ../lib/advene/model/zippackage.py:161 ../lib/advene/model/zippackage.py:163
+#, python-format
+msgid "File %s is not an Advene zip package."
 msgstr ""
 
-#: ../lib/advene/core/controller.py:264
-#: ../lib/advene/gui/plugins/actions.py:41
-#: ../lib/advene/gui/plugins/actions.py:53
-#: ../lib/advene/gui/plugins/actions.py:71
-#: ../lib/advene/gui/plugins/actions.py:86
-#: ../lib/advene/gui/plugins/actions.py:102
-#: ../lib/advene/gui/plugins/actions.py:203
-msgid "String to display."
+#: ../lib/advene/model/zippackage.py:219
+#, python-format
+msgid "Directory %s is not an extracted Advene zip package."
 msgstr ""
 
-#: ../lib/advene/core/controller.py:362
-msgid "Exception (traceback in console):"
-msgstr ""
+#: ../lib/advene/gui/widget.py:295
+#, fuzzy, python-format
+msgid "Set of %s annotations"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/core/controller.py:393
-msgid "No available GUI"
+#: ../lib/advene/gui/widget.py:1006
+#: ../lib/advene/gui/views/transcription.py:459
+#: ../lib/advene/gui/edit/montage.py:60
+msgid "Play"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:412
-msgid "No available event handler"
-msgstr ""
+#: ../lib/advene/gui/widget.py:1010 ../lib/advene/gui/edit/timeadjustment.py:77
+#, fuzzy
+msgid "Refresh snapshot"
+msgstr "Zeige Shortcuts"
 
-#: ../lib/advene/core/controller.py:420
-msgid "No available gui"
-msgstr ""
+#: ../lib/advene/gui/widget.py:1014
+#, fuzzy
+msgid "Save as..."
+msgstr "Kein Pakte"
 
-#: ../lib/advene/core/controller.py:436
-#, python-format
-msgid "Warning: redefining an existing feature %s"
-msgstr ""
+#: ../lib/advene/gui/widget.py:1019
+#, fuzzy
+msgid "Use current player position"
+msgstr "Aktuelle Sitzung speichern"
 
-#: ../lib/advene/core/controller.py:568
-msgid "All annotations"
+#: ../lib/advene/gui/widget.py:1025
+msgid "Adjust timestamp"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:569 ../lib/advene/gui/edit/rules.py:358
-#, python-format
-msgid "Annotations of type %s"
-msgstr ""
+#: ../lib/advene/gui/main.py:200 ../lib/advene/gui/main.py:314
+#, fuzzy
+msgid "_Select player"
+msgstr "Wähle einen DVD"
 
-#: ../lib/advene/core/controller.py:570 ../lib/advene/gui/edit/imports.py:129
-#: ../lib/advene/gui/edit/imports.py:130
-msgid "Views"
-msgstr ""
+#: ../lib/advene/gui/main.py:202 ../lib/advene/gui/main.py:299
+msgid "_View"
+msgstr "_Zeige"
 
-#: ../lib/advene/core/controller.py:570 ../lib/advene/gui/edit/elements.py:521
-msgid "Tags"
-msgstr ""
+#: ../lib/advene/gui/main.py:204 ../lib/advene/gui/main.py:316
+msgid "Packages"
+msgstr "Pakete"
 
-#: ../lib/advene/core/controller.py:570
-msgid "Ids"
+#: ../lib/advene/gui/main.py:207 ../lib/advene/gui/main.py:258
+msgid "Open recent"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:747
-#, python-format
-msgid ""
-"Cannot start the webserver\n"
-"The following processes seem to use the %(port)s port: %(processes)s"
+#: ../lib/advene/gui/main.py:252
+msgid "Input from the keyboard (function keys)"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:797 ../lib/advene/core/controller.py:808
-#, python-format
-msgid "Loaded %(uri)s as %(alias)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:255
+msgid "_File"
+msgstr "_Datei"
 
-#: ../lib/advene/core/controller.py:799 ../lib/advene/core/controller.py:811
-#, python-format
-msgid "Cannot load package from file %(uri)s: %(error)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:256
+#, fuzzy
+msgid "_New package"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/core/controller.py:850
-msgid "Deactivating web server"
-msgstr ""
+#: ../lib/advene/gui/main.py:256
+#, fuzzy
+msgid "Create a new package"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/core/controller.py:970
-#, python-format
-msgid "Cannot get audio volume: %s"
-msgstr ""
+#: ../lib/advene/gui/main.py:257
+#, fuzzy
+msgid "_Open package"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/core/controller.py:1020
-#, python-format
-msgid "Cannot open Advene URL %s: the webserver is not running."
-msgstr ""
+#: ../lib/advene/gui/main.py:257
+#, fuzzy
+msgid "Open a package"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/core/controller.py:1128 ../lib/advene/gui/edit/merge.py:272
-msgid "None"
-msgstr ""
+#: ../lib/advene/gui/main.py:258
+#, fuzzy
+msgid "Show recently opened packages"
+msgstr "Aktuelle Sitzung speichern"
 
-#: ../lib/advene/core/controller.py:1222
-#, python-format
-msgid "Found matching video file in moviepath: %s"
-msgstr ""
+#: ../lib/advene/gui/main.py:259
+#, fuzzy
+msgid "_Save package"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/core/controller.py:1263 ../lib/advene/core/controller.py:1265
-msgid "Analysis of "
-msgstr ""
+#: ../lib/advene/gui/main.py:259
+#, fuzzy
+msgid "Save the package"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/core/controller.py:1465
-msgid "Cannot split the annotation: the given position is outside."
-msgstr ""
+#: ../lib/advene/gui/main.py:260
+#, fuzzy
+msgid "Save package as..."
+msgstr "Kein Pakte"
 
-#: ../lib/advene/core/controller.py:1630
-#, python-format
-msgid "Cannot find the template package %(filename)s: %(error)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:260
+#, fuzzy
+msgid "Save the package as..."
+msgstr "Kein Pakte"
 
-#: ../lib/advene/core/controller.py:1672
-#, python-format
-msgid "Cannot read the imported package %(uri)s: %(error)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:261
+#, fuzzy
+msgid "Close package"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/core/controller.py:1907
-msgid "Package URI has changed. Reloading package with new URI."
-msgstr ""
+#: ../lib/advene/gui/main.py:261
+#, fuzzy
+msgid "Close the package"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/core/controller.py:1925
-msgid ""
-"Cannot load package: the following annotations do not have Millisecond "
-"fragments:"
-msgstr ""
+#: ../lib/advene/gui/main.py:263
+msgid "Save session"
+msgstr "Sitzung speichern"
 
-#: ../lib/advene/core/controller.py:1952
-#, python-format
-msgid "Cannot handle master attribute, the package %s is not imported."
-msgstr ""
+#: ../lib/advene/gui/main.py:263
+#, fuzzy
+msgid "Save the current session (list of opened packages)"
+msgstr "Aktuelle Sitzung speichern"
 
-#: ../lib/advene/core/controller.py:1954
-#, python-format
-msgid "Checking master package %s for not yet imported elements."
+#: ../lib/advene/gui/main.py:264
+msgid "Save workspace"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1994
-msgid "Standard summary"
+#: ../lib/advene/gui/main.py:265
+msgid "...as package view"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1999
-msgid "Default view"
+#: ../lib/advene/gui/main.py:266
+msgid "...as standard workspace"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2041
-#, python-format
-msgid ""
-"Infinite loop in STBV %(name)s: the %(imp)s view is invoked multiple times."
+#: ../lib/advene/gui/main.py:266
+msgid "Use the current layout as standard workspace in the future"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2131
-#, python-format
-msgid "Got exception %s when stopping player."
-msgstr ""
+#: ../lib/advene/gui/main.py:268
+#, fuzzy
+msgid "Associate a video _File"
+msgstr "Wähle eine Video Datei"
 
-#: ../lib/advene/core/controller.py:2214
-#, python-format
-msgid "Raised exception in update_status: %s"
-msgstr ""
+#: ../lib/advene/gui/main.py:268
+#, fuzzy
+msgid "Associate a video file"
+msgstr "Wähle eine Video Datei"
 
-#: ../lib/advene/core/controller.py:2241
-msgid "Unable to start the player."
-msgstr ""
+#: ../lib/advene/gui/main.py:269
+#, fuzzy
+msgid "Associate a _DVD"
+msgstr "Wähle eine DVD Kapitel"
 
-#: ../lib/advene/core/controller.py:2448
-#, fuzzy, python-format
-msgid "Comment on set of %d annotations"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/main.py:269
+#, fuzzy
+msgid "Associate a chapter from a DVD"
+msgstr "Wähle eine DVD Kapitel"
 
-#: ../lib/advene/core/controller.py:2450
-#, python-format
-msgid "Comment on %s"
-msgstr ""
+#: ../lib/advene/gui/main.py:270
+#, fuzzy
+msgid "Associate a _Video stream"
+msgstr "Wähle einen video stream"
 
-#: ../lib/advene/core/controller.py:2454
-#, python-format
-msgid ""
-"<h1>Comment on %(title)s</h1>\n"
-"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
-"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
-"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
-"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
-"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
-"\"%(imgurl)s\" ></img></a></span>"
-msgstr ""
+#: ../lib/advene/gui/main.py:270
+msgid "Enter a video stream address"
+msgstr "Gebe eine Video Stream Adresse ein"
 
-#: ../lib/advene/core/controller.py:2464
-#, fuzzy, python-format
-msgid "List of %s annotations"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/main.py:272
+msgid "_Import File"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/core/controller.py:2499
-#, python-format
-msgid "Cannot export to %(filename)s: %(e)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:272
+msgid "Import data from an external source"
+msgstr "Importiere Daten von einer Externen Quelle"
 
-#: ../lib/advene/core/controller.py:2514 ../lib/advene/core/controller.py:2523
-#, python-format
-msgid "Error when exporting: %s"
-msgstr ""
+#: ../lib/advene/gui/main.py:273
+#, fuzzy
+msgid "_Process video"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/core/controller.py:2525 ../lib/advene/gui/views/table.py:406
-#: ../lib/advene/gui/views/table.py:536
-#, python-format
-msgid "Data exported to %s"
-msgstr ""
+#: ../lib/advene/gui/main.py:273
+#, fuzzy
+msgid "Import data from video processing algorithms"
+msgstr "Importiere Daten von einer Externen Quelle"
 
-#: ../lib/advene/core/webcherry.py:51
-msgid "The webserver requires version 3.0 of CherryPy at least."
-msgstr ""
+#: ../lib/advene/gui/main.py:275
+msgid "Merge package"
+msgstr "Vereine Packete"
 
-#: ../lib/advene/core/webcherry.py:167
-#, python-format
-msgid ""
-"\n"
-"            <p>\n"
-"            <a href=\"/admin\">Server administration</a> |\n"
-"            <a href=\"/media\">Media control</a> |\n"
-"            <a href=\"%(path)s?mode=raw\">Raw view</a>\n"
-"            </p>\n"
-"            Location: %(locationbar)s\n"
-"            <hr>\n"
-"            "
-msgstr ""
+#: ../lib/advene/gui/main.py:275
+msgid "Merge elements from another package"
+msgstr "Füge Elemente von anderen Packeten hinzu"
 
-#: ../lib/advene/core/webcherry.py:227
-msgid "Unspecified Error"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:228
-#, python-format
-msgid ""
-"\n"
-"        <h1>Error</h1>\n"
-"        <p>An error occurred:</p>\n"
-"        %s\n"
-"        "
-msgstr ""
-"\n"
-"        <h1>Fehler</h1>\n"
-"        <p>Ein Fehler tauchte auf:</p>\n"
-"        %s\n"
-"        "
-
-#: ../lib/advene/core/webcherry.py:261
-msgid "<h1>No available mediaplayer</h1>"
-msgstr "<h1>Kein verfügbarer Mediaplayer</h1>"
-
-#: ../lib/advene/core/webcherry.py:265
-#, python-format
-msgid ""
-"\n"
-"            <h1>Current STBV: %(currentstbv)s</h1>\n"
-"\n"
-"            <h1>Player status</h1>\n"
-"            <table border=\"1\">\n"
-"            <tr>\n"
-"            <td>Current position</td><td>%(position)s</td>\n"
-"            <td>Duration</td><td>%(duration)s</td>\n"
-"            <td>Player status</td><td>%(status)s</td>\n"
-"            </tr>\n"
-"            </table>\n"
-"            "
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:284
-msgid "<h1>No playlist</h1>"
-msgstr "<h1>Keine Abspielliste</h1>"
-
-#: ../lib/advene/core/webcherry.py:286
-#, python-format
-msgid ""
-"<h1>Current playlist</h1>\n"
-"                <ul>%s</ul>"
-msgstr ""
-"<h1>Gegenwärtige Abspielliste</h1>\n"
-"                <ul>%s</ul>"
-
-#: ../lib/advene/core/webcherry.py:288
-msgid ""
-"\n"
-"                <form action=\"/media/play\" method=\"GET\">\n"
-"                Starting pos: <input type=\"text\" name=\"position\" value="
-"\"0\">\n"
-"                <input type=\"submit\" value=\"Play\">\n"
-"                </form>\n"
-"                <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
-"\">Pause</a><br>\n"
-"                "
-msgstr ""
-"\n"
-"                <form action=\"/media/play\" method=\"GET\">\n"
-"                Start position: <input type=\"text\" name=\"position\" value="
-"\"0\">\n"
-"                <input type=\"submit\" value=\"Play\">\n"
-"                </form>\n"
-"                <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
-"\">Pause</a><br>\n"
-"                "
-
-#: ../lib/advene/core/webcherry.py:295
-msgid ""
-"<hr />\n"
-"            <form action=\"/media/load\" method=\"GET\">\n"
-"            Add a new file (<em>dvd</em> to play a DVD):\n"
-"            <input type=\"text\" name=\"filename\">\n"
-"            <input type=\"submit\" value=\"Add\">\n"
-"            </form>"
-msgstr ""
-"<hr />\n"
-"            <form action=\"/media/load\" method=\"GET\">\n"
-"            Neue DAtei hinzufügen (<em>dvd</em> für  DVD):\n"
-"            <input type=\"text\" name=\"filename\">\n"
-"            <input type=\"submit\" value=\"Add\">\n"
-"            </form>"
-
-#: ../lib/advene/core/webcherry.py:301
-msgid ""
-"<h3><a href=\"/media/snapshot\">Access to current packages snapshots</h3>"
-msgstr ""
-"<h3><a href=\"/media/snapshot\">zugriff auf gegenwärtige Paket "
-"Schnappschüsse</h3>"
-
-#: ../lib/advene/core/webcherry.py:310
-#, python-format
-msgid "Unknown STBV identifier: %s"
-msgstr "Unbekannte STBV identifier: %s"
-
-#: ../lib/advene/core/webcherry.py:385
-msgid "Media information"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:398
-msgid "File added"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:399
-#, python-format
-msgid "<p><strong>%s has been added to the playlist</strong></p>"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:410 ../lib/advene/core/webcherry.py:472
-msgid "Access to packages snapshots"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:420 ../lib/advene/core/webcherry.py:482
-msgid "Unknown package alias"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:426
-#, python-format
-msgid "Available snapshots for %s"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:432
-#, python-format
-msgid ""
-"<p><a href=\"/media/snapshot/%s?mode=inline\">Display with inline images</"
-"a></p>"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:439
-msgid "Done"
-msgstr "Erledigt"
-
-#: ../lib/advene/core/webcherry.py:441
-msgid "Pending"
-msgstr "Ausstehend"
-
-#: ../lib/advene/core/webcherry.py:487
-#, fuzzy, python-format
-msgid "Unknown annotation id: %s"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/core/webcherry.py:610 ../lib/advene/core/webcherry.py:728
-#, python-format
-msgid "Cannot activate stbvid %(stbvid)s: %(error)s"
-msgstr "Kann nicht stbvid %(stbvid)s: %(error)s aktivieren"
-
-#: ../lib/advene/core/webcherry.py:675
-msgid "<p>No GUI is available."
-msgstr "<p>Kein GUI zur Verfügung"
-
-#: ../lib/advene/core/webcherry.py:677
-#, python-format
-msgid "<p>Opened adhoc views: %s</p>"
-msgstr "<p>Geöffnete adhoc ansichten: %s</p>"
-
-#: ../lib/advene/core/webcherry.py:678
-msgid "<p>Available adhoc views:</p><ul>"
-msgstr "<p>Verfügbare adhoc ansichten:</p><ul>"
-
-#: ../lib/advene/core/webcherry.py:699
-#, python-format
-msgid "<p>Current stbv: %s</p>"
-msgstr "<p>Gegenwärtige stbv: %s</p>"
-
-#: ../lib/advene/core/webcherry.py:700
-#, python-format
-msgid "<p>You can activate the following STBV:</p><ul>%s</ul>"
-msgstr "<p>Du kannst nicht folgende STBV:</p><ul>%s</ul> aktivieren"
-
-#: ../lib/advene/core/webcherry.py:702
-msgid "Activate and play"
-msgstr "Aktivieren und Abspielen"
-
-#: ../lib/advene/core/webcherry.py:708
-msgid "Application information"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:778
-msgid "Missing element id parameter"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:782
-#, python-format
-msgid "No existing element with id %s"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:791
-#, python-format
-msgid "<p>The GUI view %s does not exist.</p>"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:798
-msgid "Invalid request"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:803
-msgid "Invalid configuration variable name"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:815
-msgid "Invalid value"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:819
-#, python-format
-msgid "Unsupported method %s"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:845
-#, python-format
-msgid ""
-"\n"
-"        <h1>Authorized hosts</h1>\n"
-"        <table border=\"1\">\n"
-"        <tr><th>Host</th><th>IP Addr</th><th>Action</th></tr>\n"
-"        %s\n"
-"        </table>\n"
-"        <form method=\"GET\">\n"
-"        Add a new hostname to the list :<br>\n"
-"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
-"\"Add\">\n"
-"        </form>\n"
-"        "
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:859
-msgid "Access control"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:864
-msgid "Access control - add a hostname"
-msgstr "Zugriffs Kontrolle - Füge Hostname hinzu"
-
-#: ../lib/advene/core/webcherry.py:872 ../lib/advene/core/webcherry.py:886
-#, python-format
-msgid "<strong>Error: %s is an invalid hostname.</strong>"
-msgstr "<strong>Fehler: %s ist ein ungültiger hostname.</strong>"
-
-#: ../lib/advene/core/webcherry.py:875
-#, python-format
-msgid "<p>Added %s to authorized hosts list.</p>"
-msgstr "<p>Füge %s zur authorisierten host liste.</p>"
-
-#: ../lib/advene/core/webcherry.py:881
-msgid "Access control - delete a hostname"
-msgstr "Zugriffs Kontrolle - Lösche einen Hostnamen"
-
-#: ../lib/advene/core/webcherry.py:889
-msgid "<strong>Cannot remove the localhost access.</strong>"
-msgstr "<strong>Du kannst nicht den localhost zugriff löschen</strong>"
-
-#: ../lib/advene/core/webcherry.py:894
-#, python-format
-msgid "<p>Removed %s from authorized hosts list.</p>"
-msgstr "<p>lösche %s von der Host liste</p>"
-
-#: ../lib/advene/core/webcherry.py:896
-#, python-format
-msgid "<p>%s is not in authorized hosts list.</p>"
-msgstr "<p>%s ist keine authorisierte Hostliste</p>"
-
-#: ../lib/advene/core/webcherry.py:945
-msgid "Server Administration"
-msgstr "Server Administration"
-
-#: ../lib/advene/core/webcherry.py:953
-#, python-format
-msgid ""
-"\n"
-"        <p><a href=\"/admin/access\">Update the access list</a></p>\n"
-"        <p><a href=\"/admin/methods\">List available TALES methods</a></p>\n"
-"        <p><a href=\"/action\">List available actions</a></p>\n"
-"        <p><a href=\"/admin/reset\">Reset the server</a></p>\n"
-"        <p><a href=\"/media\">Media control</a></p>\n"
-"        <p><a href=\"/application\">Display GUI status</a></p>\n"
-"        <p><a href=\"/admin/list\">List available files</a></p>\n"
-"        <p><a href=\"/packages\">List loaded packages</a> (%(packagelist)s)</"
-"p>\n"
-"        <p>Display mode : %(displaymode)s</p>\n"
-"        <hr>\n"
-"        <p>Load a package :\n"
-"        <form action=\"/admin/load\" method=\"GET\">\n"
-"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
-"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
-"        <input type=\"submit\" value=\"Load\" />\n"
-"        </form>\n"
-"        </body></html>\n"
-"        "
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:983
-msgid "Available files"
-msgstr ""
+#: ../lib/advene/gui/main.py:276
+msgid "Import _DVD chapters"
+msgstr "Importiere _DVD Kapitel"
 
-#: ../lib/advene/core/webcherry.py:1009
-msgid "You should specify an alias"
-msgstr ""
+#: ../lib/advene/gui/main.py:276
+msgid "Create annotations based on DVD chapters"
+msgstr "Erschaffe Anmerkung auf Basis des DVD Kapitels"
 
-#: ../lib/advene/core/webcherry.py:1014
-msgid "You should specify an uri"
-msgstr ""
+#: ../lib/advene/gui/main.py:278
+#, fuzzy
+msgid "_Export..."
+msgstr "Datei _importieren"
 
-#: ../lib/advene/core/webcherry.py:1020
-#, python-format
-msgid "Package %s loaded"
-msgstr ""
+#: ../lib/advene/gui/main.py:278
+#, fuzzy
+msgid "Export data to another format"
+msgstr "Importiere Daten von einer Externen Quelle"
 
-#: ../lib/advene/core/webcherry.py:1021 ../lib/advene/core/webcherry.py:1057
-#, python-format
-msgid ""
-"<p>Go to the <a href=\"/packages/%(alias)s\">%(alias)s</a> package, or to "
-"the <a href=\"/packages\">package list</a>."
+#: ../lib/advene/gui/main.py:279
+msgid "_Website export..."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1024
-#, python-format
-msgid "<p>Cannot load package %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:279
+msgid "Export views to a website"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1035
-#, python-format
-msgid "Package %s deleted"
-msgstr ""
+#: ../lib/advene/gui/main.py:281
+#, fuzzy
+msgid "_Quit"
+msgstr "_Bearbeite"
 
-#: ../lib/advene/core/webcherry.py:1036
-msgid "<p>Go to the <a href=\"/packages\">package list</a>."
-msgstr ""
+#: ../lib/advene/gui/main.py:283
+msgid "_Edit"
+msgstr "_Bearbeite"
 
-#: ../lib/advene/core/webcherry.py:1039
-#, python-format
-msgid "<p>Cannot delete package %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:284
+msgid "_Undo"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1056
-#, python-format
-msgid "Package %s saved"
-msgstr ""
+#: ../lib/advene/gui/main.py:285
+#, fuzzy
+msgid "_Find"
+msgstr "_Datei"
 
-#: ../lib/advene/core/webcherry.py:1060
-#, python-format
-msgid "<p>Cannot save package %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:286
+msgid "_Delete"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1070
-msgid "Server reset"
-msgstr ""
+#: ../lib/advene/gui/main.py:287
+msgid "Create"
+msgstr "Erstelle"
 
-#: ../lib/advene/core/webcherry.py:1076
-msgid "Available TALES methods"
-msgstr ""
+#: ../lib/advene/gui/main.py:288 ../lib/advene/gui/main.py:3337
+#: ../lib/advene/util/helper.py:411
+msgid "Schema"
+msgstr "Schema"
 
-#: ../lib/advene/core/webcherry.py:1117
-msgid "Loaded package(s)"
-msgstr ""
+#: ../lib/advene/gui/main.py:289 ../lib/advene/gui/edit/rules.py:1086
+#: ../lib/advene/rules/actions.py:238 ../lib/advene/util/helper.py:414
+msgid "View"
+msgstr "Darstellung"
 
-#: ../lib/advene/core/webcherry.py:1119
-msgid ""
-"\n"
-"        <h1>Loaded package(s)</h1>\n"
-"        <table border=\"1\" width=\"50%\">\n"
-"        <tr>\n"
-"        <th>Alias</th>\n"
-"        <th>Action</th>\n"
-"        <th>URI</th>\n"
-"        <th>Annotations</th>\n"
-"        </tr>\n"
-"        "
-msgstr ""
+#: ../lib/advene/gui/main.py:290 ../lib/advene/gui/popup.py:488
+#: ../lib/advene/util/helper.py:415
+msgid "Query"
+msgstr "Abfragen"
 
-#: ../lib/advene/core/webcherry.py:1131
-#, python-format
-msgid ""
-"<tr>\n"
-"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
-"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
-"%(uri)s\">Reload</a>|<a href=\"/admin/delete?alias=%(alias)s\">Drop</a>|<a "
-"href=\"/admin/save?alias=%(alias)s\">Save</a></td>\n"
-"            <td>%(uri)s</td>\n"
-"            <td>%(size)d</td>\n"
-"            </tr>\n"
-"            "
-msgstr ""
+#: ../lib/advene/gui/main.py:291 ../lib/advene/util/helper.py:412
+msgid "Annotation Type"
+msgstr "Kommentar Typ"
 
-#: ../lib/advene/core/webcherry.py:1204 ../lib/advene/core/webcherry.py:1279
-#: ../lib/advene/core/webcherry.py:1288 ../lib/advene/core/webcherry.py:1296
-#: ../lib/advene/core/webcherry.py:1454 ../lib/advene/core/webcherry.py:1462
-#: ../lib/advene/core/webcherry.py:1470 ../lib/advene/core/webcherry.py:2032
-#: ../lib/advene/core/webcherry.py:2039
-msgid "Error"
-msgstr ""
+#: ../lib/advene/gui/main.py:292 ../lib/advene/util/helper.py:413
+#, fuzzy
+msgid "Relation Type"
+msgstr "Verbindungs Type"
 
-#: ../lib/advene/core/webcherry.py:1205
-#, python-format
-msgid "The TALES expression %s is not valid."
-msgstr ""
+#: ../lib/advene/gui/main.py:296
+msgid "P_ackage properties"
+msgstr "P_acket Eigenschaften"
 
-#: ../lib/advene/core/webcherry.py:1256
-msgid "Content mode not available on non-content data"
-msgstr ""
+#: ../lib/advene/gui/main.py:296
+msgid "Edit package properties"
+msgstr "Bearbeite Packet Eigentschaften"
 
-#: ../lib/advene/core/webcherry.py:1280 ../lib/advene/core/webcherry.py:1289
-#: ../lib/advene/core/webcherry.py:1297 ../lib/advene/core/webcherry.py:1317
-#: ../lib/advene/core/webcherry.py:1321 ../lib/advene/core/webcherry.py:1455
-#: ../lib/advene/core/webcherry.py:1463 ../lib/advene/core/webcherry.py:1471
-#: ../lib/advene/core/webcherry.py:1530 ../lib/advene/core/webcherry.py:1607
-#: ../lib/advene/core/webcherry.py:1727 ../lib/advene/core/webcherry.py:1777
-msgid "<h1>Error</h1>"
-msgstr ""
+#: ../lib/advene/gui/main.py:297
+msgid "P_references"
+msgstr "E_instellungen"
 
-#: ../lib/advene/core/webcherry.py:1281 ../lib/advene/core/webcherry.py:1322
-#, python-format
-msgid ""
-"<p>There was an error in the template code.</p>\n"
-"                <p>Tag name: <strong>%(tagname)s</strong></p>\n"
-"                <p>Error message: <em>%(message)s</em></p>"
-msgstr ""
+#: ../lib/advene/gui/main.py:297
+msgid "Interface preferences"
+msgstr "Oberflächen Eigentschaften"
 
-#: ../lib/advene/core/webcherry.py:1290
-#, python-format
-msgid ""
-"<p>An invalid character is in the Context:</p>\n"
-"                <p>Error message: <em>%(error)s</em></p><pre>%(message)s</"
-"pre>"
+#: ../lib/advene/gui/main.py:301
+msgid "_Start Web Browser"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1298
-#, python-format
-msgid ""
-"<p>There was an error in the TALES expression.</p>\n"
-"                <pre>%s</pre>"
+#: ../lib/advene/gui/main.py:301
+msgid "Start the web browser"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1318
-#, python-format
-msgid ""
-"<p>There was an error.</p>\n"
-"                <pre>%s</pre>"
+#: ../lib/advene/gui/main.py:303
+msgid "Simplify interface"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1342
-#, python-format
-msgid ""
-"\n"
-"            <hr>\n"
-"            <p>\n"
-"            Location: %(location)s<br>\n"
-"            <form name=\"navigation\" method=\"GET\">\n"
-"            <a href=\"%(levelup)s\">Up one level</a> |\n"
-"            Next level :\n"
-"            <select name=\"path\" onchange=\"submit()\">\n"
-"            "
-msgstr ""
+#: ../lib/advene/gui/main.py:303
+#, fuzzy
+msgid "Simplify the application interface (toggle)"
+msgstr "Zeige Kommentare an einer Timeline"
 
-#: ../lib/advene/core/webcherry.py:1360
-msgid ""
-"\n"
-"            </select> View: <select name=\"view\" onchange=\"submit()\">\n"
-"            <option selected></option>\n"
-"            "
+#: ../lib/advene/gui/main.py:304
+msgid "Evaluator"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1378
-#, python-format
-msgid ""
-"<hr>\n"
-"            <p>Evaluating expression \"<strong>%(expression)s</strong>\" on "
-"package %(uri)s returns %(value)s</p>\n"
-"            "
+#: ../lib/advene/gui/main.py:304
+msgid "Open python evaluator window"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1414
-#, python-format
-msgid "<p>Package <strong>%s</strong> not loaded</p>"
+#: ../lib/advene/gui/main.py:305 ../lib/advene/gui/main.py:4096
+msgid "Webserver log"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1456
-#, python-format
-msgid ""
-"<p>There was an error in the template code.</p>\n"
-"            <p>Tag name: <strong>%(tagname)s</strong></p>\n"
-"            <p>Error message: <em>%(message)s</em></p>"
-msgstr ""
+#: ../lib/advene/gui/main.py:307
+msgid "_Player"
+msgstr "_Spieler"
 
-#: ../lib/advene/core/webcherry.py:1464
-#, python-format
-msgid ""
-"<p>There was an error in the expression.</p>\n"
-"            <pre>%s</pre>"
+#: ../lib/advene/gui/main.py:308
+msgid "Go to _Time"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1472
-#, python-format
-msgid ""
-"<p>Cannot resolve TALES expression %(expr)s on package %(package)s<p><pre>\n"
-"            %(type)s\n"
-"            %(value)s\n"
-"            %(traceback)s</pre>"
+#: ../lib/advene/gui/main.py:308
+msgid "Goto a specified time code"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1531 ../lib/advene/core/webcherry.py:1728
-msgid "<p>Cannot set the value : invalid path</p>"
-msgstr ""
+#: ../lib/advene/gui/main.py:309
+msgid "Save _ImageCache"
+msgstr "Sichere _ImageCache"
 
-#: ../lib/advene/core/webcherry.py:1593 ../lib/advene/core/webcherry.py:1846
-#, python-format
-msgid ""
-"<h1>Error</h1><p>When creating resource %(path)s, the resource folder "
-"%(folder)s could not be created.</p>"
-msgstr ""
+#: ../lib/advene/gui/main.py:309
+msgid "Save the contents of the ImageCache to disk"
+msgstr "Sichere den Inhalt des ImageCaches auf die Festplatte"
 
-#: ../lib/advene/core/webcherry.py:1602 ../lib/advene/core/webcherry.py:1856
-msgid "Resource successfuly created/updated"
-msgstr ""
+#: ../lib/advene/gui/main.py:310
+#, fuzzy
+msgid "Reset ImageCache"
+msgstr "Sichere _ImageCache"
 
-#: ../lib/advene/core/webcherry.py:1611
-msgid "Value successfuly updated"
-msgstr ""
+#: ../lib/advene/gui/main.py:310
+#, fuzzy
+msgid "Reset the ImageCache"
+msgstr "Sichere _ImageCache"
 
-#: ../lib/advene/core/webcherry.py:1613
-#, python-format
-msgid ""
-"Unable to update the attribute %(attribute)s for element %(element)s: "
-"%(error)s."
-msgstr ""
+#: ../lib/advene/gui/main.py:311
+msgid "_Restart player"
+msgstr "_Neustart Spieler"
 
-#: ../lib/advene/core/webcherry.py:1724
-msgid "<p>Invalid request</p>."
-msgstr ""
+#: ../lib/advene/gui/main.py:311
+#, fuzzy
+msgid "Restart the player"
+msgstr "_Neustart Spieler"
 
-#: ../lib/advene/core/webcherry.py:1788 ../lib/advene/core/webcherry.py:1805
-msgid "Value updated"
-msgstr ""
+#: ../lib/advene/gui/main.py:312
+#, fuzzy
+msgid "Display _Media information"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/core/webcherry.py:1789
-#, python-format
-msgid ""
-"\n"
-"                <h1>Value updated</h1>\n"
-"                The value of %(path)s has been updated to\n"
-"                <pre>\n"
-"                %(value)s\n"
-"                </pre>\n"
-"                "
-msgstr ""
+#: ../lib/advene/gui/main.py:312
+#, fuzzy
+msgid "Display information about the current media"
+msgstr "Zeige Kommentare an einer Timeline"
 
-#: ../lib/advene/core/webcherry.py:1806
-#, python-format
-msgid ""
-"\n"
-"                    <h1>Value updated</h1>\n"
-"                    The value of %(path)s has been updated to\n"
-"                    <pre>\n"
-"                    %(value)s\n"
-"                    </pre>\n"
-"                    "
-msgstr ""
+#: ../lib/advene/gui/main.py:313
+#, fuzzy
+msgid "Update annotation screenshots"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/core/webcherry.py:1817
-#, python-format
-msgid ""
-"Malformed request: cannot update the value of %(attribute)s in %(tales)s."
+#: ../lib/advene/gui/main.py:313
+msgid "Update screenshots for annotation bounds"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1860
-msgid "Cannot create an element in something else than a package."
+#: ../lib/advene/gui/main.py:314
+msgid "Select the player plugin"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1877
-#, python-format
-msgid "The identifier %s already exists."
-msgstr ""
+#: ../lib/advene/gui/main.py:317
+msgid "No package"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/core/webcherry.py:1889
-#, python-format
-msgid "<p>Error while creating view %(id)s</p><pre>%(error)s</pre>"
-msgstr ""
+#: ../lib/advene/gui/main.py:319
+msgid "_Help"
+msgstr "_Hilfe"
 
-#: ../lib/advene/core/webcherry.py:1895
-msgid "View created"
-msgstr ""
+#: ../lib/advene/gui/main.py:320
+#, fuzzy
+msgid "Help"
+msgstr "_Hilfe"
 
-#: ../lib/advene/core/webcherry.py:1896
-#, python-format
-msgid ""
-"\n"
-"                 <h1>View <em>%(id)s</em> created</h1>\n"
-"                 <p>The view <a href=\"%(url)s\">%(id)s</a> was successfully "
-"created.</p>\n"
-"                 "
+#: ../lib/advene/gui/main.py:321
+msgid "Get support"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1912
-#, python-format
-msgid "Missing %s parameter"
+#: ../lib/advene/gui/main.py:322
+msgid "Check for updates"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1915
-#, python-format
-msgid "Relation type %s does not exist"
-msgstr ""
+#: ../lib/advene/gui/main.py:323
+msgid "Display shortcuts"
+msgstr "Zeige Shortcuts"
 
-#: ../lib/advene/core/webcherry.py:1922 ../lib/advene/core/webcherry.py:1925
-#, python-format
-msgid "Annotation %s does not exist"
-msgstr ""
+#: ../lib/advene/gui/main.py:324
+#, fuzzy
+msgid "Display logfile"
+msgstr "Verbindungs Type"
 
-#: ../lib/advene/core/webcherry.py:1928
-#, python-format
-msgid ""
-"<p>Cannot create relation between %(member1)s and %(member2)s: invalid type</"
-"p>"
+#: ../lib/advene/gui/main.py:324
+#, fuzzy
+msgid "Display log messages"
+msgstr "Verbindungs Type"
+
+#: ../lib/advene/gui/main.py:325
+msgid "Open logfile folder"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1940
-#, python-format
+#: ../lib/advene/gui/main.py:325
 msgid ""
-"<p>Error while creating relation between %(member1)s and %(member2)s :</"
-"p><pre>%(error)s</pre>"
+"Display logfile folder. It can help when sending the advene.log file by e-"
+"mail."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1943
-msgid "Relation created"
+#: ../lib/advene/gui/main.py:326
+msgid "_About"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1944
-#, python-format
-msgid "<h1>Relation <em>%s</em> created</h1>"
+#: ../lib/advene/gui/main.py:352
+msgid "Open a package file"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1954
-#, python-format
-msgid "Annotation type %s does not exist"
+#: ../lib/advene/gui/main.py:353
+msgid "Save the current package"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1971
-#, python-format
-msgid ""
-"<p>Error while creating annotation of type %(type)s :<pre>\n"
-"                    %(errortype)s\n"
-"                    %(value)s\n"
-"                    %(traceback)s</pre>"
+#: ../lib/advene/gui/main.py:354
+msgid "Save the package with a new name"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1983
-#, python-format
-msgid "Annotation %s created"
+#: ../lib/advene/gui/main.py:355
+msgid "Select movie file..."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1985
-#, python-format
-msgid "Error: Cannot create an object of type %s."
+#: ../lib/advene/gui/main.py:356
+msgid "Select DVD"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1988
-#, python-format
-msgid ""
-"Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</"
-"code></p>"
+#: ../lib/advene/gui/main.py:358
+#: ../lib/advene/gui/plugins/shotvalidation.py:260
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:810
+#: ../lib/advene/gui/edit/transcribe.py:1178
+msgid "Undo"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2001
-msgid "Available actions"
+#: ../lib/advene/gui/main.py:360
+#, fuzzy
+msgid "Create a text annotation"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/main.py:361
+#, fuzzy
+msgid "Create a graphical annotation"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/main.py:367
+msgid "List recently opened packages"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2010
-#, python-format
-msgid "<li>%(name)s: %(value)s"
+#: ../lib/advene/gui/main.py:397
+msgid "Snapshotter activity"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2033
+#: ../lib/advene/gui/main.py:399
 #, python-format
-msgid "<p>Unknown action</p><pre>Action: %s</pre>"
+msgid "%d queued requests"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2040
-msgid "Missing parameter(s) :<ul>"
+#: ../lib/advene/gui/main.py:400
+msgid "Cancel all requests"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2076
-msgid "Advene web resources"
+#: ../lib/advene/gui/main.py:405
+#, fuzzy
+msgid "No snapshotter"
+msgstr "Zeige Shortcuts"
+
+#: ../lib/advene/gui/main.py:427
+msgid "No snapshotting activity"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2082
-msgid "Advene webserver"
+#: ../lib/advene/gui/main.py:431
+msgid "Snapshotting"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2083
-#, python-format
-msgid ""
-"<p>Welcome on the <a href=\"http://liris.cnrs.fr/advene/\">Advene</a> "
-"webserver run by %(userid)s on %(serveraddress)s.</p>"
+#: ../lib/advene/gui/main.py:447
+#, fuzzy
+msgid "Display application log messages"
+msgstr "Verbindungs Type"
+
+#: ../lib/advene/gui/main.py:488
+msgid "Quicksearch lists"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2090
-msgid ""
-" <p>No package is loaded. You can access the <a href=\"/admin\">server "
-"administration page</a>.<p>"
+#: ../lib/advene/gui/main.py:494
+msgid "Please specify the lists of elements to be searched."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2100
+#: ../lib/advene/gui/main.py:513
 #, python-format
 msgid ""
-"the <a href=\"/packages/%(alias)s/view/%(view)s\">loaded package's default "
-"view</a>"
+"Searching on %s.\n"
+"Left click to launch the search, right-click to set the quicksearch options"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2102
+#: ../lib/advene/gui/main.py:514
 #, python-format
-msgid "the <a href=\"/packages/%s\">loaded package's data</a>"
+msgid "String to search in %s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2104
-msgid "the <a href=\"/packages\">loaded packages' data</a>"
+#: ../lib/advene/gui/main.py:527 ../lib/advene/gui/main.py:531
+msgid "Tracing : "
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2105
-#, python-format
-msgid ""
-" <p>You can either access %s or the <a href=\"/admin\">server administration "
-"page</a>.<p>"
+#: ../lib/advene/gui/main.py:527
+msgid "off"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2107
-#, python-format
-msgid ""
-"<hr><p align=\"right\"><em>Document generated by <a href=\"http://liris.cnrs."
-"fr/advene/\">Advene</a> v. %s.</em></p>"
+#: ../lib/advene/gui/main.py:531
+#, fuzzy
+msgid "on"
+msgstr "Erledigt"
+
+#: ../lib/advene/gui/main.py:543
+#: ../lib/advene/gui/views/interactivequery.py:410
+msgid "String to search"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2189 ../lib/advene/core/webcherry.py:2198
-#, python-format
-msgid "Cannot start HTTP server: %s"
+#: ../lib/advene/gui/main.py:551
+msgid "Launch search"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:61
-#, python-format
-msgid "%s exists but is not a directory. Cancelling website export"
+#: ../lib/advene/gui/main.py:556
+msgid "Ignore case"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:67
-#, python-format
-msgid "%s does not exist"
+#: ../lib/advene/gui/main.py:561
+msgid "Searched elements"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:422
-msgid "Starting export"
+#: ../lib/advene/gui/main.py:645
+msgid "Playing"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:451
-#, python-format
-msgid "Depth %d"
+#: ../lib/advene/gui/main.py:646
+msgid "Pause"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:455
-#, python-format
-msgid "Depth %(depth)d: processing %(url)s"
+#: ../lib/advene/gui/main.py:647
+msgid "Init"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:477
-msgid "Finalizing"
+#: ../lib/advene/gui/main.py:648 ../lib/advene/gui/views/table.py:314
+#: ../lib/advene/gui/edit/elements.py:1809
+msgid "End"
+msgstr ""
+
+#: ../lib/advene/gui/main.py:649
+msgid "Undefined"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:511
+#: ../lib/advene/gui/main.py:660
 #, python-format
 msgid ""
-"<p><strong>You should probably begin at <a href=\"%(href)s\">%(title)s</a>.</"
-"strong></p>"
+"Wrong player shortcut modifier %s in configuration. Fallback on Control."
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:554
+#: ../lib/advene/gui/main.py:679
 #, fuzzy
-msgid "Export complete"
-msgstr "Datei _importieren"
+msgid "Exception in update_annotation"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/util/importer.py:134
-msgid "Generic importer"
-msgstr ""
+#: ../lib/advene/gui/main.py:707
+#, fuzzy
+msgid "Exception in update_relation"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/util/importer.py:161
-msgid "Usage: %prog [options] source-file destination-file"
+#: ../lib/advene/gui/main.py:729
+#, fuzzy
+msgid "Exception in update_view"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/main.py:758
+#, fuzzy
+msgid "Exception in update_query"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/main.py:778
+#, fuzzy
+msgid "Exception in update_resource"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/main.py:798
+#, fuzzy
+msgid "Exception in update_schema"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/main.py:818
+#, fuzzy
+msgid "Exception in update_annotationtype"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/main.py:845
+#, fuzzy
+msgid "Exception in update_relationtype"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/main.py:951
+msgid "Enter the new time value"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:165
-msgid "Specify the offset in ms"
+#: ../lib/advene/gui/main.py:975
+#, python-format
+msgid "Replace content in %d elements"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:210
-msgid ""
-"Import filter error. The asynchronous API should be used, please report a "
-"bug."
+#: ../lib/advene/gui/main.py:988
+msgid "Find word"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:212
-msgid ""
-"Import filter error. No conversion method is defined,  please report a bug."
+#: ../lib/advene/gui/main.py:995
+msgid "Replace by"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:344
+#: ../lib/advene/gui/main.py:1023
 #, python-format
-msgid "Converted from %s"
+msgid "%(search)s has been replaced by %(replace)s in %(count)d element(s)."
+msgstr ""
+
+#: ../lib/advene/gui/main.py:1032
+msgid "The video extracting feature is not available."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:469
+#: ../lib/advene/gui/main.py:1035
 #, fuzzy
-msgid "ExternalApp importer"
-msgstr "Datei _importieren"
+msgid "Video export"
+msgstr "_Einstellung Spieler"
 
-#: ../lib/advene/util/importer.py:483
+#: ../lib/advene/gui/main.py:1037
 #, python-format
+msgid "Exporting video montage/fragment to %%(filename)s"
+msgstr ""
+
+#: ../lib/advene/gui/main.py:1039
+msgid "Please choose a destination filename"
+msgstr ""
+
+#: ../lib/advene/gui/main.py:1117
 msgid ""
-"The <b>%s</b> application does not seem to be installed. Please check that "
-"it is present and that its path is correctly specified in preferences."
+"No media association is defined in the package. Please use the 'File/"
+"Associate a video file' menu item to associate a media file."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:485
+#: ../lib/advene/gui/main.py:1119
 #, python-format
-msgid "The file %s does not seem to exist."
+msgid ""
+"The associated media %s could not be found. Please use the 'File/Associate a "
+"video file' menu item to associate a media file."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:507
+#: ../lib/advene/gui/main.py:1121
 #, python-format
-msgid "Could not run %(appname)s: %(msg)s"
+msgid ""
+"You are now working with the following video:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:509
-#, fuzzy, python-format
-msgid "Processing %s"
-msgstr "Datei _importieren"
-
-#: ../lib/advene/util/importer.py:513
-msgid "Cleaning up..."
+#: ../lib/advene/gui/main.py:1217
+msgid "Open this view..."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:633
-msgid "Text importer"
+#: ../lib/advene/gui/main.py:1218 ../lib/advene/gui/plugins/actions.py:286
+#: ../lib/advene/gui/views/viewbook.py:130
+msgid "...in its own window"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:646 ../lib/advene/util/importer.py:1176
-msgid "Specify the encoding of the input file (latin1, utf8...)"
+#: ../lib/advene/gui/main.py:1219 ../lib/advene/gui/plugins/actions.py:287
+#: ../lib/advene/gui/views/viewbook.py:131
+#: ../lib/advene/gui/views/__init__.py:398
+msgid "...embedded east of the video"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:649
-msgid "Should the timestamps be encoded relative to the first timestamp?"
+#: ../lib/advene/gui/main.py:1220 ../lib/advene/gui/plugins/actions.py:288
+#: ../lib/advene/gui/views/viewbook.py:132
+#: ../lib/advene/gui/views/__init__.py:399
+msgid "...embedded west of the video"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:652
-msgid "Unit to consider for integers"
+#: ../lib/advene/gui/main.py:1221 ../lib/advene/gui/plugins/actions.py:289
+#: ../lib/advene/gui/views/viewbook.py:133
+#: ../lib/advene/gui/views/__init__.py:400
+msgid "...embedded south of the video"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:655
-msgid ""
-"What timestamps are present in a line (only begin, both begin and end, or "
-"automatic recognition)"
+#: ../lib/advene/gui/main.py:1222 ../lib/advene/gui/plugins/actions.py:290
+#: ../lib/advene/gui/views/viewbook.py:134
+#: ../lib/advene/gui/views/__init__.py:401
+msgid "...embedded at the right of the window"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:798
-msgid "lsdvd importer"
+#: ../lib/advene/gui/main.py:1234
+msgid "_All available views"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:825
-msgid "Processing data"
+#: ../lib/advene/gui/main.py:1250 ../lib/advene/gui/views/timeline.py:126
+msgid "Timeline"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:843 ../lib/advene/util/importer.py:903
+#: ../lib/advene/gui/main.py:1251 ../lib/advene/gui/views/finder.py:808
 #, fuzzy
-msgid "DVD Chapter"
-msgstr "Importiere _DVD Kapitel"
+msgid "Package finder"
+msgstr "Pakete"
 
-#: ../lib/advene/util/importer.py:847
-msgid "Launching lsdvd..."
+#: ../lib/advene/gui/main.py:1252
+msgid "Transcription of annotations"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:859
-msgid "chaplin importer"
-msgstr ""
+#: ../lib/advene/gui/main.py:1253
+#, fuzzy
+msgid "Annotation table"
+msgstr "Kommentar Typ"
 
-#: ../lib/advene/util/importer.py:917
-msgid "Xi importer"
+#: ../lib/advene/gui/main.py:1256
+msgid "Note-taking editor"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:986
-msgid "ELAN importer"
+#: ../lib/advene/gui/main.py:1257
+msgid "Active bookmarks"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1039
-#, python-format
-msgid "Converting tier %s"
+#: ../lib/advene/gui/main.py:1260 ../lib/advene/gui/views/tagbag.py:57
+msgid "Bag of tags"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1140
-msgid "Processing time slots"
+#: ../lib/advene/gui/main.py:1261
+msgid "TALES explorer"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1155
-msgid "Fixing forward references"
+#: ../lib/advene/gui/main.py:1262
+msgid "Dynamic montage"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1157
-msgid "Creating relations"
-msgstr ""
+#: ../lib/advene/gui/main.py:1263 ../lib/advene/gui/plugins/videoplayer.py:37
+#, fuzzy
+msgid "Video player"
+msgstr "_Einstellung Spieler"
 
-#: ../lib/advene/util/importer.py:1169
-msgid "Subtitle (SRT) importer"
+#: ../lib/advene/gui/main.py:1266
+msgid "Open a comment view in the web browser"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1238
-#, python-format
-msgid "Subtitles from %s"
+#: ../lib/advene/gui/main.py:1267
+msgid "Create or open a comment view"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1251
-msgid "PRAAT importer"
+#: ../lib/advene/gui/main.py:1270
+msgid ""
+"Edit window placeholder (annotation and relation edit windows will be put "
+"here)"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1341
-msgid "CMML importer"
-msgstr ""
+#: ../lib/advene/gui/main.py:1271
+#, fuzzy
+msgid "Display edition history"
+msgstr "Zeige Kommentare an einer Timeline"
 
-#: ../lib/advene/util/importer.py:1404
-msgid "Parsing clip information"
+#: ../lib/advene/gui/main.py:1300
+msgid "The webserver could not be started. Static views cannot be accessed."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1501
-#: ../lib/advene/plugins/transcriber.py:254
-msgid "Creating package"
+#: ../lib/advene/gui/main.py:1381
+#, python-format
+msgid ""
+"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s has been "
+"released</b> on %(date)s, but you are running version %(current)s.\n"
+"You can download the latest version from the Advene website: http://advene."
+"org/</span>"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1504
-msgid "Creating CMML schema"
+#: ../lib/advene/gui/main.py:1386
+msgid "Go to the website"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1508
-#: ../lib/advene/plugins/transcriber.py:260
-msgid "Creating annotation types"
-msgstr ""
+#: ../lib/advene/gui/main.py:1392
+#, fuzzy
+msgid "Advene release"
+msgstr "Advene"
 
-#: ../lib/advene/util/importer.py:1514
-#: ../lib/advene/plugins/transcriber.py:265
-msgid "Parsing header information"
+#: ../lib/advene/gui/main.py:1398
+#, python-format
+msgid "You are using a up-to-date version of Advene (%(current)s)."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1528
-msgid "Parsing stream information"
+#: ../lib/advene/gui/main.py:1398
+msgid "Advene is up-to-date"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1562
-msgid "IRI importer"
+#: ../lib/advene/gui/main.py:1412
+msgid "Choose a color"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1571
-msgid "Generate one type per view"
+#: ../lib/advene/gui/main.py:1444
+msgid "Select an annotation to loop on it"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1591
+#: ../lib/advene/gui/main.py:1446
 #, python-format
-msgid "Parsing ensemble %s"
+msgid "Looping on %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1602
-#, python-format
-msgid "Parsing decoupage %s"
+#: ../lib/advene/gui/main.py:1516 ../lib/advene/gui/main.py:2443
+msgid "No active dynamic view"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1638
-msgid "Parsing views"
+#: ../lib/advene/gui/main.py:1527
+msgid "Create a new dynamic view."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1686 ../lib/advene/util/importer.py:1775
-msgid "Initializing package"
+#: ../lib/advene/gui/main.py:1546
+msgid "Edit the current dynamic view."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1724
-msgid "IRIData importer"
+#: ../lib/advene/gui/main.py:1558
+msgid "No dynamic view"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1738
-msgid "Parsing sound values"
+#: ../lib/advene/gui/main.py:1589
+msgid "Playing rate"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1750
-#, fuzzy
-msgid "Creating annotations"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/util/helper.py:402
-msgid "Package"
+#: ../lib/advene/gui/main.py:1737
+msgid "History"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:403
-msgid "Annotation"
+#: ../lib/advene/gui/main.py:1744
+msgid "Popups"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:404
-msgid "Relation"
+#: ../lib/advene/gui/main.py:1748
+msgid ""
+"You can drag and drop view icons (timeline, treeview, transcription...) in "
+"notebooks to embed various views."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:405 ../lib/advene/gui/edit/schemaeditor.py:111
-#: ../lib/advene/gui/main.py:276 ../lib/advene/gui/main.py:3270
-msgid "Schema"
-msgstr "Schema"
+#: ../lib/advene/gui/main.py:1748 ../lib/advene/gui/main.py:4123
+msgid "Information"
+msgstr ""
 
-#: ../lib/advene/util/helper.py:406 ../lib/advene/gui/main.py:279
-msgid "Annotation Type"
-msgstr "Kommentar Typ"
+#: ../lib/advene/gui/main.py:2034
+msgid "Cannot create annotation. There is no schema to put it in."
+msgstr ""
 
-#: ../lib/advene/util/helper.py:407 ../lib/advene/gui/main.py:280
+#: ../lib/advene/gui/main.py:2043
 #, fuzzy
-msgid "Relation Type"
-msgstr "Verbindungs Type"
+msgid "Default annotation type"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/util/helper.py:408 ../lib/advene/rules/actions.py:236
-#: ../lib/advene/gui/edit/rules.py:1087 ../lib/advene/gui/main.py:277
-msgid "View"
-msgstr "Darstellung"
+#: ../lib/advene/gui/main.py:2055
+#, fuzzy
+msgid "Annotation created"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/util/helper.py:409 ../lib/advene/gui/main.py:278
-#: ../lib/advene/gui/popup.py:459
-msgid "Query"
-msgstr "Abfragen"
+#: ../lib/advene/gui/main.py:2088
+msgid "Play/Pause [Control-Tab / Control-Space]"
+msgstr ""
 
-#: ../lib/advene/util/helper.py:410
-msgid "Resource Folder"
+#: ../lib/advene/gui/main.py:2092
+#, python-format
+msgid "Rewind (%.02f s) [Control-Left]"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:411 ../lib/advene/gui/edit/create.py:122
-msgid "Resource File"
+#: ../lib/advene/gui/main.py:2096
+#, python-format
+msgid "Forward (%.02f s) [Control-Right]"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:446
-msgid "---- Elements ----"
+#: ../lib/advene/gui/main.py:2100
+msgid "Previous frame [Control-Down]"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:452
-msgid "---- Attributes ----"
+#: ../lib/advene/gui/main.py:2104
+msgid "Next frame [Control-Up]"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:455
-msgid "---- Methods ----"
+#: ../lib/advene/gui/main.py:2108
+msgid "Fullscreen"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:531
+#: ../lib/advene/gui/main.py:2290
 #, python-format
-msgid "Cannot read %(filename)s: %(error)s"
+msgid "Screenshot saved to %s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:555
+#: ../lib/advene/gui/main.py:2292
 #, python-format
 msgid ""
-"Error:\n"
-"%s"
+"Screenshot saved in\n"
+" %s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:565
-#, python-format
+#: ../lib/advene/gui/main.py:2294
+#, fuzzy, python-format
 msgid ""
-"Package %(title)s:\n"
-"%(schema)s\n"
-"%(annotation)s in %(annotation_type)s\n"
-"%(relation)s in %(relation_type)s\n"
-"%(query)s\n"
-"%(view)s\n"
-"\n"
-"Description:\n"
-"%(description)s\n"
-msgstr ""
+"Could not save screenshot:\n"
+" %s"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/util/helper.py:592
-#, fuzzy
-msgid "Min duration"
-msgstr "_Einstellung Spieler"
+#: ../lib/advene/gui/main.py:2302
+msgid "Save screenshot to..."
+msgstr ""
 
-#: ../lib/advene/util/helper.py:593
-msgid "Max duration"
+#: ../lib/advene/gui/main.py:2320
+msgid "Could not take snapshot with enough precision"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:594
+#: ../lib/advene/gui/main.py:2358
 #, fuzzy
-msgid "Mean duration"
-msgstr "Zeige die Anmerkung als Transkription"
+msgid "Export package data"
+msgstr "durchsuche Packet daten"
+
+#: ../lib/advene/gui/main.py:2360
+#, fuzzy, python-format
+msgid "Export annotation type %s"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/main.py:2362
+#, fuzzy, python-format
+msgid "Export element %s"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/util/helper.py:595
+#: ../lib/advene/gui/main.py:2388
 #, fuzzy
-msgid "Total duration"
-msgstr "Zeige die Anmerkung als Transkription"
+msgid "Export format"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/util/helper.py:601
-msgid "schema"
+#: ../lib/advene/gui/main.py:2425
+msgid " (modified)"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:601
-msgid "schemas"
+#: ../lib/advene/gui/main.py:2428
+#, python-format
+msgid "Activate %s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:602
-msgid "annotation"
+#: ../lib/advene/gui/main.py:2598
+msgid "Saved workspace"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:602
-msgid "annotations"
+#: ../lib/advene/gui/main.py:2651
+msgid "Restoring workspace..."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:603 ../lib/advene/util/helper.py:604
-msgid "annotation type"
+#: ../lib/advene/gui/main.py:2657
+#, python-format
+msgid "Do you wish to restore the %s workspace ?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:603 ../lib/advene/util/helper.py:604
-msgid "annotation types"
-msgstr ""
+#: ../lib/advene/gui/main.py:2662
+#, fuzzy
+msgid "Clear the current workspace"
+msgstr "Aktuelle Sitzung speichern"
 
-#: ../lib/advene/util/helper.py:605
-msgid "relation"
+#: ../lib/advene/gui/main.py:2683
+#, python-format
+msgid "View %s is not an adhoc view"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:605
-msgid "relations"
+#: ../lib/advene/gui/main.py:2694
+#, python-format
+msgid "Cannot identify the adhoc view %s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:606 ../lib/advene/util/helper.py:607
-msgid "relation type"
+#: ../lib/advene/gui/main.py:2708
+msgid "Choose the annotation type to display as transcription."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:606 ../lib/advene/util/helper.py:607
-msgid "relation types"
+#: ../lib/advene/gui/main.py:2743
+#, python-format
+msgid "Error: unable to find an edit popup for %(element)s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:608
-msgid "query"
-msgstr ""
+#: ../lib/advene/gui/main.py:2750
+#, fuzzy, python-format
+msgid "Editing %s"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/util/helper.py:608
-msgid "queries"
+#: ../lib/advene/gui/main.py:2762
+#, python-format
+msgid "Comment view (%s)"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:609
-msgid "view"
+#: ../lib/advene/gui/main.py:2829
+#, python-format
+msgid "Package %(uri)s saved: %(annotations)s and %(relations)s."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:609
-msgid "views"
+#: ../lib/advene/gui/main.py:2840
+#, python-format
+msgid "Activating package %s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:610
-msgid "package"
+#: ../lib/advene/gui/main.py:2868
+#, python-format
+msgid "Package %(uri)s loaded: %(annotations)s and %(relations)s."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:610
-msgid "packages"
+#: ../lib/advene/gui/main.py:2900
+msgid "Do you want to restore the saved workspace ?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:622
-#, python-format
-msgid "No %s"
-msgstr ""
+#: ../lib/advene/gui/main.py:2907
+msgid "Advene"
+msgstr "Advene"
 
-#: ../lib/advene/util/helper.py:624
-#, python-format
-msgid "1 %s"
+#: ../lib/advene/gui/main.py:2957
+#, fuzzy, python-format
+msgid "Video player error: %s"
+msgstr "_Einstellung Spieler"
+
+#: ../lib/advene/gui/main.py:3137 ../lib/advene/gui/main.py:3158
+msgid "Unknown"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:626
+#: ../lib/advene/gui/main.py:3228
 #, python-format
-msgid "%(count)d %(plural)s"
+msgid ""
+"The package(s) %s are modified.\n"
+"Save them now?"
 msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:76
-#, fuzzy
-msgid "Cinelab importer"
-msgstr "Datei _importieren"
+#: ../lib/advene/gui/main.py:3252
+#: ../lib/advene/gui/views/interactivequery.py:376
+msgid "Empty quicksearch string"
+msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:119 ../lib/advene/plugins/cinelab.py:121
+#: ../lib/advene/gui/main.py:3255
+#: ../lib/advene/gui/views/interactivequery.py:281
 #, python-format
-msgid "File %s is not an Advene2 zip package."
+msgid "'%s'"
 msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:176
-#, fuzzy
-msgid "Converting annotation types"
-msgstr "Kommentar Typ"
-
-#: ../lib/advene/plugins/cinelab.py:217
-#, fuzzy
-msgid "Converting views"
-msgstr "Aktivieren und Abspielen"
-
-#: ../lib/advene/plugins/cinelab.py:249
-#: ../lib/advene/plugins/youtubeannotations.py:72
-#, fuzzy
-msgid "Importing annotations"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/main.py:3270
+msgid "Choose an annotation type."
+msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:41
-#, fuzzy
-msgid "ShotdetectApp importer"
-msgstr "Datei _importieren"
+#: ../lib/advene/gui/main.py:3289 ../lib/advene/gui/views/timeline.py:3035
+#: ../lib/advene/gui/edit/transcribe.py:994
+msgid "Create a new annotation type"
+msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:52
-msgid ""
-"Sensitivity of the algorithm. It should typically be between 50 and 80. If "
-"too many shots are detected, try to increase its value."
+#: ../lib/advene/gui/main.py:3314
+msgid "No annotation type is defined."
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:80
-#: ../lib/advene/plugins/goodshotdetector.py:78
-msgid "Detected shots"
+#: ../lib/advene/gui/main.py:3323
+msgid "Creating a new type."
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:140 ../lib/advene/gui/main.py:5130
-#, python-format
-msgid "Detected shot #%(num)d at %(pos)s "
+#: ../lib/advene/gui/main.py:3327
+msgid "Title of the new type"
+msgstr ""
+
+#: ../lib/advene/gui/main.py:3328
+msgid ""
+"Id of the new type. It is generated from the title, but you may change it if "
+"necessary."
 msgstr ""
 
-#: ../lib/advene/plugins/youtubeannotations.py:33
+#: ../lib/advene/gui/main.py:3332
 #, fuzzy
-msgid "Youtube XML annotations importer"
-msgstr "Kommentar Typ"
+msgid "Specify the content-type for the annotation type"
+msgstr "Zeige die Transkription für eine Anmerkung"
 
-#: ../lib/advene/plugins/brltty.py:62
-msgid "Input from the braille table."
+#: ../lib/advene/gui/main.py:3334
+msgid "Content type"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:66
-msgid "BrlTTY not installed. There will be no braille support."
+#: ../lib/advene/gui/main.py:3341 ../lib/advene/gui/main.py:3450
+msgid "Create a new schema"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:78
-msgid "Could not initialize BrlTTY. No braille support."
+#: ../lib/advene/gui/main.py:3354
+msgid "Choose an existing schema for the new type, or create a new one"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:84
-msgid "Display a message in Braille"
+#: ../lib/advene/gui/main.py:3357 ../lib/advene/gui/main.py:3465
+msgid "Specify the schema title"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:85
-msgid "Message to display."
+#: ../lib/advene/gui/main.py:3361
+msgid "Title of the new schema"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:88 ../lib/advene/plugins/tts.py:81
-#: ../lib/advene/rules/actions.py:40 ../lib/advene/rules/actions.py:107
-#: ../lib/advene/rules/actions.py:123 ../lib/advene/gui/plugins/actions.py:44
-#: ../lib/advene/gui/plugins/actions.py:58
-#: ../lib/advene/gui/plugins/actions.py:110
-#: ../lib/advene/gui/plugins/actions.py:399
-#: ../lib/advene/gui/plugins/actions.py:527
-#: ../lib/advene/gui/edit/rules.py:766
-#, fuzzy
-msgid "The annotation content"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/plugins/brltty.py:240 ../lib/advene/plugins/tts.py:110
-#: ../lib/advene/gui/plugins/actions.py:234
-msgid "Unknown rule"
+#: ../lib/advene/gui/main.py:3362
+msgid ""
+"Id of the new schema. It is generated from the title, but you may change it "
+"if necessary."
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:241 ../lib/advene/plugins/tts.py:111
-#: ../lib/advene/gui/plugins/actions.py:235
-#, python-format
+#: ../lib/advene/gui/main.py:3385
 msgid ""
-"Rule %(rulename)s: Error in the evaluation of the parameter "
-"%(parametername)s:"
+"You specified a annotation-type identifier that already exists. Aborting."
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:256
-#, python-format
-msgid "BrlTTY connection error: %s"
+#: ../lib/advene/gui/main.py:3403
+msgid "You specified a existing schema identifier. Using the existing schema."
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:273
-msgid "Braille display: "
+#: ../lib/advene/gui/main.py:3405
+msgid ""
+"You specified an existing identifier that does not reference a schema. "
+"Aborting."
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:279
-#, fuzzy
-msgid "No message"
-msgstr "Kein Pakte"
+#: ../lib/advene/gui/main.py:3432
+msgid "Choose a schema."
+msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:45
-msgid "Shot detection (Delakis version)"
+#: ../lib/advene/gui/main.py:3492
+msgid "You specified an existing identifier. Aborting."
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:60
-msgid "Cache histogram alongside video files."
+#: ../lib/advene/gui/main.py:3512
+#, python-format
+msgid "Package %s modified"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:63
+#: ../lib/advene/gui/main.py:3513
+#, python-format
 msgid ""
-"Parameter profile: safe will detect less cuts, aggressive will detect more "
-"cuts (but more false ones too). default is a compromise."
+"The package %s has been modified but not saved.\n"
+"Save it now?"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:77
+#: ../lib/advene/gui/main.py:3523
 #, python-format
-msgid "Shot (%s profile)"
+msgid "%s snapshots"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:83
-msgid "Loading histogram"
+#: ../lib/advene/gui/main.py:3524
+#, python-format
+msgid "Do you want to save the snapshots for media %s?"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:146
-msgid "Computing hdiff"
+#: ../lib/advene/gui/main.py:3531 ../lib/advene/gui/main.py:3540
+#: ../lib/advene/gui/main.py:4541
+#, python-format
+msgid "Cannot save imagecache for %(media)s: %(e)s"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:153
-msgid "Detecting cuts"
+#: ../lib/advene/gui/main.py:3554
+msgid "first frame"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:180
-msgid "Detecting dissolves"
+#: ../lib/advene/gui/main.py:3555
+msgid "last frame"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:265
-#, fuzzy
-msgid "Extracting histogram"
-msgstr "Datei _importieren"
+#: ../lib/advene/gui/main.py:3563
+#, fuzzy, python-format
+msgid "Click on %(bound)s of %(annotation)s"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/plugins/anvil.py:35
-msgid "Anvil importer"
-msgstr ""
+#: ../lib/advene/gui/main.py:3566
+#, fuzzy, python-format
+msgid "Update %(bound)s of %(annotation)s"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/plugins/annotationgraph.py:40
-#, fuzzy
-msgid "AnnotationGraph importer"
-msgstr "Kommentar Typ"
+#: ../lib/advene/gui/main.py:3585
+msgid "Click on the frame corresponding to the timestamp value"
+msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:33
-msgid "Final Cut Pro XML importer"
+#: ../lib/advene/gui/main.py:3587
+msgid "Set new timestamp value"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:55
-msgid "FCP clipitem"
+#: ../lib/advene/gui/main.py:3594
+msgid ""
+"<b>Annotation statistics</b>\n"
+"\n"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:75
+#: ../lib/advene/gui/main.py:3666
 #, fuzzy
-msgid "Importing subtitles"
-msgstr "Datei _importieren"
+msgid "Text annotation"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/plugins/fcp.py:90
+#: ../lib/advene/gui/main.py:3674 ../lib/advene/gui/main.py:3699
 #, fuzzy
-msgid "Importing clips"
-msgstr "Datei _importieren"
+msgid "Cannot find an appropriate annotation type"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/plugins/fcp.py:93
-msgid "No clip"
+#: ../lib/advene/gui/main.py:3676 ../lib/advene/gui/views/bookmarks.py:293
+msgid "Comment here"
 msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:219
-#, python-format
-msgid "Cannot export to %(fname)s: %(e)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:3692
+#, fuzzy
+msgid "Graphical annotation"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/plugins/tracebuilder.py:1129
-#: ../lib/advene/plugins/tracebuilder.py:1168
-#, fuzzy, python-format
-msgid "Cannot export to %(host)s:%(port)s %(error)s"
-msgstr "Kann nicht stbvid %(stbvid)s: %(error)s aktivieren"
+#: ../lib/advene/gui/main.py:3744
+msgid ""
+"An unsaved template package exists\n"
+"Save it first."
+msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:1143
-#, fuzzy, python-format
-msgid "Cannot send data to %(host)s:%(port)s %(error)s"
-msgstr "Kann nicht stbvid %(stbvid)s: %(error)s aktivieren"
+#: ../lib/advene/gui/main.py:3753
+msgid "Package modified"
+msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:1191
-#, fuzzy, python-format
-msgid "Cannot send event %(nb)s to %(host)s:%(port)s %(error)s"
-msgstr "Kann nicht stbvid %(stbvid)s: %(error)s aktivieren"
+#: ../lib/advene/gui/main.py:3754
+msgid ""
+"The package that you want to close has been modified but not saved.\n"
+"Save it now?"
+msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:1197
-#, python-format
-msgid "%(nb)s events sent to %(host)s:%(port)s during session."
+#: ../lib/advene/gui/main.py:3787
+msgid "Load a package"
 msgstr ""
 
-#: ../lib/advene/plugins/dcp.py:65
-#, fuzzy
-msgid "DCP importer"
-msgstr "Datei _importieren"
+#: ../lib/advene/gui/main.py:3800
+msgid ""
+"A video file was selected. Pretend that the user selected 'Select a video "
+"file'..."
+msgstr ""
 
-#: ../lib/advene/plugins/dcp.py:120
+#: ../lib/advene/gui/main.py:3805
 #, python-format
-msgid "Converting #%(num)d / %(count)d"
+msgid ""
+"The file %s does not look like a valid Advene package. It should have a .azp "
+"or .xml extension. Try to open anyway?"
 msgstr ""
 
-#: ../lib/advene/plugins/ttl.py:41
-#, fuzzy
-msgid "TurTLe (RDF) importer"
-msgstr "Datei _importieren"
-
-#: ../lib/advene/plugins/aeidon_import.py:48
-msgid "Aeidon (subtitles) importer"
+#: ../lib/advene/gui/main.py:3814
+msgid ""
+"You are trying to load a session file, but there are unsaved packages. "
+"Proceed anyway?"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:47
-#: ../lib/advene/plugins/soundenveloppe.py:143
-#: ../lib/advene/plugins/soundenveloppe.py:145
-msgid "Sound enveloppe"
+#: ../lib/advene/gui/main.py:3823
+#, python-format
+msgid ""
+"Cannot load package %(filename)s:\n"
+"%(error)s"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:60
-msgid "Interval (in ms) at which to take samples."
+#: ../lib/advene/gui/main.py:3843 ../lib/advene/gui/main.py:3899
+msgid "Do you want to save the current workspace ?"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:63
-msgid "Maximum number of samples per annotation."
+#: ../lib/advene/gui/main.py:3858 ../lib/advene/gui/main.py:3914
+#, python-format
+msgid "Could not save the package: %s"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:66
-#: ../lib/advene/plugins/cutter.py:56
-msgid "Channel selection."
+#: ../lib/advene/gui/main.py:3871
+#, python-format
+msgid "Save the package %s"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:90
-#: ../lib/advene/plugins/pocketsphinx.py:119
-#: ../lib/advene/plugins/barcode.py:58
-#, fuzzy
-msgid "Generating annotations"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/main.py:3884
+msgid "Invalid file extension"
+msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:115
+#: ../lib/advene/gui/main.py:3885
 #, python-format
-msgid "At %s"
+msgid ""
+"Your package contains resources,\n"
+"the filename (%s) should have a .azp extension.\n"
+"Should I put the correct extension?"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:162
-#, fuzzy
-msgid "Extracting sound enveloppe"
-msgstr "Datei _importieren"
+#: ../lib/advene/gui/main.py:3889
+msgid "OK, the resources will be lost."
+msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:39
-#, fuzzy
-msgid "Audio segmentation"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/main.py:3891
+msgid "Aborting package saving"
+msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:53
-msgid "Volume threshold (in dB, can be negative) before trigger."
+#: ../lib/advene/gui/main.py:3925
+msgid "Save the session in..."
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:101
+#: ../lib/advene/gui/main.py:3936
 #, python-format
-msgid "Detected %(count)d segments until %(time)s"
+msgid "Session saved in %s"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:119
-msgid "Sound segment"
+#: ../lib/advene/gui/main.py:3945
+msgid "Do you confirm the creation of annotations matching the DVD chapters?"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:120
-#, python-format
-msgid ""
-"Sound segmentation with a threshold of %(threshold)d dB - channel: "
-"%(channel)s"
+#: ../lib/advene/gui/main.py:3951
+msgid "Cannot import DVD chapters. Did you install the lsdvd software?"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:138
-msgid "Starting silence detection"
+#: ../lib/advene/gui/main.py:3959
+msgid "The associated media is not a DVD."
 msgstr ""
 
-#: ../lib/advene/plugins/montagerenderer.py:43
-msgid "Cannot register montage renderer: Gnonlin plugins are not present."
+#: ../lib/advene/gui/main.py:3970
+#, fuzzy, python-format
+msgid "Processing %s video"
+msgstr "Datei _importieren"
+
+#: ../lib/advene/gui/main.py:3973
+#, fuzzy
+msgid "No associated video file"
+msgstr "Wähle eine Video Datei"
+
+#: ../lib/advene/gui/main.py:4000
+msgid "Standard RuleSet"
 msgstr ""
 
-#: ../lib/advene/plugins/mpeg7.py:54
-msgid "MPEG7 importer"
+#: ../lib/advene/gui/main.py:4112
+#, python-format
+msgid ""
+"Media information\n"
+"\n"
+"URI: %(uri)s\n"
+"Framerate: %(framerate_denom)d / %(framerate_num)d (%(framerate).02f )\n"
+"Duration: %(duration_formatted)s (%(duration)d ms) (cached: "
+"%(cached_duration_formatted)s)\n"
+"Current position: %(position_formatted)s (%(position)d ms)\n"
+"\n"
+"Original image size: %(width)d x %(height)d\n"
+"\n"
+"Image cache information: %(imagecache)s\n"
 msgstr ""
 
-#: ../lib/advene/plugins/transcriber.py:40
-msgid "Transcriber importer"
+#: ../lib/advene/gui/main.py:4137
+msgid "Visit the Advene web site for examples and documentation."
 msgstr ""
 
-#: ../lib/advene/plugins/transcriber.py:86
-msgid "Parsing section information"
+#: ../lib/advene/gui/main.py:4170 ../lib/advene/gui/main.py:4258
+msgid "Select a movie file"
 msgstr ""
 
-#: ../lib/advene/plugins/transcriber.py:276
-msgid "Parsing topic and speaker tables information"
+#: ../lib/advene/gui/main.py:4182
+msgid "Title/Chapter selection"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:42
-msgid "Feature detection (face...)"
+#: ../lib/advene/gui/main.py:4224
+msgid "Select a video stream"
+msgstr "Wähle einen video stream"
+
+#: ../lib/advene/gui/main.py:4225
+msgid "Enter the address of a video stream"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:57
-msgid "Sensitivity level."
+#: ../lib/advene/gui/main.py:4229
+#, python-format
+msgid "Successfully extracted the video stream address (%s) from the url.\n"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:60
-msgid ""
-"Scale. Original image size will be divided by this factor, in order to speed "
-"up detection."
+#: ../lib/advene/gui/main.py:4254
+msgid "Package properties"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:63
-msgid "Classifier"
+#: ../lib/advene/gui/main.py:4255 ../lib/advene/gui/edit/elements.py:516
+#: ../lib/advene/gui/edit/elements.py:565
+#: ../lib/advene/gui/edit/elements.py:652
+#: ../lib/advene/gui/edit/elements.py:732
+#: ../lib/advene/gui/edit/elements.py:789
+#: ../lib/advene/gui/edit/elements.py:881
+#: ../lib/advene/gui/edit/elements.py:950
+#: ../lib/advene/gui/edit/elements.py:1062
+#: ../lib/advene/gui/edit/elements.py:1124
+msgid "Author"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:77
-#, python-format
-msgid "Feature %s"
+#: ../lib/advene/gui/main.py:4255
+msgid "Author name"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:79
-#, python-format
-msgid "Detected %s"
+#: ../lib/advene/gui/main.py:4256 ../lib/advene/gui/edit/elements.py:517
+#: ../lib/advene/gui/edit/elements.py:566
+#: ../lib/advene/gui/edit/elements.py:653
+#: ../lib/advene/gui/edit/elements.py:733
+#: ../lib/advene/gui/edit/elements.py:790
+#: ../lib/advene/gui/edit/elements.py:882
+#: ../lib/advene/gui/edit/elements.py:951
+#: ../lib/advene/gui/edit/elements.py:1063
+#: ../lib/advene/gui/edit/elements.py:1125
+msgid "Date"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:81
-msgid "Detection started"
+#: ../lib/advene/gui/main.py:4256
+msgid "Package creation date"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:171
-#, python-format
-msgid "Detected %(count)d feature(s) until %(time)s"
+#: ../lib/advene/gui/main.py:4257 ../lib/advene/gui/views/table.py:681
+#: ../lib/advene/gui/util/dialog.py:391 ../lib/advene/gui/edit/imports.py:334
+#: ../lib/advene/gui/edit/dvdselect.py:75
+#: ../lib/advene/gui/edit/transcribe.py:1022
+msgid "Title"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:37
-msgid ""
-"Cannot register speech recognition: Pocketsphinx plugins not found. See "
-"http://cmusphinx.sourceforge.net/wiki/gstreamer for details."
+#: ../lib/advene/gui/main.py:4257
+msgid "Package title"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:41
-msgid "Speech recognition (PocketSphinx)"
+#: ../lib/advene/gui/main.py:4258
+msgid "Associated media"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:61
-msgid "Filtering noise level [0..1]."
+#: ../lib/advene/gui/main.py:4259 ../lib/advene/gui/views/table.py:315
+msgid "Duration"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:65
-msgid ""
-"Minimum amount (in milliseconds) of silence required to terminate the "
-"current annotation and start a new one. Decreasing this length will result "
-"in a large amount of short annotations and increasing this length will "
-"result in a small amount of long annotations."
+#: ../lib/advene/gui/main.py:4259
+msgid "Media duration in ms"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:69
-msgid "Use default acoustic and language models."
+#: ../lib/advene/gui/main.py:4259
+#: ../lib/advene/gui/plugins/eventaccumulator.py:143
+msgid "Reset"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:73
-msgid "Acoustic model (directory)"
+#: ../lib/advene/gui/main.py:4320 ../lib/advene/gui/views/timeline.py:3522
+#: ../lib/advene/gui/views/timeline.py:3677
+#: ../lib/advene/gui/views/tagbag.py:64
+#: ../lib/advene/gui/edit/properties.py:181
+#: ../lib/advene/gui/edit/transcribe.py:148
+#: ../lib/advene/gui/edit/transcribe.py:1162
+msgid "Preferences"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:77
-msgid "Phonetic dictionary (.dic file)"
+#: ../lib/advene/gui/main.py:4322
+msgid "Paths"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:81
-msgid "Language model (.DMP file)"
+#: ../lib/advene/gui/main.py:4324
+msgid "Data"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:144
-#: ../lib/advene/plugins/barcode.py:83
-#, python-format
-msgid "%(count)d utterances until %(time)s"
+#: ../lib/advene/gui/main.py:4324
+msgid "Standard directory for data files"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:153
-msgid "Speech"
+#: ../lib/advene/gui/main.py:4325
+msgid "Movie path"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:155
-msgid "Recognized speech"
+#: ../lib/advene/gui/main.py:4325
+#, python-format
+msgid ""
+"List of directories (separated by %s) to search for movie files (_ means "
+"package directory)"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:191
-msgid "Recognizing speech"
+#: ../lib/advene/gui/main.py:4326
+msgid "Imagecache"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:36
-msgid "Cannot register barcode extraction: zbar plugin not found."
+#: ../lib/advene/gui/main.py:4326
+msgid "Directory for storing the snapshot cache"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:40
-msgid "Barcode (qr-code) extraction"
+#: ../lib/advene/gui/main.py:4327
+msgid "Player"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:95
-msgid "Barcode"
+#: ../lib/advene/gui/main.py:4327
+msgid "Directory of the video player"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:97
-msgid "Extracted barcode information"
+#: ../lib/advene/gui/main.py:4328
+msgid "Shotdetect"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:115
-#, fuzzy
-msgid "Extraction barcodes"
-msgstr "Datei _importieren"
-
-#: ../lib/advene/plugins/nerd_plugin.py:47
-msgid "NERD (Named Entity Recognition and Disambiguation)"
+#: ../lib/advene/gui/main.py:4328
+msgid "Shotdetect application"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:68
-msgid "NERD API key"
+#: ../lib/advene/gui/main.py:4330
+msgid "GUI"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:82
-msgid "NER service to use"
+#: ../lib/advene/gui/main.py:4331
+msgid "Interface language (after restart)"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:88
-#, fuzzy
-msgid "Type of annotation to analyze"
-msgstr "Kommentar Typ"
-
-#: ../lib/advene/plugins/nerd_plugin.py:93
-msgid "Language to analyze"
+#: ../lib/advene/gui/main.py:4331
+msgid ""
+"Language used for the interface (necessitates to restart the application)"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:98
-msgid "Minimum confidence level (between 0.0 and 1.0)"
+#: ../lib/advene/gui/main.py:4332 ../lib/advene/gui/util/initialconfig.py:88
+msgid "System default"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:103
-#, fuzzy
-msgid "Interpolate position of annotations"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/plugins/nerd_plugin.py:108
-msgid "Split by entity type"
+#: ../lib/advene/gui/main.py:4337
+msgid "Record activity trace"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:113
-msgid "Store results as markup in the annotation text"
+#: ../lib/advene/gui/main.py:4338
+msgid "Expert mode"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:118
-msgid "Create relations between the original annotations and the new ones"
+#: ../lib/advene/gui/main.py:4338
+msgid "Offer advanced possibilities"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:150
-#, python-format
-msgid "NERD applied to %s"
+#: ../lib/advene/gui/main.py:4339
+msgid "Prefer WYSIWYG"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:208
-#, python-format
-msgid "NERD %s"
+#: ../lib/advene/gui/main.py:4339
+msgid "Use WYSIWYG editors when possible (HTML, SVG)"
 msgstr ""
 
-#: ../lib/advene/plugins/ted.py:39
+#: ../lib/advene/gui/main.py:4340
 #, fuzzy
-msgid "TED importer"
-msgstr "Datei _importieren"
+msgid "Player control modifier"
+msgstr "_Spieler"
 
-#: ../lib/advene/plugins/shotdetect.py:35
-msgid "Shotdetect importer"
+#: ../lib/advene/gui/main.py:4340
+msgid ""
+"Generic player control modifier: key used in combination with arrows/space/"
+"tab to control the player. Click the button and press key+space to choose "
+"the modifier."
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetect.py:79
-msgid "No shots"
+#: ../lib/advene/gui/main.py:4341
+msgid "Player control in edit popups"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:77
-msgid "Pronounce a text"
+#: ../lib/advene/gui/main.py:4341
+msgid ""
+"Enable generic player controls in edit windows. This may be undesirable "
+"since it overloads some standard text-edition behaviours (esp. control-left/"
+"right)."
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:78
-msgid "String to pronounce."
+#: ../lib/advene/gui/main.py:4342
+msgid "Open popups"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:131 ../lib/advene/gui/plugins/actions.py:259
-#: ../lib/advene/gui/plugins/actions.py:340
-#: ../lib/advene/gui/plugins/actions.py:358
-msgid "No message..."
+#: ../lib/advene/gui/main.py:4343
+msgid "Where should we open adhoc views?"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:156
-msgid "TTS disabled. Cannot find the application 'festival' in PATH"
+#: ../lib/advene/gui/main.py:4344
+msgid "as a popup window"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:158
-msgid "TTS disabled. Cannot find the application 'aplay' in PATH"
+#: ../lib/advene/gui/main.py:4345
+msgid "embedded east of the video"
 msgstr ""
 
-#: ../lib/advene/player/gstreamer.py:434
-msgid "Cannot capture full-resolution snapshot, another capture is ongoing."
+#: ../lib/advene/gui/main.py:4346
+msgid "embedded west of the video"
 msgstr ""
 
-#: ../lib/advene/rules/importer.py:29
-msgid "Event history importer"
+#: ../lib/advene/gui/main.py:4347
+msgid "embedded south of the video"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:37 ../lib/advene/rules/actions.py:102
-#: ../lib/advene/rules/actions.py:120
-msgid "Message to display"
+#: ../lib/advene/gui/main.py:4348
+msgid "embedded at the right of the window"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:48
-msgid "Start the player"
+#: ../lib/advene/gui/main.py:4351
+msgid "History size"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:49
-msgid "Start position (in ms)"
+#: ../lib/advene/gui/main.py:4351
+msgid "History filelist size limit"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:52 ../lib/advene/rules/actions.py:384
-msgid "The movie start"
+#: ../lib/advene/gui/main.py:4353
+msgid "Remember window size"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:53 ../lib/advene/rules/actions.py:385
-#, fuzzy
-msgid "The annotation begin"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/main.py:4353
+msgid "Remember the size of opened windows"
+msgstr ""
 
-#: ../lib/advene/rules/actions.py:54 ../lib/advene/rules/actions.py:386
-#, fuzzy
-msgid "The annotation end"
-msgstr "Kommentar Typ"
+#: ../lib/advene/gui/main.py:4354
+msgid "Bookmark snapshot width"
+msgstr ""
 
-#: ../lib/advene/rules/actions.py:63 ../lib/advene/gui/views/logwindow.py:129
-msgid "Go to the given position"
+#: ../lib/advene/gui/main.py:4354
+msgid "Width of the snapshots representing bookmarks"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:64
-msgid "Goto position (in ms)"
+#: ../lib/advene/gui/main.py:4355
+msgid "Bookmark snapshot precision"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:73
-msgid "Stop the player"
+#: ../lib/advene/gui/main.py:4355
+msgid "Precision (in ms) of the displayed bookmark snapshots."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:80
-msgid "Pause the player"
+#: ../lib/advene/gui/main.py:4357
+msgid "Frame selector (shotvalidation...)"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:87
-msgid "Resume the player"
+#: ../lib/advene/gui/main.py:4358
+msgid "Frameselector snapshot width"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:94
-msgid "Take a snapshot"
+#: ../lib/advene/gui/main.py:4358
+msgid "Width of the snapshots in frameselector"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:101
-msgid "Display a caption"
+#: ../lib/advene/gui/main.py:4359
+msgid "Frameselector count"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:103
-msgid "Duration of the caption"
+#: ../lib/advene/gui/main.py:4359
+msgid "Number of frames displayed in frameselector."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:110 ../lib/advene/rules/actions.py:172
-#: ../lib/advene/gui/plugins/actions.py:61
-#: ../lib/advene/gui/plugins/actions.py:121
-#: ../lib/advene/gui/plugins/actions.py:403
-#: ../lib/advene/gui/plugins/actions.py:538
-msgid "1 second"
+#: ../lib/advene/gui/main.py:4361
+msgid "General"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:111 ../lib/advene/rules/actions.py:173
-#: ../lib/advene/gui/plugins/actions.py:62
-#: ../lib/advene/gui/plugins/actions.py:122
-#: ../lib/advene/gui/plugins/actions.py:404
-#: ../lib/advene/gui/plugins/actions.py:539
-#: ../lib/advene/gui/edit/rules.py:773
-#, fuzzy
-msgid "The annotation duration"
-msgstr "Zeige die Anmerkung als Transkription"
+#: ../lib/advene/gui/main.py:4362
+msgid "Weekly update check"
+msgstr ""
 
-#: ../lib/advene/rules/actions.py:119 ../lib/advene/gui/popup.py:718
-msgid "Caption the annotation"
+#: ../lib/advene/gui/main.py:4362 ../lib/advene/gui/util/initialconfig.py:90
+msgid "Weekly check for updates on the Advene website"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:131
-#, fuzzy
-msgid "Display a graphical shape"
-msgstr "Verbindungs Type"
+#: ../lib/advene/gui/main.py:4363
+msgid "On exit,"
+msgstr ""
 
-#: ../lib/advene/rules/actions.py:132
-msgid "Shape (square, circle, triangle)"
+#: ../lib/advene/gui/main.py:4364
+msgid "How to handle screenshots on exit"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:133
-#: ../lib/advene/gui/edit/shapewidget.py:342
-#: ../lib/advene/gui/edit/elements.py:891
-#: ../lib/advene/gui/edit/elements.py:971
-#: ../lib/advene/gui/edit/elements.py:1085
-#: ../lib/advene/gui/views/tagbag.py:138
-msgid "Color"
+#: ../lib/advene/gui/main.py:4365
+msgid "never save screenshots"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:134
-msgid "x-position (percentage of screen)"
+#: ../lib/advene/gui/main.py:4366
+msgid "always save screenshots"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:135
-msgid "y-position (percentage of screen)"
+#: ../lib/advene/gui/main.py:4367
+msgid "ask before saving screenshots"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:136
-msgid "Size (arbitrary units)"
+#: ../lib/advene/gui/main.py:4369
+msgid "Auto-save"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:137
-msgid "Duration of the display in ms"
+#: ../lib/advene/gui/main.py:4370
+msgid "Data auto-save functionality"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:145
-msgid "A square"
+#: ../lib/advene/gui/main.py:4371
+msgid "is desactivated"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:146
-msgid "A circle"
+#: ../lib/advene/gui/main.py:4372
+msgid "is done automatically"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:147
-msgid "A triangle"
+#: ../lib/advene/gui/main.py:4373
+msgid "is done after confirmation"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:150
-msgid "White"
+#: ../lib/advene/gui/main.py:4375
+msgid "Auto-save interval (in s)"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:151
-msgid "Black"
+#: ../lib/advene/gui/main.py:4375
+msgid "Interval (in seconds) between package auto-saves"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:152
-msgid "Red"
+#: ../lib/advene/gui/main.py:4377
+#, fuzzy
+msgid "Workspace"
+msgstr "Aktuelle Sitzung speichern"
+
+#: ../lib/advene/gui/main.py:4379
+msgid "On package saving,"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:153
-msgid "Green"
+#: ../lib/advene/gui/main.py:4380
+msgid "Do you wish to save the default workspace with the package?"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:154
-msgid "Blue"
+#: ../lib/advene/gui/main.py:4381
+#, fuzzy
+msgid "never save the current workspace"
+msgstr "Aktuelle Sitzung speichern"
+
+#: ../lib/advene/gui/main.py:4382
+#, fuzzy
+msgid "always save the current workspace"
+msgstr "Aktuelle Sitzung speichern"
+
+#: ../lib/advene/gui/main.py:4383
+msgid "ask before saving the current workspace"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:155
-msgid "Yellow"
+#: ../lib/advene/gui/main.py:4385
+msgid "Auto-validation of edited elements"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:158
-msgid "At the top of the screen"
+#: ../lib/advene/gui/main.py:4385
+msgid "Automatically validate modified elements when saving the package."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:159 ../lib/advene/rules/actions.py:164
-msgid "In the middle of the screen"
+#: ../lib/advene/gui/main.py:4387
+#, fuzzy
+msgid "On package load,"
+msgstr "Kein Pakte"
+
+#: ../lib/advene/gui/main.py:4388
+msgid "Do you wish to load the workspace saved with the package?"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:160
-msgid "At the bottom of the screen"
+#: ../lib/advene/gui/main.py:4389
+msgid "never load the saved workspace"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:163
-msgid "At the left of the screen"
+#: ../lib/advene/gui/main.py:4390
+msgid "always load the saved workspace"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:167
-#: ../lib/advene/gui/edit/transcribe.py:1164
-#: ../lib/advene/gui/views/activebookmarks.py:547
-msgid "Small"
+#: ../lib/advene/gui/main.py:4391
+msgid "ask before loading the saved workspace"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:168
-#: ../lib/advene/gui/edit/transcribe.py:1165
-#: ../lib/advene/gui/views/activebookmarks.py:548
-msgid "Normal"
-msgstr ""
+#: ../lib/advene/gui/main.py:4394
+#, fuzzy
+msgid "Video Player"
+msgstr "_Einstellung Spieler"
 
-#: ../lib/advene/rules/actions.py:169
-#: ../lib/advene/gui/edit/transcribe.py:1166
-#: ../lib/advene/gui/views/activebookmarks.py:549
-msgid "Large"
+#: ../lib/advene/gui/main.py:4395
+msgid "Autostart"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:181
-msgid "Zero the volume during the annotation"
+#: ../lib/advene/gui/main.py:4395
+msgid ""
+"Automatically start the player when loading a media file (either directly or "
+"through a package)"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:188
-msgid "Zero the volume"
+#: ../lib/advene/gui/main.py:4396
+msgid "Fulscreen timestamp"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:195
-msgid "Restore the volume"
+#: ../lib/advene/gui/main.py:4396
+msgid "Display the timestamp over the video when in fullscreen mode"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:203
-msgid "Activate a STBV"
+#: ../lib/advene/gui/main.py:4397
+msgid "Enable captions"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:204
-msgid "STBV id"
-msgstr ""
+#: ../lib/advene/gui/main.py:4397
+#, fuzzy
+msgid "Enable captions over the video"
+msgstr "Zeige Kommentare an einer Timeline"
 
-#: ../lib/advene/rules/actions.py:213
-msgid "Send a user event"
+#: ../lib/advene/gui/main.py:4398
+msgid "Caption font"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:214
-msgid "Identifier"
+#: ../lib/advene/gui/main.py:4398
+msgid "TrueType font for captions"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:215
-msgid "Delay in ms before sending the event."
+#: ../lib/advene/gui/main.py:4399
+msgid "Enable SVG"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:225
-msgid "Open a URL in the web browser"
+#: ../lib/advene/gui/main.py:4399
+msgid "Enable SVG captions over the video"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:226 ../lib/advene/gui/plugins/actions.py:103
-#: ../lib/advene/gui/views/logwindow.py:159
-msgid "URL"
+#: ../lib/advene/gui/main.py:4401
+msgid "Enable snapshots"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:235
-msgid "Open a static view"
+#: ../lib/advene/gui/main.py:4402
+msgid "Snapshot width"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:246
-msgid "Set the audio volume"
+#: ../lib/advene/gui/main.py:4402
+msgid "Snapshot width in pixels."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:247
-msgid "Volume level (from 0 to 100)"
+#: ../lib/advene/gui/main.py:4403
+msgid "Verbosity"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:256
-msgid "Set the playing rate"
+#: ../lib/advene/gui/main.py:4403
+msgid "Verbosity level. -1 for no messages."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:257
-msgid "Rate (100: normal rate, 200: twice slower)"
+#: ../lib/advene/gui/main.py:4406
+msgid "Devices"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:266
-msgid "Play a sound resource"
+#: ../lib/advene/gui/main.py:4408
+msgid "Standard"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:267
-msgid "Clip id"
+#: ../lib/advene/gui/main.py:4410
+msgid "DVD drive"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:268 ../lib/advene/rules/actions.py:282
-msgid "Volume (0..100)"
+#: ../lib/advene/gui/main.py:4410
+msgid "Drive letter for the DVD"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:269 ../lib/advene/rules/actions.py:283
-msgid "Left-right balance: -1 -> full left, 0 -> center, 1 -> full right"
+#: ../lib/advene/gui/main.py:4411
+msgid "GDI"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:280
-#, fuzzy
-msgid "Play a sound file"
-msgstr "Verbindungs Type"
-
-#: ../lib/advene/rules/actions.py:281
-msgid "Sound filename"
+#: ../lib/advene/gui/main.py:4412
+msgid "Direct X"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:293
-msgid "Set a state variable"
+#: ../lib/advene/gui/main.py:4414
+msgid "DVD device"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:294 ../lib/advene/rules/actions.py:306
-msgid "State variable name"
+#: ../lib/advene/gui/main.py:4414
+msgid "Device for the DVD"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:295
-msgid "State value"
+#: ../lib/advene/gui/main.py:4415
+msgid "X11"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:305
-msgid "Increment a state variable"
+#: ../lib/advene/gui/main.py:4416
+msgid "XVideo"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:315
-msgid "Clear all state variables"
+#: ../lib/advene/gui/main.py:4417
+msgid "GL"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:330
-#, python-format
-msgid "Error in the evaluation of the parameter %s:"
+#: ../lib/advene/gui/main.py:4419
+msgid "Video output"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:389 ../lib/advene/gui/plugins/actions.py:247
-#, python-format
-msgid "The %s-related outgoing annotation"
+#: ../lib/advene/gui/main.py:4419
+msgid "Video output module"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:391 ../lib/advene/gui/plugins/actions.py:249
-#, python-format
-msgid "The %s-related incoming annotation"
+#: ../lib/advene/gui/main.py:4421
+msgid "Recorder options"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:551
-#, python-format
-msgid "Cannot find the stbv %s"
+#: ../lib/advene/gui/main.py:4422
+msgid "Audio input"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:615 ../lib/advene/gui/views/viewbook.py:263
-#, python-format
-msgid "Cannot find the view %s"
+#: ../lib/advene/gui/main.py:4422
+msgid "Device name for audio input (with gstrecorder plugin)"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:647
-msgid "The set_rate method is unavailable."
+#: ../lib/advene/gui/main.py:4423
+msgid "Record video"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:657
-msgid "No 'soundclips' resource folder in the package"
+#: ../lib/advene/gui/main.py:4423
+msgid "Record both video and audio"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:683
-msgid "Full volume"
+#: ../lib/advene/gui/main.py:4426
+msgid "<i>Experimental</i>"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:684
-msgid "Left"
+#: ../lib/advene/gui/main.py:4427 ../lib/advene/gui/views/scroller.py:30
+msgid "Scroller"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:685
-#: ../lib/advene/gui/edit/transcribe.py:1196
-#, fuzzy
-msgid "Center"
-msgstr "Erstelle"
-
-#: ../lib/advene/rules/actions.py:686
-msgid "Right"
+#: ../lib/advene/gui/main.py:4427
+msgid "Embed the caption scroller below the video"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:141
-msgid "is equal to"
+#: ../lib/advene/gui/main.py:4428 ../lib/advene/gui/views/caption.py:29
+msgid "Caption"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:142
-msgid "is different from"
+#: ../lib/advene/gui/main.py:4428
+msgid "Embed the caption view below the video"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:143
-msgid "contains"
+#: ../lib/advene/gui/main.py:4430
+msgid "Time-related"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:144
-msgid "is greater than"
-msgstr ""
+#: ../lib/advene/gui/main.py:4431
+#, fuzzy
+msgid "Time format"
+msgstr "T_imeline"
 
-#: ../lib/advene/rules/elements.py:145
-msgid "is lower than"
+#: ../lib/advene/gui/main.py:4431
+msgid "Format used to display timecodes"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:146
-msgid "matches the regexp"
+#: ../lib/advene/gui/main.py:4445
+msgid "Default FPS"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:147
-msgid "is before"
+#: ../lib/advene/gui/main.py:4446
+msgid ""
+"Default FPS (frame-per-second) value, when the information cannot be read "
+"from the media."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:148
-msgid "meets"
-msgstr ""
+#: ../lib/advene/gui/main.py:4447
+#, fuzzy
+msgid "Time increment"
+msgstr "T_imeline"
 
-#: ../lib/advene/rules/elements.py:149
-msgid "overlaps"
+#: ../lib/advene/gui/main.py:4447
+msgid ""
+"Skip duration, when using control-left/right or forward/rewind buttons (in "
+"ms)."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:150
-msgid "during"
+#: ../lib/advene/gui/main.py:4448
+msgid "Second time increment"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:151
-msgid "starts"
+#: ../lib/advene/gui/main.py:4448
+msgid "Skip duration, when using control-shift-left/right (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:152
-msgid "finishes"
-msgstr ""
+#: ../lib/advene/gui/main.py:4449
+#, fuzzy
+msgid "Third time increment"
+msgstr "T_imeline"
 
-#: ../lib/advene/rules/elements.py:157
-msgid "is not true"
+#: ../lib/advene/gui/main.py:4449
+msgid "Skip duration, when using control-shift-up/down (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:158
-msgid "is true"
+#: ../lib/advene/gui/main.py:4450
+msgid "Custom Up/Down"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:162
-msgid "Basic conditions"
+#: ../lib/advene/gui/main.py:4450
+msgid ""
+"Use third time increment for up/down navigation without having to hold shift."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:163
-msgid "Allen relations"
+#: ../lib/advene/gui/main.py:4452
+msgid "Scroll increment"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:226 ../lib/advene/rules/elements.py:232
-msgid "Unknown type for overlaps comparison"
+#: ../lib/advene/gui/main.py:4452
+msgid ""
+"On most annotations, control+scrollwheel will increment/decrement their "
+"bounds by this value (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:240 ../lib/advene/rules/elements.py:246
-msgid "Unknown type for during comparison"
+#: ../lib/advene/gui/main.py:4453
+msgid "Second scroll increment"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:515 ../lib/advene/rules/elements.py:521
-#, python-format
-msgid "Unknown action %s"
+#: ../lib/advene/gui/main.py:4453
+msgid ""
+"On most annotations, control+shift+scrollwheel will increment/decrement "
+"their bounds by this value (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:522
-#, fuzzy, python-format
-msgid "Unknown parameter %s"
-msgstr "Unbekannte STBV identifier: %s"
-
-#: ../lib/advene/rules/elements.py:527
-msgid "Unknown actions"
-msgstr ""
+#: ../lib/advene/gui/main.py:4455
+#, fuzzy
+msgid "Player sync"
+msgstr "_Spieler"
 
-#: ../lib/advene/rules/elements.py:972
-msgid "Start of the editing of an element"
+#: ../lib/advene/gui/main.py:4455
+msgid ""
+"Interval (in ms) with which we synchronize slave players. Setting a too-low "
+"value could render the application unusable. Use 0 to disable continuous "
+"synchronization."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:973
-msgid "Cancel of the editing of an element"
+#: ../lib/advene/gui/main.py:4456
+msgid "Timeline parameters"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:974
-msgid "Destruction of the edit window of an element"
+#: ../lib/advene/gui/main.py:4457 ../lib/advene/gui/edit/transcribe.py:156
+msgid "Font size"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:975
-msgid "Validation of the editing of an element"
+#: ../lib/advene/gui/main.py:4457
+msgid "Font size for annotation widgets"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:976
-msgid "Ending editing of a package"
+#: ../lib/advene/gui/main.py:4458
+msgid "Button height"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:977
-msgid "Beginning of an annotation"
+#: ../lib/advene/gui/main.py:4458
+msgid "Height of annotation widgets"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:978
-msgid "End of an annotation"
+#: ../lib/advene/gui/main.py:4459
+msgid "Interline height"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:979
-msgid "Creation of a new annotation"
+#: ../lib/advene/gui/main.py:4459
+msgid "Height of interlines"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:980
-msgid "Ending editing of an annotation"
-msgstr ""
+#: ../lib/advene/gui/main.py:4461
+#, fuzzy
+msgid "Text content"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/rules/elements.py:981
-msgid "Suppression of an annotation"
+#: ../lib/advene/gui/main.py:4462
+msgid "Completion mode"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:982
-msgid "Activation of an annotation"
+#: ../lib/advene/gui/main.py:4462
+msgid "Enable dynamic completion mode"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:983
-msgid "Deactivation of an annotation"
+#: ../lib/advene/gui/main.py:4463
+msgid "Predefined terms only"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:984
-msgid "Merging of two annotations"
+#: ../lib/advene/gui/main.py:4463
+msgid "If completion is enabled, complete only with predefined terms."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:985
-#, fuzzy
-msgid "Moving an annotation"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/rules/elements.py:986
-msgid "Activation of a relation"
+#: ../lib/advene/gui/main.py:4464
+msgid "Abbreviation mode"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:987
-msgid "Deactivation of a relation"
+#: ../lib/advene/gui/main.py:4464
+msgid "Enable abbreviation mode"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:988
-msgid "Creation of a new relation"
+#: ../lib/advene/gui/main.py:4465
+msgid "Abbreviations"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:989
-msgid "Ending editing of a relation"
+#: ../lib/advene/gui/main.py:4465
+msgid ""
+"Text abbreviations. 1 entry per line. Each line consists of the abbreviation "
+"followed by its replacement."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:990
-msgid "Suppression of a relation"
+#: ../lib/advene/gui/main.py:4467
+msgid "Text-To-Speech"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:991
-msgid "Creation of a new view"
+#: ../lib/advene/gui/main.py:4468
+msgid "TTS language"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:992
-msgid "Ending editing of a view"
+#: ../lib/advene/gui/main.py:4469
+msgid "What language settings should be used for text-to-speech"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:993
-msgid "Suppression of a view"
+#: ../lib/advene/gui/main.py:4470
+msgid "English"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:994
-msgid "Creation of a new query"
+#: ../lib/advene/gui/main.py:4471
+msgid "French"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:995
-msgid "Ending editing of a query"
+#: ../lib/advene/gui/main.py:4472
+msgid "Spanish"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:996
-msgid "Suppression of a query"
+#: ../lib/advene/gui/main.py:4474
+msgid "TTS Encoding"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:997
-msgid "Creation of a new schema"
+#: ../lib/advene/gui/main.py:4475
+msgid "What encoding should be used to communicate with the TTS engine"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:998
-msgid "Ending editing of a schema"
+#: ../lib/advene/gui/main.py:4476
+msgid "TTS Engine"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:999
-msgid "Suppression of a schema"
+#: ../lib/advene/gui/main.py:4477
+msgid ""
+"Which TTS engine should be used (modification requires restarting Advene to "
+"take into account)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1000
-#: ../lib/advene/gui/views/timeline.py:1029 ../lib/advene/gui/main.py:4555
-msgid "Creation of a new annotation type"
+#: ../lib/advene/gui/main.py:4478
+msgid "Automatic"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1001
-msgid "Ending editing an annotation type"
+#: ../lib/advene/gui/main.py:4479
+msgid "eSpeak"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1002
-msgid "Suppression of an annotation type"
+#: ../lib/advene/gui/main.py:4480
+msgid "Custom script with standard input"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1003
-msgid "Creation of a new relation type"
+#: ../lib/advene/gui/main.py:4481
+msgid "Custom script with arguments"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1004
-msgid "Ending editing a relation type"
+#: ../lib/advene/gui/main.py:4482
+msgid "SAPI"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1005
-msgid "Suppression of a relation type"
+#: ../lib/advene/gui/main.py:4483
+msgid "MacOS X say"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1006
-msgid "Creation of a new resource"
+#: ../lib/advene/gui/main.py:4484
+msgid "Generic (text output)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1007
-msgid "Ending editing of a resource"
+#: ../lib/advene/gui/main.py:4530
+msgid "You should restart Advene to take some options into account."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1008
-msgid "Suppression of a resource"
+#: ../lib/advene/gui/main.py:4539
+#, python-format
+msgid "Imagecache saved to %s"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1009
-msgid "Modification of the tag"
+#: ../lib/advene/gui/main.py:4552
+msgid "Restarting player..."
 msgstr ""
 
+#: ../lib/advene/gui/main.py:4647 ../lib/advene/gui/views/timeline.py:1121
 #: ../lib/advene/rules/elements.py:1010
-msgid "Activating a link"
+msgid "Creation of a new annotation type"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1011
-msgid "Player start"
+#: ../lib/advene/gui/main.py:4655 ../lib/advene/gui/views/timeline.py:1150
+msgid ""
+"Select the schema where you want to\n"
+"create the new relation type."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1012
-msgid "Player stop"
+#: ../lib/advene/gui/main.py:4673
+msgid "Select the package to merge"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1013
-msgid "Player pause"
+#: ../lib/advene/gui/main.py:4694
+msgid "Saving workspace"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1014
-msgid "Player resume"
+#: ../lib/advene/gui/main.py:4697
+msgid "Enter a view name to save the workspace"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1015
-msgid "Going to a given position"
+#: ../lib/advene/gui/main.py:4698
+#, fuzzy
+msgid "Default workspace"
+msgstr "Aktuelle Sitzung speichern"
+
+#: ../lib/advene/gui/main.py:4699
+msgid "Open this workspace when opening the package"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1016
-msgid "Loading a new package"
+#: ../lib/advene/gui/main.py:4722 ../lib/advene/gui/views/__init__.py:305
+#, python-format
+msgid "Error: the identifier %s contains invalid characters."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1017
-msgid "Activating a package"
+#: ../lib/advene/gui/main.py:4733
+#, python-format
+msgid "Error: the view %s exists and is not a workspace view."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1018
-msgid "Saving the package"
+#: ../lib/advene/gui/main.py:4764
+#, python-format
+msgid "Cannot save default workspace: %s"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1019
-msgid "Start of the dynamic view"
+#: ../lib/advene/gui/main.py:4774
+msgid "Standard workspace has been saved"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1020
-msgid "End of the dynamic view"
+#: ../lib/advene/gui/main.py:4781
+msgid "Website export"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1021
-msgid "Start of the application"
+#: ../lib/advene/gui/main.py:4782
+msgid "Exporting views to a website"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1022
-msgid "End of the application"
+#: ../lib/advene/gui/main.py:4785
+msgid "Output directory"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1023
-msgid "User-defined event"
+#: ../lib/advene/gui/main.py:4794
+msgid "Specify the output directory"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1024
-msgid "Modification of the associated media"
+#: ../lib/advene/gui/main.py:4803
+msgid "Maximum recursion depth"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1025
-msgid "Highlight a bookmark"
+#: ../lib/advene/gui/main.py:4810
+msgid "Video URL"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1026
-msgid "Unhighlight a bookmark"
+#: ../lib/advene/gui/main.py:4812
+msgid ""
+"URL for the video, if it is available on a sharing website (Only Youtube for "
+"the moment).\n"
+" It can also be a h264/ogg file, which will in this case be handled by the "
+"HTML5 video player."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1027
-msgid "Updating duration of the movie"
+#: ../lib/advene/gui/main.py:4862
+msgid "Could not export data: "
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1028
-msgid "Displaying a popup"
+#: ../lib/advene/gui/main.py:4864
+#, fuzzy, python-format
+msgid "Website export to %s completed"
+msgstr "Datei _importieren"
+
+#: ../lib/advene/gui/main.py:4903
+msgid "This video player is not able to grab specific screenshots"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1029
-msgid "Updating a snapshot"
+#: ../lib/advene/gui/main.py:4909
+#, python-format
+msgid "Updating %d snapshots"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1067
-#, fuzzy
-msgid "Player control"
-msgstr "_Spieler"
+#: ../lib/advene/gui/main.py:4914
+msgid "No snapshot to update"
+msgstr ""
 
-#: ../lib/advene/rules/elements.py:1068
-msgid "Audio enrichment"
+#: ../lib/advene/gui/plugins/shotvalidation.py:37
+msgid "Shot validation view"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1069
+#: ../lib/advene/gui/plugins/shotvalidation.py:39
 #, fuzzy
-msgid "Image enrichment"
-msgstr "T_imeline"
+msgid "Display shot validation interface"
+msgstr "Zeige Kommentare an einer Timeline"
 
-#: ../lib/advene/rules/elements.py:1070
-msgid "External display control"
+#: ../lib/advene/gui/plugins/shotvalidation.py:115
+#, python-format
+msgid "Merged #%(first)d-#%(second)d into #%(first)d"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1071
-msgid "Popup"
+#: ../lib/advene/gui/plugins/shotvalidation.py:145
+msgid "Last action undone"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1073
-msgid "State"
+#: ../lib/advene/gui/plugins/shotvalidation.py:163
+#, python-format
+msgid "Split annotation #%(current)d into #%(current)d and #%(next)d"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1074
-msgid "GUI actions"
+#: ../lib/advene/gui/plugins/shotvalidation.py:168
+#, python-format
+msgid "Cannot split annotation #%(current)d: out of bounds."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1075
-msgid "Expert"
+#: ../lib/advene/gui/plugins/shotvalidation.py:188
+#, python-format
+msgid "Changed cut between #%(first)d and %(second)d"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:82
-msgid "Initial Advene configuration"
-msgstr ""
+#: ../lib/advene/gui/plugins/shotvalidation.py:191
+#, fuzzy
+msgid "Changed begin time for first annotation"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/util/initialconfig.py:83
+#: ../lib/advene/gui/plugins/shotvalidation.py:197
+#, fuzzy
+msgid "No annotations to adjust"
+msgstr "Kommentar Typ"
+
+#: ../lib/advene/gui/plugins/shotvalidation.py:204
 msgid ""
-"<span size='large'><b>Welcome in Advene</b>\n"
-"This is the first time that you run Advene. Please answer some basic "
-"configuration questions. You will be able to modify these choices from the "
-"Advene interface, in the Edit/Preferences menu.</span>"
+"Click on the frame just after the cut to adjust the cut time.\n"
+"Control-click on a frame to indicate a missing cut."
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:84
-#, fuzzy
-msgid "Interface language"
-msgstr "Oberflächen Eigentschaften"
+#: ../lib/advene/gui/plugins/shotvalidation.py:212
+#, python-format
+msgid "Begin of #%(index)d (title: %(content)s)"
+msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:84
-msgid "Language used for the interface"
+#: ../lib/advene/gui/plugins/shotvalidation.py:226
+msgid "< Previous cut"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:88 ../lib/advene/gui/main.py:4247
-msgid "System default"
+#: ../lib/advene/gui/plugins/shotvalidation.py:227
+#, fuzzy
+msgid "Display previous cut"
+msgstr "Zeige die Transkription für eine Anmerkung"
+
+#: ../lib/advene/gui/plugins/shotvalidation.py:234
+msgid "Next cut >"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:90
-msgid "Weekly check for Advene updates on the Advene website"
+#: ../lib/advene/gui/plugins/shotvalidation.py:235
+#, fuzzy
+msgid "Display next cut"
+msgstr "Zeige Shortcuts"
+
+#: ../lib/advene/gui/plugins/shotvalidation.py:250
+#: ../lib/advene/gui/views/annotationdisplay.py:92
+#: ../lib/advene/gui/views/timeline.py:86
+msgid "Current time"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:90 ../lib/advene/gui/main.py:4273
-msgid "Weekly check for updates on the Advene website"
+#: ../lib/advene/gui/plugins/shotvalidation.py:251
+#, fuzzy
+msgid "Go to annotation containing current player time."
+msgstr "Kommentar Typ"
+
+#: ../lib/advene/gui/plugins/shotvalidation.py:255
+#: ../lib/advene/gui/edit/frameselector.py:200
+#, fuzzy
+msgid "Refresh snapshots"
+msgstr "Zeige Shortcuts"
+
+#: ../lib/advene/gui/plugins/shotvalidation.py:256
+#: ../lib/advene/gui/edit/frameselector.py:201
+msgid "Refresh missing snapshots"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:92
-msgid "Preferred directory for data files"
+#: ../lib/advene/gui/plugins/shotvalidation.py:261
+msgid "Undo last modification"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:92
-msgid "Preferred directory for storing data files (Advene packages)"
+#: ../lib/advene/gui/plugins/shotvalidation.py:267
+msgid "Merge with previous"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:94
-msgid "Directories to search for movies"
+#: ../lib/advene/gui/plugins/shotvalidation.py:268
+msgid "Merge with previous annotation, i.e. remove this bound."
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:94
-#, python-format
-msgid ""
-"List of directories (separated by %(pathsep)s) to search for movie files."
+#: ../lib/advene/gui/plugins/shotvalidation.py:273
+msgid "Close view."
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:95
-msgid "First look for movie file in the same directory as the package"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:44
+#, fuzzy
+msgid "Activity trace"
+msgstr "Aktivieren und Abspielen"
+
+#: ../lib/advene/gui/plugins/eventaccumulator.py:74
+#: ../lib/advene/gui/plugins/eventaccumulator.py:75
+#: ../lib/advene/gui/plugins/tracetimeline.py:65
+#: ../lib/advene/gui/plugins/tracetimeline.py:66
+#: ../lib/advene/gui/plugins/tracepreview.py:72
+#: ../lib/advene/gui/plugins/tracepreview.py:73
+msgid "Beginning edition"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:95
-msgid ""
-"If checked, the movie file will be searched for in the same directory as the "
-"referencing package."
+#: ../lib/advene/gui/plugins/eventaccumulator.py:76
+#: ../lib/advene/gui/plugins/eventaccumulator.py:77
+#: ../lib/advene/gui/plugins/eventaccumulator.py:78
+#: ../lib/advene/gui/plugins/tracetimeline.py:67
+#: ../lib/advene/gui/plugins/tracetimeline.py:68
+#: ../lib/advene/gui/plugins/tracetimeline.py:69
+#: ../lib/advene/gui/plugins/tracepreview.py:74
+#: ../lib/advene/gui/plugins/tracepreview.py:75
+#: ../lib/advene/gui/plugins/tracepreview.py:76
+msgid "Canceling edition"
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:39
-#: ../lib/advene/gui/edit/schemaeditor.py:1081
-#: ../lib/advene/gui/edit/schemaeditor.py:1202
-#: ../lib/advene/gui/edit/create.py:106
-msgid "Plain text content"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:79
+#: ../lib/advene/gui/plugins/tracetimeline.py:70
+#: ../lib/advene/gui/plugins/tracepreview.py:77
+msgid "Ending edition"
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:40
-msgid "HTML content"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:135
+msgid " Trace : "
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:41
-#: ../lib/advene/gui/edit/schemaeditor.py:1082
-#: ../lib/advene/gui/edit/schemaeditor.py:1203
-#: ../lib/advene/gui/edit/create.py:107
-msgid "Simple-structured content"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:139
+#, fuzzy
+msgid " Filters"
+msgstr "_Datei"
+
+#: ../lib/advene/gui/plugins/eventaccumulator.py:168
+msgid " Time : "
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:42
-msgid "List of numeric values"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:178
+msgid " Max. : "
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:43
-#: ../lib/advene/gui/edit/schemaeditor.py:1083
-#: ../lib/advene/gui/edit/schemaeditor.py:1204
-#: ../lib/advene/gui/edit/create.py:108
-msgid "SVG graphics content"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:187
+#, fuzzy
+msgid "Export"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/util/__init__.py:459
-#, python-format
-msgid ""
-"Annotation Type %(title)s:\n"
-"%(count)s"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:203
+#: ../lib/advene/gui/plugins/tracetimeline.py:665
+#, fuzzy
+msgid "Exporting traces"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/util/__init__.py:465
-#, python-format
+#: ../lib/advene/gui/plugins/eventaccumulator.py:208
+#: ../lib/advene/gui/plugins/tracetimeline.py:670
+#, fuzzy, python-format
 msgid ""
-"Relation Type %(title)s:\n"
-"%(count)s"
-msgstr ""
+"Export done to\n"
+"%s"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/util/dialog.py:376 ../lib/advene/gui/edit/dvdselect.py:95
-#: ../lib/advene/gui/edit/imports.py:331
-#: ../lib/advene/gui/edit/transcribe.py:1055
-#: ../lib/advene/gui/views/table.py:557 ../lib/advene/gui/main.py:4176
-msgid "Title"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:254
+#, fuzzy
+msgid "Defining Filters"
+msgstr "_Datei"
 
-#: ../lib/advene/gui/util/dialog.py:385 ../lib/advene/gui/edit/rules.py:1092
-#: ../lib/advene/gui/edit/imports.py:325
-#: ../lib/advene/gui/edit/elements.py:507
-#: ../lib/advene/gui/edit/elements.py:556
-#: ../lib/advene/gui/edit/elements.py:644
-#: ../lib/advene/gui/edit/elements.py:724
-#: ../lib/advene/gui/edit/elements.py:873
-#: ../lib/advene/gui/edit/elements.py:942
-#: ../lib/advene/gui/edit/elements.py:1054
-#: ../lib/advene/gui/edit/elements.py:1115
-#: ../lib/advene/gui/views/table.py:255 ../lib/advene/gui/views/table.py:559
-msgid "Id"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:560
+#: ../lib/advene/gui/plugins/eventaccumulator.py:615
+#: ../lib/advene/gui/plugins/tracepreview.py:214
+#, fuzzy, python-format
+msgid "of an annotation (%s)"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/util/dialog.py:404 ../lib/advene/gui/util/dialog.py:443
-msgid "Name the element"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:562
+#: ../lib/advene/gui/plugins/eventaccumulator.py:617
+#: ../lib/advene/gui/plugins/tracepreview.py:216
+#, fuzzy, python-format
+msgid "of a relation (%s)"
+msgstr "Verbindungs Type"
 
-#: ../lib/advene/gui/util/dialog.py:407 ../lib/advene/gui/util/dialog.py:444
-msgid "Choose a name for the element"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:564
+#: ../lib/advene/gui/plugins/eventaccumulator.py:619
+#: ../lib/advene/gui/plugins/tracepreview.py:218
+#, fuzzy, python-format
+msgid "of an annotation type (%s)"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/util/dialog.py:482
-msgid "Open a file"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:566
+#: ../lib/advene/gui/plugins/eventaccumulator.py:621
+#: ../lib/advene/gui/plugins/tracepreview.py:220
+#, fuzzy, python-format
+msgid "of a relation type (%s)"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/util/dialog.py:507 ../lib/advene/gui/util/dialog.py:543
-msgid "N/C"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:568
+#: ../lib/advene/gui/plugins/eventaccumulator.py:623
+#: ../lib/advene/gui/plugins/tracepreview.py:222
+#, fuzzy, python-format
+msgid "of a schema (%s)"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/gui/util/dialog.py:512
-msgid "Alias"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:570
+#: ../lib/advene/gui/plugins/eventaccumulator.py:625
+#: ../lib/advene/gui/plugins/tracepreview.py:224
+#, python-format
+msgid "of a view (%s)"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:532
-msgid ""
-"Press to\n"
-"display\n"
-"information"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:572
+#: ../lib/advene/gui/plugins/eventaccumulator.py:627
+#: ../lib/advene/gui/plugins/tracepreview.py:226
+#, fuzzy, python-format
+msgid "of a package (%s)"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/gui/util/dialog.py:551
-msgid "Wait..."
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:574
+#: ../lib/advene/gui/plugins/eventaccumulator.py:629
+#: ../lib/advene/gui/plugins/tracepreview.py:228
+#, fuzzy, python-format
+msgid "of an unknown item (%s)"
+msgstr "Unbekannte STBV identifier: %s"
 
-#: ../lib/advene/gui/util/dialog.py:555
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:382
 #, python-format
-msgid "Error: %s"
+msgid "Rendering type %(type)s as %(presentation)s"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:575
-msgid "Any type of file"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:527
+msgid "Snapshot only"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:577
-msgid "Advene files (.xml, .azp, .apl)"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:528
+msgid "Overlayed snapshot only"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:579
-msgid "Advene session (.apl)"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:529
+msgid "Timestamp only"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:580
-msgid "Audio files"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:530
+msgid "Snapshot+timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:581
-msgid "Video files"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:531
+#, fuzzy
+msgid "Annotation content"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/util/dialog.py:626
-#: ../lib/advene/gui/edit/properties.py:418
-msgid "Choose a directory"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:546
+msgid "as a list"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:679
-msgid "Select an element"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:547
+msgid "as a grid"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:32
-msgid "Shot validation view"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:548
+msgid "as a table"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:34
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:549
+#: ../lib/advene/gui/views/viewbook.py:394
 #, fuzzy
-msgid "Display shot validation interface"
-msgstr "Zeige Kommentare an einer Timeline"
+msgid "as a transcription"
+msgstr "T_ranskription"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:111
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:667
+#: ../lib/advene/gui/views/transcription.py:448
 #, python-format
-msgid "Merged #%(first)d-#%(second)d into #%(first)d"
+msgid "Annotation %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:136
-msgid "Last action undone"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:668
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:687
+msgid "Play video"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:154
-#, python-format
-msgid "Split annotation #%(current)d into #%(current)d and #%(next)d"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:669
+msgid "Show timestamp only"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:159
-#, python-format
-msgid "Cannot split annotation #%(current)d: out of bounds."
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:670
+msgid "Show content only"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:179
-#, python-format
-msgid "Changed cut between #%(first)d and %(second)d"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:671
+msgid "Show snapshot only"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:182
-#, fuzzy
-msgid "Changed begin time for first annotation"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:188
-#, fuzzy
-msgid "No annotations to adjust"
-msgstr "Kommentar Typ"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:195
-msgid ""
-"Click on the frame just after the cut to adjust the cut time.\n"
-"Control-click on a frame to indicate a missing cut."
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:673
+msgid "Show overlayed timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:203
-#, python-format
-msgid "Begin of #%(index)d (title: %(content)s)"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:674
+msgid "Show overlayed content"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:217
-msgid "< Previous cut"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:676
+#, fuzzy, python-format
+msgid "Annotation type %s"
+msgstr "Kommentar Typ"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:218
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:677
 #, fuzzy
-msgid "Display previous cut"
-msgstr "Zeige die Transkription für eine Anmerkung"
+msgid "display as list"
+msgstr "Zeige Packet inhalt als Baumdarstellung"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:225
-msgid "Next cut >"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:678
+#, fuzzy
+msgid "display as grid"
+msgstr "Zeige Packet inhalt als Baumdarstellung"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:226
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:679
 #, fuzzy
-msgid "Display next cut"
-msgstr "Zeige Shortcuts"
+msgid "display as table"
+msgstr "Zeige Kommentare an einer Timeline"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:251
-#: ../lib/advene/gui/views/timeline.py:81
-#: ../lib/advene/gui/views/annotationdisplay.py:90
-msgid "Current time"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:680
+#, fuzzy
+msgid "display as transcription"
+msgstr "T_ranskription"
+
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:689
+msgid "Open link"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:252
-#, fuzzy
-msgid "Go to annotation containing current player time."
-msgstr "Kommentar Typ"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:745
+#, fuzzy, python-format
+msgid "HTML editor: cannot parse content (%s)"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:256
-#: ../lib/advene/gui/edit/frameselector.py:193
-#, fuzzy
-msgid "Refresh snapshots"
-msgstr "Zeige Shortcuts"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:776
+#, fuzzy, python-format
+msgid "Heading %d"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:257
-#: ../lib/advene/gui/edit/frameselector.py:194
-msgid "Refresh missing snapshots"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:787
+msgid "Bold"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:261
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:806
-#: ../lib/advene/gui/edit/transcribe.py:1211 ../lib/advene/gui/main.py:350
-msgid "Undo"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:788
+msgid "Italic"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:262
-msgid "Undo last modification"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:789
+msgid "Header"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:268
-msgid "Merge with previous"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:791
+msgid "Copy"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:269
-msgid "Merge with previous annotation, i.e. remove this bound."
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:792
+msgid "Cut"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:274
-msgid "Close view."
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:793
+msgid "Paste"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:60
-#: ../lib/advene/gui/plugins/tracetimeline.py:61
-#: ../lib/advene/gui/plugins/eventaccumulator.py:73
-#: ../lib/advene/gui/plugins/eventaccumulator.py:74
-#: ../lib/advene/gui/plugins/tracepreview.py:72
-#: ../lib/advene/gui/plugins/tracepreview.py:73
-msgid "Beginning edition"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:795
+#: ../lib/advene/gui/views/timeline.py:139
+msgid "Refresh"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:62
-#: ../lib/advene/gui/plugins/tracetimeline.py:63
-#: ../lib/advene/gui/plugins/tracetimeline.py:64
-#: ../lib/advene/gui/plugins/eventaccumulator.py:75
-#: ../lib/advene/gui/plugins/eventaccumulator.py:76
-#: ../lib/advene/gui/plugins/eventaccumulator.py:77
-#: ../lib/advene/gui/plugins/tracepreview.py:74
-#: ../lib/advene/gui/plugins/tracepreview.py:75
-#: ../lib/advene/gui/plugins/tracepreview.py:76
-msgid "Canceling edition"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:851
+msgid "WYSIWYG editor"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:65
-#: ../lib/advene/gui/plugins/eventaccumulator.py:78
-#: ../lib/advene/gui/plugins/tracepreview.py:77
-msgid "Ending edition"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:861
+msgid "Edit HTML source"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:66
+#: ../lib/advene/gui/plugins/tracetimeline.py:71
 #: ../lib/advene/gui/plugins/tracepreview.py:78
 #, fuzzy
 msgid "Moving to"
 msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:82
+#: ../lib/advene/gui/plugins/tracetimeline.py:87
 msgid "Traces"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:208
+#: ../lib/advene/gui/plugins/tracetimeline.py:213
 #, python-format
 msgid "%(name)s (%(index)d)"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:236
+#: ../lib/advene/gui/plugins/tracetimeline.py:241
 msgid "Search"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:249
-#: ../lib/advene/gui/plugins/tracetimeline.py:1224
+#: ../lib/advene/gui/plugins/tracetimeline.py:254
+#: ../lib/advene/gui/plugins/tracetimeline.py:1214
 #, python-format
 msgid "%(name)s (%(index)s)"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:421
-#: ../lib/advene/gui/edit/montage.py:439
-#: ../lib/advene/gui/views/timeline.py:3444
+#: ../lib/advene/gui/plugins/tracetimeline.py:426
+#: ../lib/advene/gui/views/timeline.py:3484
+#: ../lib/advene/gui/edit/montage.py:449
 msgid "Zoom out"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:426
-#: ../lib/advene/gui/edit/montage.py:444
-#: ../lib/advene/gui/views/timeline.py:3449
+#: ../lib/advene/gui/plugins/tracetimeline.py:431
+#: ../lib/advene/gui/views/timeline.py:3489
+#: ../lib/advene/gui/edit/montage.py:454
 msgid "Zoom in"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:431
+#: ../lib/advene/gui/plugins/tracetimeline.py:436
 msgid "Zoom 100%"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:435
+#: ../lib/advene/gui/plugins/tracetimeline.py:440
 msgid "Toggle links lock"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:443
+#: ../lib/advene/gui/plugins/tracetimeline.py:448
 msgid "Toggle link mode"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:450
+#: ../lib/advene/gui/plugins/tracetimeline.py:455
 msgid "Open a trace file"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:465
+#: ../lib/advene/gui/plugins/tracetimeline.py:470
 msgid "Toggle auto refresh"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:476
+#: ../lib/advene/gui/plugins/tracetimeline.py:481
 msgid "Open an existing trace"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:482
+#: ../lib/advene/gui/plugins/tracetimeline.py:487
 #, fuzzy
 msgid "Save trace"
 msgstr "Sichere _ImageCache"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:487
+#: ../lib/advene/gui/plugins/tracetimeline.py:492
 #, fuzzy
 msgid "Configuration"
 msgstr "_Einstellung Spieler"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:668
-#: ../lib/advene/gui/plugins/eventaccumulator.py:202
-#, fuzzy
-msgid "Exporting traces"
-msgstr "Datei _importieren"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:673
-#: ../lib/advene/gui/plugins/eventaccumulator.py:207
-#, fuzzy, python-format
-msgid ""
-"Export done to\n"
-"%s"
-msgstr "Datei _importieren"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:951
+#: ../lib/advene/gui/plugins/tracetimeline.py:941
 msgid "Zoom and center on linked items"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:960
+#: ../lib/advene/gui/plugins/tracetimeline.py:950
 #, fuzzy
 msgid "Edit item"
 msgstr "_Bearbeite"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:964
+#: ../lib/advene/gui/plugins/tracetimeline.py:954
 msgid "Recreate item"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:980
-#: ../lib/advene/gui/plugins/tracetimeline.py:1001
-#: ../lib/advene/gui/edit/transcribe.py:502
-#: ../lib/advene/gui/views/timeline.py:2556 ../lib/advene/gui/popup.py:513
+#: ../lib/advene/gui/plugins/tracetimeline.py:970
+#: ../lib/advene/gui/plugins/tracetimeline.py:991
+#: ../lib/advene/gui/views/timeline.py:2595 ../lib/advene/gui/popup.py:542
+#: ../lib/advene/gui/edit/transcribe.py:495
 msgid "Go to..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:984
+#: ../lib/advene/gui/plugins/tracetimeline.py:974
 msgid "Zoom on action"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2030
-#: ../lib/advene/gui/edit/montage.py:535
-#: ../lib/advene/gui/views/timeline.py:3318
+#: ../lib/advene/gui/plugins/tracetimeline.py:2018
+#: ../lib/advene/gui/views/timeline.py:3362
+#: ../lib/advene/gui/edit/montage.py:544
 msgid "Inspector"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2035
+#: ../lib/advene/gui/plugins/tracetimeline.py:2023
 msgid "Item Id"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2038
+#: ../lib/advene/gui/plugins/tracetimeline.py:2026
 msgid "Item name or class"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2042
+#: ../lib/advene/gui/plugins/tracetimeline.py:2030
 #, fuzzy
 msgid "Type or schema"
 msgstr "Schema"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2045
+#: ../lib/advene/gui/plugins/tracetimeline.py:2033
 msgid "Operations"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2087
+#: ../lib/advene/gui/plugins/tracetimeline.py:2076
 #, fuzzy
 msgid "Comment"
 msgstr "Erstelle"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2119
+#: ../lib/advene/gui/plugins/tracetimeline.py:2108
 #: ../lib/advene/gui/edit/merge.py:191
 msgid "Action"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/kinect.py:41
-msgid "Kinect Controller"
+#: ../lib/advene/gui/plugins/logmessages.py:35
+#, fuzzy
+msgid "Log Messages"
+msgstr "Kein Pakte"
+
+#: ../lib/advene/gui/plugins/actions.py:40 ../lib/advene/core/controller.py:307
+#: ../lib/advene/rules/actions.py:38
+msgid "Display a message"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/kinect.py:43
-msgid "Kinect control interface"
+#: ../lib/advene/gui/plugins/actions.py:41
+#: ../lib/advene/gui/plugins/actions.py:53
+#: ../lib/advene/gui/plugins/actions.py:71
+#: ../lib/advene/gui/plugins/actions.py:86
+#: ../lib/advene/gui/plugins/actions.py:102
+#: ../lib/advene/gui/plugins/actions.py:203
+#: ../lib/advene/core/controller.py:308
+msgid "String to display."
 msgstr ""
 
+#: ../lib/advene/gui/plugins/actions.py:44
+#: ../lib/advene/gui/plugins/actions.py:58
+#: ../lib/advene/gui/plugins/actions.py:110
+#: ../lib/advene/gui/plugins/actions.py:399
+#: ../lib/advene/gui/plugins/actions.py:527 ../lib/advene/gui/edit/rules.py:766
+#: ../lib/advene/plugins/brltty.py:90 ../lib/advene/plugins/tts.py:84
+#: ../lib/advene/rules/actions.py:42 ../lib/advene/rules/actions.py:109
+#: ../lib/advene/rules/actions.py:125
+#, fuzzy
+msgid "The annotation content"
+msgstr "von einem Anmerkungs Typ"
+
 #: ../lib/advene/gui/plugins/actions.py:52
 msgid "Display a popup"
 msgstr ""
@@ -3153,6 +2849,23 @@ msgstr ""
 msgid "Display duration in ms. Ignored if empty."
 msgstr ""
 
+#: ../lib/advene/gui/plugins/actions.py:61
+#: ../lib/advene/gui/plugins/actions.py:121
+#: ../lib/advene/gui/plugins/actions.py:403
+#: ../lib/advene/gui/plugins/actions.py:538 ../lib/advene/rules/actions.py:112
+#: ../lib/advene/rules/actions.py:174
+msgid "1 second"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/actions.py:62
+#: ../lib/advene/gui/plugins/actions.py:122
+#: ../lib/advene/gui/plugins/actions.py:404
+#: ../lib/advene/gui/plugins/actions.py:539 ../lib/advene/gui/edit/rules.py:773
+#: ../lib/advene/rules/actions.py:113 ../lib/advene/rules/actions.py:175
+#, fuzzy
+msgid "The annotation duration"
+msgstr "Zeige die Anmerkung als Transkription"
+
 #: ../lib/advene/gui/plugins/actions.py:70
 msgid "Popup an entry box"
 msgstr ""
@@ -3186,6 +2899,11 @@ msgstr "von einem Anmerkungs Typ"
 msgid "Display a popup linking to an URL"
 msgstr ""
 
+#: ../lib/advene/gui/plugins/actions.py:103
+#: ../lib/advene/gui/views/logwindow.py:159 ../lib/advene/rules/actions.py:228
+msgid "URL"
+msgstr ""
+
 #: ../lib/advene/gui/plugins/actions.py:106
 msgid "string:Display annotation in web browser"
 msgstr ""
@@ -3227,7 +2945,7 @@ msgid "Destination: popup, south, east"
 msgstr ""
 
 #: ../lib/advene/gui/plugins/actions.py:144
-#: ../lib/advene/gui/views/viewbook.py:308
+#: ../lib/advene/gui/views/viewbook.py:313
 msgid "Open a saved view"
 msgstr ""
 
@@ -3306,38 +3024,38 @@ msgstr ""
 msgid "Bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:276
-#, python-format
-msgid "Error: undefined GUI view %s"
+#: ../lib/advene/gui/plugins/actions.py:234 ../lib/advene/plugins/brltty.py:242
+#: ../lib/advene/plugins/tts.py:113
+msgid "Unknown rule"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:286
-#: ../lib/advene/gui/views/viewbook.py:124 ../lib/advene/gui/main.py:1189
-msgid "...in its own window"
+#: ../lib/advene/gui/plugins/actions.py:235 ../lib/advene/plugins/brltty.py:243
+#: ../lib/advene/plugins/tts.py:114
+#, python-format
+msgid ""
+"Rule %(rulename)s: Error in the evaluation of the parameter "
+"%(parametername)s:"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:287
-#: ../lib/advene/gui/views/viewbook.py:125
-#: ../lib/advene/gui/views/__init__.py:381 ../lib/advene/gui/main.py:1190
-msgid "...embedded east of the video"
+#: ../lib/advene/gui/plugins/actions.py:247 ../lib/advene/rules/actions.py:385
+#, python-format
+msgid "The %s-related outgoing annotation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:288
-#: ../lib/advene/gui/views/viewbook.py:126
-#: ../lib/advene/gui/views/__init__.py:382 ../lib/advene/gui/main.py:1191
-msgid "...embedded west of the video"
+#: ../lib/advene/gui/plugins/actions.py:249 ../lib/advene/rules/actions.py:387
+#, python-format
+msgid "The %s-related incoming annotation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:289
-#: ../lib/advene/gui/views/viewbook.py:127
-#: ../lib/advene/gui/views/__init__.py:383 ../lib/advene/gui/main.py:1192
-msgid "...embedded south of the video"
+#: ../lib/advene/gui/plugins/actions.py:259
+#: ../lib/advene/gui/plugins/actions.py:340
+#: ../lib/advene/gui/plugins/actions.py:358 ../lib/advene/plugins/tts.py:134
+msgid "No message..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:290
-#: ../lib/advene/gui/views/viewbook.py:128
-#: ../lib/advene/gui/views/__init__.py:384 ../lib/advene/gui/main.py:1193
-msgid "...embedded at the right of the window"
+#: ../lib/advene/gui/plugins/actions.py:276
+#, python-format
+msgid "Error: undefined GUI view %s"
 msgstr ""
 
 #: ../lib/advene/gui/plugins/actions.py:322
@@ -3429,5769 +3147,6090 @@ msgstr ""
 msgid "New bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:43
+#: ../lib/advene/gui/plugins/kinect.py:38
+msgid "Kinect Controller"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/kinect.py:40
+msgid "Kinect control interface"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/contenthandlers.py:127
+msgid "Label"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/contenthandlers.py:177
+#, python-format
+msgid ""
+"Error while parsing SVG content:\n"
+"\n"
+"%s"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/contenthandlers.py:252
+msgid " created from "
+msgstr ""
+
+#: ../lib/advene/gui/plugins/contenthandlers.py:329
+msgid "Graphical editor"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/contenthandlers.py:340
 #, fuzzy
-msgid "Activity trace"
-msgstr "Aktivieren und Abspielen"
+msgid "Edit XML"
+msgstr "_Bearbeite"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:134
-msgid " Trace : "
+#: ../lib/advene/gui/plugins/contenthandlers.py:392
+#: ../lib/advene/gui/plugins/contenthandlers.py:448
+#: ../lib/advene/gui/edit/rules.py:188
+#, python-format
+msgid ""
+"The following items seem to be\n"
+"invalid TALES expressions:\n"
+"\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:138
+#: ../lib/advene/gui/plugins/tracepreview.py:61
 #, fuzzy
-msgid " Filters"
-msgstr "_Datei"
+msgid "Trace preview"
+msgstr "_Baumdarstellung"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:142
-#: ../lib/advene/gui/main.py:4178
-msgid "Reset"
+#: ../lib/advene/gui/plugins/tracepreview.py:99
+#, fuzzy
+msgid "Full trace"
+msgstr "Sichere _ImageCache"
+
+#: ../lib/advene/gui/plugins/tracepreview.py:100
+msgid "Open the trace timeline view fareast"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:167
-msgid " Time : "
+#: ../lib/advene/gui/plugins/videoplayer.py:39
+msgid "Complementary video player"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:177
-msgid " Max. : "
+#: ../lib/advene/gui/plugins/videoplayer.py:45
+#: ../lib/advene/gui/views/bookmarks.py:246
+#: ../lib/advene/gui/views/transcription.py:59
+#: ../lib/advene/gui/views/timeline.py:140 ../lib/advene/gui/edit/montage.py:58
+#: ../lib/advene/gui/edit/transcribe.py:88
+msgid "Save view"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/videoplayer.py:46
+#: ../lib/advene/gui/views/transcription.py:60
+#: ../lib/advene/gui/views/timeline.py:141 ../lib/advene/gui/views/tagbag.py:65
+#: ../lib/advene/gui/views/interactivequery.py:61
+#: ../lib/advene/gui/edit/transcribe.py:89
+msgid "Save default options"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:186
+#: ../lib/advene/gui/plugins/videoplayer.py:47
 #, fuzzy
-msgid "Export"
-msgstr "Datei _importieren"
+msgid "Select video file"
+msgstr "Wähle einen video stream"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:253
+#: ../lib/advene/gui/plugins/videoplayer.py:128
 #, fuzzy
-msgid "Defining Filters"
-msgstr "_Datei"
+msgid "Select a video file"
+msgstr "Wähle einen video stream"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:559
-#: ../lib/advene/gui/plugins/eventaccumulator.py:614
-#: ../lib/advene/gui/plugins/tracepreview.py:214
-#, fuzzy, python-format
-msgid "of an annotation (%s)"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/plugins/videoplayer.py:250
+msgid "Synchronize"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:561
-#: ../lib/advene/gui/plugins/eventaccumulator.py:616
-#: ../lib/advene/gui/plugins/tracepreview.py:216
-#, fuzzy, python-format
-msgid "of a relation (%s)"
-msgstr "Verbindungs Type"
+#: ../lib/advene/gui/plugins/videoplayer.py:268
+msgid "Offset in ms"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:563
-#: ../lib/advene/gui/plugins/eventaccumulator.py:618
-#: ../lib/advene/gui/plugins/tracepreview.py:218
-#, fuzzy, python-format
-msgid "of an annotation type (%s)"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/plugins/videoplayer.py:276
+#, fuzzy
+msgid "Drag and drop to get player time"
+msgstr "Kommentar Typ"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:565
-#: ../lib/advene/gui/plugins/eventaccumulator.py:620
-#: ../lib/advene/gui/plugins/tracepreview.py:220
-#, fuzzy, python-format
-msgid "of a relation type (%s)"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/views/singletonpopup.py:32
+msgid "SingletonPopup"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:567
-#: ../lib/advene/gui/plugins/eventaccumulator.py:622
-#: ../lib/advene/gui/plugins/tracepreview.py:222
-#, fuzzy, python-format
-msgid "of a schema (%s)"
-msgstr "Kein Pakte"
+#: ../lib/advene/gui/views/caption.py:31
+msgid "Display a text caption below the video output"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:569
-#: ../lib/advene/gui/plugins/eventaccumulator.py:624
-#: ../lib/advene/gui/plugins/tracepreview.py:224
+#: ../lib/advene/gui/views/html.py:90
 #, python-format
-msgid "of a view (%s)"
+msgid "%s%% loaded"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:571
-#: ../lib/advene/gui/plugins/eventaccumulator.py:626
-#: ../lib/advene/gui/plugins/tracepreview.py:226
+#: ../lib/advene/gui/views/html.py:93
 #, fuzzy, python-format
-msgid "of a package (%s)"
-msgstr "Kein Pakte"
+msgid "Title %s"
+msgstr "Darstellung"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:573
-#: ../lib/advene/gui/plugins/eventaccumulator.py:628
-#: ../lib/advene/gui/plugins/tracepreview.py:228
-#, fuzzy, python-format
-msgid "of an unknown item (%s)"
-msgstr "Unbekannte STBV identifier: %s"
+#: ../lib/advene/gui/views/html.py:157
+msgid "HTML Viewer"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:122
-msgid "Label"
+#: ../lib/advene/gui/views/html.py:159
+msgid "Embedded HTML widget"
+msgstr ""
+
+#: ../lib/advene/gui/views/html.py:187
+msgid "No available HTML rendering component"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:172
+#: ../lib/advene/gui/views/annotationdisplay.py:43
+#, fuzzy
+msgid "AnnotationDisplay"
+msgstr "Kommentar Typ"
+
+#: ../lib/advene/gui/views/annotationdisplay.py:45
+#, fuzzy
+msgid "Display the contents of an annotation"
+msgstr "Zeige die Transkription für eine Anmerkung"
+
+#: ../lib/advene/gui/views/annotationdisplay.py:86
+#: ../lib/advene/util/helper.py:610
+#, fuzzy
+msgid "No annotation"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/views/annotationdisplay.py:112
 #, python-format
 msgid ""
-"Error while parsing SVG content:\n"
-"\n"
-"%s"
+"Schema %(schema)s (id %(id)s)\n"
+"%(description)s\n"
+"%(stats)s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:247
-msgid " created from "
+#: ../lib/advene/gui/views/annotationdisplay.py:233
+msgid "Screenshot"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:315
-msgid "Graphical editor"
+#: ../lib/advene/gui/views/annotationdisplay.py:255
+#: ../lib/advene/gui/views/relationdisplay.py:104
+msgid "Contents"
+msgstr ""
+
+#: ../lib/advene/gui/views/annotationdisplay.py:258
+#: ../lib/advene/gui/views/editaccumulator.py:74
+msgid "Validate"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:326
+#: ../lib/advene/gui/views/relationdisplay.py:34
 #, fuzzy
-msgid "Edit XML"
-msgstr "_Bearbeite"
+msgid "RelationDisplay"
+msgstr "Verbindungs Type"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:378
-#: ../lib/advene/gui/plugins/contenthandlers.py:434
-#: ../lib/advene/gui/edit/rules.py:186
-#, python-format
-msgid ""
-"The following items seem to be\n"
-"invalid TALES expressions:\n"
-"\n"
-"%s"
+#: ../lib/advene/gui/views/relationdisplay.py:36
+#, fuzzy
+msgid "Display the contents of a relation"
+msgstr "Zeige Packet inhalt als Baumdarstellung"
+
+#: ../lib/advene/gui/views/relationdisplay.py:79
+msgid "No relation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:36 ../lib/advene/gui/main.py:1235
-#, fuzzy
-msgid "Video player"
-msgstr "_Einstellung Spieler"
+#: ../lib/advene/gui/views/relationdisplay.py:113
+#: ../lib/advene/gui/edit/elements.py:588
+#: ../lib/advene/gui/edit/elements.py:1071
+msgid "Members"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:38
-msgid "Complementary video player"
+#: ../lib/advene/gui/views/viewplugin.py:60
+msgid "Generic view plugin"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:44
-#: ../lib/advene/gui/edit/montage.py:54
-#: ../lib/advene/gui/edit/transcribe.py:85
-#: ../lib/advene/gui/views/transcription.py:56
-#: ../lib/advene/gui/views/bookmarks.py:245
-#: ../lib/advene/gui/views/timeline.py:135
-msgid "Save view"
+#: ../lib/advene/gui/views/viewplugin.py:62
+msgid "You should not ever see this tooltip..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:45
-#: ../lib/advene/gui/edit/transcribe.py:86
-#: ../lib/advene/gui/views/tagbag.py:62
-#: ../lib/advene/gui/views/transcription.py:57
-#: ../lib/advene/gui/views/interactivequery.py:60
-#: ../lib/advene/gui/views/timeline.py:136
-msgid "Save default options"
+#: ../lib/advene/gui/views/checker.py:37
+msgid "Checker"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:46
+#: ../lib/advene/gui/views/checker.py:39
 #, fuzzy
-msgid "Select video file"
-msgstr "Wähle einen video stream"
+msgid "Check various package properties"
+msgstr "Bearbeite Packet Eigentschaften"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:127
+#: ../lib/advene/gui/views/checker.py:89
+msgid "List of possible issues in the current package"
+msgstr ""
+
+#: ../lib/advene/gui/views/checker.py:107
+msgid "Overlapping"
+msgstr ""
+
+#: ../lib/advene/gui/views/table.py:61
+msgid "Annotation table view"
+msgstr ""
+
+#: ../lib/advene/gui/views/table.py:63
+msgid "Display annotations in a table"
+msgstr ""
+
+#: ../lib/advene/gui/views/table.py:74
 #, fuzzy
-msgid "Select a video file"
-msgstr "Wähle einen video stream"
+msgid "Export as CSV"
+msgstr "Datei _importieren"
+
+#: ../lib/advene/gui/views/table.py:268 ../lib/advene/gui/views/table.py:550
+msgid "Snapshot"
+msgstr ""
+
+#: ../lib/advene/gui/views/table.py:281
+#: ../lib/advene/gui/views/timeline.py:1745
+msgid "Cannot update the annotation, its representation is too complex"
+msgstr ""
+
+#: ../lib/advene/gui/views/table.py:311 ../lib/advene/gui/edit/elements.py:606
+#: ../lib/advene/gui/edit/elements.py:683
+#: ../lib/advene/gui/edit/elements.py:743
+#: ../lib/advene/gui/edit/elements.py:1134
+msgid "Content"
+msgstr ""
+
+#: ../lib/advene/gui/views/table.py:312 ../lib/advene/gui/views/table.py:682
+#: ../lib/advene/gui/views/browser.py:368 ../lib/advene/gui/edit/create.py:94
+#: ../lib/advene/gui/edit/elements.py:514
+#: ../lib/advene/gui/edit/elements.py:563
+#: ../lib/advene/gui/edit/elements.py:665
+msgid "Type"
+msgstr ""
+
+#: ../lib/advene/gui/views/table.py:313 ../lib/advene/gui/edit/elements.py:1800
+msgid "Begin"
+msgstr ""
+
+#: ../lib/advene/gui/views/table.py:316 ../lib/advene/gui/views/table.py:683
+#: ../lib/advene/gui/util/dialog.py:400 ../lib/advene/gui/edit/rules.py:1091
+#: ../lib/advene/gui/edit/imports.py:328 ../lib/advene/gui/edit/elements.py:513
+#: ../lib/advene/gui/edit/elements.py:562
+#: ../lib/advene/gui/edit/elements.py:650
+#: ../lib/advene/gui/edit/elements.py:730
+#: ../lib/advene/gui/edit/elements.py:879
+#: ../lib/advene/gui/edit/elements.py:948
+#: ../lib/advene/gui/edit/elements.py:1060
+#: ../lib/advene/gui/edit/elements.py:1121
+msgid "Id"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:250
-msgid "Synchronize"
+#: ../lib/advene/gui/views/table.py:317 ../lib/advene/gui/views/finder.py:105
+#: ../lib/advene/util/helper.py:408
+msgid "Package"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:266
-msgid "Offset in ms"
+#: ../lib/advene/gui/views/table.py:455 ../lib/advene/gui/views/table.py:633
+msgid "Export data to file..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:274
-#, fuzzy
-msgid "Drag and drop to get player time"
-msgstr "Kommentar Typ"
+#: ../lib/advene/gui/views/table.py:464 ../lib/advene/gui/views/table.py:642
+#, python-format
+msgid "Error while exporting data to %(filename)s: %(error)s"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/tracepreview.py:61
-#, fuzzy
-msgid "Trace preview"
-msgstr "_Baumdarstellung"
+#: ../lib/advene/gui/views/table.py:475
+msgid "id"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/tracepreview.py:99
-#, fuzzy
-msgid "Full trace"
-msgstr "Sichere _ImageCache"
+#: ../lib/advene/gui/views/table.py:475
+msgid "type"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/tracepreview.py:100
-msgid "Open the trace timeline view fareast"
+#: ../lib/advene/gui/views/table.py:475
+msgid "begin"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:376
-#, python-format
-msgid "Rendering type %(type)s as %(presentation)s"
+#: ../lib/advene/gui/views/table.py:475
+msgid "end"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:521
-msgid "Snapshot only"
+#: ../lib/advene/gui/views/table.py:475
+msgid "content"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:522
-msgid "Overlayed snapshot only"
+#: ../lib/advene/gui/views/table.py:479 ../lib/advene/gui/views/table.py:658
+#: ../lib/advene/core/controller.py:2646
+#, python-format
+msgid "Data exported to %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:523
-msgid "Timestamp only"
+#: ../lib/advene/gui/views/table.py:499
+#, python-format
+msgid "Set %(attr)s time to %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:524
-msgid "Snapshot+timestamp"
+#: ../lib/advene/gui/views/table.py:558
+msgid "Generic table view"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:525
-#, fuzzy
-msgid "Annotation content"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/views/table.py:560
+msgid "Display Advene elements in a table."
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:540
-msgid "as a list"
+#: ../lib/advene/gui/views/table.py:583
+#, python-format
+msgid "Error in source evaluation %(source)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:541
-msgid "as a grid"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element title"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:542
-msgid "as a table"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element type"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:543
-#: ../lib/advene/gui/views/viewbook.py:380
-#, fuzzy
-msgid "as a transcription"
-msgstr "T_ranskription"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element id"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:661
-#: ../lib/advene/gui/views/transcription.py:461
-#, python-format
-msgid "Annotation %s"
+#: ../lib/advene/gui/views/accumulatorpopup.py:51
+msgid "PopupAccumulator"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:662
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:681
-msgid "Play video"
+#: ../lib/advene/gui/views/bookmarks.py:51
+msgid "Bookmarks importer"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:663
-msgid "Show timestamp only"
+#: ../lib/advene/gui/views/bookmarks.py:72
+msgid "Bookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:664
-msgid "Show content only"
+#: ../lib/advene/gui/views/bookmarks.py:74
+msgid "Bookmark timecodes with their corresponding screenshots"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:665
-msgid "Show snapshot only"
+#: ../lib/advene/gui/views/bookmarks.py:80 ../lib/advene/gui/views/tagbag.py:63
+#: ../lib/advene/gui/views/activebookmarks.py:62
+#: ../lib/advene/gui/views/logwindow.py:50 ../lib/advene/gui/edit/montage.py:59
+msgid "Clear"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:667
-msgid "Show overlayed timestamp"
+#: ../lib/advene/gui/views/bookmarks.py:145
+msgid "Select the annotation type to generate"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:668
-msgid "Show overlayed content"
+#: ../lib/advene/gui/views/bookmarks.py:150
+msgid "Choose a duration"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:670
-#, fuzzy, python-format
-msgid "Annotation type %s"
-msgstr "Kommentar Typ"
+#: ../lib/advene/gui/views/bookmarks.py:151
+msgid "Enter the standard duration (in ms) of created annotations."
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:671
-#, fuzzy
-msgid "display as list"
-msgstr "Zeige Packet inhalt als Baumdarstellung"
+#: ../lib/advene/gui/views/bookmarks.py:168
+msgid "Converted from bookmarks"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:672
-#, fuzzy
-msgid "display as grid"
-msgstr "Zeige Packet inhalt als Baumdarstellung"
+#: ../lib/advene/gui/views/bookmarks.py:172
+#: ../lib/advene/gui/edit/transcribe.py:1114
+#, python-format
+msgid ""
+"Conversion completed.\n"
+"%s annotations generated."
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:673
-#, fuzzy
-msgid "display as table"
-msgstr "Zeige Kommentare an einer Timeline"
+#: ../lib/advene/gui/views/bookmarks.py:226
+msgid "Drop a position here to remove it from the list"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:674
-#, fuzzy
-msgid "display as transcription"
-msgstr "T_ranskription"
+#: ../lib/advene/gui/views/bookmarks.py:244
+#: ../lib/advene/gui/views/activebookmarks.py:496
+msgid "Insert a bookmark for the current video time"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:683
-msgid "Open link"
+#: ../lib/advene/gui/views/bookmarks.py:245
+msgid "Convert bookmarks to annotations"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:739
-#, fuzzy, python-format
-msgid "HTML editor: cannot parse content (%s)"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/views/viewbook.py:39
+msgid "ViewBook"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:772
-#, fuzzy, python-format
-msgid "Heading %d"
-msgstr "Datei _importieren"
+#: ../lib/advene/gui/views/viewbook.py:60
+#: ../lib/advene/gui/views/viewbook.py:67
+msgid "Cannot remove this widget, it is essential."
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:783
-msgid "Bold"
+#: ../lib/advene/gui/views/viewbook.py:141
+msgid "Detach"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:784
-msgid "Italic"
+#: ../lib/advene/gui/views/viewbook.py:145
+#: ../lib/advene/gui/views/editaccumulator.py:80
+msgid "Close"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:785
-msgid "Header"
+#: ../lib/advene/gui/views/viewbook.py:162
+msgid "Rename the view"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:787
-msgid "Copy"
+#: ../lib/advene/gui/views/viewbook.py:163
+msgid "Please enter the new name of the view"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:788
-msgid "Cut"
+#: ../lib/advene/gui/views/viewbook.py:202
+msgid "Detach view in its own window, or drag-and-drop to another zone"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:789
-msgid "Paste"
+#: ../lib/advene/gui/views/viewbook.py:216
+msgid "Close view"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:791
-#: ../lib/advene/gui/edit/schemaeditor.py:64
-#: ../lib/advene/gui/views/timeline.py:134 ../lib/advene/gui/views/tree.py:428
-msgid "Refresh"
+#: ../lib/advene/gui/views/viewbook.py:239
+#: ../lib/advene/gui/views/viewbook.py:245
+#: ../lib/advene/gui/edit/elements.py:336
+#, python-format
+msgid "Edit %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:847
-msgid "WYSIWYG editor"
+#: ../lib/advene/gui/views/viewbook.py:268 ../lib/advene/rules/actions.py:601
+#, python-format
+msgid "Cannot find the view %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:857
-msgid "Edit HTML source"
+#: ../lib/advene/gui/views/viewbook.py:291
+#, python-format
+msgid "Open a new %s for..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/logmessages.py:35
+#: ../lib/advene/gui/views/viewbook.py:303
 #, fuzzy
-msgid "Log Messages"
-msgstr "Kein Pakte"
+msgid "Create a new comment view"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/edit/dvdselect.py:73
-#: ../lib/advene/gui/edit/importer.py:143
-msgid "Stop"
+#: ../lib/advene/gui/views/viewbook.py:305
+msgid "Open a new view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:82
-#: ../lib/advene/gui/edit/dvdselect.py:112
-msgid "Preview"
-msgstr ""
+#: ../lib/advene/gui/views/viewbook.py:388
+#, fuzzy, python-format
+msgid "Use annotation-type %s :"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/edit/dvdselect.py:91
-msgid ""
-"Select the correct\n"
-"title and chapter\n"
-"of the DVD"
+#: ../lib/advene/gui/views/viewbook.py:392
+#: ../lib/advene/gui/views/viewbook.py:418
+msgid "to edit it"
 msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:104
-msgid "Chapter"
+#: ../lib/advene/gui/views/viewbook.py:393
+#: ../lib/advene/gui/views/viewbook.py:419
+#: ../lib/advene/gui/views/viewbook.py:451
+msgid "to create a new static view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:33
-msgid "Create element"
+#: ../lib/advene/gui/views/viewbook.py:395
+#, fuzzy
+msgid "in a timeline"
+msgstr "T_imeline"
+
+#: ../lib/advene/gui/views/viewbook.py:396
+msgid "as a montage"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:34
-msgid "Create annotation (duplicate id)"
+#: ../lib/advene/gui/views/viewbook.py:397
+#: ../lib/advene/gui/views/viewbook.py:450
+msgid "in a table"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:35
-msgid "Create relation (duplicate id)"
+#: ../lib/advene/gui/views/viewbook.py:398
+#: ../lib/advene/gui/views/viewbook.py:420
+msgid "in a query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:36
-msgid "Update the color"
+#: ../lib/advene/gui/views/viewbook.py:398
+#: ../lib/advene/gui/views/viewbook.py:420
+#, fuzzy, python-format
+msgid "Query %s"
+msgstr "Abfragen"
+
+#: ../lib/advene/gui/views/viewbook.py:399
+#: ../lib/advene/gui/views/viewbook.py:421
+#, fuzzy
+msgid "in the TALES browser"
+msgstr "Bearbeite Packet Eigentschaften"
+
+#: ../lib/advene/gui/views/viewbook.py:399
+#, python-format
+msgid "Browsing %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:37
-msgid "Update the representation"
+#: ../lib/advene/gui/views/viewbook.py:415
+#, fuzzy, python-format
+msgid "Use annotation %s :"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/views/viewbook.py:421
+#, python-format
+msgid "Browse %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:38
-msgid "Update the description"
+#: ../lib/advene/gui/views/viewbook.py:422
+#, fuzzy
+msgid "to display its contents"
+msgstr "Zeige Shortcuts"
+
+#: ../lib/advene/gui/views/viewbook.py:422
+#, python-format
+msgid "%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:39
-msgid "Update the title"
+#: ../lib/advene/gui/views/viewbook.py:423
+msgid "as a bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:40
-msgid "Update the mimetype"
+#: ../lib/advene/gui/views/viewbook.py:441
+msgid "as the context for the query..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:41
-msgid "Update the begin time"
+#: ../lib/advene/gui/views/viewbook.py:445
+#, fuzzy
+msgid "Set of annotations"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/views/viewbook.py:446
+#, fuzzy
+msgid "Use annotations:"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/views/viewbook.py:449
+msgid "to edit them"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:42
-msgid "Update the end time"
+#: ../lib/advene/gui/views/viewbook.py:452
+msgid "as bookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:43
-msgid "Update the content"
+#: ../lib/advene/gui/views/transcription.py:51
+msgid "Transcription"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:44
-msgid "Update the matchFilter"
+#: ../lib/advene/gui/views/transcription.py:53
+#, fuzzy
+msgid "Display annotations as a text transcription"
+msgstr "Zeige die Anmerkung als Transkription"
+
+#: ../lib/advene/gui/views/transcription.py:158
+msgid "Transcription options"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:45
-msgid "Update the member types"
+#: ../lib/advene/gui/views/transcription.py:159
+msgid "Default representation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:46
-msgid "Update tags"
+#: ../lib/advene/gui/views/transcription.py:159
+msgid "Use the default representation for annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:90
-msgid "Difference between original and merged elements"
+#: ../lib/advene/gui/views/transcription.py:160
+#: ../lib/advene/gui/edit/elements.py:988
+msgid "Representation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:136
-msgid "Current element"
+#: ../lib/advene/gui/views/transcription.py:160
+msgid ""
+"If default representation is unchecked,\n"
+"this TALES expression that will be used to format the annotations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:141
-msgid "Updated element"
+#: ../lib/advene/gui/views/transcription.py:161
+msgid "Separator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:147
-msgid "Show diff"
+#: ../lib/advene/gui/views/transcription.py:162
+msgid "This separator will be inserted between the annotations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:180
-msgid "Merge?"
+#: ../lib/advene/gui/views/transcription.py:163
+msgid "Whitespace"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:197
-msgid "Element"
+#: ../lib/advene/gui/views/transcription.py:164
+msgid "Newline"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:230 ../lib/advene/gui/edit/imports.py:406
-#, python-format
-msgid "Package %s"
+#: ../lib/advene/gui/views/transcription.py:165
+msgid "Tabulation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:230 ../lib/advene/gui/edit/imports.py:406
-msgid "No title"
+#: ../lib/advene/gui/views/transcription.py:166
+msgid "Dash"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:267
-msgid "All"
+#: ../lib/advene/gui/views/transcription.py:167
+msgid "User defined"
 msgstr ""
 
-#: ../lib/advene/gui/edit/properties.py:32
-#: ../lib/advene/gui/edit/shapewidget.py:1588
-msgid "Properties"
+#: ../lib/advene/gui/views/transcription.py:169
+msgid "User-defined separator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/properties.py:46
-#: ../lib/advene/gui/edit/transcribe.py:147
-#: ../lib/advene/gui/edit/transcribe.py:1195
-#: ../lib/advene/gui/views/tagbag.py:61
-#: ../lib/advene/gui/views/timeline.py:3483
-#: ../lib/advene/gui/views/timeline.py:3624 ../lib/advene/gui/main.py:4235
-msgid "Preferences"
+#: ../lib/advene/gui/views/transcription.py:169
+msgid ""
+"Separator used if user-defined is selected.Use \\n for a newline and \\t for "
+"a tabulation."
 msgstr ""
 
-#: ../lib/advene/gui/edit/properties.py:371
-msgid "Choose a file"
+#: ../lib/advene/gui/views/transcription.py:170
+msgid "Display timestamps"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:45
-msgid "Importer"
+#: ../lib/advene/gui/views/transcription.py:170
+msgid "Insert timestsamp values"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:101
-#: ../lib/advene/gui/edit/importer.py:111
-#, fuzzy
-msgid "Advene package importer"
-msgstr "Bearbeite Packet Eigentschaften"
-
-#: ../lib/advene/gui/edit/importer.py:115
-msgid "Not likely"
+#: ../lib/advene/gui/views/transcription.py:171
+msgid "Display annotation bounds"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:137
+#: ../lib/advene/gui/views/transcription.py:231
 #, python-format
-msgid "Completed conversion: %(statistics)s"
+msgid ""
+"Cannot convert the following annotations,\n"
+"the representation pattern is too complex.\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:253
-msgid "Choose the file to import"
+#: ../lib/advene/gui/views/transcription.py:242
+msgid ""
+"Cannot validate the update.\n"
+"The representation pattern is too complex."
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:272
+#: ../lib/advene/gui/views/transcription.py:268
 #, fuzzy
-msgid "Filter"
-msgstr "_Datei"
+msgid "Save transcription to a text file"
+msgstr "Zeige die Transkription für eine Anmerkung"
 
-#: ../lib/advene/gui/edit/importer.py:276
-msgid "Options"
+#: ../lib/advene/gui/views/transcription.py:269
+msgid "Apply the modifications"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:287
-msgid "Start"
+#: ../lib/advene/gui/views/transcription.py:270
+msgid "Find text"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:57
-#, fuzzy
-msgid "Schema Editor"
-msgstr "Schema"
-
-#: ../lib/advene/gui/edit/schemaeditor.py:132
-#, fuzzy
-msgid "Display"
-msgstr "Verbindungs Type"
-
-#: ../lib/advene/gui/edit/schemaeditor.py:155
-#: ../lib/advene/gui/edit/shapewidget.py:1587 ../lib/advene/gui/popup.py:472
-#: ../lib/advene/gui/popup.py:476
-msgid "Delete"
+#: ../lib/advene/gui/views/transcription.py:271
+msgid "Quickly switch display options"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:762
+#: ../lib/advene/gui/views/transcription.py:272
 #, fuzzy
-msgid "Remove relation type"
-msgstr "Verbindungs Type"
-
-#: ../lib/advene/gui/edit/schemaeditor.py:765
-#: ../lib/advene/gui/edit/schemaeditor.py:997
-msgid "Create HTML view"
-msgstr ""
+msgid "Refresh the transcription"
+msgstr "T_ranskription"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:831
+#: ../lib/advene/gui/views/transcription.py:273
 #, fuzzy
-msgid "Remove annotation type"
-msgstr "Kommentar Typ"
+msgid "Edit preferences"
+msgstr "E_instellungen"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:834
-msgid "Create relation type between this one and..."
+#: ../lib/advene/gui/views/transcription.py:692
+#, python-format
+msgid "Cannot write to %(filename)s: %(error)s:"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:969
-#, fuzzy
-msgid "New schema"
-msgstr "Schema"
-
-#: ../lib/advene/gui/edit/schemaeditor.py:985 ../lib/advene/gui/popup.py:690
-#: ../lib/advene/gui/popup.py:750 ../lib/advene/gui/popup.py:803
-msgid "Select a color"
+#: ../lib/advene/gui/views/transcription.py:698
+#: ../lib/advene/gui/edit/transcribe.py:859
+#, python-format
+msgid "Transcription saved to %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:988
-#, fuzzy
-msgid "New annotation type"
-msgstr "Kommentar Typ"
-
-#: ../lib/advene/gui/edit/schemaeditor.py:991
-#, fuzzy
-msgid "New relation type"
-msgstr "Verbindungs Type"
-
-#: ../lib/advene/gui/edit/schemaeditor.py:994
-msgid "Hide this schema"
+#: ../lib/advene/gui/views/browser.py:169
+#: ../lib/advene/gui/views/browser.py:171
+msgid "TALES browser"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:1000
-msgid "Export drawing to pdf"
+#: ../lib/advene/gui/views/browser.py:176
+msgid "Display result in table"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:1042
-msgid "Choose a filename to export the schema as PDF"
+#: ../lib/advene/gui/views/browser.py:199
+msgid "Insert path"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:84 ../lib/advene/gui/edit/rules.py:86
-#: ../lib/advene/gui/edit/create.py:252
-msgid "Rule"
+#: ../lib/advene/gui/views/browser.py:200
+msgid "Insert value"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:95 ../lib/advene/gui/edit/create.py:242
-msgid "Subviews"
+#: ../lib/advene/gui/views/browser.py:255
+msgid "Expression returned None (there was an exception)"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:122
-msgid "Add a new rule"
+#: ../lib/advene/gui/views/browser.py:308
+msgid "Result is not a list"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:126
-msgid "Subview"
+#: ../lib/advene/gui/views/browser.py:365
+#: ../lib/advene/gui/edit/shapewidget.py:944
+msgid "Path"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:129
-msgid "Add a subview list"
+#: ../lib/advene/gui/views/browser.py:372
+#: ../lib/advene/gui/edit/elements.py:2163
+msgid "Value"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:135
+#: ../lib/advene/gui/views/timeline.py:128
+msgid "Display annotations on a timeline"
+msgstr "Zeige Kommentare an einer Timeline"
+
+#: ../lib/advene/gui/views/timeline.py:142
 #, fuzzy
-msgid "Remove the current rule"
-msgstr "Aktuelle Sitzung speichern"
+msgid "Limit display to current area"
+msgstr "Zeige Shortcuts"
 
-#: ../lib/advene/gui/edit/rules.py:275
-msgid "Source expression"
+#: ../lib/advene/gui/views/timeline.py:143
+#: ../lib/advene/gui/views/timeline.py:3307
+msgid "Display whole movie"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:277
-msgid "Return expression"
+#: ../lib/advene/gui/views/timeline.py:173
+#, python-format
+msgid "Cannot find annotation type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:351
-msgid "For all elements in "
+#: ../lib/advene/gui/views/timeline.py:234
+msgid "No scrolling"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:352
-msgid "All annotations of the package"
+#: ../lib/advene/gui/views/timeline.py:235
+msgid "Continuous scrolling"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:353
-msgid "All views of the package"
+#: ../lib/advene/gui/views/timeline.py:236
+msgid "Discrete scrolling"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:354 ../lib/advene/gui/edit/rules.py:798
-msgid "The context annotations"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:237
+#, fuzzy
+msgid "Annotation scrolling"
+msgstr "Kommentar Typ"
 
-#: ../lib/advene/gui/edit/rules.py:355 ../lib/advene/gui/edit/rules.py:799
-msgid "The annotations of the context type"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:582
+#, fuzzy, python-format
+msgid "%d annotations"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/edit/rules.py:370
-msgid "Return "
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:585
+#, fuzzy
+msgid "Display all types"
+msgstr "Verbindungs Type"
 
-#: ../lib/advene/gui/edit/rules.py:372 ../lib/advene/gui/edit/rules.py:787
-msgid "The element"
+#: ../lib/advene/gui/views/timeline.py:587
+#, python-format
+msgid ""
+"There are %d annotations.\n"
+"The current timeline may take a long time to display them, so only the first "
+"two annotation types are displayed. Use the annotation type selector (second "
+"button in the timeline) to select other annotations types to display, or "
+"click on the 'Display all types' button below."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:373 ../lib/advene/gui/edit/rules.py:788
-msgid "The element's content"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:1055
+#, fuzzy
+msgid "Split at current player position"
+msgstr "Aktuelle Sitzung speichern"
 
-#: ../lib/advene/gui/edit/rules.py:388
-msgid "If the element matches "
+#: ../lib/advene/gui/views/timeline.py:1059
+msgid "Center and zoom"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:390
-msgid "Return the element if it matches "
+#: ../lib/advene/gui/views/timeline.py:1163
+msgid "Create a relation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:408 ../lib/advene/gui/edit/rules.py:617
-msgid "All conditions must be met"
+#: ../lib/advene/gui/views/timeline.py:1173
+msgid "Create a new relation-type."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:409 ../lib/advene/gui/edit/rules.py:618
-msgid "Any condition can be met"
+#: ../lib/advene/gui/views/timeline.py:1199
+msgid "Merge with this annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:493 ../lib/advene/gui/edit/rules.py:563
-#, python-format
-msgid "Rule <b>%s</b>"
+#: ../lib/advene/gui/views/timeline.py:1208
+msgid "Align both begin times"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:574
-msgid "Rule name"
+#: ../lib/advene/gui/views/timeline.py:1209
+msgid "Align both end times"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:591
-msgid "Event"
+#: ../lib/advene/gui/views/timeline.py:1210
+msgid "Align end time to selected begin time"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:599
-msgid "If"
+#: ../lib/advene/gui/views/timeline.py:1211
+msgid "Align begin time to selected end time"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:638
-msgid "Then"
+#: ../lib/advene/gui/views/timeline.py:1212
+msgid "Align all times"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:683
-msgid "When the "
+#: ../lib/advene/gui/views/timeline.py:1250
+msgid "Cannot delete the annotation : it has relations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:696
-msgid " occurs,"
+#: ../lib/advene/gui/views/timeline.py:1325
+msgid "Select the appropriate relation type"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:723 ../lib/advene/gui/edit/rules.py:726
+#: ../lib/advene/gui/views/timeline.py:1344
 #, python-format
-msgid "Condition expression: %s"
+msgid "Duplicate selection to type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:765
-#, fuzzy
-msgid "The annotation type"
-msgstr "Kommentar Typ"
+#: ../lib/advene/gui/views/timeline.py:1347
+#, fuzzy, python-format
+msgid "Move selection to type %s"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/edit/rules.py:768
+#: ../lib/advene/gui/views/timeline.py:1356
 #, fuzzy, python-format
-msgid "The value of the %s attribute"
+msgid "Duplicate annotation to type %s"
 msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/edit/rules.py:770
-msgid "The annotation fragment"
+#: ../lib/advene/gui/views/timeline.py:1360
+#, fuzzy, python-format
+msgid "Move annotation to type %s"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/views/timeline.py:1367
+#, python-format
+msgid "Duplicate to type %(type)s at %(position)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:771
-msgid "The annotation begin time"
+#: ../lib/advene/gui/views/timeline.py:1373
+#, python-format
+msgid "Move to type %(type)s at %(position)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:772
-msgid "The annotation end time"
+#: ../lib/advene/gui/views/timeline.py:1383
+msgid "Duplicate and create a relation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:774
+#: ../lib/advene/gui/views/timeline.py:1394
+#, python-format
+msgid "Duplicate at %s and create a relation"
+msgstr ""
+
+#: ../lib/advene/gui/views/timeline.py:1425
 #, fuzzy
-msgid "The annotation MIME-type"
+msgid "Annotation filter"
+msgstr "Kommentar Typ"
+
+#: ../lib/advene/gui/views/timeline.py:1426
+msgid "Enter the searched string"
+msgstr ""
+
+#: ../lib/advene/gui/views/timeline.py:1534
+#, fuzzy, python-format
+msgid "Duplicate all annotations to type %s"
 msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/edit/rules.py:775
-msgid "The annotation's incoming relations"
+#: ../lib/advene/gui/views/timeline.py:1536
+#, fuzzy, python-format
+msgid "Move all annotations to type %s"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/views/timeline.py:1538
+#, python-format
+msgid "Duplicate all annotations matching a string to type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:776
-msgid "The annotation's outgoing relations"
+#: ../lib/advene/gui/views/timeline.py:1540
+#, python-format
+msgid "Move all annotations matching a string to type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:779
+#: ../lib/advene/gui/views/timeline.py:1542
 #, python-format
-msgid "The %s-related incoming annotations"
+msgid "Align all annotation time codes using %s as reference."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:783
+#: ../lib/advene/gui/views/timeline.py:1544
 #, python-format
-msgid "The %s-related outgoing annotations"
+msgid "Align all annotation contents using %s as reference"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:789
-msgid "The element fragment"
+#: ../lib/advene/gui/views/timeline.py:2038
+#: ../lib/advene/gui/views/timeline.py:2060
+#, fuzzy, python-format
+msgid "Displaying %(count)d / %(total)d annotations..."
+msgstr "Zeige die Transkription für eine Anmerkung"
+
+#: ../lib/advene/gui/views/timeline.py:2049
+#, fuzzy
+msgid "Displaying done."
+msgstr "Verbindungs Type"
+
+#: ../lib/advene/gui/views/timeline.py:2478
+msgid "Create a new annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:790
-msgid "The element begin time"
+#: ../lib/advene/gui/views/timeline.py:2479
+msgid "Zoom on region"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:791
-msgid "The element end time"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:2480
+#, fuzzy
+msgid "Restrict display to region"
+msgstr "Zeige Shortcuts"
 
-#: ../lib/advene/gui/edit/rules.py:792
-msgid "The element duration"
+#: ../lib/advene/gui/views/timeline.py:2589
+#: ../lib/advene/gui/edit/transcribe.py:489
+#, python-format
+msgid "Position %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:793
+#: ../lib/advene/gui/views/timeline.py:2599
 #, fuzzy
-msgid "The element type"
-msgstr "Wähle einen DVD"
+msgid "New annotation at player time"
+msgstr "Kommentar Typ"
 
-#: ../lib/advene/gui/edit/rules.py:794
-msgid "The element's incoming relations"
+#: ../lib/advene/gui/views/timeline.py:2603
+#, fuzzy
+msgid "New annotation at mouse position"
+msgstr "Kommentar Typ"
+
+#: ../lib/advene/gui/views/timeline.py:2607
+msgid "Selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:795
-msgid "The element's outgoing relations"
+#: ../lib/advene/gui/views/timeline.py:2728
+#, python-format
+msgid "Cannot zoom more %f"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:796
-msgid "The context"
+#: ../lib/advene/gui/views/timeline.py:2940
+#, python-format
+msgid "From schema %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:797
-msgid "The context fragment"
+#: ../lib/advene/gui/views/timeline.py:3003
+msgid "Restrict playing to this annotation-type"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:809
-#, fuzzy, python-format
-msgid "annotation-type %s"
-msgstr "Kommentar Typ"
+#: ../lib/advene/gui/views/timeline.py:3010
+msgid "Goto previous annotation"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:812
-#, fuzzy, python-format
-msgid "relation-type %s"
+#: ../lib/advene/gui/views/timeline.py:3021
+#, fuzzy
+msgid "Goto next annotation"
 msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/edit/rules.py:834
-msgid "Select a condition"
+#: ../lib/advene/gui/views/timeline.py:3032
+msgid "+"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:878
-#, python-format
-msgid "Parameter %s"
+#: ../lib/advene/gui/views/timeline.py:3091
+#, fuzzy
+msgid "Open an annotation display view"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/views/timeline.py:3098
+msgid "Open a slave montage view (coordinated zoom level)"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:992
-msgid "Select an action"
+#: ../lib/advene/gui/views/timeline.py:3133
+msgid ""
+"<b>Statistics about current selection</b>\n"
+"\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:1083
+#: ../lib/advene/gui/views/timeline.py:3156
 #, fuzzy
-msgid "Activate?"
-msgstr "Aktivieren und Abspielen"
-
-#: ../lib/advene/gui/edit/shapewidget.py:83
-msgid "Generic shape"
-msgstr ""
+msgid "No selected annotation"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/edit/shapewidget.py:234
-#: ../lib/advene/gui/edit/shapewidget.py:741
+#: ../lib/advene/gui/views/timeline.py:3160
 #, python-format
-msgid "Link to %s"
+msgid "%d selected annotation(s)"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:321
-#: ../lib/advene/gui/views/tagbag.py:132
-msgid "Name"
+#: ../lib/advene/gui/views/timeline.py:3167
+msgid "Unselect all annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:326
-#: ../lib/advene/gui/edit/shapewidget.py:1299
-msgid "Link"
+#: ../lib/advene/gui/views/timeline.py:3168
+msgid "Create a static view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:331
-msgid "Link label"
+#: ../lib/advene/gui/views/timeline.py:3169
+msgid "Highlight selection in other views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:349
-msgid "Linewidth"
+#: ../lib/advene/gui/views/timeline.py:3170
+#: ../lib/advene/gui/views/timeline.py:3766
+msgid "Tag selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:354
-msgid "Filled"
+#: ../lib/advene/gui/views/timeline.py:3171
+msgid "Delete selected annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:362
-msgid "Opacity"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3172
+#, fuzzy
+msgid "Display selection in a table"
+msgstr "Zeige Kommentare an einer Timeline"
 
-#: ../lib/advene/gui/edit/shapewidget.py:404
-#, python-format
-msgid "Properties of %s"
+#: ../lib/advene/gui/views/timeline.py:3173
+msgid "Center and zoom on selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:451
-msgid "Rectangle"
+#: ../lib/advene/gui/views/timeline.py:3174
+msgid "Edit selected annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:532
-#: ../lib/advene/gui/edit/shapewidget.py:652
-msgid "Text"
+#: ../lib/advene/gui/views/timeline.py:3175
+msgid "Merge annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:663
-msgid "Textsize"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3176
+#, fuzzy
+msgid "Display statistics"
+msgstr "Zeige Shortcuts"
 
-#: ../lib/advene/gui/edit/shapewidget.py:677
-msgid "Image"
+#: ../lib/advene/gui/views/timeline.py:3183
+#, fuzzy
+msgid "Select all annotations of the same type in this time range"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/views/timeline.py:3186
+#, fuzzy
+msgid "Select all annotations in this time range"
+msgstr "Transkription für das gesamte Packet"
+
+#: ../lib/advene/gui/views/timeline.py:3300
+msgid "Goto previous page"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:761
-msgid "Href"
+#: ../lib/advene/gui/views/timeline.py:3312
+#, fuzzy
+msgid "Goto next page"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/views/timeline.py:3368
+msgid "Inspector locked. Click here or in the timeline background to unlock."
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:771
-msgid "Line"
+#: ../lib/advene/gui/views/timeline.py:3395
+msgid ""
+"Delete the selected annotations or drop an annotation here to delete it."
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:872
-msgid "Draw an arrow"
+#: ../lib/advene/gui/views/timeline.py:3418
+msgid ""
+"Drag an annotation type here to remove it from display.\n"
+"Click to edit all displayed types"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:883
-msgid "Arrow size"
+#: ../lib/advene/gui/views/timeline.py:3430
+msgid "Selection actions"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:935
-#: ../lib/advene/gui/views/browser.py:359
-msgid "Path"
+#: ../lib/advene/gui/views/timeline.py:3441
+msgid "Display relations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:1102
+#: ../lib/advene/gui/views/timeline.py:3447
 #, fuzzy
-msgid "Close path"
-msgstr "Kein Pakte"
+msgid "Display all relations"
+msgstr "Zeige Packet inhalt als Baumdarstellung"
 
-#: ../lib/advene/gui/edit/shapewidget.py:1181
-msgid "Circle"
+#: ../lib/advene/gui/views/timeline.py:3523
+msgid "Center on current player position."
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:1239
-msgid "Ellipse"
+#: ../lib/advene/gui/views/timeline.py:3539
+msgid "Automatically activate loop when clicking on an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:1589
-msgid "SVG"
+#: ../lib/advene/gui/views/timeline.py:3563
+msgid "Displayed"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:2172
-msgid "Load SVG"
+#: ../lib/advene/gui/views/timeline.py:3571
+msgid "Not displayed"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:2178
-msgid "Save SVG"
+#: ../lib/advene/gui/views/timeline.py:3620
+msgid "< All <"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:74
-#: ../lib/advene/gui/widget.py:1063
-#, fuzzy
-msgid "Refresh snapshot"
-msgstr "Zeige Shortcuts"
-
-#: ../lib/advene/gui/edit/timeadjustment.py:102
-#, python-format
-msgid "Decrement value by %.2f s"
+#: ../lib/advene/gui/views/timeline.py:3624
+msgid "> All >"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:104
-#, python-format
-msgid "Increment value by %.2f s"
+#: ../lib/advene/gui/views/timeline.py:3648
+msgid "Displayed annotation types"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:130
-msgid ""
-"Click to play\n"
-"Control+click to set to current time\n"
-"Scroll to modify value (with control/shift)\n"
-"Right-click to invalidate screenshot"
+#: ../lib/advene/gui/views/timeline.py:3678
+msgid "Relation type"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:145
-msgid ""
-"Enter a timecode.\n"
-"An integer value will be considered as milliseconds.\n"
-"A float value (12.2) will be considered as seconds.\n"
-"HH:MM:SS.sss values are possible."
+#: ../lib/advene/gui/views/timeline.py:3678
+msgid "Display relation types"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:159
-msgid "Set to current player position"
+#: ../lib/advene/gui/views/timeline.py:3679
+msgid "Relation content"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:81
-#, python-format
-msgid "%s creation"
+#: ../lib/advene/gui/views/timeline.py:3679
+msgid "Display relation content"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:82
-#, python-format
-msgid ""
-"To create a new element of type %s,\n"
-"you must give the following information."
+#: ../lib/advene/gui/views/timeline.py:3680 ../lib/advene/gui/popup.py:545
+msgid "Highlight"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:92 ../lib/advene/gui/edit/elements.py:508
-#: ../lib/advene/gui/edit/elements.py:557
-#: ../lib/advene/gui/edit/elements.py:659
-#: ../lib/advene/gui/views/browser.py:362 ../lib/advene/gui/views/table.py:251
-#: ../lib/advene/gui/views/table.py:558
-msgid "Type"
+#: ../lib/advene/gui/views/timeline.py:3680
+msgid "Highlight active annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:111
-msgid "Dynamic view"
+#: ../lib/advene/gui/views/timeline.py:3767
+msgid "Enter the tag for the selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:112
-msgid "HTML template"
+#: ../lib/advene/gui/views/timeline.py:3773
+#: ../lib/advene/gui/views/tagbag.py:165
+msgid "The tag contains invalid characters"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:113
-msgid "Plain XML"
+#: ../lib/advene/gui/views/relation.py:71
+msgid "Relations view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:114
-msgid "SVG template"
+#: ../lib/advene/gui/views/editionhistory.py:40
+msgid "Edition History"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:115
-msgid "Plain text template"
+#: ../lib/advene/gui/views/editionhistory.py:42
+msgid "Access last edited/created elements"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:118
-msgid "Simple query"
-msgstr ""
+#: ../lib/advene/gui/views/editionhistory.py:102
+#, fuzzy
+msgid "Created"
+msgstr "Erstelle"
 
-#: ../lib/advene/gui/edit/create.py:120
-msgid "Directory"
-msgstr ""
+#: ../lib/advene/gui/views/editionhistory.py:103
+#, fuzzy
+msgid "Edited"
+msgstr "_Bearbeite"
 
-#: ../lib/advene/gui/edit/create.py:128
-msgid "No available type."
+#: ../lib/advene/gui/views/tagbag.py:55
+msgid "Tag Bag"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:172
-#, python-format
-msgid ""
-"The identifier %s is not valid.\n"
-"It must be composed of non-accentuated alphabetic characters\n"
-"Underscore is allowed."
+#: ../lib/advene/gui/views/tagbag.py:62
+msgid "New tag"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:177
-#, python-format
-msgid "The identifier %s is already defined."
+#: ../lib/advene/gui/views/tagbag.py:125
+msgid "New tag name"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:310
-msgid "New resource data"
+#: ../lib/advene/gui/views/tagbag.py:131
+msgid "Enter a new tag name and select its color."
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:143 ../lib/advene/gui/edit/imports.py:144
-msgid "Schemas"
+#: ../lib/advene/gui/views/tagbag.py:135
+#: ../lib/advene/gui/edit/shapewidget.py:343
+msgid "Name"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:181 ../lib/advene/gui/edit/imports.py:182
-#: ../lib/advene/gui/views/interactivequery.py:464
-msgid "Annotations"
+#: ../lib/advene/gui/views/tagbag.py:141
+#: ../lib/advene/gui/edit/shapewidget.py:364
+#: ../lib/advene/gui/edit/elements.py:897
+#: ../lib/advene/gui/edit/elements.py:977
+#: ../lib/advene/gui/edit/elements.py:1091 ../lib/advene/rules/actions.py:135
+msgid "Color"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:195 ../lib/advene/gui/edit/imports.py:196
-#: ../lib/advene/gui/edit/elements.py:517
-msgid "Relations"
+#: ../lib/advene/gui/views/tagbag.py:178
+msgid "Tag bag options"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:209 ../lib/advene/gui/edit/imports.py:210
-msgid "Queries"
+#: ../lib/advene/gui/views/tagbag.py:179
+msgid "Update with new tags"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:320
-msgid "Imported?"
+#: ../lib/advene/gui/views/tagbag.py:179
+msgid "Automatically display new defined tags"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:337
-#: ../lib/advene/gui/edit/elements.py:509
-#: ../lib/advene/gui/edit/elements.py:558
-#: ../lib/advene/gui/edit/elements.py:645
-#: ../lib/advene/gui/edit/elements.py:725
-#: ../lib/advene/gui/edit/elements.py:782
-#: ../lib/advene/gui/edit/elements.py:874
-#: ../lib/advene/gui/edit/elements.py:943
-#: ../lib/advene/gui/edit/elements.py:1055
-#: ../lib/advene/gui/edit/elements.py:1117
-msgid "URI"
+#: ../lib/advene/gui/views/tagbag.py:228
+#, python-format
+msgid "Choose the color for tag %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:359
-msgid "Choose the package to import, and its alias"
+#: ../lib/advene/gui/views/tagbag.py:252
+msgid "Set color"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:47
-msgid "Montage"
+#: ../lib/advene/gui/views/tagbag.py:253
+msgid "Remove"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:49
-msgid "Dynamic montage of annotations"
+#: ../lib/advene/gui/views/tagbag.py:326
+msgid "Drop a tag here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:55
-#: ../lib/advene/gui/views/logwindow.py:50
-#: ../lib/advene/gui/views/tagbag.py:60
-#: ../lib/advene/gui/views/activebookmarks.py:59
-#: ../lib/advene/gui/views/bookmarks.py:77
-msgid "Clear"
+#: ../lib/advene/gui/views/tagbag.py:336
+msgid "Save as adhoc view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:56
-#: ../lib/advene/gui/views/transcription.py:472
-#: ../lib/advene/gui/widget.py:1059
-msgid "Play"
+#: ../lib/advene/gui/views/tagbag.py:337
+msgid "Add a new tag"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:57
-msgid "Render"
+#: ../lib/advene/gui/views/tagbag.py:338
+msgid "Display all defined tags"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:171
-msgid "Remove from montage"
+#: ../lib/advene/gui/views/__init__.py:197
+msgid "Invalid view id"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:303 ../lib/advene/gui/popup.py:444
-#, fuzzy, python-format
-msgid "Extracting %s"
-msgstr "Datei _importieren"
+#: ../lib/advene/gui/views/__init__.py:243
+#, python-format
+msgid "Cannot save default options: %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:304
+#: ../lib/advene/gui/views/__init__.py:254
 #, python-format
-msgid ""
-"Exporting montage %(title)s\n"
-"to %%(filename)s"
+msgid "Default options saved for view %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:396
-msgid "Drop an annotation here to remove it from the list"
+#: ../lib/advene/gui/views/__init__.py:282
+#, python-format
+msgid "Error in source evaluation %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:407
-msgid "Play the montage"
+#: ../lib/advene/gui/views/__init__.py:299
+#, python-format
+msgid "Saving %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:412
-#, fuzzy
-msgid "Save the view in the package"
-msgstr "Kein Pakte"
-
-#: ../lib/advene/gui/edit/montage.py:460
-msgid "Set zoom level"
+#: ../lib/advene/gui/views/__init__.py:302
+msgid "Enter a view name to save this parametered view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:465
-msgid "Set 100% zoom"
+#: ../lib/advene/gui/views/__init__.py:320
+#, python-format
+msgid "Error: the view %s is not an adhoc view."
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:471
-#: ../lib/advene/gui/views/interactivequery.py:439
-msgid "Unhighlight annotations"
+#: ../lib/advene/gui/views/__init__.py:345
+msgid "HTML export"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:475 ../lib/advene/gui/edit/montage.py:484
-#: ../lib/advene/gui/views/interactivequery.py:443
-#: ../lib/advene/gui/views/interactivequery.py:480
-msgid "Highlight annotations"
+#: ../lib/advene/gui/views/__init__.py:346
+msgid "Specify a name for the export view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:545
-msgid "Total duration:"
+#: ../lib/advene/gui/views/__init__.py:365
+#, python-format
+msgid ""
+"View successfully exported as %s.\n"
+"Open it in the web browser ?"
 msgstr ""
 
-#: ../lib/advene/gui/edit/frameselector.py:43
-msgid "Click on a frame to select its time."
+#: ../lib/advene/gui/views/__init__.py:444
+msgid "Actions"
 msgstr ""
 
-#: ../lib/advene/gui/edit/frameselector.py:177
-msgid "Select the appropriate snapshot"
+#: ../lib/advene/gui/views/__init__.py:469
+msgid "Click or drag-and-drop to reattach view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/frameselector.py:230
-#: ../lib/advene/gui/edit/frameselector.py:283
-msgid "Click to see more frames or scroll with the mouse wheel"
+#: ../lib/advene/gui/views/finder.py:106
+msgid "List of views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:67
-msgid "Transcription importer"
+#: ../lib/advene/gui/views/finder.py:107
+msgid "Static views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:78
-msgid "Note taking"
+#: ../lib/advene/gui/views/finder.py:108
+msgid "Dynamic views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:80
-msgid "Take notes on the fly as a timestamped transcription"
-msgstr "Schreibe Noitzen on the fly als transkription mit zeitangabe"
+#: ../lib/advene/gui/views/finder.py:109
+msgid "Admin views"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:87
-#: ../lib/advene/gui/views/activebookmarks.py:60
-msgid "Export as static view"
+#: ../lib/advene/gui/views/finder.py:110
+msgid "Adhoc views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:148
-msgid "Timestamp"
+#: ../lib/advene/gui/views/finder.py:174
+msgid "No resources"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:148
-msgid "Click inserts timestamp marks"
+#: ../lib/advene/gui/views/finder.py:551
+#, python-format
+msgid ""
+"View <b>%(title)s</b>\n"
+"Id: %(id)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:149
-msgid "Insert on single-click"
+#: ../lib/advene/gui/views/finder.py:558
+msgid "Open in webbrowser"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:149
-msgid "A single click will insert the mark (else a double click is needed)"
+#: ../lib/advene/gui/views/finder.py:559
+#, python-format
+msgid "View applied to %s\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:150
-msgid "Play on scroll"
+#: ../lib/advene/gui/views/finder.py:564 ../lib/advene/gui/popup.py:525
+msgid "Activate"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:150
-msgid "Play the new position upon timestamp modification"
+#: ../lib/advene/gui/views/finder.py:567
+msgid "Open in GUI"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:151
-msgid "Generate empty annotations"
+#: ../lib/advene/gui/views/finder.py:569
+msgid "Unknown type of view??"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:151
-msgid "If checked, generate annotations for empty text"
+#: ../lib/advene/gui/views/finder.py:597
+msgid "Edit view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:152
-msgid "Reaction time"
+#: ../lib/advene/gui/views/finder.py:606
+msgid "Open view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:152
+#: ../lib/advene/gui/views/finder.py:646 ../lib/advene/gui/views/finder.py:710
+#, python-format
 msgid ""
-"Reaction time (substracted from current player time, except when paused.)"
+"%(type)s <b>%(title)s</b>\n"
+"Id: %(id)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:153
-msgid "Auto-insert"
+#: ../lib/advene/gui/views/finder.py:661
+#: ../lib/advene/gui/views/interactivequery.py:401
+msgid "Edit query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:153
-msgid "Automatic timestamp mark insertion"
+#: ../lib/advene/gui/views/finder.py:669
+msgid "Try to apply the query on..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:154
-msgid "Automatic insertion delay"
+#: ../lib/advene/gui/views/finder.py:687 ../lib/advene/gui/popup.py:860
+#, fuzzy
+msgid "the package"
+msgstr "Kein Pakte"
+
+#: ../lib/advene/gui/views/finder.py:688 ../lib/advene/gui/popup.py:861
+#, fuzzy
+msgid "all annotations of the package"
+msgstr "Transkription für das gesamte Packet"
+
+#: ../lib/advene/gui/views/finder.py:689 ../lib/advene/gui/popup.py:862
+#, fuzzy
+msgid "the first annotation of the package"
+msgstr "Transkription für das gesamte Packet"
+
+#: ../lib/advene/gui/views/finder.py:734
+msgid "Edit resource"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:154
+#: ../lib/advene/gui/views/finder.py:769 ../lib/advene/util/helper.py:569
+#, python-format
 msgid ""
-"If autoinsert is active, timestamp marks will be automatically inserted when "
-"text is entered after no interaction since this delay (in ms).\n"
-"1000 is typically a good value."
+"Package %(title)s:\n"
+"%(schema)s\n"
+"%(annotation)s in %(annotation_type)s\n"
+"%(relation)s in %(relation_type)s\n"
+"%(query)s\n"
+"%(view)s\n"
+"\n"
+"Description:\n"
+"%(description)s\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:155 ../lib/advene/gui/main.py:4368
-msgid "Font size"
+#: ../lib/advene/gui/views/finder.py:790
+#, python-format
+msgid "%(type)s %(title)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:155
-msgid "Font size for text (0 for standard size)"
+#: ../lib/advene/gui/views/finder.py:793 ../lib/advene/gui/edit/elements.py:519
+#: ../lib/advene/gui/edit/elements.py:568
+#: ../lib/advene/gui/edit/elements.py:655
+#: ../lib/advene/gui/edit/elements.py:735
+#: ../lib/advene/gui/edit/elements.py:793
+#: ../lib/advene/gui/edit/elements.py:884
+#: ../lib/advene/gui/edit/elements.py:954
+#: ../lib/advene/gui/edit/elements.py:1066
+msgid "Metadata"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:215
-#: ../lib/advene/gui/edit/transcribe.py:219
-#: ../lib/advene/gui/edit/transcribe.py:379
-#: ../lib/advene/gui/edit/transcribe.py:383
-msgid "Invalid timestamp mark"
+#: ../lib/advene/gui/views/finder.py:810
+msgid "Column-based package finder"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:496
-#: ../lib/advene/gui/views/timeline.py:2550
-#, python-format
-msgid "Position %s"
+#: ../lib/advene/gui/views/editaccumulator.py:46
+msgid "EditAccumulator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:506 ../lib/advene/gui/popup.py:456
-msgid "Edit"
+#: ../lib/advene/gui/views/activebookmarks.py:55
+#: ../lib/advene/gui/views/activebookmarks.py:57
+msgid "ActiveBookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:510
-msgid "Ignore the following text (toggle)"
+#: ../lib/advene/gui/views/activebookmarks.py:63
+msgid "Export as static view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:514
-msgid "Remove mark"
+#: ../lib/advene/gui/views/activebookmarks.py:434
+msgid "Bookmark duration"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:518
-msgid "Reaction-time offset"
+#: ../lib/advene/gui/views/activebookmarks.py:435
+msgid "Enter the duration (in ms) to convert bookmarks into annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:522
-msgid "-1 sec"
+#: ../lib/advene/gui/views/activebookmarks.py:457
+msgid "User-specified duration"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:525
-msgid "-0.5 sec"
+#: ../lib/advene/gui/views/activebookmarks.py:458
+msgid "2s duration"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:528
-msgid "-0.1 sec"
+#: ../lib/advene/gui/views/activebookmarks.py:459
+msgid "Complete coverage"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:532
-msgid "+1 sec"
+#: ../lib/advene/gui/views/activebookmarks.py:477
+msgid "Drop a bookmark here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:535
-msgid "+0.5 sec"
+#: ../lib/advene/gui/views/activebookmarks.py:504
+msgid "Type of the annotations that will be created"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:538
-msgid "+0.1 sec"
+#: ../lib/advene/gui/views/activebookmarks.py:522
+#: ../lib/advene/gui/edit/transcribe.py:1130
+msgid "Smallish"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:629
-msgid "Invalid timestamp"
+#: ../lib/advene/gui/views/activebookmarks.py:523
+#: ../lib/advene/gui/edit/transcribe.py:1131 ../lib/advene/rules/actions.py:169
+msgid "Small"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:762
-#, python-format
-msgid "Invalid timestamp mark in conversion: %s"
+#: ../lib/advene/gui/views/activebookmarks.py:524
+#: ../lib/advene/gui/edit/transcribe.py:1132 ../lib/advene/rules/actions.py:170
+msgid "Normal"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:879
-#, python-format
-msgid "Cannot save the file: %s"
+#: ../lib/advene/gui/views/activebookmarks.py:525
+#: ../lib/advene/gui/edit/transcribe.py:1133 ../lib/advene/rules/actions.py:171
+msgid "Large"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:884
-#: ../lib/advene/gui/views/transcription.py:703
-#, python-format
-msgid "Transcription saved to %s"
+#: ../lib/advene/gui/views/activebookmarks.py:526
+#: ../lib/advene/gui/edit/transcribe.py:1134
+msgid "Larger"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:890
-#: ../lib/advene/gui/edit/transcribe.py:980
-msgid "This will overwrite the current textual content. Are you sure?"
+#: ../lib/advene/gui/views/activebookmarks.py:527
+#: ../lib/advene/gui/edit/transcribe.py:1135
+msgid "Huge"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:893
-msgid "Select transcription file to load"
+#: ../lib/advene/gui/views/activebookmarks.py:537
+msgid "Complete bookmarks into annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:910
-#, python-format
-msgid "Cannot open %(filename)s: %(error)s"
-msgstr ""
+#: ../lib/advene/gui/views/activebookmarks.py:538
+#, fuzzy
+msgid "Save the current state"
+msgstr "Aktuelle Sitzung speichern"
 
-#: ../lib/advene/gui/edit/transcribe.py:965
-msgid "Cannot import annotations: no existing interface"
+#: ../lib/advene/gui/views/activebookmarks.py:539
+#: ../lib/advene/gui/edit/transcribe.py:1165
+msgid "Set the size of snaphots"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:967
-msgid "Select the annotation type to import"
+#: ../lib/advene/gui/views/activebookmarks.py:806
+msgid "Remove end timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:976
-#, fuzzy, python-format
-msgid "There are no annotations of type %s"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/edit/transcribe.py:1005
-msgid "Cannot convert the data: no associated package"
+#: ../lib/advene/gui/views/activebookmarks.py:1014
+msgid ""
+"Error: cannot find an appropriate schema to create the Active-bookmark type."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1008
-#, fuzzy
-msgid "Converting transcription"
-msgstr "T_ranskription"
+#: ../lib/advene/gui/views/activebookmarks.py:1019
+msgid "Active bookmark"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1014
-msgid "Choose the annotation-type where to create annotations.\n"
+#: ../lib/advene/gui/views/activebookmarks.py:1057
+msgid "Validate the annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1022
-msgid "Delete existing annotations in this type"
+#: ../lib/advene/gui/views/activebookmarks.py:1201
+msgid "Duplicate bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1027
-#: ../lib/advene/gui/views/timeline.py:3009 ../lib/advene/gui/main.py:3222
-msgid "Create a new annotation type"
+#: ../lib/advene/gui/views/activebookmarks.py:1202
+msgid "Remove bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1045
-#, fuzzy
-msgid "Select type"
-msgstr "Wähle einen DVD"
+#: ../lib/advene/gui/views/activebookmarks.py:1211
+msgid "Remove begin timestamp"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1049
-msgid "You want to create a new type. Please specify its schema and title."
+#: ../lib/advene/gui/views/activebookmarks.py:1218
+msgid "Complete bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1061
-msgid "Containing schema"
+#: ../lib/advene/gui/views/activebookmarks.py:1222
+msgid "Change type to"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1074
-msgid "Export options"
+#: ../lib/advene/gui/views/logwindow.py:43
+msgid "Links"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1079
+#: ../lib/advene/gui/views/logwindow.py:45
 #, fuzzy
-msgid "Generate annotations for empty contents"
-msgstr "Erschaffe Anmerkung auf Basis des DVD Kapitels"
+msgid "URL stack"
+msgstr "_URL stapel"
 
-#: ../lib/advene/gui/edit/transcribe.py:1104
+#: ../lib/advene/gui/views/logwindow.py:123
 #, python-format
-msgid "The %s identifier already exists. Choose another one."
+msgid "Go to %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1143
-msgid "Notes converted"
+#: ../lib/advene/gui/views/logwindow.py:129 ../lib/advene/rules/actions.py:65
+msgid "Go to the given position"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1147
-#: ../lib/advene/gui/views/bookmarks.py:169
-#, python-format
-msgid ""
-"Conversion completed.\n"
-"%s annotations generated."
+#: ../lib/advene/gui/views/logwindow.py:157
+msgid "Push a URL on the stack"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1163
-#: ../lib/advene/gui/views/activebookmarks.py:546
-msgid "Smallish"
-msgstr ""
+#: ../lib/advene/gui/views/logwindow.py:158
+#, fuzzy
+msgid "Description of the URL"
+msgstr "Transkription für das gesamte Packet"
 
-#: ../lib/advene/gui/edit/transcribe.py:1167
-#: ../lib/advene/gui/views/activebookmarks.py:550
-msgid "Larger"
+#: ../lib/advene/gui/views/interactivequery.py:52
+#: ../lib/advene/gui/views/interactivequery.py:100
+msgid "Interactive query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1168
-#: ../lib/advene/gui/views/activebookmarks.py:551
-msgid "Huge"
+#: ../lib/advene/gui/views/interactivequery.py:54
+msgid "Interactive query dialog"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1190
-msgid "Open"
+#: ../lib/advene/gui/views/interactivequery.py:60
+#: ../lib/advene/gui/views/interactivequery.py:257
+msgid "Save query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1191
-msgid "Save"
+#: ../lib/advene/gui/views/interactivequery.py:123
+#: ../lib/advene/gui/views/interactivequery.py:173
+#, python-format
+msgid ""
+"Invalid query.\n"
+"The following fields have an invalid value:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1192
-msgid "Save As"
+#: ../lib/advene/gui/views/interactivequery.py:137
+#: ../lib/advene/gui/views/interactivequery.py:297
+msgid "Saving the query..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1193
-msgid "Import"
+#: ../lib/advene/gui/views/interactivequery.py:138
+#: ../lib/advene/gui/views/interactivequery.py:298
+msgid "Give a title and identifier for saving the query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1193
-msgid "Import from annotations"
+#: ../lib/advene/gui/views/interactivequery.py:181
+msgid "Expert search"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1194
-msgid "Convert"
+#: ../lib/advene/gui/views/interactivequery.py:187
+#, python-format
+msgid ""
+"TALES error in interactive expression:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1194
-msgid "Convert to annotations"
+#: ../lib/advene/gui/views/interactivequery.py:248
+msgid "Interactive result"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1196
-msgid "Center on the current mark"
+#: ../lib/advene/gui/views/interactivequery.py:250
+msgid "Interactive result display"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1197
-msgid "Find"
+#: ../lib/advene/gui/views/interactivequery.py:275
+msgid "Result of interactive query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1197
-msgid "Search a string"
+#: ../lib/advene/gui/views/interactivequery.py:279
+msgid "Result of a query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1198
-msgid "Scale"
+#: ../lib/advene/gui/views/interactivequery.py:334
+#, fuzzy, python-format
+msgid "Comment on annotations containing %s"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/views/interactivequery.py:353
+msgid "Choose the annotation type where annotations will be created."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1198
-#: ../lib/advene/gui/views/activebookmarks.py:564
-msgid "Set the size of snaphots"
+#: ../lib/advene/gui/views/interactivequery.py:357
+#, python-format
+msgid "Copied result of the '%s' query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1221
-msgid "Automatically scroll to the mark position when playing"
+#: ../lib/advene/gui/views/interactivequery.py:369
+#, python-format
+msgid "Search/replace content in %d elements"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1223
-msgid "Autoscroll"
+#: ../lib/advene/gui/views/interactivequery.py:397
+msgid "Edit query again"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1230
-msgid "Autoinsert"
+#: ../lib/advene/gui/views/interactivequery.py:411
+msgid "Search again"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1232
-msgid "Automatically insert marks"
+#: ../lib/advene/gui/views/interactivequery.py:417
+msgid "Empty result"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:74
+#: ../lib/advene/gui/views/interactivequery.py:426
 #, python-format
-msgid "No edit popup available for element %s"
+msgid "Result is a list of %d annotations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:95
-msgid "Edit Window"
+#: ../lib/advene/gui/views/interactivequery.py:428
+#, python-format
+msgid "Result is a list of  %(number)d elements with %(elements)s."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:134
-msgid "Apply changes and close the edit window"
+#: ../lib/advene/gui/views/interactivequery.py:440
+#: ../lib/advene/gui/edit/montage.py:481
+msgid "Unhighlight annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:139
-msgid "Apply changes"
+#: ../lib/advene/gui/views/interactivequery.py:444
+#: ../lib/advene/gui/views/interactivequery.py:481
+#: ../lib/advene/gui/edit/montage.py:485 ../lib/advene/gui/edit/montage.py:494
+msgid "Highlight annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:273
-msgid "Content has been modified. Close anyway and lose data?"
+#: ../lib/advene/gui/views/interactivequery.py:465
+#: ../lib/advene/gui/edit/imports.py:184 ../lib/advene/gui/edit/imports.py:185
+msgid "Annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:331
-#: ../lib/advene/gui/views/viewbook.py:234
-#: ../lib/advene/gui/views/viewbook.py:240
-#, python-format
-msgid "Edit %s"
+#: ../lib/advene/gui/views/interactivequery.py:471
+msgid "Other elements"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:333
-#, python-format
-msgid "View %s (read-only)"
+#: ../lib/advene/gui/views/interactivequery.py:475
+msgid "Display annotations in timeline"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:369
-#, python-format
-msgid "Display %s"
+#: ../lib/advene/gui/views/interactivequery.py:476
+#, fuzzy
+msgid "Display annotations as transcription"
+msgstr "Zeige die Anmerkung als Transkription"
+
+#: ../lib/advene/gui/views/interactivequery.py:482
+#: ../lib/advene/gui/views/interactivequery.py:504
+msgid "Export table"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:453
+#: ../lib/advene/gui/views/interactivequery.py:483
 #, fuzzy
-msgid "Apply changes and edit previous annotation of same type"
-msgstr "von einem Anmerkungs Typ"
+msgid "Create annotations from the result"
+msgstr "Erschaffe Anmerkung auf Basis des DVD Kapitels"
+
+#: ../lib/advene/gui/views/interactivequery.py:484
+msgid "Define a montage with the result"
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:457
+#: ../lib/advene/gui/views/interactivequery.py:485
 #, fuzzy
-msgid "Apply changes and edit next annotation of same type"
+msgid "Create a comment view with the result"
 msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/edit/elements.py:463
-msgid "Unhighlight annotation"
+#: ../lib/advene/gui/views/interactivequery.py:486
+msgid "Search and replace strings in the annotations content"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:467
-msgid "Highlight annotation"
+#: ../lib/advene/gui/views/interactivequery.py:511
+msgid "Edit elements"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:498
-msgid "Fragment"
+#: ../lib/advene/gui/views/interactivequery.py:517
+msgid "Open in python evaluator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:510
-#: ../lib/advene/gui/edit/elements.py:559
-#: ../lib/advene/gui/edit/elements.py:646
-#: ../lib/advene/gui/edit/elements.py:726
-#: ../lib/advene/gui/edit/elements.py:783
-#: ../lib/advene/gui/edit/elements.py:875
-#: ../lib/advene/gui/edit/elements.py:944
-#: ../lib/advene/gui/edit/elements.py:1056
-#: ../lib/advene/gui/edit/elements.py:1118 ../lib/advene/gui/main.py:4174
-msgid "Author"
+#: ../lib/advene/gui/views/interactivequery.py:520
+#, python-format
+msgid ""
+"Result:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:511
-#: ../lib/advene/gui/edit/elements.py:560
-#: ../lib/advene/gui/edit/elements.py:647
-#: ../lib/advene/gui/edit/elements.py:727
-#: ../lib/advene/gui/edit/elements.py:784
-#: ../lib/advene/gui/edit/elements.py:876
-#: ../lib/advene/gui/edit/elements.py:945
-#: ../lib/advene/gui/edit/elements.py:1057
-#: ../lib/advene/gui/edit/elements.py:1119 ../lib/advene/gui/main.py:4175
-msgid "Date"
+#: ../lib/advene/gui/views/interactivequery.py:562
+msgid "Results of _interactive query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:513
-#: ../lib/advene/gui/edit/elements.py:562
-#: ../lib/advene/gui/edit/elements.py:649
-#: ../lib/advene/gui/edit/elements.py:729
-#: ../lib/advene/gui/edit/elements.py:787
-#: ../lib/advene/gui/edit/elements.py:878
-#: ../lib/advene/gui/edit/elements.py:948
-#: ../lib/advene/gui/edit/elements.py:1060
-msgid "Metadata"
+#: ../lib/advene/gui/popup.py:135
+msgid "Choose the file to insert"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:582
-#: ../lib/advene/gui/edit/elements.py:1065
-#: ../lib/advene/gui/views/relationdisplay.py:113
-msgid "Members"
+#: ../lib/advene/gui/popup.py:143
+msgid "Select a valid identifier"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:600
-#: ../lib/advene/gui/edit/elements.py:677
-#: ../lib/advene/gui/edit/elements.py:737
-#: ../lib/advene/gui/edit/elements.py:1128
-#: ../lib/advene/gui/views/table.py:250
-msgid "Content"
+#: ../lib/advene/gui/popup.py:144
+#, python-format
+msgid ""
+"The filename %s contains invalid characters\n"
+"that have been replaced.\n"
+"You can modify this identifier if necessary:"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:617
-msgid "Apply changes and visualise in web browser"
+#: ../lib/advene/gui/popup.py:155
+msgid "Choose the soundclip to insert"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:622
-msgid "Apply changes and activate the view"
+#: ../lib/advene/gui/popup.py:159
+msgid "Choose the directory to insert"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:630
-#: ../lib/advene/gui/edit/elements.py:711
-#: ../lib/advene/gui/edit/elements.py:768
-#: ../lib/advene/gui/edit/elements.py:859
-#: ../lib/advene/gui/edit/elements.py:928
-#: ../lib/advene/gui/edit/elements.py:1030
-#, fuzzy
-msgid "Title (name)"
-msgstr "Darstellung"
+#: ../lib/advene/gui/popup.py:171
+#, python-format
+msgid "Apply %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:634
-msgid "Name of the view"
+#: ../lib/advene/gui/popup.py:175
+msgid ""
+"Give the offset to use\n"
+"on specified element.\n"
+"It is in ms and can be\n"
+"either positive or negative."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:658
-msgid "Class"
+#: ../lib/advene/gui/popup.py:219
+#, python-format
+msgid "Replace content in %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:661
-msgid "Match Filter"
+#: ../lib/advene/gui/popup.py:222
+#, fuzzy, python-format
+msgid "Replace content in annotations of type %s"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/popup.py:225
+#, fuzzy
+msgid "Replace content in all annotations"
+msgstr "Zeige die Transkription für eine Anmerkung"
+
+#: ../lib/advene/gui/popup.py:318
+#, python-format
+msgid "Copy id %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:699 ../lib/advene/gui/popup.py:821
+#: ../lib/advene/gui/popup.py:352
 #, python-format
-msgid "Exception in query: %s"
+msgid ""
+"<b>Statistics about %s</b>\n"
+"\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:704
-#, fuzzy
-msgid "Validate and run query on package"
+#: ../lib/advene/gui/popup.py:358
+#, fuzzy, python-format
+msgid "Renumbering annotations of type %s"
 msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/edit/elements.py:715
-msgid "Name of the query"
+#: ../lib/advene/gui/popup.py:365
+msgid ""
+"<b>Renumber all annotations according to their order.</b>\n"
+"\n"
+"<i>Note that this action cannot be undone.</i>\n"
+"Replace the first numeric value of the annotation content with the new "
+"annotation number.\n"
+"If no numeric value is found and the annotation is structured, it will "
+"insert the number.\n"
+"If no numeric value is found and the annotation is of type text/plain, it "
+"will overwrite the annotation content.\n"
+"The offset parameter allows you to renumber from a given annotation."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:772
-#, fuzzy
-msgid "Name of the package"
-msgstr "Kein Pakte"
-
-#: ../lib/advene/gui/edit/elements.py:790
-#: ../lib/advene/gui/edit/elements.py:881
-#: ../lib/advene/gui/edit/elements.py:960
-#: ../lib/advene/gui/edit/elements.py:1074
-msgid "Description"
+#: ../lib/advene/gui/popup.py:371 ../lib/advene/gui/popup.py:513
+msgid "Offset"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:794
-#: ../lib/advene/gui/edit/elements.py:885
-#: ../lib/advene/gui/edit/elements.py:964
-#: ../lib/advene/gui/edit/elements.py:1078
-msgid "Textual description of the package"
+#: ../lib/advene/gui/popup.py:393
+#, fuzzy, python-format
+msgid "Renumbering %d annotations"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/popup.py:402
+#, fuzzy, python-format
+msgid "Annotation #%d"
+msgstr "Kommentar Typ"
+
+#: ../lib/advene/gui/popup.py:433
+#, python-format
+msgid "Splitting package according to %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:799
-msgid "Default dynamic view"
+#: ../lib/advene/gui/popup.py:436
+#, python-format
+msgid ""
+"For each of the %(count)d annotations in %(atype)s, create a package named "
+"after the source package and the annotation content, copying only "
+"annotations contained in the reference annotation."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:803
-msgid "Dynamic view to activate on package load"
+#: ../lib/advene/gui/popup.py:456
+#, fuzzy
+msgid "Created %(name)s - %(n) annotations"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/popup.py:473 ../lib/advene/gui/edit/montage.py:309
+#, fuzzy, python-format
+msgid "Extracting %s"
+msgstr "Datei _importieren"
+
+#: ../lib/advene/gui/popup.py:474
+#, python-format
+msgid ""
+"Exporting annotation %(title)s\n"
+"from %(begin)s to %(end)s\n"
+"to %%(filename)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:808
-msgid "Default static view"
+#: ../lib/advene/gui/popup.py:485 ../lib/advene/gui/edit/transcribe.py:499
+msgid "Edit"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:812
-msgid "Static view to open on package load"
+#: ../lib/advene/gui/popup.py:487
+msgid "Browse"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:817
-msgid "Default adhoc view"
+#: ../lib/advene/gui/popup.py:495 ../lib/advene/gui/popup.py:884
+msgid "Open in web browser"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:821
-msgid "Adhoc view to open on package load"
+#: ../lib/advene/gui/popup.py:501 ../lib/advene/gui/popup.py:505
+#: ../lib/advene/gui/edit/shapewidget.py:1601
+msgid "Delete"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:826
-msgid "Cached duration"
+#: ../lib/advene/gui/popup.py:508
+msgid "Search/replace content"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:830
-msgid "Cached duration in ms"
+#: ../lib/advene/gui/popup.py:526
+msgid "Desactivate"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:835
-msgid "Mediafile"
+#: ../lib/advene/gui/popup.py:543
+msgid "Loop"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:839
-msgid "Location of associated media file"
+#: ../lib/advene/gui/popup.py:544
+msgid "Duplicate"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:863
+#: ../lib/advene/gui/popup.py:548
 #, fuzzy
-msgid "Name of the schema"
-msgstr "Schema"
+msgid "Save snapshot..."
+msgstr "Zeige Shortcuts"
 
-#: ../lib/advene/gui/edit/elements.py:895
-#: ../lib/advene/gui/edit/elements.py:975
-msgid "TALES expression returning a color for the element"
-msgstr ""
+#: ../lib/advene/gui/popup.py:550
+#, fuzzy
+msgid "Extract video fragment"
+msgstr "Gebe eine Video Stream Adresse ein"
 
-#: ../lib/advene/gui/edit/elements.py:902
-#: ../lib/advene/gui/edit/elements.py:993
-msgid "Item color"
+#: ../lib/advene/gui/popup.py:580
+msgid "Incoming"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:906
-#: ../lib/advene/gui/edit/elements.py:997
-msgid ""
-"TALES expression returning a color for the items contained by the element"
+#: ../lib/advene/gui/popup.py:596
+msgid "Outgoing"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:932
-#: ../lib/advene/gui/edit/elements.py:1034
-msgid "Name of the type"
-msgstr ""
+#: ../lib/advene/gui/popup.py:611
+#, fuzzy
+msgid "Related annotations"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/edit/elements.py:950
-#: ../lib/advene/gui/edit/elements.py:1039
-#: ../lib/advene/gui/edit/elements.py:1308
-msgid "MIME Type"
+#: ../lib/advene/gui/popup.py:618
+msgid "Incoming relations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:954
-#: ../lib/advene/gui/edit/elements.py:1043
-msgid "MIMEType of the content"
+#: ../lib/advene/gui/popup.py:625
+msgid "Outgoing relations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:982
-#: ../lib/advene/gui/views/transcription.py:165
-msgid "Representation"
+#: ../lib/advene/gui/popup.py:642
+#, python-format
+msgid "Begin: %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:986
-msgid ""
-"TALES expression used to get a compact representation of the annotations"
+#: ../lib/advene/gui/popup.py:644
+#, python-format
+msgid "End: %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:987
+#: ../lib/advene/gui/popup.py:645
 #, fuzzy, python-format
-msgid "Display %s key"
+msgid "Duration: %s"
 msgstr "Verbindungs Type"
 
-#: ../lib/advene/gui/edit/elements.py:1003
-msgid "Completions"
+#: ../lib/advene/gui/popup.py:652
+msgid "Members:"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1007
-msgid "Space-separated list of words used for content completion"
+#: ../lib/advene/gui/popup.py:665
+#, fuzzy
+msgid "Edit package properties..."
+msgstr "Bearbeite Packet Eigentschaften"
+
+#: ../lib/advene/gui/popup.py:666 ../lib/advene/gui/popup.py:787
+#, python-format
+msgid "%d annotations(s) - statistics"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1013
-#, fuzzy
-msgid "Advanced"
-msgstr "Advene"
+#: ../lib/advene/gui/popup.py:668 ../lib/advene/gui/popup.py:895
+msgid "Create a new static view..."
+msgstr ""
+
+#: ../lib/advene/gui/popup.py:669 ../lib/advene/gui/popup.py:896
+msgid "Create a new dynamic view..."
+msgstr ""
+
+#: ../lib/advene/gui/popup.py:670 ../lib/advene/gui/popup.py:782
+msgid "Create a new annotation..."
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1063
-msgid "Any annotation type"
+#: ../lib/advene/gui/popup.py:672 ../lib/advene/gui/popup.py:898
+msgid "Create a new schema..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1089
-msgid "TALES expression specifying a color"
+#: ../lib/advene/gui/popup.py:673 ../lib/advene/gui/popup.py:893
+msgid "Create a new query..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1116
-msgid "MIMEType"
+#: ../lib/advene/gui/popup.py:681
+msgid "Create a new folder..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1341
-#, python-format
-msgid "Error: cannot find a content handler for %s"
+#: ../lib/advene/gui/popup.py:682
+msgid "Create a new resource file..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1457
-#: ../lib/advene/gui/edit/elements.py:1682
-#, python-format
-msgid ""
-"Cannot read the data:\n"
-"%s"
+#: ../lib/advene/gui/popup.py:683
+msgid "Insert a new resource file..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1481
-#: ../lib/advene/gui/edit/elements.py:1707
-msgid "Save content to..."
+#: ../lib/advene/gui/popup.py:684
+msgid "Insert a new resource directory..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1492
-#: ../lib/advene/gui/edit/elements.py:1720
-#, python-format
-msgid ""
-"Cannot save the data:\n"
-"%s"
+#: ../lib/advene/gui/popup.py:693 ../lib/advene/gui/popup.py:695
+msgid "Insert a soundclip..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1511
-#: ../lib/advene/gui/edit/elements.py:1734
-msgid "Open a file (C-o)"
+#: ../lib/advene/gui/popup.py:706
+msgid "Play sound"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1516
-#: ../lib/advene/gui/edit/elements.py:1739
-msgid "Save to a file (C-s)"
+#: ../lib/advene/gui/popup.py:716
+msgid "Create a new annotation type..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1521
-#: ../lib/advene/gui/edit/elements.py:1744
-msgid "Reload the file (C-r)"
+#: ../lib/advene/gui/popup.py:718
+msgid "Create a new relation type..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1527
-msgid "Insert a value from the browser (C-i)"
+#: ../lib/advene/gui/popup.py:720 ../lib/advene/gui/popup.py:781
+#: ../lib/advene/gui/popup.py:834
+msgid "Select a color"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1773
-msgid "Begin time is greater than end time"
+#: ../lib/advene/gui/popup.py:729
+#, python-format
+msgid "A caption dynamic view for %s already seems to exist."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1803
-#: ../lib/advene/gui/views/table.py:252
-msgid "Begin"
+#: ../lib/advene/gui/popup.py:738
+#, fuzzy, python-format
+msgid "Caption %s annotations"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/popup.py:748 ../lib/advene/rules/actions.py:121
+msgid "Caption the annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1812
-#: ../lib/advene/gui/views/table.py:253 ../lib/advene/gui/main.py:628
-msgid "End"
+#: ../lib/advene/gui/popup.py:770
+#, fuzzy
+msgid "Create a comment view"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/popup.py:771
+msgid "Generate a caption dynamic view..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2044
-msgid "Expecting an integer."
+#: ../lib/advene/gui/popup.py:772
+msgid "Display as transcription"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2076
+#: ../lib/advene/gui/popup.py:773
+#, fuzzy
+msgid "Display annotations in table"
+msgstr "Zeige Kommentare an einer Timeline"
+
+#: ../lib/advene/gui/popup.py:774
+#, fuzzy
+msgid "Export to another format..."
+msgstr "Importiere Daten von einer Externen Quelle"
+
+#: ../lib/advene/gui/popup.py:775
+#, fuzzy
+msgid "Split according to annotations"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/popup.py:777
 #, python-format
-msgid ""
-"The %(attribute)s attribute could not be updated:\n"
-"\n"
-"%(error)s\n"
-"\n"
-"Resetting to the original value."
+msgid "Apply %s..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2103
+#: ../lib/advene/gui/popup.py:783
+#, fuzzy
+msgid "Delete all annotations"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/popup.py:784
+#, fuzzy
+msgid "Renumber annotations..."
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/popup.py:785
+#, fuzzy
+msgid "Shot validation view..."
+msgstr "Zeige Kommentare an einer Timeline"
+
+#: ../lib/advene/gui/popup.py:797
 #, python-format
-msgid ""
-"The following attributes cannot be updated:\n"
-"\n"
-"%s"
+msgid "A follow dynamic view for %s already seems to exist."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2143
-#, python-format
-msgid ""
-"The following attributes could not be updated:\n"
-"\n"
-"%s"
+#: ../lib/advene/gui/popup.py:806
+#, fuzzy, python-format
+msgid "Follow %s relation-type"
+msgstr "Verbindungs Type"
+
+#: ../lib/advene/gui/popup.py:815
+msgid "Follow the relation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2160
-msgid "Attribute"
+#: ../lib/advene/gui/popup.py:835
+msgid "Delete all relations..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2168
-#: ../lib/advene/gui/views/browser.py:366
-msgid "Value"
+#: ../lib/advene/gui/popup.py:836
+#, fuzzy
+msgid "Create montage from related annotations"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/popup.py:837
+msgid "Create dynamic view following relations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2259
-msgid "Insert an element"
+#: ../lib/advene/gui/popup.py:852 ../lib/advene/gui/edit/elements.py:705
+#, python-format
+msgid "Exception in query: %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2260
-msgid "Choose the element to insert."
+#: ../lib/advene/gui/popup.py:855
+msgid "Apply query on..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2330
-#: ../lib/advene/gui/edit/elements.py:2373
-#, python-format
-msgid "Some tags contain invalid characters: %s"
+#: ../lib/advene/gui/popup.py:880
+msgid "Activate view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2353
-msgid "Tags:"
+#: ../lib/advene/gui/popup.py:882
+msgid "Open adhoc view"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:163
-#: ../lib/advene/gui/views/browser.py:165
-msgid "TALES browser"
+#: ../lib/advene/gui/util/initialconfig.py:82
+msgid "Initial Advene configuration"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:170
-msgid "Display result in table"
+#: ../lib/advene/gui/util/initialconfig.py:83
+msgid ""
+"<span size='large'><b>Welcome in Advene</b>\n"
+"This is the first time that you run Advene. Please answer some basic "
+"configuration questions. You will be able to modify these choices from the "
+"Advene interface, in the Edit/Preferences menu.</span>"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:193
-msgid "Insert path"
+#: ../lib/advene/gui/util/initialconfig.py:84
+#, fuzzy
+msgid "Interface language"
+msgstr "Oberflächen Eigentschaften"
+
+#: ../lib/advene/gui/util/initialconfig.py:84
+msgid "Language used for the interface"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:194
-msgid "Insert value"
+#: ../lib/advene/gui/util/initialconfig.py:90
+msgid "Weekly check for Advene updates on the Advene website"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:249
-msgid "Expression returned None (there was an exception)"
+#: ../lib/advene/gui/util/initialconfig.py:92
+msgid "Preferred directory for data files"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:302
-msgid "Result is not a list"
+#: ../lib/advene/gui/util/initialconfig.py:92
+msgid "Preferred directory for storing data files (Advene packages)"
 msgstr ""
 
-#: ../lib/advene/gui/views/accumulatorpopup.py:49
-msgid "PopupAccumulator"
+#: ../lib/advene/gui/util/initialconfig.py:94
+msgid "Directories to search for movies"
 msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:40
-msgid "Edition History"
+#: ../lib/advene/gui/util/initialconfig.py:94
+#, python-format
+msgid ""
+"List of directories (separated by %(pathsep)s) to search for movie files."
 msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:42
-msgid "Access last edited/created elements"
+#: ../lib/advene/gui/util/initialconfig.py:95
+msgid "First look for movie file in the same directory as the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:102
-#, fuzzy
-msgid "Created"
-msgstr "Erstelle"
+#: ../lib/advene/gui/util/initialconfig.py:95
+msgid ""
+"If checked, the movie file will be searched for in the same directory as the "
+"referencing package."
+msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:103
-#, fuzzy
-msgid "Edited"
-msgstr "_Bearbeite"
+#: ../lib/advene/gui/util/__init__.py:44 ../lib/advene/gui/edit/create.py:108
+msgid "Plain text content"
+msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:43
-msgid "Links"
+#: ../lib/advene/gui/util/__init__.py:45
+msgid "HTML content"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:45
-#, fuzzy
-msgid "URL stack"
-msgstr "_URL stapel"
+#: ../lib/advene/gui/util/__init__.py:46 ../lib/advene/gui/edit/create.py:109
+msgid "Simple-structured content"
+msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:123
-#, python-format
-msgid "Go to %s"
+#: ../lib/advene/gui/util/__init__.py:47
+msgid "List of numeric values"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:157
-msgid "Push a URL on the stack"
+#: ../lib/advene/gui/util/__init__.py:48 ../lib/advene/gui/edit/create.py:110
+msgid "SVG graphics content"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:158
-#, fuzzy
-msgid "Description of the URL"
-msgstr "Transkription für das gesamte Packet"
+#: ../lib/advene/gui/util/__init__.py:387
+#, python-format
+msgid ""
+"Annotation Type %(title)s:\n"
+"%(count)s"
+msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:37
-msgid "Checker"
+#: ../lib/advene/gui/util/__init__.py:393
+#, python-format
+msgid ""
+"Relation Type %(title)s:\n"
+"%(count)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:39
-#, fuzzy
-msgid "Check various package properties"
-msgstr "Bearbeite Packet Eigentschaften"
+#: ../lib/advene/gui/util/dialog.py:419 ../lib/advene/gui/util/dialog.py:458
+msgid "Name the element"
+msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:90
-msgid "List of possible issues in the current package"
+#: ../lib/advene/gui/util/dialog.py:422 ../lib/advene/gui/util/dialog.py:459
+msgid "Choose a name for the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:108
-msgid "Overlapping"
+#: ../lib/advene/gui/util/dialog.py:497
+msgid "Open a file"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:52
-msgid "Tag Bag"
+#: ../lib/advene/gui/util/dialog.py:522 ../lib/advene/gui/util/dialog.py:560
+msgid "N/C"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:54 ../lib/advene/gui/main.py:1232
-msgid "Bag of tags"
+#: ../lib/advene/gui/util/dialog.py:527
+msgid "Alias"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:59
-msgid "New tag"
+#: ../lib/advene/gui/util/dialog.py:545
+msgid ""
+"Press to\n"
+"display\n"
+"information"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:122
-msgid "New tag name"
+#: ../lib/advene/gui/util/dialog.py:568
+msgid "Wait..."
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:128
-msgid "Enter a new tag name and select its color."
+#: ../lib/advene/gui/util/dialog.py:572
+#, python-format
+msgid "Error: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:162
-#: ../lib/advene/gui/views/timeline.py:3720
-msgid "The tag contains invalid characters"
+#: ../lib/advene/gui/util/dialog.py:592
+msgid "Any type of file"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:175
-msgid "Tag bag options"
+#: ../lib/advene/gui/util/dialog.py:594
+msgid "Advene files (.xml, .azp, .apl)"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:176
-msgid "Update with new tags"
+#: ../lib/advene/gui/util/dialog.py:596
+msgid "Advene session (.apl)"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:176
-msgid "Automatically display new defined tags"
+#: ../lib/advene/gui/util/dialog.py:597
+msgid "Audio files"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:225
-#, python-format
-msgid "Choose the color for tag %s"
+#: ../lib/advene/gui/util/dialog.py:598
+msgid "Video files"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:249
-msgid "Set color"
+#: ../lib/advene/gui/util/dialog.py:637
+#: ../lib/advene/gui/edit/properties.py:578
+msgid "Choose a directory"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:250
-msgid "Remove"
+#: ../lib/advene/gui/util/dialog.py:690
+msgid "Select an element"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:324
-msgid "Drop a tag here to remove it from the list"
+#: ../lib/advene/gui/edit/rules.py:88 ../lib/advene/gui/edit/rules.py:90
+#: ../lib/advene/gui/edit/create.py:254
+msgid "Rule"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:333
-msgid "Save as adhoc view"
+#: ../lib/advene/gui/edit/rules.py:99 ../lib/advene/gui/edit/create.py:244
+msgid "Subviews"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:334
-msgid "Add a new tag"
+#: ../lib/advene/gui/edit/rules.py:126
+msgid "Add a new rule"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:335
-msgid "Display all defined tags"
+#: ../lib/advene/gui/edit/rules.py:130
+msgid "Subview"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:48
-msgid "Transcription"
+#: ../lib/advene/gui/edit/rules.py:133
+msgid "Add a subview list"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:50
+#: ../lib/advene/gui/edit/rules.py:139
 #, fuzzy
-msgid "Display annotations as a text transcription"
-msgstr "Zeige die Anmerkung als Transkription"
+msgid "Remove the current rule"
+msgstr "Aktuelle Sitzung speichern"
 
-#: ../lib/advene/gui/views/transcription.py:146
-#, python-format
-msgid "Error in source evaluation %(source)s: %(error)s"
+#: ../lib/advene/gui/edit/rules.py:275
+msgid "Source expression"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:163
-msgid "Transcription options"
+#: ../lib/advene/gui/edit/rules.py:277
+msgid "Return expression"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:164
-msgid "Default representation"
+#: ../lib/advene/gui/edit/rules.py:351
+msgid "For all elements in "
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:164
-msgid "Use the default representation for annotations"
+#: ../lib/advene/gui/edit/rules.py:352
+msgid "All annotations of the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:165
-msgid ""
-"If default representation is unchecked,\n"
-"this TALES expression that will be used to format the annotations."
+#: ../lib/advene/gui/edit/rules.py:353
+msgid "All views of the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:166
-msgid "Separator"
+#: ../lib/advene/gui/edit/rules.py:354 ../lib/advene/gui/edit/rules.py:798
+msgid "The context annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:167
-msgid "This separator will be inserted between the annotations."
+#: ../lib/advene/gui/edit/rules.py:355 ../lib/advene/gui/edit/rules.py:799
+msgid "The annotations of the context type"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:168
-msgid "Whitespace"
+#: ../lib/advene/gui/edit/rules.py:358 ../lib/advene/core/controller.py:610
+#, python-format
+msgid "Annotations of type %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:169
-msgid "Newline"
+#: ../lib/advene/gui/edit/rules.py:370
+msgid "Return "
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:170
-msgid "Tabulation"
+#: ../lib/advene/gui/edit/rules.py:372 ../lib/advene/gui/edit/rules.py:787
+msgid "The element"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:171
-msgid "Dash"
+#: ../lib/advene/gui/edit/rules.py:373 ../lib/advene/gui/edit/rules.py:788
+msgid "The element's content"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:172
-msgid "User defined"
+#: ../lib/advene/gui/edit/rules.py:388
+msgid "If the element matches "
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:174
-msgid "User-defined separator"
+#: ../lib/advene/gui/edit/rules.py:390
+msgid "Return the element if it matches "
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:174
-msgid ""
-"Separator used if user-defined is selected.Use \\n for a newline and \\t for "
-"a tabulation."
+#: ../lib/advene/gui/edit/rules.py:408 ../lib/advene/gui/edit/rules.py:617
+msgid "All conditions must be met"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:175
-msgid "Display timestamps"
+#: ../lib/advene/gui/edit/rules.py:409 ../lib/advene/gui/edit/rules.py:618
+msgid "Any condition can be met"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:175
-msgid "Insert timestsamp values"
+#: ../lib/advene/gui/edit/rules.py:493 ../lib/advene/gui/edit/rules.py:563
+#, python-format
+msgid "Rule <b>%s</b>"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:176
-msgid "Display annotation bounds"
+#: ../lib/advene/gui/edit/rules.py:574
+msgid "Rule name"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:236
-#, python-format
-msgid ""
-"Cannot convert the following annotations,\n"
-"the representation pattern is too complex.\n"
-"%s"
+#: ../lib/advene/gui/edit/rules.py:591
+msgid "Event"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:247
-msgid ""
-"Cannot validate the update.\n"
-"The representation pattern is too complex."
+#: ../lib/advene/gui/edit/rules.py:599
+msgid "If"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:273
-#, fuzzy
-msgid "Save transcription to a text file"
-msgstr "Zeige die Transkription für eine Anmerkung"
+#: ../lib/advene/gui/edit/rules.py:638
+msgid "Then"
+msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:274
-msgid "Apply the modifications"
+#: ../lib/advene/gui/edit/rules.py:683
+msgid "When the "
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:275
-msgid "Find text"
+#: ../lib/advene/gui/edit/rules.py:696
+msgid " occurs,"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:276
-msgid "Quickly switch display options"
+#: ../lib/advene/gui/edit/rules.py:723 ../lib/advene/gui/edit/rules.py:726
+#, python-format
+msgid "Condition expression: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:277
+#: ../lib/advene/gui/edit/rules.py:765
 #, fuzzy
-msgid "Refresh the transcription"
-msgstr "T_ranskription"
+msgid "The annotation type"
+msgstr "Kommentar Typ"
 
-#: ../lib/advene/gui/views/transcription.py:278
-#, fuzzy
-msgid "Edit preferences"
-msgstr "E_instellungen"
+#: ../lib/advene/gui/edit/rules.py:768
+#, fuzzy, python-format
+msgid "The value of the %s attribute"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/views/transcription.py:697
-#, python-format
-msgid "Cannot write to %(filename)s: %(error)s:"
+#: ../lib/advene/gui/edit/rules.py:770
+msgid "The annotation fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:52
-#: ../lib/advene/gui/views/activebookmarks.py:54
-msgid "ActiveBookmarks"
+#: ../lib/advene/gui/edit/rules.py:771
+msgid "The annotation begin time"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:441
-msgid "Chronological order"
+#: ../lib/advene/gui/edit/rules.py:772
+msgid "The annotation end time"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:442
-msgid "Completeness and chronological order"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:774
+#, fuzzy
+msgid "The annotation MIME-type"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/views/activebookmarks.py:458
-msgid "Bookmark duration"
+#: ../lib/advene/gui/edit/rules.py:775
+msgid "The annotation's incoming relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:459
-msgid "Enter the duration (in ms) to convert bookmarks into annotations"
+#: ../lib/advene/gui/edit/rules.py:776
+msgid "The annotation's outgoing relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:481
-msgid "User-specified duration"
+#: ../lib/advene/gui/edit/rules.py:779
+#, python-format
+msgid "The %s-related incoming annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:482
-msgid "2s duration"
+#: ../lib/advene/gui/edit/rules.py:783
+#, python-format
+msgid "The %s-related outgoing annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:483
-msgid "Complete coverage"
+#: ../lib/advene/gui/edit/rules.py:789
+msgid "The element fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:501
-msgid "Drop a bookmark here to remove it from the list"
+#: ../lib/advene/gui/edit/rules.py:790
+msgid "The element begin time"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:520
-#: ../lib/advene/gui/views/bookmarks.py:243
-msgid "Insert a bookmark for the current video time"
+#: ../lib/advene/gui/edit/rules.py:791
+msgid "The element end time"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:528
-msgid "Type of the annotations that will be created"
+#: ../lib/advene/gui/edit/rules.py:792
+msgid "The element duration"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:561
-msgid "Reorder active bookmarks"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:793
+#, fuzzy
+msgid "The element type"
+msgstr "Wähle einen DVD"
 
-#: ../lib/advene/gui/views/activebookmarks.py:562
-msgid "Complete bookmarks into annotations"
+#: ../lib/advene/gui/edit/rules.py:794
+msgid "The element's incoming relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:563
-#, fuzzy
-msgid "Save the current state"
-msgstr "Aktuelle Sitzung speichern"
-
-#: ../lib/advene/gui/views/activebookmarks.py:863
-msgid "Remove end timestamp"
+#: ../lib/advene/gui/edit/rules.py:795
+msgid "The element's outgoing relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1071
-msgid ""
-"Error: cannot find an appropriate schema to create the Active-bookmark type."
+#: ../lib/advene/gui/edit/rules.py:796
+msgid "The context"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1076
-msgid "Active bookmark"
+#: ../lib/advene/gui/edit/rules.py:797
+msgid "The context fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1114
-msgid "Validate the annotation"
+#: ../lib/advene/gui/edit/rules.py:809
+#, fuzzy, python-format
+msgid "annotation-type %s"
+msgstr "Kommentar Typ"
+
+#: ../lib/advene/gui/edit/rules.py:812
+#, fuzzy, python-format
+msgid "relation-type %s"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/gui/edit/rules.py:834
+msgid "Select a condition"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1260
-msgid "Duplicate bookmark"
+#: ../lib/advene/gui/edit/rules.py:878
+#, python-format
+msgid "Parameter %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1261
-msgid "Remove bookmark"
+#: ../lib/advene/gui/edit/rules.py:991
+msgid "Select an action"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1270
-msgid "Remove begin timestamp"
+#: ../lib/advene/gui/edit/rules.py:1082
+#, fuzzy
+msgid "Activate?"
+msgstr "Aktivieren und Abspielen"
+
+#: ../lib/advene/gui/edit/properties.py:110
+msgid "Please press the new key combination"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1277
-msgid "Complete bookmark"
+#: ../lib/advene/gui/edit/properties.py:161
+msgid "Disabled"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1281
-msgid "Change type to"
+#: ../lib/advene/gui/edit/properties.py:167
+#: ../lib/advene/gui/edit/shapewidget.py:1602
+msgid "Properties"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:48
-msgid "Bookmarks importer"
+#: ../lib/advene/gui/edit/properties.py:531
+msgid "Choose a file"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:69
-msgid "Bookmarks"
+#: ../lib/advene/gui/edit/frameselector.py:46
+msgid "Click on a frame to select its time."
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:71
-msgid "Bookmark timecodes with their corresponding screenshots"
+#: ../lib/advene/gui/edit/frameselector.py:184
+msgid "Select the appropriate snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:142
-msgid "Select the annotation type to generate"
+#: ../lib/advene/gui/edit/frameselector.py:237
+#: ../lib/advene/gui/edit/frameselector.py:268
+msgid "Click to see more frames or scroll with the mouse wheel"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:147
-msgid "Choose a duration"
+#: ../lib/advene/gui/edit/create.py:83
+#, python-format
+msgid "%s creation"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:148
-msgid "Enter the standard duration (in ms) of created annotations."
+#: ../lib/advene/gui/edit/create.py:84
+#, python-format
+msgid ""
+"To create a new element of type %s,\n"
+"you must give the following information."
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:165
-msgid "Converted from bookmarks"
+#: ../lib/advene/gui/edit/create.py:113
+msgid "Dynamic view"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:223
-msgid "Drop a position here to remove it from the list"
+#: ../lib/advene/gui/edit/create.py:114
+msgid "HTML template"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:244
-msgid "Convert bookmarks to annotations"
+#: ../lib/advene/gui/edit/create.py:115
+msgid "Plain XML"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:292 ../lib/advene/gui/main.py:3609
-msgid "Comment here"
+#: ../lib/advene/gui/edit/create.py:116
+msgid "SVG template"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewplugin.py:60
-msgid "Generic view plugin"
+#: ../lib/advene/gui/edit/create.py:117
+msgid "Plain text template"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewplugin.py:62
-msgid "You should not ever see this tooltip..."
+#: ../lib/advene/gui/edit/create.py:120
+msgid "Simple query"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:51
-#: ../lib/advene/gui/views/interactivequery.py:99
-msgid "Interactive query"
+#: ../lib/advene/gui/edit/create.py:122
+msgid "Directory"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:53
-msgid "Interactive query dialog"
+#: ../lib/advene/gui/edit/create.py:124 ../lib/advene/util/helper.py:417
+msgid "Resource File"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:59
-#: ../lib/advene/gui/views/interactivequery.py:256
-msgid "Save query"
+#: ../lib/advene/gui/edit/create.py:130
+msgid "No available type."
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:122
-#: ../lib/advene/gui/views/interactivequery.py:172
+#: ../lib/advene/gui/edit/create.py:174
 #, python-format
 msgid ""
-"Invalid query.\n"
-"The following fields have an invalid value:\n"
-"%s"
+"The identifier %s is not valid.\n"
+"It must be composed of non-accentuated alphabetic characters\n"
+"Underscore is allowed."
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:136
-#: ../lib/advene/gui/views/interactivequery.py:296
-msgid "Saving the query..."
+#: ../lib/advene/gui/edit/create.py:179
+#, python-format
+msgid "The identifier %s is already defined."
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:137
-#: ../lib/advene/gui/views/interactivequery.py:297
-msgid "Give a title and identifier for saving the query"
+#: ../lib/advene/gui/edit/create.py:312
+msgid "New resource data"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:180
-msgid "Expert search"
+#: ../lib/advene/gui/edit/imports.py:132 ../lib/advene/gui/edit/imports.py:133
+#: ../lib/advene/core/controller.py:611
+msgid "Views"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:186
-#, python-format
-msgid ""
-"TALES error in interactive expression:\n"
-"%s"
+#: ../lib/advene/gui/edit/imports.py:146 ../lib/advene/gui/edit/imports.py:147
+msgid "Schemas"
+msgstr ""
+
+#: ../lib/advene/gui/edit/imports.py:198 ../lib/advene/gui/edit/imports.py:199
+#: ../lib/advene/gui/edit/elements.py:523
+msgid "Relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:247
-msgid "Interactive result"
+#: ../lib/advene/gui/edit/imports.py:212 ../lib/advene/gui/edit/imports.py:213
+msgid "Queries"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:249
-msgid "Interactive result display"
+#: ../lib/advene/gui/edit/imports.py:323
+msgid "Imported?"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:274
-msgid "Result of interactive query"
+#: ../lib/advene/gui/edit/imports.py:340 ../lib/advene/gui/edit/elements.py:515
+#: ../lib/advene/gui/edit/elements.py:564
+#: ../lib/advene/gui/edit/elements.py:651
+#: ../lib/advene/gui/edit/elements.py:731
+#: ../lib/advene/gui/edit/elements.py:788
+#: ../lib/advene/gui/edit/elements.py:880
+#: ../lib/advene/gui/edit/elements.py:949
+#: ../lib/advene/gui/edit/elements.py:1061
+#: ../lib/advene/gui/edit/elements.py:1123
+msgid "URI"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:278
-msgid "Result of a query"
+#: ../lib/advene/gui/edit/imports.py:362
+msgid "Choose the package to import, and its alias"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:280
-#: ../lib/advene/gui/main.py:3188
+#: ../lib/advene/gui/edit/imports.py:408 ../lib/advene/gui/edit/merge.py:230
 #, python-format
-msgid "'%s'"
+msgid "Package %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:333
-#, fuzzy, python-format
-msgid "Comment on annotations containing %s"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/views/interactivequery.py:352
-msgid "Choose the annotation type where annotations will be created."
+#: ../lib/advene/gui/edit/imports.py:408 ../lib/advene/gui/edit/merge.py:230
+msgid "No title"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:356
-#, python-format
-msgid "Copied result of the '%s' query"
+#: ../lib/advene/gui/edit/shapewidget.py:91
+msgid "Generic shape"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:368
+#: ../lib/advene/gui/edit/shapewidget.py:256
+#: ../lib/advene/gui/edit/shapewidget.py:755
 #, python-format
-msgid "Search/replace content in %d elements"
+msgid "Link to %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:375
-#: ../lib/advene/gui/main.py:3185
-msgid "Empty quicksearch string"
+#: ../lib/advene/gui/edit/shapewidget.py:348
+#: ../lib/advene/gui/edit/shapewidget.py:1304
+msgid "Link"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:396
-msgid "Edit query again"
+#: ../lib/advene/gui/edit/shapewidget.py:353
+msgid "Link label"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:400
-#: ../lib/advene/gui/views/finder.py:436
-msgid "Edit query"
+#: ../lib/advene/gui/edit/shapewidget.py:371
+msgid "Linewidth"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:409
-#: ../lib/advene/gui/main.py:537
-msgid "String to search"
+#: ../lib/advene/gui/edit/shapewidget.py:376
+msgid "Filled"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:410
-msgid "Search again"
+#: ../lib/advene/gui/edit/shapewidget.py:384
+msgid "Opacity"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:416
-msgid "Empty result"
+#: ../lib/advene/gui/edit/shapewidget.py:426
+#, python-format
+msgid "Properties of %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:425
-#, python-format
-msgid "Result is a list of %d annotations."
+#: ../lib/advene/gui/edit/shapewidget.py:473
+msgid "Rectangle"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:427
-#, python-format
-msgid "Result is a list of  %(number)d elements with %(elements)s."
+#: ../lib/advene/gui/edit/shapewidget.py:553
+#: ../lib/advene/gui/edit/shapewidget.py:666
+msgid "Text"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:470
-msgid "Other elements"
+#: ../lib/advene/gui/edit/shapewidget.py:677
+msgid "Textsize"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:474
-msgid "Display annotations in timeline"
+#: ../lib/advene/gui/edit/shapewidget.py:691
+msgid "Image"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:475
-#, fuzzy
-msgid "Display annotations as transcription"
-msgstr "Zeige die Anmerkung als Transkription"
+#: ../lib/advene/gui/edit/shapewidget.py:775
+msgid "Href"
+msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:481
-#: ../lib/advene/gui/views/interactivequery.py:503
-msgid "Export table"
+#: ../lib/advene/gui/edit/shapewidget.py:785
+msgid "Line"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:482
-#, fuzzy
-msgid "Create annotations from the result"
-msgstr "Erschaffe Anmerkung auf Basis des DVD Kapitels"
+#: ../lib/advene/gui/edit/shapewidget.py:881
+msgid "Draw an arrow"
+msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:483
-msgid "Define a montage with the result"
+#: ../lib/advene/gui/edit/shapewidget.py:892
+msgid "Arrow size"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:484
+#: ../lib/advene/gui/edit/shapewidget.py:1107
 #, fuzzy
-msgid "Create a comment view with the result"
-msgstr "von einem Anmerkungs Typ"
+msgid "Close path"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/gui/views/interactivequery.py:485
-msgid "Search and replace strings in the annotations content"
+#: ../lib/advene/gui/edit/shapewidget.py:1186
+msgid "Circle"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:510
-msgid "Edit elements"
+#: ../lib/advene/gui/edit/shapewidget.py:1241
+msgid "Ellipse"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:516
-msgid "Open in python evaluator"
+#: ../lib/advene/gui/edit/shapewidget.py:1603
+msgid "SVG"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:519
-#, python-format
-msgid ""
-"Result:\n"
-"%s"
+#: ../lib/advene/gui/edit/shapewidget.py:2162
+msgid "Load SVG"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:561
-msgid "Results of _interactive query"
+#: ../lib/advene/gui/edit/shapewidget.py:2168
+msgid "Save SVG"
 msgstr ""
 
-#: ../lib/advene/gui/views/relationdisplay.py:34
-#, fuzzy
-msgid "RelationDisplay"
-msgstr "Verbindungs Type"
+#: ../lib/advene/gui/edit/importer.py:49
+msgid "Importer"
+msgstr ""
 
-#: ../lib/advene/gui/views/relationdisplay.py:36
+#: ../lib/advene/gui/edit/importer.py:108
+#: ../lib/advene/gui/edit/importer.py:118
 #, fuzzy
-msgid "Display the contents of a relation"
-msgstr "Zeige Packet inhalt als Baumdarstellung"
+msgid "Advene package importer"
+msgstr "Bearbeite Packet Eigentschaften"
 
-#: ../lib/advene/gui/views/relationdisplay.py:79
-msgid "No relation"
+#: ../lib/advene/gui/edit/importer.py:122
+msgid "Not likely"
 msgstr ""
 
-#: ../lib/advene/gui/views/relationdisplay.py:104
-#: ../lib/advene/gui/views/annotationdisplay.py:253
-msgid "Contents"
+#: ../lib/advene/gui/edit/importer.py:144
+#, python-format
+msgid ""
+"Completed conversion: %(message)s\n"
+"%(statistics)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:62
-msgid "Cannot go back: first item in history"
+#: ../lib/advene/gui/edit/importer.py:151
+msgid "Stop"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:220
+#: ../lib/advene/gui/edit/importer.py:190
 #, python-format
-msgid "%s%% loaded"
+msgid ""
+"The filter is not ready.\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:223
-#, fuzzy, python-format
-msgid "Title %s"
-msgstr "Darstellung"
-
-#: ../lib/advene/gui/views/html.py:287
-msgid "HTML Viewer"
+#: ../lib/advene/gui/edit/importer.py:279
+msgid "Choose the file to import"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:289
-msgid "Embedded HTML widget"
-msgstr ""
+#: ../lib/advene/gui/edit/importer.py:299
+#, fuzzy
+msgid "Filter"
+msgstr "_Datei"
 
-#: ../lib/advene/gui/views/html.py:319
-msgid "No available HTML rendering component"
+#: ../lib/advene/gui/edit/importer.py:308
+msgid "Options"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:36
-msgid "ViewBook"
+#: ../lib/advene/gui/edit/importer.py:318
+msgid "Start"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:57
-#: ../lib/advene/gui/views/viewbook.py:64
-msgid "Cannot remove this widget, it is essential."
+#: ../lib/advene/gui/edit/dvdselect.py:71
+msgid ""
+"Select the correct\n"
+"title and chapter\n"
+"of the DVD"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:135
-msgid "Detach"
+#: ../lib/advene/gui/edit/dvdselect.py:84
+msgid "Chapter"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:139
-#: ../lib/advene/gui/views/editaccumulator.py:76
-msgid "Close"
+#: ../lib/advene/gui/edit/merge.py:33
+msgid "Create element"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:157
-msgid "Rename the view"
+#: ../lib/advene/gui/edit/merge.py:34
+msgid "Create annotation (duplicate id)"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:158
-msgid "Please enter the new name of the view"
+#: ../lib/advene/gui/edit/merge.py:35
+msgid "Create relation (duplicate id)"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:197
-msgid "Detach view in its own window, or drag-and-drop to another zone"
+#: ../lib/advene/gui/edit/merge.py:36
+msgid "Update the color"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:211
-msgid "Close view"
+#: ../lib/advene/gui/edit/merge.py:37
+msgid "Update the representation"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:286
-msgid "Open a new transcription for..."
+#: ../lib/advene/gui/edit/merge.py:38
+msgid "Update the description"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:298
-#, fuzzy
-msgid "Create a new comment view"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/views/viewbook.py:300
-msgid "Open a new view"
+#: ../lib/advene/gui/edit/merge.py:39
+msgid "Update the title"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:375
-#, fuzzy, python-format
-msgid "Use annotation-type %s :"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/views/viewbook.py:378
-#: ../lib/advene/gui/views/viewbook.py:404
-msgid "to edit it"
+#: ../lib/advene/gui/edit/merge.py:40
+msgid "Update the mimetype"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:379
-#: ../lib/advene/gui/views/viewbook.py:405
-#: ../lib/advene/gui/views/viewbook.py:437
-msgid "to create a new static view"
+#: ../lib/advene/gui/edit/merge.py:41
+msgid "Update the begin time"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:381
-#, fuzzy
-msgid "in a timeline"
-msgstr "T_imeline"
-
-#: ../lib/advene/gui/views/viewbook.py:382
-msgid "as a montage"
+#: ../lib/advene/gui/edit/merge.py:42
+msgid "Update the end time"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:383
-#: ../lib/advene/gui/views/viewbook.py:436
-msgid "in a table"
+#: ../lib/advene/gui/edit/merge.py:43
+msgid "Update the content"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:384
-#: ../lib/advene/gui/views/viewbook.py:406
-msgid "in a query"
+#: ../lib/advene/gui/edit/merge.py:44
+msgid "Update the matchFilter"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:384
-#: ../lib/advene/gui/views/viewbook.py:406
-#, fuzzy, python-format
-msgid "Query %s"
-msgstr "Abfragen"
-
-#: ../lib/advene/gui/views/viewbook.py:385
-#: ../lib/advene/gui/views/viewbook.py:407
-#, fuzzy
-msgid "in the TALES browser"
-msgstr "Bearbeite Packet Eigentschaften"
-
-#: ../lib/advene/gui/views/viewbook.py:385
-#, python-format
-msgid "Browsing %s"
+#: ../lib/advene/gui/edit/merge.py:45
+msgid "Update the member types"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:401
-#, fuzzy, python-format
-msgid "Use annotation %s :"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/views/viewbook.py:407
-#, python-format
-msgid "Browse %s"
+#: ../lib/advene/gui/edit/merge.py:46
+msgid "Update tags"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:408
-#, fuzzy
-msgid "to display its contents"
-msgstr "Zeige Shortcuts"
-
-#: ../lib/advene/gui/views/viewbook.py:408
-#, python-format
-msgid "%s"
+#: ../lib/advene/gui/edit/merge.py:90
+msgid "Difference between original and merged elements"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:409
-msgid "as a bookmark"
+#: ../lib/advene/gui/edit/merge.py:136
+msgid "Current element"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:427
-msgid "as the context for the query..."
+#: ../lib/advene/gui/edit/merge.py:141
+msgid "Updated element"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:431
-#, fuzzy
-msgid "Set of annotations"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/views/viewbook.py:432
-#, fuzzy
-msgid "Use annotations:"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/views/viewbook.py:435
-msgid "to edit them"
+#: ../lib/advene/gui/edit/merge.py:147
+msgid "Show diff"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:438
-msgid "as bookmarks"
+#: ../lib/advene/gui/edit/merge.py:180
+msgid "Merge?"
 msgstr ""
 
-#: ../lib/advene/gui/views/singletonpopup.py:32
-msgid "SingletonPopup"
+#: ../lib/advene/gui/edit/merge.py:197
+msgid "Element"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:121 ../lib/advene/gui/main.py:1221
-msgid "Timeline"
+#: ../lib/advene/gui/edit/merge.py:215
+#, fuzzy, python-format
+msgid "Merge elements from %(source)s into %(dest)s"
+msgstr "Füge Elemente von anderen Packeten hinzu"
+
+#: ../lib/advene/gui/edit/merge.py:266
+msgid "All"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:123
-msgid "Display annotations on a timeline"
-msgstr "Zeige Kommentare an einer Timeline"
+#: ../lib/advene/gui/edit/merge.py:271 ../lib/advene/core/controller.py:1097
+msgid "None"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:137
-#, fuzzy
-msgid "Limit display to current area"
-msgstr "Zeige Shortcuts"
+#: ../lib/advene/gui/edit/montage.py:51
+msgid "Montage"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:138
-#: ../lib/advene/gui/views/timeline.py:3265
-msgid "Display whole movie"
+#: ../lib/advene/gui/edit/montage.py:53
+msgid "Dynamic montage of annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:168
-#, python-format
-msgid "Cannot find annotation type %s"
+#: ../lib/advene/gui/edit/montage.py:61
+msgid "Render"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:218
-msgid "No scrolling"
+#: ../lib/advene/gui/edit/montage.py:176
+msgid "Remove from montage"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:219
-msgid "Continuous scrolling"
+#: ../lib/advene/gui/edit/montage.py:310
+#, python-format
+msgid ""
+"Exporting montage %(title)s\n"
+"to %%(filename)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:220
-msgid "Discrete scrolling"
+#: ../lib/advene/gui/edit/montage.py:405
+msgid "Drop an annotation here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:221
-#, fuzzy
-msgid "Annotation scrolling"
-msgstr "Kommentar Typ"
-
-#: ../lib/advene/gui/views/timeline.py:483
-#, fuzzy, python-format
-msgid "%d annotations"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/edit/montage.py:417
+msgid "Play the montage"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:486
+#: ../lib/advene/gui/edit/montage.py:422
 #, fuzzy
-msgid "Display all types"
-msgstr "Verbindungs Type"
+msgid "Save the view in the package"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/gui/views/timeline.py:488
-#, python-format
-msgid ""
-"There are %d annotations.\n"
-"The current timeline may take a long time to display them, so only the first "
-"two annotation types are displayed. Use the annotation type selector (second "
-"button in the timeline) to select other annotations types to display, or "
-"click on the 'Display all types' button below."
+#: ../lib/advene/gui/edit/montage.py:470
+msgid "Set zoom level"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:963
-#, fuzzy
-msgid "Split at current player position"
-msgstr "Aktuelle Sitzung speichern"
+#: ../lib/advene/gui/edit/montage.py:475
+msgid "Set 100% zoom"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:967
-msgid "Center and zoom"
+#: ../lib/advene/gui/edit/montage.py:554
+msgid "Total duration:"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1058
-#: ../lib/advene/gui/views/tree.py:808 ../lib/advene/gui/main.py:4563
-msgid ""
-"Select the schema where you want to\n"
-"create the new relation type."
+#: ../lib/advene/gui/edit/timeadjustment.py:97
+#, python-format
+msgid "Decrement value by %.2f s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1071
-#: ../lib/advene/gui/views/tree.py:821
-msgid "Create a relation"
+#: ../lib/advene/gui/edit/timeadjustment.py:99
+#, python-format
+msgid "Increment value by %.2f s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1081
-#: ../lib/advene/gui/views/tree.py:831
-msgid "Create a new relation-type."
+#: ../lib/advene/gui/edit/timeadjustment.py:128
+msgid ""
+"Click to play\n"
+"Control+click to set to current time\n"
+"Scroll to modify value (with control/shift)\n"
+"Right-click to invalidate screenshot"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1107
-msgid "Merge with this annotation"
+#: ../lib/advene/gui/edit/timeadjustment.py:143
+msgid ""
+"Enter a timecode.\n"
+"An integer value will be considered as milliseconds.\n"
+"A float value (12.2) will be considered as seconds.\n"
+"HH:MM:SS.sss values are possible."
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1116
-msgid "Align both begin times"
+#: ../lib/advene/gui/edit/timeadjustment.py:157
+msgid "Set to current player position"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1117
-msgid "Align both end times"
+#: ../lib/advene/gui/edit/elements.py:80
+#, python-format
+msgid "No edit popup available for element %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1118
-msgid "Align end time to selected begin time"
+#: ../lib/advene/gui/edit/elements.py:100
+msgid "Edit Window"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1119
-msgid "Align begin time to selected end time"
+#: ../lib/advene/gui/edit/elements.py:139
+msgid "Apply changes and close the edit window"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1120
-msgid "Align all times"
+#: ../lib/advene/gui/edit/elements.py:144
+msgid "Apply changes"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1158
-#: ../lib/advene/gui/views/tree.py:700
-msgid "Cannot delete the annotation : it has relations."
+#: ../lib/advene/gui/edit/elements.py:278
+msgid "Content has been modified. Close anyway and lose data?"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1233
-msgid "Select the appropriate relation type"
+#: ../lib/advene/gui/edit/elements.py:338
+#, python-format
+msgid "View %s (read-only)"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1252
-#: ../lib/advene/gui/views/tree.py:757
+#: ../lib/advene/gui/edit/elements.py:374
 #, python-format
-msgid "Duplicate selection to type %s"
+msgid "Display %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1255
-#: ../lib/advene/gui/views/tree.py:760
-#, fuzzy, python-format
-msgid "Move selection to type %s"
+#: ../lib/advene/gui/edit/elements.py:459
+#, fuzzy
+msgid "Apply changes and edit previous annotation of same type"
 msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/views/timeline.py:1264
-#: ../lib/advene/gui/views/tree.py:769
-#, fuzzy, python-format
-msgid "Duplicate annotation to type %s"
+#: ../lib/advene/gui/edit/elements.py:463
+#, fuzzy
+msgid "Apply changes and edit next annotation of same type"
 msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/views/timeline.py:1268
-#: ../lib/advene/gui/views/tree.py:773
-#, fuzzy, python-format
-msgid "Move annotation to type %s"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/edit/elements.py:469
+msgid "Unhighlight annotation"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1275
-#, python-format
-msgid "Duplicate to type %(type)s at %(position)s"
+#: ../lib/advene/gui/edit/elements.py:473
+msgid "Highlight annotation"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1281
-#, python-format
-msgid "Move to type %(type)s at %(position)s"
+#: ../lib/advene/gui/edit/elements.py:504
+msgid "Fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1291
-#: ../lib/advene/gui/views/tree.py:784
-msgid "Duplicate and create a relation"
+#: ../lib/advene/gui/edit/elements.py:527 ../lib/advene/core/controller.py:611
+msgid "Tags"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1302
-#, python-format
-msgid "Duplicate at %s and create a relation"
+#: ../lib/advene/gui/edit/elements.py:623
+msgid "Apply changes and visualise in web browser"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1333
+#: ../lib/advene/gui/edit/elements.py:628
+msgid "Apply changes and activate the view"
+msgstr ""
+
+#: ../lib/advene/gui/edit/elements.py:636
+#: ../lib/advene/gui/edit/elements.py:717
+#: ../lib/advene/gui/edit/elements.py:774
+#: ../lib/advene/gui/edit/elements.py:865
+#: ../lib/advene/gui/edit/elements.py:934
+#: ../lib/advene/gui/edit/elements.py:1036
 #, fuzzy
-msgid "Annotation filter"
-msgstr "Kommentar Typ"
+msgid "Title (name)"
+msgstr "Darstellung"
 
-#: ../lib/advene/gui/views/timeline.py:1334
-msgid "Enter the searched string"
+#: ../lib/advene/gui/edit/elements.py:640
+msgid "Name of the view"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1442
-#, fuzzy, python-format
-msgid "Duplicate all annotations to type %s"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/edit/elements.py:664
+msgid "Class"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1444
-#, fuzzy, python-format
-msgid "Move all annotations to type %s"
+#: ../lib/advene/gui/edit/elements.py:667
+msgid "Match Filter"
+msgstr ""
+
+#: ../lib/advene/gui/edit/elements.py:710
+#, fuzzy
+msgid "Validate and run query on package"
 msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/views/timeline.py:1446
-#, python-format
-msgid "Duplicate all annotations matching a string to type %s"
+#: ../lib/advene/gui/edit/elements.py:721
+msgid "Name of the query"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1448
-#, python-format
-msgid "Move all annotations matching a string to type %s"
+#: ../lib/advene/gui/edit/elements.py:778
+#, fuzzy
+msgid "Name of the package"
+msgstr "Kein Pakte"
+
+#: ../lib/advene/gui/edit/elements.py:796
+#: ../lib/advene/gui/edit/elements.py:887
+#: ../lib/advene/gui/edit/elements.py:966
+#: ../lib/advene/gui/edit/elements.py:1080
+msgid "Description"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1450
-#, python-format
-msgid "Align all annotation time codes using %s as reference."
+#: ../lib/advene/gui/edit/elements.py:800
+#: ../lib/advene/gui/edit/elements.py:891
+#: ../lib/advene/gui/edit/elements.py:970
+#: ../lib/advene/gui/edit/elements.py:1084
+msgid "Textual description of the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1452
-#, python-format
-msgid "Align all annotation contents using %s as reference"
+#: ../lib/advene/gui/edit/elements.py:805
+msgid "Default dynamic view"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1642
-#: ../lib/advene/gui/views/table.py:240
-msgid "Cannot update the annotation, its representation is too complex"
+#: ../lib/advene/gui/edit/elements.py:809
+msgid "Dynamic view to activate on package load"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1936
-#: ../lib/advene/gui/views/timeline.py:1965
-#, fuzzy, python-format
-msgid "Displaying %(count)d / %(total)d annotations..."
-msgstr "Zeige die Transkription für eine Anmerkung"
+#: ../lib/advene/gui/edit/elements.py:814
+msgid "Default static view"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1947
-#, fuzzy
-msgid "Displaying done."
-msgstr "Verbindungs Type"
+#: ../lib/advene/gui/edit/elements.py:818
+msgid "Static view to open on package load"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2439
-msgid "Create a new annotation"
+#: ../lib/advene/gui/edit/elements.py:823
+msgid "Default adhoc view"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2440
-msgid "Zoom on region"
+#: ../lib/advene/gui/edit/elements.py:827
+msgid "Adhoc view to open on package load"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2441
-#, fuzzy
-msgid "Restrict display to region"
-msgstr "Zeige Shortcuts"
+#: ../lib/advene/gui/edit/elements.py:832
+msgid "Cached duration"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2560
-#, fuzzy
-msgid "New annotation at player time"
-msgstr "Kommentar Typ"
+#: ../lib/advene/gui/edit/elements.py:836
+msgid "Cached duration in ms"
+msgstr ""
+
+#: ../lib/advene/gui/edit/elements.py:841
+msgid "Mediafile"
+msgstr ""
+
+#: ../lib/advene/gui/edit/elements.py:845
+msgid "Location of associated media file"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2564
+#: ../lib/advene/gui/edit/elements.py:869
 #, fuzzy
-msgid "New annotation at mouse position"
-msgstr "Kommentar Typ"
+msgid "Name of the schema"
+msgstr "Schema"
 
-#: ../lib/advene/gui/views/timeline.py:2568
-msgid "Selection"
+#: ../lib/advene/gui/edit/elements.py:901
+#: ../lib/advene/gui/edit/elements.py:981
+msgid "TALES expression returning a color for the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2694
-msgid "Cannot zoom more"
+#: ../lib/advene/gui/edit/elements.py:908
+#: ../lib/advene/gui/edit/elements.py:999
+msgid "Item color"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2915
-#, python-format
-msgid "From schema %s"
+#: ../lib/advene/gui/edit/elements.py:912
+#: ../lib/advene/gui/edit/elements.py:1003
+msgid ""
+"TALES expression returning a color for the items contained by the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2977
-msgid "Restrict playing to this annotation-type"
+#: ../lib/advene/gui/edit/elements.py:938
+#: ../lib/advene/gui/edit/elements.py:1040
+msgid "Name of the type"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2984
-msgid "Goto previous annotation"
+#: ../lib/advene/gui/edit/elements.py:956
+#: ../lib/advene/gui/edit/elements.py:1045
+#: ../lib/advene/gui/edit/elements.py:1314
+msgid "MIME Type"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2995
-#, fuzzy
-msgid "Goto next annotation"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/edit/elements.py:960
+#: ../lib/advene/gui/edit/elements.py:1049
+msgid "MIMEType of the content"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3006
-msgid "+"
+#: ../lib/advene/gui/edit/elements.py:992
+msgid ""
+"TALES expression used to get a compact representation of the annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3064
-#, fuzzy
-msgid "Open an annotation display view"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/edit/elements.py:993
+#, fuzzy, python-format
+msgid "Display %s key"
+msgstr "Verbindungs Type"
 
-#: ../lib/advene/gui/views/timeline.py:3071
-msgid "Open a slave montage view (coordinated zoom level)"
+#: ../lib/advene/gui/edit/elements.py:1009
+msgid "Completions"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3106
-msgid ""
-"<b>Statistics about current selection</b>\n"
-"\n"
+#: ../lib/advene/gui/edit/elements.py:1013
+msgid "Space-separated list of words used for content completion"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3113
+#: ../lib/advene/gui/edit/elements.py:1019
 #, fuzzy
-msgid "No selected annotation"
-msgstr "von einem Anmerkungs Typ"
+msgid "Advanced"
+msgstr "Advene"
 
-#: ../lib/advene/gui/views/timeline.py:3117
-#, python-format
-msgid "%d selected annotation(s)"
+#: ../lib/advene/gui/edit/elements.py:1069
+msgid "Any annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3124
-msgid "Unselect all annotations"
+#: ../lib/advene/gui/edit/elements.py:1095
+msgid "TALES expression specifying a color"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3125
-msgid "Create a static view"
+#: ../lib/advene/gui/edit/elements.py:1122
+msgid "MIMEType"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3126
-msgid "Highlight selection in other views"
+#: ../lib/advene/gui/edit/elements.py:1347
+#, python-format
+msgid "Error: cannot find a content handler for %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3127
-#: ../lib/advene/gui/views/timeline.py:3713
-msgid "Tag selection"
+#: ../lib/advene/gui/edit/elements.py:1466
+#: ../lib/advene/gui/edit/elements.py:1679
+#, python-format
+msgid ""
+"Cannot read the data:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3128
-msgid "Delete selected annotations"
+#: ../lib/advene/gui/edit/elements.py:1479
+#: ../lib/advene/gui/edit/elements.py:1704
+msgid "Save content to..."
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3129
-#, fuzzy
-msgid "Display selection in a table"
-msgstr "Zeige Kommentare an einer Timeline"
+#: ../lib/advene/gui/edit/elements.py:1493
+#: ../lib/advene/gui/edit/elements.py:1717
+#, python-format
+msgid ""
+"Cannot save the data:\n"
+"%s"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3130
-msgid "Center and zoom on selection"
+#: ../lib/advene/gui/edit/elements.py:1508
+#: ../lib/advene/gui/edit/elements.py:1731
+msgid "Open a file (C-o)"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3131
-msgid "Edit selected annotations"
+#: ../lib/advene/gui/edit/elements.py:1513
+#: ../lib/advene/gui/edit/elements.py:1736
+msgid "Save to a file (C-s)"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3132
-msgid "Merge annotations"
+#: ../lib/advene/gui/edit/elements.py:1518
+#: ../lib/advene/gui/edit/elements.py:1741
+msgid "Reload the file (C-r)"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3133
-#, fuzzy
-msgid "Display statistics"
-msgstr "Zeige Shortcuts"
+#: ../lib/advene/gui/edit/elements.py:1524
+msgid "Insert a value from the browser (C-i)"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3258
-msgid "Goto previous page"
+#: ../lib/advene/gui/edit/elements.py:1770
+msgid "Begin time is greater than end time"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3270
-#, fuzzy
-msgid "Goto next page"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/gui/edit/elements.py:2042
+msgid "Expecting an integer."
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3324
-msgid "Inspector locked. Click here or in the timeline background to unlock."
+#: ../lib/advene/gui/edit/elements.py:2074
+#, python-format
+msgid ""
+"The %(attribute)s attribute could not be updated:\n"
+"\n"
+"%(error)s\n"
+"\n"
+"Resetting to the original value."
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3352
+#: ../lib/advene/gui/edit/elements.py:2100
+#, python-format
 msgid ""
-"Delete the selected annotations or drop an annotation here to delete it."
+"The following attributes cannot be updated:\n"
+"\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3374
+#: ../lib/advene/gui/edit/elements.py:2138
+#, python-format
 msgid ""
-"Drag an annotation type here to remove it from display.\n"
-"Click to edit all displayed types"
+"The following attributes could not be updated:\n"
+"\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3386
-msgid "Selection actions"
+#: ../lib/advene/gui/edit/elements.py:2155
+msgid "Attribute"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3401
-msgid "Display relations"
+#: ../lib/advene/gui/edit/elements.py:2254
+msgid "Insert an element"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3407
-#, fuzzy
-msgid "Display all relations"
-msgstr "Zeige Packet inhalt als Baumdarstellung"
-
-#: ../lib/advene/gui/views/timeline.py:3484
-msgid "Center on current player position."
+#: ../lib/advene/gui/edit/elements.py:2255
+msgid "Choose the element to insert."
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3500
-msgid "Automatically activate loop when clicking on an annotation"
+#: ../lib/advene/gui/edit/elements.py:2325
+#: ../lib/advene/gui/edit/elements.py:2368
+#, python-format
+msgid "Some tags contain invalid characters: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3524
-msgid "Displayed"
+#: ../lib/advene/gui/edit/elements.py:2348
+msgid "Tags:"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3532
-msgid "Not displayed"
+#: ../lib/advene/gui/edit/transcribe.py:70
+msgid "Transcription importer"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3580
-msgid "< All <"
+#: ../lib/advene/gui/edit/transcribe.py:81
+msgid "Note taking"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3584
-msgid "> All >"
+#: ../lib/advene/gui/edit/transcribe.py:83
+msgid "Take notes on the fly as a timestamped transcription"
+msgstr "Schreibe Noitzen on the fly als transkription mit zeitangabe"
+
+#: ../lib/advene/gui/edit/transcribe.py:149
+msgid "Timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3600
-msgid "Displayed annotation types"
+#: ../lib/advene/gui/edit/transcribe.py:149
+msgid "Click inserts timestamp marks"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3625
-msgid "Relation type"
+#: ../lib/advene/gui/edit/transcribe.py:150
+msgid "Insert on single-click"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3625
-msgid "Display relation types"
+#: ../lib/advene/gui/edit/transcribe.py:150
+msgid "A single click will insert the mark (else a double click is needed)"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3626
-msgid "Relation content"
+#: ../lib/advene/gui/edit/transcribe.py:151
+msgid "Play on scroll"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3626
-msgid "Display relation content"
+#: ../lib/advene/gui/edit/transcribe.py:151
+msgid "Play the new position upon timestamp modification"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3627 ../lib/advene/gui/popup.py:516
-msgid "Highlight"
+#: ../lib/advene/gui/edit/transcribe.py:152
+msgid "Generate empty annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3627
-msgid "Highlight active annotations"
+#: ../lib/advene/gui/edit/transcribe.py:152
+msgid "If checked, generate annotations for empty text"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3714
-msgid "Enter the tag for the selection"
+#: ../lib/advene/gui/edit/transcribe.py:153
+msgid "Reaction time"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:248
-msgid "No children in on_iter_children()!"
+#: ../lib/advene/gui/edit/transcribe.py:153
+msgid ""
+"Reaction time (substracted from current player time, except when paused.)"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:263
-msgid "No children in on_iter_nth_child()"
+#: ../lib/advene/gui/edit/transcribe.py:154
+msgid "Auto-insert"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:317
-msgid "List of views"
+#: ../lib/advene/gui/edit/transcribe.py:154
+msgid "Automatic timestamp mark insertion"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:318
-msgid "Static views"
+#: ../lib/advene/gui/edit/transcribe.py:155
+msgid "Automatic insertion delay"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:319
-msgid "Dynamic views"
+#: ../lib/advene/gui/edit/transcribe.py:155
+msgid ""
+"If autoinsert is active, timestamp marks will be automatically inserted when "
+"text is entered after no interaction since this delay (in ms).\n"
+"1000 is typically a good value."
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:320
-msgid "Admin views"
+#: ../lib/advene/gui/edit/transcribe.py:156
+msgid "Font size for text (0 for standard size)"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:321
-msgid "Adhoc views"
+#: ../lib/advene/gui/edit/transcribe.py:216
+#: ../lib/advene/gui/edit/transcribe.py:220
+#: ../lib/advene/gui/edit/transcribe.py:378
+#: ../lib/advene/gui/edit/transcribe.py:382
+msgid "Invalid timestamp mark"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:421 ../lib/advene/gui/main.py:1222
-msgid "Tree view"
+#: ../lib/advene/gui/edit/transcribe.py:503
+msgid "Ignore the following text (toggle)"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:453
-msgid "Package View"
+#: ../lib/advene/gui/edit/transcribe.py:507
+msgid "Remove mark"
 msgstr ""
 
-#: ../lib/advene/gui/views/editaccumulator.py:42
-msgid "EditAccumulator"
+#: ../lib/advene/gui/edit/transcribe.py:511
+msgid "Reaction-time offset"
 msgstr ""
 
-#: ../lib/advene/gui/views/editaccumulator.py:70
-#: ../lib/advene/gui/views/annotationdisplay.py:256
-msgid "Validate"
+#: ../lib/advene/gui/edit/transcribe.py:515
+msgid "-1 sec"
 msgstr ""
 
-#: ../lib/advene/gui/views/relation.py:68
-msgid "Relations view"
+#: ../lib/advene/gui/edit/transcribe.py:518
+msgid "-0.5 sec"
 msgstr ""
 
-#: ../lib/advene/gui/views/caption.py:30 ../lib/advene/gui/main.py:4339
-msgid "Caption"
+#: ../lib/advene/gui/edit/transcribe.py:521
+msgid "-0.1 sec"
 msgstr ""
 
-#: ../lib/advene/gui/views/caption.py:32
-msgid "Display a text caption below the video output"
+#: ../lib/advene/gui/edit/transcribe.py:525
+msgid "+1 sec"
 msgstr ""
 
-#: ../lib/advene/gui/views/scroller.py:29 ../lib/advene/gui/main.py:4338
-msgid "Scroller"
+#: ../lib/advene/gui/edit/transcribe.py:528
+msgid "+0.5 sec"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:329
-#, python-format
-msgid ""
-"View <b>%(title)s</b>\n"
-"Id: %(id)s"
+#: ../lib/advene/gui/edit/transcribe.py:531
+msgid "+0.1 sec"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:336
-msgid "Open in webbrowser"
+#: ../lib/advene/gui/edit/transcribe.py:618
+msgid "Invalid timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:337
+#: ../lib/advene/gui/edit/transcribe.py:738
 #, python-format
-msgid "View applied to %s\n"
+msgid "Invalid timestamp mark in conversion: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:342 ../lib/advene/gui/popup.py:496
-msgid "Activate"
+#: ../lib/advene/gui/edit/transcribe.py:856
+#, python-format
+msgid "Cannot save the file: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:345
-msgid "Open in GUI"
+#: ../lib/advene/gui/edit/transcribe.py:865
+#: ../lib/advene/gui/edit/transcribe.py:947
+msgid "This will overwrite the current textual content. Are you sure?"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:347
-msgid "Unknown type of view??"
+#: ../lib/advene/gui/edit/transcribe.py:868
+msgid "Select transcription file to load"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:372
-msgid "Edit view"
+#: ../lib/advene/gui/edit/transcribe.py:885
+#, python-format
+msgid "Cannot open %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:381
-msgid "Open view"
+#: ../lib/advene/gui/edit/transcribe.py:932
+msgid "Cannot import annotations: no existing interface"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:421 ../lib/advene/gui/views/finder.py:487
-#, python-format
-msgid ""
-"%(type)s <b>%(title)s</b>\n"
-"Id: %(id)s"
+#: ../lib/advene/gui/edit/transcribe.py:934
+msgid "Select the annotation type to import"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:444
-msgid "Try to apply the query on..."
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:943
+#, fuzzy, python-format
+msgid "There are no annotations of type %s"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/views/finder.py:464 ../lib/advene/gui/popup.py:829
-#, fuzzy
-msgid "the package"
-msgstr "Kein Pakte"
+#: ../lib/advene/gui/edit/transcribe.py:972
+msgid "Cannot convert the data: no associated package"
+msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:465 ../lib/advene/gui/popup.py:830
+#: ../lib/advene/gui/edit/transcribe.py:975
 #, fuzzy
-msgid "all annotations of the package"
-msgstr "Transkription für das gesamte Packet"
+msgid "Converting transcription"
+msgstr "T_ranskription"
 
-#: ../lib/advene/gui/views/finder.py:466 ../lib/advene/gui/popup.py:831
-#, fuzzy
-msgid "the first annotation of the package"
-msgstr "Transkription für das gesamte Packet"
+#: ../lib/advene/gui/edit/transcribe.py:981
+msgid "Choose the annotation-type where to create annotations.\n"
+msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:509
-msgid "Edit resource"
+#: ../lib/advene/gui/edit/transcribe.py:989
+msgid "Delete existing annotations in this type"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:523 ../lib/advene/gui/main.py:1223
+#: ../lib/advene/gui/edit/transcribe.py:1012
 #, fuzzy
-msgid "Package finder"
-msgstr "Pakete"
+msgid "Select type"
+msgstr "Wähle einen DVD"
 
-#: ../lib/advene/gui/views/finder.py:525
-msgid "Column-based package finder"
+#: ../lib/advene/gui/edit/transcribe.py:1016
+msgid "You want to create a new type. Please specify its schema and title."
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:41
-#, fuzzy
-msgid "AnnotationDisplay"
-msgstr "Kommentar Typ"
+#: ../lib/advene/gui/edit/transcribe.py:1028
+msgid "Containing schema"
+msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:43
-#, fuzzy
-msgid "Display the contents of an annotation"
-msgstr "Zeige die Transkription für eine Anmerkung"
+#: ../lib/advene/gui/edit/transcribe.py:1041
+msgid "Export options"
+msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:84
+#: ../lib/advene/gui/edit/transcribe.py:1046
 #, fuzzy
-msgid "No annotation"
-msgstr "von einem Anmerkungs Typ"
+msgid "Generate annotations for empty contents"
+msgstr "Erschaffe Anmerkung auf Basis des DVD Kapitels"
 
-#: ../lib/advene/gui/views/annotationdisplay.py:110
+#: ../lib/advene/gui/edit/transcribe.py:1071
 #, python-format
-msgid ""
-"Schema %(schema)s (id %(id)s)\n"
-"%(description)s\n"
-"%(stats)s"
+msgid "The %s identifier already exists. Choose another one."
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:231
-msgid "Screenshot"
+#: ../lib/advene/gui/edit/transcribe.py:1110
+msgid "Notes converted"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:193
-msgid "Invalid view id"
+#: ../lib/advene/gui/edit/transcribe.py:1157
+msgid "Open"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:239
-#, python-format
-msgid "Cannot save default options: %s"
+#: ../lib/advene/gui/edit/transcribe.py:1158
+msgid "Save"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:250
-#, python-format
-msgid "Default options saved for view %s"
+#: ../lib/advene/gui/edit/transcribe.py:1159
+msgid "Save As"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:282
-#, python-format
-msgid "Saving %s"
+#: ../lib/advene/gui/edit/transcribe.py:1160
+msgid "Import"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:285
-msgid "Enter a view name to save this parametered view"
+#: ../lib/advene/gui/edit/transcribe.py:1160
+msgid "Import from annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:288 ../lib/advene/gui/main.py:4630
-#, python-format
-msgid "Error: the identifier %s contains invalid characters."
+#: ../lib/advene/gui/edit/transcribe.py:1161
+msgid "Convert"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:303
-#, python-format
-msgid "Error: the view %s is not an adhoc view."
+#: ../lib/advene/gui/edit/transcribe.py:1161
+msgid "Convert to annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:328
-msgid "HTML export"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:1163 ../lib/advene/rules/actions.py:670
+#, fuzzy
+msgid "Center"
+msgstr "Erstelle"
 
-#: ../lib/advene/gui/views/__init__.py:329
-msgid "Specify a name for the export view"
+#: ../lib/advene/gui/edit/transcribe.py:1163
+msgid "Center on the current mark"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:348
-#, python-format
-msgid ""
-"View successfully exported as %s.\n"
-"Open it in the web browser ?"
+#: ../lib/advene/gui/edit/transcribe.py:1164
+msgid "Find"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:427
-msgid "Actions"
+#: ../lib/advene/gui/edit/transcribe.py:1164
+msgid "Search a string"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:452
-msgid "Click or drag-and-drop to reattach view"
+#: ../lib/advene/gui/edit/transcribe.py:1165
+msgid "Scale"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:55
-msgid "Annotation table view"
+#: ../lib/advene/gui/edit/transcribe.py:1188
+msgid "Automatically scroll to the mark position when playing"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:57
-msgid "Display annotations in a table"
+#: ../lib/advene/gui/edit/transcribe.py:1190
+msgid "Autoscroll"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:227 ../lib/advene/gui/views/table.py:452
-msgid "Snapshot"
+#: ../lib/advene/gui/edit/transcribe.py:1197
+msgid "Autoinsert"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:254 ../lib/advene/gui/main.py:4178
-msgid "Duration"
+#: ../lib/advene/gui/edit/transcribe.py:1199
+msgid "Automatically insert marks"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:382 ../lib/advene/gui/views/table.py:511
-msgid "Export data to file..."
+#: ../lib/advene/core/webcherry.py:53
+msgid "The webserver requires version 3.0 of CherryPy at least."
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:391 ../lib/advene/gui/views/table.py:520
+#: ../lib/advene/core/webcherry.py:169
 #, python-format
-msgid "Error while exporting data to %(filename)s: %(error)s"
+msgid ""
+"\n"
+"            <p>\n"
+"            <a href=\"/admin\">Server administration</a> |\n"
+"            <a href=\"/media\">Media control</a> |\n"
+"            <a href=\"%(path)s?mode=raw\">Raw view</a>\n"
+"            </p>\n"
+"            Location: %(locationbar)s\n"
+"            <hr>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "id"
+#: ../lib/advene/core/webcherry.py:229
+msgid "Unspecified Error"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "type"
+#: ../lib/advene/core/webcherry.py:230
+#, python-format
+msgid ""
+"\n"
+"        <h1>Error</h1>\n"
+"        <p>An error occurred:</p>\n"
+"        %s\n"
+"        "
 msgstr ""
+"\n"
+"        <h1>Fehler</h1>\n"
+"        <p>Ein Fehler tauchte auf:</p>\n"
+"        %s\n"
+"        "
+
+#: ../lib/advene/core/webcherry.py:263
+msgid "<h1>No available mediaplayer</h1>"
+msgstr "<h1>Kein verfügbarer Mediaplayer</h1>"
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "begin"
+#: ../lib/advene/core/webcherry.py:266
+#, python-format
+msgid ""
+"\n"
+"            <h1>Current STBV: %(currentstbv)s</h1>\n"
+"\n"
+"            <h1>Player status</h1>\n"
+"            <table border=\"1\">\n"
+"            <tr>\n"
+"            <td>Current media</td><td>%(uri)s</td>\n"
+"            <td>Current position</td><td>%(position)s</td>\n"
+"            <td>Duration</td><td>%(duration)s</td>\n"
+"            <td>Player status</td><td>%(status)s</td>\n"
+"            </tr>\n"
+"            </table>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "end"
-msgstr ""
+#: ../lib/advene/core/webcherry.py:279
+#, fuzzy
+msgid "No media file"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "content"
+#: ../lib/advene/core/webcherry.py:286
+#, fuzzy
+msgid ""
+"\n"
+"            <form action=\"/media/play\" method=\"GET\">\n"
+"            Starting pos: <input type=\"text\" name=\"position\" value="
+"\"0\">\n"
+"            <input type=\"submit\" value=\"Play\">\n"
+"            </form>\n"
+"            <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
+"\">Pause</a><br>\n"
+"            "
 msgstr ""
+"\n"
+"                <form action=\"/media/play\" method=\"GET\">\n"
+"                Start position: <input type=\"text\" name=\"position\" value="
+"\"0\">\n"
+"                <input type=\"submit\" value=\"Play\">\n"
+"                </form>\n"
+"                <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
+"\">Pause</a><br>\n"
+"                "
 
-#: ../lib/advene/gui/views/table.py:460
-msgid "Generic table view"
+#: ../lib/advene/core/webcherry.py:293
+msgid ""
+"<hr />\n"
+"            <form action=\"/media/load\" method=\"GET\">\n"
+"            Add a new file (<em>dvd</em> to play a DVD):\n"
+"            <input type=\"text\" name=\"filename\">\n"
+"            <input type=\"submit\" value=\"Add\">\n"
+"            </form>"
 msgstr ""
+"<hr />\n"
+"            <form action=\"/media/load\" method=\"GET\">\n"
+"            Neue DAtei hinzufügen (<em>dvd</em> für  DVD):\n"
+"            <input type=\"text\" name=\"filename\">\n"
+"            <input type=\"submit\" value=\"Add\">\n"
+"            </form>"
 
-#: ../lib/advene/gui/views/table.py:462
-msgid "Display Advene elements in a table."
+#: ../lib/advene/core/webcherry.py:299
+msgid ""
+"<h3><a href=\"/media/snapshot\">Access to current packages snapshots</h3>"
 msgstr ""
+"<h3><a href=\"/media/snapshot\">zugriff auf gegenwärtige Paket "
+"Schnappschüsse</h3>"
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element title"
-msgstr ""
+#: ../lib/advene/core/webcherry.py:308
+#, python-format
+msgid "Unknown STBV identifier: %s"
+msgstr "Unbekannte STBV identifier: %s"
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element type"
+#: ../lib/advene/core/webcherry.py:383
+msgid "Media information"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element id"
+#: ../lib/advene/core/webcherry.py:396
+msgid "File added"
 msgstr ""
 
-#: ../lib/advene/gui/widget.py:327
+#: ../lib/advene/core/webcherry.py:397
 #, fuzzy, python-format
-msgid "Set of %s annotations"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/widget.py:1067
-#, fuzzy
-msgid "Save as..."
-msgstr "Kein Pakte"
-
-#: ../lib/advene/gui/widget.py:1072
-#, fuzzy
-msgid "Use current player position"
-msgstr "Aktuelle Sitzung speichern"
+msgid "<p><strong>%s has been loaded.</strong></p>"
+msgstr "<strong>Fehler: %s ist ein ungültiger hostname.</strong>"
 
-#: ../lib/advene/gui/widget.py:1078
-msgid "Adjust timestamp"
+#: ../lib/advene/core/webcherry.py:408 ../lib/advene/core/webcherry.py:466
+msgid "Access to packages snapshots"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:193 ../lib/advene/gui/main.py:304
-#, fuzzy
-msgid "_Select player"
-msgstr "Wähle einen DVD"
-
-#: ../lib/advene/gui/main.py:195 ../lib/advene/gui/main.py:287
-msgid "_View"
-msgstr "_Zeige"
-
-#: ../lib/advene/gui/main.py:197 ../lib/advene/gui/main.py:306
-msgid "Packages"
-msgstr "Pakete"
+#: ../lib/advene/core/webcherry.py:418 ../lib/advene/core/webcherry.py:476
+msgid "Unknown package alias"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:200 ../lib/advene/gui/main.py:246
-msgid "Open recent"
+#: ../lib/advene/core/webcherry.py:424
+#, python-format
+msgid "Available snapshots for %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:239
-msgid "Input from the keyboard (function keys)"
+#: ../lib/advene/core/webcherry.py:430
+#, python-format
+msgid ""
+"<p><a href=\"/media/snapshot/%s?mode=inline\">Display with inline images</"
+"a></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:243
-msgid "_File"
-msgstr "_Datei"
+#: ../lib/advene/core/webcherry.py:437
+msgid "Done"
+msgstr "Erledigt"
 
-#: ../lib/advene/gui/main.py:244
-#, fuzzy
-msgid "_New package"
-msgstr "Kein Pakte"
+#: ../lib/advene/core/webcherry.py:439
+msgid "Pending"
+msgstr "Ausstehend"
 
-#: ../lib/advene/gui/main.py:244
-#, fuzzy
-msgid "Create a new package"
+#: ../lib/advene/core/webcherry.py:481
+#, fuzzy, python-format
+msgid "Unknown annotation id: %s"
 msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/main.py:245
-#, fuzzy
-msgid "_Open package"
-msgstr "Kein Pakte"
-
-#: ../lib/advene/gui/main.py:245
-#, fuzzy
-msgid "Open a package"
-msgstr "Kein Pakte"
-
-#: ../lib/advene/gui/main.py:246
-#, fuzzy
-msgid "Show recently opened packages"
-msgstr "Aktuelle Sitzung speichern"
-
-#: ../lib/advene/gui/main.py:247
-#, fuzzy
-msgid "_Save package"
-msgstr "Kein Pakte"
-
-#: ../lib/advene/gui/main.py:247
-#, fuzzy
-msgid "Save the package"
-msgstr "Kein Pakte"
+#: ../lib/advene/core/webcherry.py:597 ../lib/advene/core/webcherry.py:715
+#, python-format
+msgid "Cannot activate stbvid %(stbvid)s: %(error)s"
+msgstr "Kann nicht stbvid %(stbvid)s: %(error)s aktivieren"
 
-#: ../lib/advene/gui/main.py:248
-#, fuzzy
-msgid "Save package as..."
-msgstr "Kein Pakte"
+#: ../lib/advene/core/webcherry.py:662
+msgid "<p>No GUI is available."
+msgstr "<p>Kein GUI zur Verfügung"
 
-#: ../lib/advene/gui/main.py:248
-#, fuzzy
-msgid "Save the package as..."
-msgstr "Kein Pakte"
+#: ../lib/advene/core/webcherry.py:664
+#, python-format
+msgid "<p>Opened adhoc views: %s</p>"
+msgstr "<p>Geöffnete adhoc ansichten: %s</p>"
 
-#: ../lib/advene/gui/main.py:249
-#, fuzzy
-msgid "Close package"
-msgstr "Kein Pakte"
+#: ../lib/advene/core/webcherry.py:665
+msgid "<p>Available adhoc views:</p><ul>"
+msgstr "<p>Verfügbare adhoc ansichten:</p><ul>"
 
-#: ../lib/advene/gui/main.py:249
-#, fuzzy
-msgid "Close the package"
-msgstr "Kein Pakte"
+#: ../lib/advene/core/webcherry.py:686
+#, python-format
+msgid "<p>Current stbv: %s</p>"
+msgstr "<p>Gegenwärtige stbv: %s</p>"
 
-#: ../lib/advene/gui/main.py:251
-msgid "Save session"
-msgstr "Sitzung speichern"
+#: ../lib/advene/core/webcherry.py:687
+#, python-format
+msgid "<p>You can activate the following STBV:</p><ul>%s</ul>"
+msgstr "<p>Du kannst nicht folgende STBV:</p><ul>%s</ul> aktivieren"
 
-#: ../lib/advene/gui/main.py:251
-#, fuzzy
-msgid "Save the current session (list of opened packages)"
-msgstr "Aktuelle Sitzung speichern"
+#: ../lib/advene/core/webcherry.py:689
+msgid "Activate and play"
+msgstr "Aktivieren und Abspielen"
 
-#: ../lib/advene/gui/main.py:252
-msgid "Save workspace"
+#: ../lib/advene/core/webcherry.py:695
+msgid "Application information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:253
-msgid "...as package view"
+#: ../lib/advene/core/webcherry.py:765
+msgid "Missing element id parameter"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:254
-msgid "...as standard workspace"
+#: ../lib/advene/core/webcherry.py:769
+#, python-format
+msgid "No existing element with id %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:254
-msgid "Use the current layout as standard workspace in the future"
+#: ../lib/advene/core/webcherry.py:778
+#, python-format
+msgid "<p>The GUI view %s does not exist.</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:256
-#, fuzzy
-msgid "Associate a video _File"
-msgstr "Wähle eine Video Datei"
-
-#: ../lib/advene/gui/main.py:256
-#, fuzzy
-msgid "Associate a video file"
-msgstr "Wähle eine Video Datei"
-
-#: ../lib/advene/gui/main.py:257
-#, fuzzy
-msgid "Associate a _DVD"
-msgstr "Wähle eine DVD Kapitel"
-
-#: ../lib/advene/gui/main.py:257
-#, fuzzy
-msgid "Associate a chapter from a DVD"
-msgstr "Wähle eine DVD Kapitel"
-
-#: ../lib/advene/gui/main.py:258
-#, fuzzy
-msgid "Associate a _Video stream"
-msgstr "Wähle einen video stream"
-
-#: ../lib/advene/gui/main.py:258
-msgid "Enter a video stream address"
-msgstr "Gebe eine Video Stream Adresse ein"
-
-#: ../lib/advene/gui/main.py:260
-msgid "_Import File"
-msgstr "Datei _importieren"
+#: ../lib/advene/core/webcherry.py:785
+msgid "Invalid request"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:260
-msgid "Import data from an external source"
-msgstr "Importiere Daten von einer Externen Quelle"
+#: ../lib/advene/core/webcherry.py:790
+msgid "Invalid configuration variable name"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:261
-#, fuzzy
-msgid "_Process video"
-msgstr "Datei _importieren"
+#: ../lib/advene/core/webcherry.py:802
+msgid "Invalid value"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:261
-#, fuzzy
-msgid "Import data from video processing algorithms"
-msgstr "Importiere Daten von einer Externen Quelle"
+#: ../lib/advene/core/webcherry.py:806
+#, python-format
+msgid "Unsupported method %s"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:263
-msgid "Merge package"
-msgstr "Vereine Packete"
+#: ../lib/advene/core/webcherry.py:832
+#, python-format
+msgid ""
+"\n"
+"        <h1>Authorized hosts</h1>\n"
+"        <table border=\"1\">\n"
+"        <tr><th>Host</th><th>IP Addr</th><th>Action</th></tr>\n"
+"        %s\n"
+"        </table>\n"
+"        <form method=\"GET\">\n"
+"        Add a new hostname to the list :<br>\n"
+"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
+"\"Add\">\n"
+"        </form>\n"
+"        "
+msgstr ""
 
-#: ../lib/advene/gui/main.py:263
-msgid "Merge elements from another package"
-msgstr "Füge Elemente von anderen Packeten hinzu"
+#: ../lib/advene/core/webcherry.py:846
+msgid "Access control"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:264
-msgid "Import _DVD chapters"
-msgstr "Importiere _DVD Kapitel"
+#: ../lib/advene/core/webcherry.py:851
+msgid "Access control - add a hostname"
+msgstr "Zugriffs Kontrolle - Füge Hostname hinzu"
 
-#: ../lib/advene/gui/main.py:264
-msgid "Create annotations based on DVD chapters"
-msgstr "Erschaffe Anmerkung auf Basis des DVD Kapitels"
+#: ../lib/advene/core/webcherry.py:859 ../lib/advene/core/webcherry.py:873
+#, python-format
+msgid "<strong>Error: %s is an invalid hostname.</strong>"
+msgstr "<strong>Fehler: %s ist ein ungültiger hostname.</strong>"
 
-#: ../lib/advene/gui/main.py:266
-#, fuzzy
-msgid "_Export..."
-msgstr "Datei _importieren"
+#: ../lib/advene/core/webcherry.py:862
+#, python-format
+msgid "<p>Added %s to authorized hosts list.</p>"
+msgstr "<p>Füge %s zur authorisierten host liste.</p>"
 
-#: ../lib/advene/gui/main.py:266
-#, fuzzy
-msgid "Export data to another format"
-msgstr "Importiere Daten von einer Externen Quelle"
+#: ../lib/advene/core/webcherry.py:868
+msgid "Access control - delete a hostname"
+msgstr "Zugriffs Kontrolle - Lösche einen Hostnamen"
 
-#: ../lib/advene/gui/main.py:267
-msgid "_Website export..."
-msgstr ""
+#: ../lib/advene/core/webcherry.py:876
+msgid "<strong>Cannot remove the localhost access.</strong>"
+msgstr "<strong>Du kannst nicht den localhost zugriff löschen</strong>"
 
-#: ../lib/advene/gui/main.py:267
-msgid "Export views to a website"
-msgstr ""
+#: ../lib/advene/core/webcherry.py:881
+#, python-format
+msgid "<p>Removed %s from authorized hosts list.</p>"
+msgstr "<p>lösche %s von der Host liste</p>"
 
-#: ../lib/advene/gui/main.py:269
-#, fuzzy
-msgid "_Quit"
-msgstr "_Bearbeite"
+#: ../lib/advene/core/webcherry.py:883
+#, python-format
+msgid "<p>%s is not in authorized hosts list.</p>"
+msgstr "<p>%s ist keine authorisierte Hostliste</p>"
 
-#: ../lib/advene/gui/main.py:271
-msgid "_Edit"
-msgstr "_Bearbeite"
+#: ../lib/advene/core/webcherry.py:932
+msgid "Server Administration"
+msgstr "Server Administration"
 
-#: ../lib/advene/gui/main.py:272
-msgid "_Undo"
+#: ../lib/advene/core/webcherry.py:940
+#, python-format
+msgid ""
+"\n"
+"        <p><a href=\"/admin/access\">Update the access list</a></p>\n"
+"        <p><a href=\"/admin/methods\">List available TALES methods</a></p>\n"
+"        <p><a href=\"/action\">List available actions</a></p>\n"
+"        <p><a href=\"/admin/reset\">Reset the server</a></p>\n"
+"        <p><a href=\"/media\">Media control</a></p>\n"
+"        <p><a href=\"/application\">Display GUI status</a></p>\n"
+"        <p><a href=\"/admin/list\">List available files</a></p>\n"
+"        <p><a href=\"/packages\">List loaded packages</a> (%(packagelist)s)</"
+"p>\n"
+"        <p>Display mode : %(displaymode)s</p>\n"
+"        <hr>\n"
+"        <p>Load a package :\n"
+"        <form action=\"/admin/load\" method=\"GET\">\n"
+"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
+"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
+"        <input type=\"submit\" value=\"Load\" />\n"
+"        </form>\n"
+"        </body></html>\n"
+"        "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:273
-#, fuzzy
-msgid "_Find"
-msgstr "_Datei"
+#: ../lib/advene/core/webcherry.py:970
+msgid "Available files"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:274
-msgid "_Delete"
+#: ../lib/advene/core/webcherry.py:996
+msgid "You should specify an alias"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:275
-msgid "Create"
-msgstr "Erstelle"
+#: ../lib/advene/core/webcherry.py:1001
+msgid "You should specify an uri"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:284
-msgid "P_ackage properties"
-msgstr "P_acket Eigenschaften"
+#: ../lib/advene/core/webcherry.py:1007
+#, python-format
+msgid "Package %s loaded"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:284
-msgid "Edit package properties"
-msgstr "Bearbeite Packet Eigentschaften"
+#: ../lib/advene/core/webcherry.py:1008 ../lib/advene/core/webcherry.py:1044
+#, python-format
+msgid ""
+"<p>Go to the <a href=\"/packages/%(alias)s\">%(alias)s</a> package, or to "
+"the <a href=\"/packages\">package list</a>."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:285
-msgid "P_references"
-msgstr "E_instellungen"
+#: ../lib/advene/core/webcherry.py:1011
+#, python-format
+msgid "<p>Cannot load package %(alias)s : %(error)s</p>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:285
-msgid "Interface preferences"
-msgstr "Oberflächen Eigentschaften"
+#: ../lib/advene/core/webcherry.py:1022
+#, python-format
+msgid "Package %s deleted"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:289
-msgid "_Start Web Browser"
+#: ../lib/advene/core/webcherry.py:1023
+msgid "<p>Go to the <a href=\"/packages\">package list</a>."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:289
-msgid "Start the web browser"
+#: ../lib/advene/core/webcherry.py:1026
+#, python-format
+msgid "<p>Cannot delete package %(alias)s : %(error)s</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:291
-msgid "Simplify interface"
+#: ../lib/advene/core/webcherry.py:1043
+#, python-format
+msgid "Package %s saved"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:291
-#, fuzzy
-msgid "Simplify the application interface (toggle)"
-msgstr "Zeige Kommentare an einer Timeline"
+#: ../lib/advene/core/webcherry.py:1047
+#, python-format
+msgid "<p>Cannot save package %(alias)s : %(error)s</p>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:292
-msgid "Evaluator"
+#: ../lib/advene/core/webcherry.py:1057
+msgid "Server reset"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:292
-msgid "Open python evaluator window"
+#: ../lib/advene/core/webcherry.py:1063
+msgid "Available TALES methods"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:293 ../lib/advene/gui/main.py:4022
-msgid "Webserver log"
+#: ../lib/advene/core/webcherry.py:1104
+msgid "Loaded package(s)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:296
-msgid "_Player"
-msgstr "_Spieler"
+#: ../lib/advene/core/webcherry.py:1106
+msgid ""
+"\n"
+"        <h1>Loaded package(s)</h1>\n"
+"        <table border=\"1\" width=\"50%\">\n"
+"        <tr>\n"
+"        <th>Alias</th>\n"
+"        <th>Action</th>\n"
+"        <th>URI</th>\n"
+"        <th>Annotations</th>\n"
+"        </tr>\n"
+"        "
+msgstr ""
 
-#: ../lib/advene/gui/main.py:297
-msgid "Go to _Time"
+#: ../lib/advene/core/webcherry.py:1118
+#, python-format
+msgid ""
+"<tr>\n"
+"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
+"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
+"%(uri)s\">Reload</a>|<a href=\"/admin/delete?alias=%(alias)s\">Drop</a>|<a "
+"href=\"/admin/save?alias=%(alias)s\">Save</a></td>\n"
+"            <td>%(uri)s</td>\n"
+"            <td>%(size)d</td>\n"
+"            </tr>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:297
-msgid "Goto a specified time code"
+#: ../lib/advene/core/webcherry.py:1191 ../lib/advene/core/webcherry.py:1267
+#: ../lib/advene/core/webcherry.py:1276 ../lib/advene/core/webcherry.py:1284
+#: ../lib/advene/core/webcherry.py:1444 ../lib/advene/core/webcherry.py:1452
+#: ../lib/advene/core/webcherry.py:1460 ../lib/advene/core/webcherry.py:2022
+#: ../lib/advene/core/webcherry.py:2029
+msgid "Error"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:298
-msgid "Save _ImageCache"
-msgstr "Sichere _ImageCache"
+#: ../lib/advene/core/webcherry.py:1192
+#, python-format
+msgid "The TALES expression %s is not valid."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:298
-msgid "Save the contents of the ImageCache to disk"
-msgstr "Sichere den Inhalt des ImageCaches auf die Festplatte"
+#: ../lib/advene/core/webcherry.py:1244
+msgid "Content mode not available on non-content data"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:299
-#, fuzzy
-msgid "Reset ImageCache"
-msgstr "Sichere _ImageCache"
+#: ../lib/advene/core/webcherry.py:1268 ../lib/advene/core/webcherry.py:1277
+#: ../lib/advene/core/webcherry.py:1285 ../lib/advene/core/webcherry.py:1306
+#: ../lib/advene/core/webcherry.py:1310 ../lib/advene/core/webcherry.py:1445
+#: ../lib/advene/core/webcherry.py:1453 ../lib/advene/core/webcherry.py:1461
+#: ../lib/advene/core/webcherry.py:1520 ../lib/advene/core/webcherry.py:1597
+#: ../lib/advene/core/webcherry.py:1717 ../lib/advene/core/webcherry.py:1767
+msgid "<h1>Error</h1>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:299
-#, fuzzy
-msgid "Reset the ImageCache"
-msgstr "Sichere _ImageCache"
+#: ../lib/advene/core/webcherry.py:1269 ../lib/advene/core/webcherry.py:1311
+#, python-format
+msgid ""
+"<p>There was an error in the template code.</p>\n"
+"                <p>Tag name: <strong>%(tagname)s</strong></p>\n"
+"                <p>Error message: <em>%(message)s</em></p>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:300
-msgid "_Restart player"
-msgstr "_Neustart Spieler"
+#: ../lib/advene/core/webcherry.py:1278
+#, python-format
+msgid ""
+"<p>An invalid character is in the Context:</p>\n"
+"                <p>Error message: <em>%(error)s</em></p><pre>%(message)s</"
+"pre>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:300
-#, fuzzy
-msgid "Restart the player"
-msgstr "_Neustart Spieler"
+#: ../lib/advene/core/webcherry.py:1286
+#, python-format
+msgid ""
+"<p>There was an error in the TALES expression.</p>\n"
+"                <pre>%s</pre>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:302
-#, fuzzy
-msgid "Update annotation screenshots"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/core/webcherry.py:1307
+#, python-format
+msgid ""
+"<p>There was an error.</p>\n"
+"                <pre>%s</pre>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:302
-msgid "Update screenshots for annotation bounds"
+#: ../lib/advene/core/webcherry.py:1331
+#, python-format
+msgid ""
+"\n"
+"            <hr>\n"
+"            <p>\n"
+"            Location: %(location)s<br>\n"
+"            <form name=\"navigation\" method=\"GET\">\n"
+"            <a href=\"%(levelup)s\">Up one level</a> |\n"
+"            Next level :\n"
+"            <select name=\"path\" onchange=\"submit()\">\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:303
-msgid "Detect shots"
+#: ../lib/advene/core/webcherry.py:1349
+msgid ""
+"\n"
+"            </select> View: <select name=\"view\" onchange=\"submit()\">\n"
+"            <option selected></option>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:303
-msgid "Automatically detect shots"
+#: ../lib/advene/core/webcherry.py:1367
+#, python-format
+msgid ""
+"<hr>\n"
+"            <p>Evaluating expression \"<strong>%(expression)s</strong>\" on "
+"package %(uri)s returns %(value)s</p>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:304
-msgid "Select the player plugin"
+#: ../lib/advene/core/webcherry.py:1403
+#, python-format
+msgid "<p>Package <strong>%s</strong> not loaded</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:307
-msgid "No package"
-msgstr "Kein Pakte"
+#: ../lib/advene/core/webcherry.py:1446
+#, python-format
+msgid ""
+"<p>There was an error in the template code.</p>\n"
+"            <p>Tag name: <strong>%(tagname)s</strong></p>\n"
+"            <p>Error message: <em>%(message)s</em></p>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:309
-msgid "_Help"
-msgstr "_Hilfe"
+#: ../lib/advene/core/webcherry.py:1454
+#, python-format
+msgid ""
+"<p>There was an error in the expression.</p>\n"
+"            <pre>%s</pre>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:310
-#, fuzzy
-msgid "Help"
-msgstr "_Hilfe"
+#: ../lib/advene/core/webcherry.py:1462
+#, python-format
+msgid ""
+"<p>Cannot resolve TALES expression %(expr)s on package %(package)s<p><pre>\n"
+"            %(type)s\n"
+"            %(value)s\n"
+"            %(traceback)s</pre>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:311
-msgid "Get support"
+#: ../lib/advene/core/webcherry.py:1521 ../lib/advene/core/webcherry.py:1718
+msgid "<p>Cannot set the value : invalid path</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:312
-msgid "Check for updates"
+#: ../lib/advene/core/webcherry.py:1583 ../lib/advene/core/webcherry.py:1836
+#, python-format
+msgid ""
+"<h1>Error</h1><p>When creating resource %(path)s, the resource folder "
+"%(folder)s could not be created.</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:313
-msgid "Display shortcuts"
-msgstr "Zeige Shortcuts"
+#: ../lib/advene/core/webcherry.py:1592 ../lib/advene/core/webcherry.py:1846
+msgid "Resource successfuly created/updated"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:314
-#, fuzzy
-msgid "Display logfile"
-msgstr "Verbindungs Type"
+#: ../lib/advene/core/webcherry.py:1601
+msgid "Value successfuly updated"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:314
-#, fuzzy
-msgid "Display log file"
-msgstr "Verbindungs Type"
+#: ../lib/advene/core/webcherry.py:1603
+#, python-format
+msgid ""
+"Unable to update the attribute %(attribute)s for element %(element)s: "
+"%(error)s."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:315
-msgid "Open logfile folder"
+#: ../lib/advene/core/webcherry.py:1714
+msgid "<p>Invalid request</p>."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:315
-msgid ""
-"Display logfile folder. It can help when sending the advene.log file by e-"
-"mail."
+#: ../lib/advene/core/webcherry.py:1778 ../lib/advene/core/webcherry.py:1795
+msgid "Value updated"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:316
-msgid "_About"
+#: ../lib/advene/core/webcherry.py:1779
+#, python-format
+msgid ""
+"\n"
+"                <h1>Value updated</h1>\n"
+"                The value of %(path)s has been updated to\n"
+"                <pre>\n"
+"                %(value)s\n"
+"                </pre>\n"
+"                "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:336 ../lib/advene/gui/main.py:3750
+#: ../lib/advene/core/webcherry.py:1796
 #, python-format
 msgid ""
-"Cannot load package %(filename)s:\n"
-"%(error)s"
+"\n"
+"                    <h1>Value updated</h1>\n"
+"                    The value of %(path)s has been updated to\n"
+"                    <pre>\n"
+"                    %(value)s\n"
+"                    </pre>\n"
+"                    "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:344
-msgid "Open a package file"
+#: ../lib/advene/core/webcherry.py:1807
+#, python-format
+msgid ""
+"Malformed request: cannot update the value of %(attribute)s in %(tales)s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:345
-msgid "Save the current package"
+#: ../lib/advene/core/webcherry.py:1850
+msgid "Cannot create an element in something else than a package."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:346
-msgid "Save the package with a new name"
+#: ../lib/advene/core/webcherry.py:1867
+#, python-format
+msgid "The identifier %s already exists."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:347
-msgid "Select movie file..."
+#: ../lib/advene/core/webcherry.py:1879
+#, python-format
+msgid "<p>Error while creating view %(id)s</p><pre>%(error)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:348
-msgid "Select DVD"
+#: ../lib/advene/core/webcherry.py:1885
+msgid "View created"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:352
-#, fuzzy
-msgid "Create a text annotation"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/core/webcherry.py:1886
+#, python-format
+msgid ""
+"\n"
+"                 <h1>View <em>%(id)s</em> created</h1>\n"
+"                 <p>The view <a href=\"%(url)s\">%(id)s</a> was successfully "
+"created.</p>\n"
+"                 "
+msgstr ""
 
-#: ../lib/advene/gui/main.py:353
-#, fuzzy
-msgid "Create a graphical annotation"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/core/webcherry.py:1902
+#, python-format
+msgid "Missing %s parameter"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:359
-msgid "List recently opened packages"
+#: ../lib/advene/core/webcherry.py:1905
+#, python-format
+msgid "Relation type %s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:389
-msgid "Snapshotter activity"
+#: ../lib/advene/core/webcherry.py:1912 ../lib/advene/core/webcherry.py:1915
+#, python-format
+msgid "Annotation %s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:391
+#: ../lib/advene/core/webcherry.py:1918
 #, python-format
-msgid "%d queued requests"
+msgid ""
+"<p>Cannot create relation between %(member1)s and %(member2)s: invalid type</"
+"p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:392
-msgid "Cancel all requests"
+#: ../lib/advene/core/webcherry.py:1930
+#, python-format
+msgid ""
+"<p>Error while creating relation between %(member1)s and %(member2)s :</"
+"p><pre>%(error)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:397
-#, fuzzy
-msgid "No snapshotter"
-msgstr "Zeige Shortcuts"
+#: ../lib/advene/core/webcherry.py:1933
+msgid "Relation created"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:419
-msgid "No snapshotting activity"
+#: ../lib/advene/core/webcherry.py:1934
+#, python-format
+msgid "<h1>Relation <em>%s</em> created</h1>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:423
-msgid "Snapshotting"
+#: ../lib/advene/core/webcherry.py:1944
+#, python-format
+msgid "Annotation type %s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:440
-#, fuzzy
-msgid "Display application log messages"
-msgstr "Verbindungs Type"
+#: ../lib/advene/core/webcherry.py:1961
+#, python-format
+msgid ""
+"<p>Error while creating annotation of type %(type)s :<pre>\n"
+"                    %(errortype)s\n"
+"                    %(value)s\n"
+"                    %(traceback)s</pre>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:482
-msgid "Quicksearch lists"
+#: ../lib/advene/core/webcherry.py:1973
+#, python-format
+msgid "Annotation %s created"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:488
-msgid "Please specify the lists of elements to be searched."
+#: ../lib/advene/core/webcherry.py:1975
+#, python-format
+msgid "Error: Cannot create an object of type %s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:507
+#: ../lib/advene/core/webcherry.py:1978
 #, python-format
 msgid ""
-"Searching on %s.\n"
-"Left click to launch the search, right-click to set the quicksearch options"
+"Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</"
+"code></p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1991
+msgid "Available actions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:508
+#: ../lib/advene/core/webcherry.py:2000
 #, python-format
-msgid "String to search in %s"
+msgid "<li>%(name)s: %(value)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:521 ../lib/advene/gui/main.py:525
-msgid "Tracing : "
+#: ../lib/advene/core/webcherry.py:2023
+#, python-format
+msgid "<p>Unknown action</p><pre>Action: %s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:521
-msgid "off"
+#: ../lib/advene/core/webcherry.py:2030
+msgid "Missing parameter(s) :<ul>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:525
-#, fuzzy
-msgid "on"
-msgstr "Erledigt"
+#: ../lib/advene/core/webcherry.py:2066
+msgid "Advene web resources"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:545
-msgid "Launch search"
+#: ../lib/advene/core/webcherry.py:2072
+msgid "Advene webserver"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:550
-msgid "Ignore case"
+#: ../lib/advene/core/webcherry.py:2073
+#, python-format
+msgid ""
+"<p>Welcome on the <a href=\"http://advene.org/\">Advene</a> webserver run by "
+"%(userid)s on %(serveraddress)s.</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:555
-msgid "Searched elements"
+#: ../lib/advene/core/webcherry.py:2080
+msgid ""
+" <p>No package is loaded. You can access the <a href=\"/admin\">server "
+"administration page</a>.<p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:625
-msgid "Playing"
+#: ../lib/advene/core/webcherry.py:2090
+#, python-format
+msgid ""
+"the <a href=\"/packages/%(alias)s/view/%(view)s\">loaded package's default "
+"view</a>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:626
-msgid "Pause"
+#: ../lib/advene/core/webcherry.py:2092
+#, python-format
+msgid "the <a href=\"/packages/%s\">loaded package's data</a>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:627
-msgid "Init"
+#: ../lib/advene/core/webcherry.py:2094
+msgid "the <a href=\"/packages\">loaded packages' data</a>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:629
-msgid "Undefined"
+#: ../lib/advene/core/webcherry.py:2095
+#, python-format
+msgid ""
+" <p>You can either access %s or the <a href=\"/admin\">server administration "
+"page</a>.<p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:901
-msgid "Enter the new time value"
+#: ../lib/advene/core/webcherry.py:2097
+#, python-format
+msgid ""
+"<hr><p align=\"right\"><em>Document generated by <a href=\"http://advene.org/"
+"\">Advene</a> v. %s.</em></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:925
+#: ../lib/advene/core/webcherry.py:2182 ../lib/advene/core/webcherry.py:2191
 #, python-format
-msgid "Replace content in %d elements"
+msgid "Cannot start HTTP server: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:938
-msgid "Find word"
+#: ../lib/advene/core/controller.py:433
+msgid "No available GUI"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:945
-msgid "Replace by"
+#: ../lib/advene/core/controller.py:452
+msgid "No available event handler"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:973
-#, python-format
-msgid "%(search)s has been replaced by %(replace)s in %(count)d element(s)."
+#: ../lib/advene/core/controller.py:460
+msgid "No available gui"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:982
-msgid "The video extracting feature is not available."
+#: ../lib/advene/core/controller.py:476
+#, python-format
+msgid "Warning: redefining an existing feature %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:985
+#: ../lib/advene/core/controller.py:608
 #, fuzzy
-msgid "Video export"
-msgstr "_Einstellung Spieler"
+msgid "Annotations in current package"
+msgstr "Transkription für das gesamte Packet"
 
-#: ../lib/advene/gui/main.py:987
-#, python-format
-msgid "Exporting video montage/fragment to %%(filename)s"
-msgstr ""
+#: ../lib/advene/core/controller.py:609
+#, fuzzy
+msgid "Annotations in all packages"
+msgstr "Transkription für das gesamte Packet"
 
-#: ../lib/advene/gui/main.py:989
-msgid "Please choose a destination filename"
+#: ../lib/advene/core/controller.py:611
+msgid "Ids"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1067
+#: ../lib/advene/core/controller.py:803
+#, python-format
 msgid ""
-"No media association is defined in the package. Please use the 'File/"
-"Associate a video file' menu item to associate a media file."
+"Cannot start the webserver\n"
+"The following processes seem to use the %(port)s port: %(processes)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1069
+#: ../lib/advene/core/controller.py:852 ../lib/advene/core/controller.py:863
 #, python-format
-msgid ""
-"The associated media %s could not be found. Please use the 'File/Associate a "
-"video file' menu item to associate a media file."
+msgid "Loaded %(uri)s as %(alias)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1071
+#: ../lib/advene/core/controller.py:854 ../lib/advene/core/controller.py:866
 #, python-format
-msgid ""
-"You are now working with the following video:\n"
-"%s"
+msgid "Cannot load package from file %(uri)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1188
-msgid "Open this view..."
+#: ../lib/advene/core/controller.py:905
+msgid "Deactivating web server"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1205
-msgid "_All available views"
+#: ../lib/advene/core/controller.py:1013
+#, python-format
+msgid "Cannot get audio volume: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1224
-msgid "Transcription of annotations"
+#: ../lib/advene/core/controller.py:1025
+#, python-format
+msgid "Cannot open Advene URL %s: the webserver is not running."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1227
-msgid "Note-taking editor"
+#: ../lib/advene/core/controller.py:1284
+#, python-format
+msgid "Found matching video file in moviepath: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1228
-msgid "Active bookmarks"
+#: ../lib/advene/core/controller.py:1310 ../lib/advene/core/controller.py:1312
+msgid "Analysis of "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1229
-#, fuzzy
-msgid "Schema editor"
-msgstr "Schema"
-
-#: ../lib/advene/gui/main.py:1233
-msgid "TALES explorer"
+#: ../lib/advene/core/controller.py:1536
+msgid "Cannot split the annotation: the given position is outside."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1234
-msgid "Dynamic montage"
+#: ../lib/advene/core/controller.py:1785
+#, python-format
+msgid "Cannot find the template package %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1238
-msgid "Open a comment view in the web browser"
+#: ../lib/advene/core/controller.py:1832
+#, python-format
+msgid "Cannot read the imported package %(uri)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1239
-msgid "Create or open a comment view"
+#: ../lib/advene/core/controller.py:2064
+msgid "Package URI has changed. Reloading package with new URI."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1242
+#: ../lib/advene/core/controller.py:2082
 msgid ""
-"Edit window placeholder (annotation and relation edit windows will be put "
-"here)"
+"Cannot load package: the following annotations do not have Millisecond "
+"fragments:"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1243
-#, fuzzy
-msgid "Display edition history"
-msgstr "Zeige Kommentare an einer Timeline"
+#: ../lib/advene/core/controller.py:2108
+#, python-format
+msgid "Cannot handle master attribute, the package %s is not imported."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1244
-#, fuzzy
-msgid "Visualise the activity trace preview"
-msgstr "Aktivieren und Abspielen"
+#: ../lib/advene/core/controller.py:2110
+#, python-format
+msgid "Checking master package %s for not yet imported elements."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1245
-#, fuzzy
-msgid "Visualise the activity trace as a timeline"
-msgstr "Aktivieren und Abspielen"
+#: ../lib/advene/core/controller.py:2150
+msgid "Standard summary"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1274
-msgid "The webserver could not be started. Static views cannot be accessed."
+#: ../lib/advene/core/controller.py:2155
+msgid "Default view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1352
+#: ../lib/advene/core/controller.py:2197
 #, python-format
 msgid ""
-"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s has been "
-"released</b> on %(date)s, but you are running version %(current)s.\n"
-"You can download the latest version from the Advene website: http://liris."
-"cnrs.fr/advene/</span>"
+"Infinite loop in STBV %(name)s: the %(imp)s view is invoked multiple times."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1357
-msgid "Go to the website"
+#: ../lib/advene/core/controller.py:2283
+msgid "Got exception when stopping player."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1363
+#: ../lib/advene/core/controller.py:2335
 #, fuzzy
-msgid "Advene release"
-msgstr "Advene"
+msgid "Video player problem"
+msgstr "_Einstellung Spieler"
 
-#: ../lib/advene/gui/main.py:1369
-#, python-format
-msgid "You are using a up-to-date version of Advene (%(current)s)."
+#: ../lib/advene/core/controller.py:2362
+msgid "Unable to start the player."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1369
-msgid "Advene is up-to-date"
-msgstr ""
+#: ../lib/advene/core/controller.py:2569
+#, fuzzy, python-format
+msgid "Comment on set of %d annotations"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/main.py:1383
-msgid "Choose a color"
+#: ../lib/advene/core/controller.py:2571
+#, python-format
+msgid "Comment on %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1415
-msgid "Select an annotation to loop on it"
+#: ../lib/advene/core/controller.py:2575
+#, python-format
+msgid ""
+"<h1>Comment on %(title)s</h1>\n"
+"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
+"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
+"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
+"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
+"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
+"\"%(imgurl)s\" ></img></a></span>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1417
+#: ../lib/advene/core/controller.py:2585
+#, fuzzy, python-format
+msgid "List of %s annotations"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/core/controller.py:2620
 #, python-format
-msgid "Looping on %s"
+msgid "Cannot export to %(filename)s: %(e)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1476 ../lib/advene/gui/main.py:2367
-msgid "No active dynamic view"
+#: ../lib/advene/core/controller.py:2635
+msgid "Error when exporting text template"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1487
-msgid "Create a new dynamic view."
+#: ../lib/advene/core/controller.py:2644
+msgid "Error when exporting XML template"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1506
-msgid "Edit the current dynamic view."
+#: ../lib/advene/plugins/featuredetect.py:45
+msgid "Feature detection (face...)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1518
-msgid "No dynamic view"
+#: ../lib/advene/plugins/featuredetect.py:60
+msgid "Sensitivity level."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1550
-msgid "Playing rate"
+#: ../lib/advene/plugins/featuredetect.py:63
+msgid ""
+"Scale. Original image size will be divided by this factor, in order to speed "
+"up detection."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1698
-msgid "History"
+#: ../lib/advene/plugins/featuredetect.py:66
+msgid "Classifier"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1705
-msgid "Popups"
+#: ../lib/advene/plugins/featuredetect.py:80
+#, python-format
+msgid "Feature %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1709
-msgid ""
-"You can drag and drop view icons (timeline, treeview, transcription...) in "
-"notebooks to embed various views."
+#: ../lib/advene/plugins/featuredetect.py:82
+#, python-format
+msgid "Detected %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1709
-msgid "Information"
+#: ../lib/advene/plugins/featuredetect.py:84
+msgid "Detection started"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2004
-msgid "Cannot create annotation. There is no schema to put it in."
+#: ../lib/advene/plugins/featuredetect.py:175
+#, python-format
+msgid "Detected %(count)d feature(s) until %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2013
+#: ../lib/advene/plugins/ted.py:39
 #, fuzzy
-msgid "Default annotation type"
-msgstr "von einem Anmerkungs Typ"
+msgid "TED importer"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/main.py:2025
+#: ../lib/advene/plugins/cutter.py:40
 #, fuzzy
-msgid "Annotation created"
+msgid "Audio segmentation"
 msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/main.py:2057
-msgid "Play/Pause [Control-Tab / Control-Space]"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:2058
-#, python-format
-msgid "Rewind (%.02f s) [Control-Left]"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:2059
-#, python-format
-msgid "Forward (%.02f s) [Control-Right]"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:2060
-msgid "Previous frame [Control-Down]"
+#: ../lib/advene/plugins/cutter.py:55
+msgid "Volume threshold (in dB, can be negative) before trigger."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2061
-msgid "Next frame [Control-Up]"
+#: ../lib/advene/plugins/cutter.py:58
+#: ../lib/advene/plugins/soundenveloppe.py:64
+msgid "Channel selection."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2062
-msgid "Fullscreen"
+#: ../lib/advene/plugins/cutter.py:61
+msgid "Length (in ms) of drop below threshold before silence is detected"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2214
+#: ../lib/advene/plugins/cutter.py:104
 #, python-format
-msgid "Screenshot saved to %s"
+msgid "Detected %(count)d segments until %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2216
-#, python-format
-msgid ""
-"Screenshot saved in\n"
-" %s"
+#: ../lib/advene/plugins/cutter.py:122
+msgid "Sound segment"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2218
-#, fuzzy, python-format
+#: ../lib/advene/plugins/cutter.py:123
+#, python-format
 msgid ""
-"Could not save screenshot:\n"
-" %s"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/main.py:2226
-msgid "Save screenshot to..."
+"Sound segmentation with a threshold of %(threshold)d dB - channel: "
+"%(channel)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2244
-msgid "Could not take snapshot with enough precision"
+#: ../lib/advene/plugins/cutter.py:141
+msgid "Starting silence detection"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2282
+#: ../lib/advene/plugins/ttl.py:41
 #, fuzzy
-msgid "Export package data"
-msgstr "durchsuche Packet daten"
-
-#: ../lib/advene/gui/main.py:2284
-#, fuzzy, python-format
-msgid "Export annotation type %s"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/main.py:2286
-#, fuzzy, python-format
-msgid "Export element %s"
+msgid "TurTLe (RDF) importer"
 msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/main.py:2312
+#: ../lib/advene/plugins/shotdetect.py:38
 #, fuzzy
-msgid "Export format"
+msgid "Shotdetect XML importer"
 msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/main.py:2349
-msgid " (modified)"
+#: ../lib/advene/plugins/shotdetect.py:82
+msgid "No shots"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2352
-#, python-format
-msgid "Activate %s"
+#: ../lib/advene/plugins/pocketsphinx.py:44
+msgid ""
+"Cannot register speech recognition: Pocketsphinx plugins not found. See "
+"http://cmusphinx.sourceforge.net/wiki/gstreamer for details."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2523
-msgid "Saved workspace"
+#: ../lib/advene/plugins/pocketsphinx.py:48
+msgid "Speech recognition (PocketSphinx)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2575
-msgid "Restoring workspace..."
+#: ../lib/advene/plugins/pocketsphinx.py:68
+msgid "Filtering noise level [0..1]."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2581
-#, python-format
-msgid "Do you wish to restore the %s workspace ?"
+#: ../lib/advene/plugins/pocketsphinx.py:72
+msgid ""
+"Minimum amount (in milliseconds) of silence required to terminate the "
+"current annotation and start a new one. Decreasing this length will result "
+"in a large amount of short annotations and increasing this length will "
+"result in a small amount of long annotations."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2586
-#, fuzzy
-msgid "Clear the current workspace"
-msgstr "Aktuelle Sitzung speichern"
-
-#: ../lib/advene/gui/main.py:2607
-#, python-format
-msgid "View %s is not an adhoc view"
+#: ../lib/advene/plugins/pocketsphinx.py:76
+msgid "Use default acoustic and language models."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2618
-#, python-format
-msgid "Cannot identify the adhoc view %s"
+#: ../lib/advene/plugins/pocketsphinx.py:80
+msgid "Acoustic model (directory)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2632
-msgid "Choose the annotation type to display as transcription."
+#: ../lib/advene/plugins/pocketsphinx.py:84
+msgid "Phonetic dictionary (.dic file)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2667
-#, python-format
-msgid ""
-"Error: unable to find an edit popup for %(element)s:\n"
-"%(error)s"
+#: ../lib/advene/plugins/pocketsphinx.py:88
+msgid "Language model (.DMP file)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2675
-#, fuzzy, python-format
-msgid "Editing %s"
-msgstr "Datei _importieren"
-
-#: ../lib/advene/gui/main.py:2687
-#, python-format
-msgid "Comment view (%s)"
-msgstr ""
+#: ../lib/advene/plugins/pocketsphinx.py:107
+#: ../lib/advene/plugins/soundenveloppe.py:88
+#: ../lib/advene/plugins/barcode.py:62
+#, fuzzy
+msgid "Generating annotations"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/main.py:2754
+#: ../lib/advene/plugins/pocketsphinx.py:146
+#: ../lib/advene/plugins/barcode.py:87
 #, python-format
-msgid "Package %(uri)s saved: %(annotations)s and %(relations)s."
+msgid "%(count)d utterances until %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2765
-#, python-format
-msgid "Activating package %s"
+#: ../lib/advene/plugins/pocketsphinx.py:155
+msgid "Speech"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2793
-#, python-format
-msgid "Package %(uri)s loaded: %(annotations)s and %(relations)s."
+#: ../lib/advene/plugins/pocketsphinx.py:157
+msgid "Recognized speech"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2826
-msgid "Do you want to restore the saved workspace ?"
+#: ../lib/advene/plugins/pocketsphinx.py:186
+msgid "Recognizing speech"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2833
-msgid "Advene"
-msgstr "Advene"
-
-#: ../lib/advene/gui/main.py:3038
-#, python-format
-msgid "Got exception %s. Trying to continue."
+#: ../lib/advene/plugins/brltty.py:64
+msgid "Input from the braille table."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3062 ../lib/advene/gui/main.py:3083
-#: ../lib/advene/gui/main.py:4033
-msgid "Unknown"
+#: ../lib/advene/plugins/brltty.py:68
+msgid "BrlTTY not installed. There will be no braille support."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3153
-#, python-format
-msgid ""
-"The package(s) %s are modified.\n"
-"Save them now?"
+#: ../lib/advene/plugins/brltty.py:80
+msgid "Could not initialize BrlTTY. No braille support."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3203
-msgid "Choose an annotation type."
+#: ../lib/advene/plugins/brltty.py:86
+msgid "Display a message in Braille"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3247
-msgid "No annotation type is defined."
+#: ../lib/advene/plugins/brltty.py:87
+msgid "Message to display."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3256
-msgid "Creating a new type."
+#: ../lib/advene/plugins/brltty.py:258
+#, python-format
+msgid "BrlTTY connection error: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3260
-msgid "Title of the new type"
+#: ../lib/advene/plugins/brltty.py:275
+msgid "Braille display: "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3261
-msgid ""
-"Id of the new type. It is generated from the title, but you may change it if "
-"necessary."
-msgstr ""
+#: ../lib/advene/plugins/brltty.py:281
+#, fuzzy
+msgid "No message"
+msgstr "Kein Pakte"
 
-#: ../lib/advene/gui/main.py:3265
+#: ../lib/advene/plugins/transcript.py:34
 #, fuzzy
-msgid "Specify the content-type for the annotation type"
-msgstr "Zeige die Transkription für eine Anmerkung"
+msgid "Youtube XML importer"
+msgstr "Kommentar Typ"
 
-#: ../lib/advene/gui/main.py:3267
-msgid "Content type"
-msgstr ""
+#: ../lib/advene/plugins/transcript.py:71
+#, fuzzy
+msgid "Importing transcript"
+msgstr "T_ranskription"
 
-#: ../lib/advene/gui/main.py:3274 ../lib/advene/gui/main.py:3383
-msgid "Create a new schema"
+#: ../lib/advene/plugins/aeidon_import.py:50
+msgid "Aeidon (subtitles) importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3287
-msgid "Choose an existing schema for the new type, or create a new one"
+#: ../lib/advene/plugins/anvil.py:38
+msgid "Anvil importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3290 ../lib/advene/gui/main.py:3398
-msgid "Specify the schema title"
+#: ../lib/advene/plugins/fcp.py:35
+msgid "Final Cut Pro XML importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3294
-msgid "Title of the new schema"
+#: ../lib/advene/plugins/fcp.py:57
+msgid "FCP clipitem"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3295
-msgid ""
-"Id of the new schema. It is generated from the title, but you may change it "
-"if necessary."
-msgstr ""
+#: ../lib/advene/plugins/fcp.py:77
+#, fuzzy
+msgid "Importing subtitles"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/main.py:3318
-msgid ""
-"You specified a annotation-type identifier that already exists. Aborting."
-msgstr ""
+#: ../lib/advene/plugins/fcp.py:92
+#, fuzzy
+msgid "Importing clips"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/main.py:3336
-msgid "You specified a existing schema identifier. Using the existing schema."
+#: ../lib/advene/plugins/fcp.py:95
+msgid "No clip"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3338
-msgid ""
-"You specified an existing identifier that does not reference a schema. "
-"Aborting."
+#: ../lib/advene/plugins/hpi.py:43
+msgid "HPI concept extraction"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3365
-msgid "Choose a schema."
-msgstr ""
+#: ../lib/advene/plugins/hpi.py:109
+#, fuzzy
+msgid "Type of annotation to analyze"
+msgstr "Kommentar Typ"
 
-#: ../lib/advene/gui/main.py:3425
-msgid "You specified an existing identifier. Aborting."
+#: ../lib/advene/plugins/hpi.py:114
+msgid "URL of the webservice"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3445
-#, python-format
-msgid "Package %s modified"
+#: ../lib/advene/plugins/hpi.py:119
+msgid "Minimum confidence level (between 0.0 and 1.0)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3446
-#, python-format
-msgid ""
-"The package %s has been modified but not saved.\n"
-"Save it now?"
-msgstr ""
+#: ../lib/advene/plugins/hpi.py:124
+#, fuzzy
+msgid "Use detected position for created annotations"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/main.py:3456
-#, python-format
-msgid "%s snapshots"
+#: ../lib/advene/plugins/hpi.py:129
+msgid "Split by entity type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3457
-#, python-format
-msgid "Do you want to save the snapshots for media %s?"
+#: ../lib/advene/plugins/hpi.py:134
+msgid "Model to be used for detection"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3464 ../lib/advene/gui/main.py:3473
-#: ../lib/advene/gui/main.py:4449
-#, python-format
-msgid "Cannot save imagecache for %(media)s: %(e)s"
+#: ../lib/advene/plugins/hpi.py:139
+msgid "Create relations between the original annotations and the new ones"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3487
-msgid "first frame"
+#: ../lib/advene/plugins/hpi.py:167
+msgid "Cannot connect to VCD server. Check that it is running and accessible."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3488
-msgid "last frame"
+#: ../lib/advene/plugins/hpi.py:179
+#, python-format
+msgid "%d / %d screenshots are missing. Wait for extraction to complete."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3496
-#, fuzzy, python-format
-msgid "Click on %(bound)s of %(annotation)s"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/plugins/hpi.py:196
+#, python-format
+msgid "Concepts for %s"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3499
+#: ../lib/advene/plugins/hpi.py:264
 #, fuzzy, python-format
-msgid "Update %(bound)s of %(annotation)s"
-msgstr "von einem Anmerkungs Typ"
+msgid "Server error: %s"
+msgstr "_Einstellung Spieler"
 
-#: ../lib/advene/gui/main.py:3518
-msgid "Click on the frame corresponding to the timestamp value"
+#: ../lib/advene/plugins/hpi.py:264
+msgid "Server transmission error."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3520
-msgid "Set new timestamp value"
+#: ../lib/advene/plugins/hpi.py:272
+#, python-format
+msgid "Parsing %d results"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3527
-msgid ""
-"<b>Annotation statistics</b>\n"
-"\n"
+#: ../lib/advene/plugins/hpi.py:289
+#, python-format
+msgid "%s concept"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3599
-#, fuzzy
-msgid "Text annotation"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/main.py:3607 ../lib/advene/gui/main.py:3632
-#, fuzzy
-msgid "Cannot find an appropriate annotation type"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/plugins/goodshotdetector.py:45
+msgid "Shot detection (Delakis version)"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3625
-#, fuzzy
-msgid "Graphical annotation"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/plugins/goodshotdetector.py:60
+msgid "Cache histogram alongside video files."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3677
+#: ../lib/advene/plugins/goodshotdetector.py:63
 msgid ""
-"An unsaved template package exists\n"
-"Save it first."
+"Parameter profile: safe will detect less cuts, aggressive will detect more "
+"cuts (but more false ones too). default is a compromise."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3686
-msgid "Package modified"
+#: ../lib/advene/plugins/goodshotdetector.py:77
+#, python-format
+msgid "Shot (%s profile)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3687
-msgid ""
-"The package that you want to close has been modified but not saved.\n"
-"Save it now?"
+#: ../lib/advene/plugins/goodshotdetector.py:78
+#: ../lib/advene/plugins/shotdetectapp.py:84
+msgid "Detected shots"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3718
-msgid "Load a package"
+#: ../lib/advene/plugins/goodshotdetector.py:83
+msgid "Loading histogram"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3727
-msgid ""
-"A video file was selected. Pretend that the user selected 'Select a video "
-"file'..."
+#: ../lib/advene/plugins/goodshotdetector.py:144
+msgid "Computing hdiff"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3732
-#, python-format
-msgid ""
-"The file %s does not look like a valid Advene package. It should have a .azp "
-"or .xml extension. Try to open anyway?"
+#: ../lib/advene/plugins/goodshotdetector.py:151
+msgid "Detecting cuts"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3741
-msgid ""
-"You are trying to load a session file, but there are unsaved packages. "
-"Proceed anyway?"
+#: ../lib/advene/plugins/goodshotdetector.py:178
+msgid "Detecting dissolves"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3769 ../lib/advene/gui/main.py:3825
-msgid "Do you want to save the current workspace ?"
-msgstr ""
+#: ../lib/advene/plugins/goodshotdetector.py:263
+#, fuzzy
+msgid "Extracting histogram"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/main.py:3784 ../lib/advene/gui/main.py:3840
-#, python-format
-msgid "Could not save the package: %s"
+#: ../lib/advene/plugins/montagerenderer.py:43
+msgid "Cannot register montage renderer: Gnonlin plugins are not present."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3797
-#, python-format
-msgid "Save the package %s"
+#: ../lib/advene/plugins/transcriber.py:43
+msgid "Transcriber importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3810
-msgid "Invalid file extension"
+#: ../lib/advene/plugins/transcriber.py:89
+msgid "Parsing section information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3811
-#, python-format
-msgid ""
-"Your package contains resources,\n"
-"the filename (%s) should have a .azp extension.\n"
-"Should I put the correct extension?"
+#: ../lib/advene/plugins/transcriber.py:257 ../lib/advene/util/importer.py:1541
+msgid "Creating package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3815
-msgid "OK, the resources will be lost."
+#: ../lib/advene/plugins/transcriber.py:263 ../lib/advene/util/importer.py:1548
+msgid "Creating annotation types"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3817
-msgid "Aborting package saving"
+#: ../lib/advene/plugins/transcriber.py:268 ../lib/advene/util/importer.py:1554
+msgid "Parsing header information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3851
-msgid "Save the session in..."
+#: ../lib/advene/plugins/transcriber.py:279
+msgid "Parsing topic and speaker tables information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3862
-#, python-format
-msgid "Session saved in %s"
+#: ../lib/advene/plugins/tts.py:80
+msgid "Pronounce a text"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3871
-msgid "Do you confirm the creation of annotations matching the DVD chapters?"
+#: ../lib/advene/plugins/tts.py:81
+msgid "String to pronounce."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3877
-msgid "Cannot import DVD chapters. Did you install the lsdvd software?"
+#: ../lib/advene/plugins/tts.py:159
+msgid "TTS disabled. Cannot find the application 'festival' in PATH"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3885
-msgid "The associated media is not a DVD."
+#: ../lib/advene/plugins/tts.py:161
+msgid "TTS disabled. Cannot find the application 'aplay' in PATH"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3896
-#, fuzzy, python-format
-msgid "Processing %s video"
-msgstr "Datei _importieren"
+#: ../lib/advene/plugins/soundenveloppe.py:42
+#: ../lib/advene/plugins/soundenveloppe.py:149
+#: ../lib/advene/plugins/soundenveloppe.py:151
+msgid "Sound enveloppe"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3899
-#, fuzzy
-msgid "No associated video file"
-msgstr "Wähle eine Video Datei"
+#: ../lib/advene/plugins/soundenveloppe.py:58
+msgid "Interval (in ms) at which to take samples."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3926
-msgid "Standard RuleSet"
+#: ../lib/advene/plugins/soundenveloppe.py:61
+msgid "Maximum number of samples per annotation."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4042
+#: ../lib/advene/plugins/soundenveloppe.py:121
 #, python-format
-msgid ""
-"Player not active - cached duration   : %(duration)s (%(durationms)d ms)"
+msgid "At %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4054
-msgid ""
-"GNU General Public License v. 2\n"
-"See http://www.gnu.org/copyleft/gpl.html for more details"
+#: ../lib/advene/plugins/soundenveloppe.py:168
+#, fuzzy
+msgid "Extracting sound enveloppe"
+msgstr "Datei _importieren"
+
+#: ../lib/advene/plugins/barcode.py:39
+msgid "Cannot register barcode extraction: zbar plugin not found."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4056
-msgid "Visit the Advene web site for examples and documentation."
+#: ../lib/advene/plugins/barcode.py:43
+msgid "Barcode (qr-code) extraction"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4089 ../lib/advene/gui/main.py:4177
-msgid "Select a movie file"
+#: ../lib/advene/plugins/barcode.py:99
+msgid "Barcode"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4101
-msgid "Title/Chapter selection"
+#: ../lib/advene/plugins/barcode.py:101
+msgid "Extracted barcode information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4143
-msgid "Select a video stream"
-msgstr "Wähle einen video stream"
+#: ../lib/advene/plugins/barcode.py:119
+#, fuzzy
+msgid "Extraction barcodes"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/main.py:4144
-msgid "Enter the address of a video stream"
-msgstr ""
+#: ../lib/advene/plugins/dcp.py:67
+#, fuzzy
+msgid "DCP importer"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/main.py:4148
+#: ../lib/advene/plugins/dcp.py:122
 #, python-format
-msgid "Successfully extracted the video stream address (%s) from the url.\n"
+msgid "Converting #%(num)d / %(count)d"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4173
-msgid "Package properties"
-msgstr ""
+#: ../lib/advene/plugins/annotationgraph.py:43
+#, fuzzy
+msgid "AnnotationGraph importer"
+msgstr "Kommentar Typ"
 
-#: ../lib/advene/gui/main.py:4174
-msgid "Author name"
-msgstr ""
+#: ../lib/advene/plugins/shotdetectapp.py:45
+#, fuzzy
+msgid "ShotdetectApp importer"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/main.py:4175
-msgid "Package creation date"
+#: ../lib/advene/plugins/shotdetectapp.py:56
+msgid ""
+"Sensitivity of the algorithm. It should typically be between 50 and 80. If "
+"too many shots are detected, try to increase its value."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4176
-msgid "Package title"
+#: ../lib/advene/plugins/shotdetectapp.py:139
+#, python-format
+msgid "Detected shot #%(num)d at %(pos)s "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4177
-msgid "Associated media"
+#: ../lib/advene/plugins/mpeg7.py:57
+msgid "MPEG7 importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4178
-msgid "Media duration in ms"
-msgstr ""
+#: ../lib/advene/plugins/cinelab.py:76
+#, fuzzy
+msgid "Cinelab importer"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/main.py:4237
-msgid "Paths"
+#: ../lib/advene/plugins/cinelab.py:114 ../lib/advene/plugins/cinelab.py:116
+#, python-format
+msgid "File %s is not an Advene2 zip package."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4239
-msgid "Data"
-msgstr ""
+#: ../lib/advene/plugins/cinelab.py:171
+#, fuzzy
+msgid "Converting annotation types"
+msgstr "Kommentar Typ"
 
-#: ../lib/advene/gui/main.py:4239
-msgid "Standard directory for data files"
-msgstr ""
+#: ../lib/advene/plugins/cinelab.py:212
+#, fuzzy
+msgid "Converting views"
+msgstr "Aktivieren und Abspielen"
 
-#: ../lib/advene/gui/main.py:4240
-msgid "Movie path"
-msgstr ""
+#: ../lib/advene/plugins/cinelab.py:244
+#, fuzzy
+msgid "Importing annotations"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/main.py:4240
+#: ../lib/advene/plugins/owl_import.py:43
+#, fuzzy
+msgid "OWL (schema) importer"
+msgstr "Datei _importieren"
+
+#: ../lib/advene/plugins/owl_import.py:62 ../lib/advene/util/importer.py:398
 #, python-format
-msgid ""
-"List of directories (separated by %s) to search for movie files (_ means "
-"package directory)"
+msgid "Converted from %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4241
-msgid "Imagecache"
+#: ../lib/advene/player/gstreamer.py:344
+msgid "Problem when seeking into media"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4241
-msgid "Directory for storing the snapshot cache"
+#: ../lib/advene/player/gstreamer.py:385
+msgid "Cannot capture full-resolution snapshot, another capture is ongoing."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4242
-msgid "Player"
+#: ../lib/advene/rules/actions.py:39 ../lib/advene/rules/actions.py:104
+#: ../lib/advene/rules/actions.py:122
+msgid "Message to display"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4242
-msgid "Directory of the video player"
+#: ../lib/advene/rules/actions.py:50
+msgid "Start the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4243
-msgid "Shotdetect"
+#: ../lib/advene/rules/actions.py:51
+msgid "Start position (in ms)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4243
-msgid "Shotdetect application"
+#: ../lib/advene/rules/actions.py:54 ../lib/advene/rules/actions.py:380
+msgid "The movie start"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4245
-msgid "GUI"
+#: ../lib/advene/rules/actions.py:55 ../lib/advene/rules/actions.py:381
+#, fuzzy
+msgid "The annotation begin"
+msgstr "von einem Anmerkungs Typ"
+
+#: ../lib/advene/rules/actions.py:56 ../lib/advene/rules/actions.py:382
+#, fuzzy
+msgid "The annotation end"
+msgstr "Kommentar Typ"
+
+#: ../lib/advene/rules/actions.py:66
+msgid "Goto position (in ms)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4246
-msgid "Interface language (after restart)"
+#: ../lib/advene/rules/actions.py:75
+msgid "Stop the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4246
-msgid ""
-"Language used for the interface (necessitates to restart the application)"
+#: ../lib/advene/rules/actions.py:82
+msgid "Pause the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4252
-msgid "Record activity trace"
+#: ../lib/advene/rules/actions.py:89
+msgid "Resume the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4253
-msgid "Expert mode"
+#: ../lib/advene/rules/actions.py:96
+msgid "Take a snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4253
-msgid "Offer advanced possibilities"
+#: ../lib/advene/rules/actions.py:103
+msgid "Display a caption"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4254
-msgid "Prefer WYSIWYG"
+#: ../lib/advene/rules/actions.py:105
+msgid "Duration of the caption"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4254
-msgid "Use WYSIWYG editors when possible (HTML, SVG)"
+#: ../lib/advene/rules/actions.py:133
+#, fuzzy
+msgid "Display a graphical shape"
+msgstr "Verbindungs Type"
+
+#: ../lib/advene/rules/actions.py:134
+msgid "Shape (square, circle, triangle)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4255
-msgid "Player control in edit popups"
+#: ../lib/advene/rules/actions.py:136
+msgid "x-position (percentage of screen)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4255
-msgid ""
-"Enable generic player controls in edit windows. This may be undesirable "
-"since it overloads some standard text-edition behaviours (esp. control-left/"
-"right)."
+#: ../lib/advene/rules/actions.py:137
+msgid "y-position (percentage of screen)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4257
-msgid "Open popups"
+#: ../lib/advene/rules/actions.py:138
+msgid "Size (arbitrary units)"
+msgstr ""
+
+#: ../lib/advene/rules/actions.py:139
+msgid "Duration of the display in ms"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4258
-msgid "Where should we open adhoc views?"
+#: ../lib/advene/rules/actions.py:147
+msgid "A square"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4259
-msgid "as a popup window"
+#: ../lib/advene/rules/actions.py:148
+msgid "A circle"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4260
-msgid "embedded east of the video"
+#: ../lib/advene/rules/actions.py:149
+msgid "A triangle"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4261
-msgid "embedded west of the video"
+#: ../lib/advene/rules/actions.py:152
+msgid "White"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4262
-msgid "embedded south of the video"
+#: ../lib/advene/rules/actions.py:153
+msgid "Black"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4263
-msgid "embedded at the right of the window"
+#: ../lib/advene/rules/actions.py:154
+msgid "Red"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4266
-msgid "History size"
+#: ../lib/advene/rules/actions.py:155
+msgid "Green"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4266
-msgid "History filelist size limit"
+#: ../lib/advene/rules/actions.py:156
+msgid "Blue"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4268
-msgid "Remember window size"
+#: ../lib/advene/rules/actions.py:157
+msgid "Yellow"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4268
-msgid "Remember the size of opened windows"
+#: ../lib/advene/rules/actions.py:160
+msgid "At the top of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4269
-msgid "Bookmark snapshot width"
+#: ../lib/advene/rules/actions.py:161 ../lib/advene/rules/actions.py:166
+msgid "In the middle of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4269
-msgid "Width of the snapshots representing bookmarks"
+#: ../lib/advene/rules/actions.py:162
+msgid "At the bottom of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4270
-msgid "Bookmark snapshot precision"
+#: ../lib/advene/rules/actions.py:165
+msgid "At the left of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4270
-msgid "Precision (in ms) of the displayed bookmark snapshots."
+#: ../lib/advene/rules/actions.py:183
+msgid "Zero the volume during the annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4272
-msgid "General"
+#: ../lib/advene/rules/actions.py:190
+msgid "Zero the volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4273
-msgid "Weekly update check"
+#: ../lib/advene/rules/actions.py:197
+msgid "Restore the volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4274
-msgid "On exit,"
+#: ../lib/advene/rules/actions.py:205
+msgid "Activate a STBV"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4275
-msgid "How to handle screenshots on exit"
+#: ../lib/advene/rules/actions.py:206
+msgid "STBV id"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4276
-msgid "never save screenshots"
+#: ../lib/advene/rules/actions.py:215
+msgid "Send a user event"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4277
-msgid "always save screenshots"
+#: ../lib/advene/rules/actions.py:216
+msgid "Identifier"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4278
-msgid "ask before saving screenshots"
+#: ../lib/advene/rules/actions.py:217
+msgid "Delay in ms before sending the event."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4280
-msgid "Auto-save"
+#: ../lib/advene/rules/actions.py:227
+msgid "Open a URL in the web browser"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4281
-msgid "Data auto-save functionality"
+#: ../lib/advene/rules/actions.py:237
+msgid "Open a static view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4282
-msgid "is desactivated"
+#: ../lib/advene/rules/actions.py:248
+msgid "Set the audio volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4283
-msgid "is done automatically"
+#: ../lib/advene/rules/actions.py:249
+msgid "Volume level (from 0 to 100)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4284
-msgid "is done after confirmation"
+#: ../lib/advene/rules/actions.py:258
+msgid "Set the playing rate"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4286
-msgid "Auto-save interval (in s)"
+#: ../lib/advene/rules/actions.py:259
+msgid "Rate (100: normal rate, 200: twice slower)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4286
-msgid "Interval (in seconds) between package auto-saves"
+#: ../lib/advene/rules/actions.py:268
+msgid "Play a sound resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4288
-#, fuzzy
-msgid "Workspace"
-msgstr "Aktuelle Sitzung speichern"
+#: ../lib/advene/rules/actions.py:269
+msgid "Clip id"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4290
-msgid "On package saving,"
+#: ../lib/advene/rules/actions.py:270 ../lib/advene/rules/actions.py:284
+msgid "Volume (0..100)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4291
-msgid "Do you wish to save the default workspace with the package?"
+#: ../lib/advene/rules/actions.py:271 ../lib/advene/rules/actions.py:285
+msgid "Left-right balance: -1 -> full left, 0 -> center, 1 -> full right"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4292
+#: ../lib/advene/rules/actions.py:282
 #, fuzzy
-msgid "never save the current workspace"
-msgstr "Aktuelle Sitzung speichern"
+msgid "Play a sound file"
+msgstr "Verbindungs Type"
 
-#: ../lib/advene/gui/main.py:4293
-#, fuzzy
-msgid "always save the current workspace"
-msgstr "Aktuelle Sitzung speichern"
+#: ../lib/advene/rules/actions.py:283
+msgid "Sound filename"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4294
-msgid "ask before saving the current workspace"
+#: ../lib/advene/rules/actions.py:295
+msgid "Set a state variable"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4296
-msgid "Auto-validation of edited elements"
+#: ../lib/advene/rules/actions.py:296 ../lib/advene/rules/actions.py:308
+msgid "State variable name"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4296
-msgid "Automatically validate modified elements when saving the package."
+#: ../lib/advene/rules/actions.py:297
+msgid "State value"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4298
-#, fuzzy
-msgid "On package load,"
-msgstr "Kein Pakte"
+#: ../lib/advene/rules/actions.py:307
+msgid "Increment a state variable"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4299
-msgid "Do you wish to load the workspace saved with the package?"
+#: ../lib/advene/rules/actions.py:317
+msgid "Clear all state variables"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4300
-msgid "never load the saved workspace"
+#: ../lib/advene/rules/actions.py:332
+#, python-format
+msgid "Error in the evaluation of the parameter %s:"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4301
-msgid "always load the saved workspace"
+#: ../lib/advene/rules/actions.py:537
+#, python-format
+msgid "Cannot find the stbv %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4302
-msgid "ask before loading the saved workspace"
+#: ../lib/advene/rules/actions.py:633
+msgid "The set_rate method is unavailable."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4305
-#, fuzzy
-msgid "Video Player"
-msgstr "_Einstellung Spieler"
+#: ../lib/advene/rules/actions.py:643
+msgid "No 'soundclips' resource folder in the package"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4306
-msgid "Autostart"
+#: ../lib/advene/rules/actions.py:668
+msgid "Full volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4306
-msgid ""
-"Automatically start the player when loading a media file (either directly or "
-"through a package)"
+#: ../lib/advene/rules/actions.py:669
+msgid "Left"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4307
-msgid "Fulscreen timestamp"
+#: ../lib/advene/rules/actions.py:671
+msgid "Right"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4307
-msgid "Display the timestamp over the video when in fullscreen mode"
+#: ../lib/advene/rules/importer.py:29
+msgid "Event history importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4308
-msgid "Enable captions"
+#: ../lib/advene/rules/elements.py:144
+msgid "is equal to"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4308
-#, fuzzy
-msgid "Enable captions over the video"
-msgstr "Zeige Kommentare an einer Timeline"
+#: ../lib/advene/rules/elements.py:145
+msgid "is different from"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4309
-msgid "Caption font"
+#: ../lib/advene/rules/elements.py:146
+msgid "contains"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4309
-msgid "TrueType font for captions"
+#: ../lib/advene/rules/elements.py:147
+msgid "is greater than"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4310
-msgid "Enable SVG"
+#: ../lib/advene/rules/elements.py:148
+msgid "is lower than"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4310
-msgid "Enable SVG captions over the video"
+#: ../lib/advene/rules/elements.py:149
+msgid "matches the regexp"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4312
-msgid "Enable snapshots"
+#: ../lib/advene/rules/elements.py:150
+msgid "is before"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4313
-msgid "Snapshot width"
+#: ../lib/advene/rules/elements.py:151
+msgid "meets"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4313
-msgid "Snapshot width in pixels."
+#: ../lib/advene/rules/elements.py:152
+msgid "overlaps"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4314
-msgid "Verbosity"
+#: ../lib/advene/rules/elements.py:153
+msgid "during"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4314
-msgid "Verbosity level. -1 for no messages."
+#: ../lib/advene/rules/elements.py:154
+msgid "starts"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4317
-msgid "Devices"
+#: ../lib/advene/rules/elements.py:155
+msgid "finishes"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4319
-msgid "Standard"
+#: ../lib/advene/rules/elements.py:160
+msgid "is not true"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4321
-msgid "DVD drive"
+#: ../lib/advene/rules/elements.py:161
+msgid "is true"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4321
-msgid "Drive letter for the DVD"
+#: ../lib/advene/rules/elements.py:165
+msgid "Basic conditions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4322
-msgid "GDI"
+#: ../lib/advene/rules/elements.py:166
+msgid "Allen relations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4323
-msgid "Direct X"
+#: ../lib/advene/rules/elements.py:229 ../lib/advene/rules/elements.py:235
+msgid "Unknown type for overlaps comparison"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4325
-msgid "DVD device"
+#: ../lib/advene/rules/elements.py:243 ../lib/advene/rules/elements.py:249
+msgid "Unknown type for during comparison"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4325
-msgid "Device for the DVD"
+#: ../lib/advene/rules/elements.py:518 ../lib/advene/rules/elements.py:524
+#, python-format
+msgid "Unknown action %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4326
-msgid "X11"
+#: ../lib/advene/rules/elements.py:525
+#, fuzzy, python-format
+msgid "Unknown parameter %s"
+msgstr "Unbekannte STBV identifier: %s"
+
+#: ../lib/advene/rules/elements.py:530
+msgid "Unknown actions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4327
-msgid "XVideo"
+#: ../lib/advene/rules/elements.py:982
+msgid "Start of the editing of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4328
-msgid "GL"
+#: ../lib/advene/rules/elements.py:983
+msgid "Cancel of the editing of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4330
-msgid "Video output"
+#: ../lib/advene/rules/elements.py:984
+msgid "Destruction of the edit window of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4330
-msgid "Video output module"
+#: ../lib/advene/rules/elements.py:985
+msgid "Validation of the editing of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4332
-msgid "Recorder options"
+#: ../lib/advene/rules/elements.py:986
+msgid "Ending editing of a package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4333
-msgid "Audio input"
+#: ../lib/advene/rules/elements.py:987
+msgid "Beginning of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4333
-msgid "Device name for audio input (with gstrecorder plugin)"
+#: ../lib/advene/rules/elements.py:988
+msgid "End of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4334
-msgid "Record video"
+#: ../lib/advene/rules/elements.py:989
+msgid "Creation of a new annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4334
-msgid "Record both video and audio"
+#: ../lib/advene/rules/elements.py:990
+msgid "Ending editing of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4337
-msgid "<i>Experimental</i>"
+#: ../lib/advene/rules/elements.py:991
+msgid "Suppression of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4338
-msgid "Embed the caption scroller below the video"
+#: ../lib/advene/rules/elements.py:992
+msgid "Activation of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4339
-msgid "Embed the caption view below the video"
+#: ../lib/advene/rules/elements.py:993
+msgid "Deactivation of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4341
-msgid "Time-related"
+#: ../lib/advene/rules/elements.py:994
+msgid "Merging of two annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4342
+#: ../lib/advene/rules/elements.py:995
 #, fuzzy
-msgid "Time format"
-msgstr "T_imeline"
+msgid "Moving an annotation"
+msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/main.py:4342
-msgid "Format used to display timecodes"
+#: ../lib/advene/rules/elements.py:996
+msgid "Activation of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4356
-msgid "Default FPS"
+#: ../lib/advene/rules/elements.py:997
+msgid "Deactivation of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4357
-msgid ""
-"Default FPS (frame-per-second) value, when entering or displaying timestamps "
-"with frame numbers."
+#: ../lib/advene/rules/elements.py:998
+msgid "Creation of a new relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4358
-#, fuzzy
-msgid "Time increment"
-msgstr "T_imeline"
-
-#: ../lib/advene/gui/main.py:4358
-msgid ""
-"Skip duration, when using control-left/right or forward/rewind buttons (in "
-"ms)."
+#: ../lib/advene/rules/elements.py:999
+msgid "Ending editing of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4359
-msgid "Second time increment"
+#: ../lib/advene/rules/elements.py:1000
+msgid "Suppression of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4359
-msgid "Skip duration, when using control-shift-left/right (in ms)."
+#: ../lib/advene/rules/elements.py:1001
+msgid "Creation of a new view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4360
-#, fuzzy
-msgid "Third time increment"
-msgstr "T_imeline"
+#: ../lib/advene/rules/elements.py:1002
+msgid "Ending editing of a view"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4360
-msgid "Skip duration, when using control-shift-up/down (in ms)."
+#: ../lib/advene/rules/elements.py:1003
+msgid "Suppression of a view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4361
-msgid "Custom Up/Down"
+#: ../lib/advene/rules/elements.py:1004
+msgid "Creation of a new query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4361
-msgid ""
-"Use third time increment for up/down navigation without having to hold shift."
+#: ../lib/advene/rules/elements.py:1005
+msgid "Ending editing of a query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4363
-msgid "Scroll increment"
+#: ../lib/advene/rules/elements.py:1006
+msgid "Suppression of a query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4363
-msgid ""
-"On most annotations, control+scrollwheel will increment/decrement their "
-"bounds by this value (in ms)."
+#: ../lib/advene/rules/elements.py:1007
+msgid "Creation of a new schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4364
-msgid "Second scroll increment"
+#: ../lib/advene/rules/elements.py:1008
+msgid "Ending editing of a schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4364
-msgid ""
-"On most annotations, control+shift+scrollwheel will increment/decrement "
-"their bounds by this value (in ms)."
+#: ../lib/advene/rules/elements.py:1009
+msgid "Suppression of a schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4366
-#, fuzzy
-msgid "Player sync"
-msgstr "_Spieler"
+#: ../lib/advene/rules/elements.py:1011
+msgid "Ending editing an annotation type"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4366
-msgid ""
-"Interval (in ms) with which we synchronize slave players. Setting a too-low "
-"value could render the application unusable. Use 0 to disable continuous "
-"synchronization."
+#: ../lib/advene/rules/elements.py:1012
+msgid "Suppression of an annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4367
-msgid "Timeline parameters"
+#: ../lib/advene/rules/elements.py:1013
+msgid "Creation of a new relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4368
-msgid "Font size for annotation widgets"
+#: ../lib/advene/rules/elements.py:1014
+msgid "Ending editing a relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4369
-msgid "Button height"
+#: ../lib/advene/rules/elements.py:1015
+msgid "Suppression of a relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4369
-msgid "Height of annotation widgets"
+#: ../lib/advene/rules/elements.py:1016
+msgid "Creation of a new resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4370
-msgid "Interline height"
+#: ../lib/advene/rules/elements.py:1017
+msgid "Ending editing of a resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4370
-msgid "Height of interlines"
+#: ../lib/advene/rules/elements.py:1018
+msgid "Suppression of a resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4372
-#, fuzzy
-msgid "Text content"
-msgstr "von einem Anmerkungs Typ"
+#: ../lib/advene/rules/elements.py:1019
+msgid "Modification of the tag"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4373
-msgid "Completion mode"
+#: ../lib/advene/rules/elements.py:1020
+msgid "Activating a link"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4373
-msgid "Enable dynamic completion mode"
+#: ../lib/advene/rules/elements.py:1021
+msgid "Player start"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4374
-msgid "Abbreviation mode"
+#: ../lib/advene/rules/elements.py:1022
+msgid "Player stop"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4374
-msgid "Enable abbreviation mode"
+#: ../lib/advene/rules/elements.py:1023
+msgid "Player pause"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4375
-msgid "Abbreviations"
+#: ../lib/advene/rules/elements.py:1024
+msgid "Player resume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4375
-msgid ""
-"Text abbreviations. 1 entry per line. Each line consists of the abbreviation "
-"followed by its replacement."
+#: ../lib/advene/rules/elements.py:1025
+msgid "Going to a given position"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4377
-msgid "Text-To-Speech"
+#: ../lib/advene/rules/elements.py:1026
+msgid "Loading a new package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4378
-msgid "TTS language"
+#: ../lib/advene/rules/elements.py:1027
+msgid "Activating a package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4379
-msgid "What language settings should be used for text-to-speech"
+#: ../lib/advene/rules/elements.py:1028
+msgid "Saving the package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4380
-msgid "English"
+#: ../lib/advene/rules/elements.py:1029
+msgid "Start of the dynamic view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4381
-msgid "French"
+#: ../lib/advene/rules/elements.py:1030
+msgid "End of the dynamic view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4382
-msgid "Spanish"
+#: ../lib/advene/rules/elements.py:1031
+msgid "Start of the application"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4384
-msgid "TTS Encoding"
+#: ../lib/advene/rules/elements.py:1032
+msgid "End of the application"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4385
-msgid "What encoding should be used to communicate with the TTS engine"
+#: ../lib/advene/rules/elements.py:1033
+msgid "User-defined event"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4386
-msgid "TTS Engine"
+#: ../lib/advene/rules/elements.py:1034
+msgid "Modification of the associated media"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4387
-msgid ""
-"Which TTS engine should be used (modification requires restarting Advene to "
-"take into account)"
+#: ../lib/advene/rules/elements.py:1035
+msgid "Highlight a bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4388
-msgid "Automatic"
+#: ../lib/advene/rules/elements.py:1036
+msgid "Unhighlight a bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4389
-msgid "eSpeak"
+#: ../lib/advene/rules/elements.py:1037
+msgid "Updating duration of the movie"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4390
-msgid "Custom script with standard input"
+#: ../lib/advene/rules/elements.py:1038
+msgid "Displaying a popup"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4391
-msgid "Custom script with arguments"
+#: ../lib/advene/rules/elements.py:1039
+msgid "Updating a snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4392
-msgid "SAPI"
+#: ../lib/advene/rules/elements.py:1077
+#, fuzzy
+msgid "Player control"
+msgstr "_Spieler"
+
+#: ../lib/advene/rules/elements.py:1078
+msgid "Audio enrichment"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4393
-msgid "MacOS X say"
+#: ../lib/advene/rules/elements.py:1079
+#, fuzzy
+msgid "Image enrichment"
+msgstr "T_imeline"
+
+#: ../lib/advene/rules/elements.py:1080
+msgid "External display control"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4394
-msgid "Generic (text output)"
+#: ../lib/advene/rules/elements.py:1081
+msgid "Popup"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4438
-msgid "You should restart Advene to take some options into account."
+#: ../lib/advene/rules/elements.py:1083
+msgid "State"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4447
-#, python-format
-msgid "Imagecache saved to %s"
+#: ../lib/advene/rules/elements.py:1084
+msgid "GUI actions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4460
-msgid "Restarting player..."
+#: ../lib/advene/rules/elements.py:1085
+msgid "Expert"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4512
-#, fuzzy
-msgid "Advene log"
-msgstr "Advene"
+#: ../lib/advene/util/helper.py:409
+msgid "Annotation"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4581
-msgid "Select the package to merge"
+#: ../lib/advene/util/helper.py:410
+msgid "Relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4602
-msgid "Saving workspace"
+#: ../lib/advene/util/helper.py:416
+msgid "Resource Folder"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4605
-msgid "Enter a view name to save the workspace"
+#: ../lib/advene/util/helper.py:452
+msgid "---- Elements ----"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4606
-#, fuzzy
-msgid "Default workspace"
-msgstr "Aktuelle Sitzung speichern"
+#: ../lib/advene/util/helper.py:458
+msgid "---- Attributes ----"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4607
-msgid "Open this workspace when opening the package"
+#: ../lib/advene/util/helper.py:461
+msgid "---- Methods ----"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4641
+#: ../lib/advene/util/helper.py:534
 #, python-format
-msgid "Error: the view %s exists and is not a workspace view."
+msgid "Cannot read %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4672
+#: ../lib/advene/util/helper.py:541
 #, python-format
-msgid "Cannot save default workspace: %s"
+msgid "File %s is not an Advene zip package - no mimetype."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4682
-msgid "Standard workspace has been saved"
+#: ../lib/advene/util/helper.py:543
+#, python-format
+msgid "File %(fname)s is not an Advene zip package - wrong mimetype %(type)s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4689
-msgid "Website export"
+#: ../lib/advene/util/helper.py:559
+#, python-format
+msgid ""
+"Error:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4690
-msgid "Exporting views to a website"
+#: ../lib/advene/util/helper.py:641
+msgid "schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4693
-msgid "Output directory"
+#: ../lib/advene/util/helper.py:641
+msgid "schemas"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4702
-msgid "Specify the output directory"
+#: ../lib/advene/util/helper.py:642
+msgid "annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4711
-msgid "Maximum recursion depth"
+#: ../lib/advene/util/helper.py:642
+msgid "annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4718
-msgid "Video URL"
+#: ../lib/advene/util/helper.py:643 ../lib/advene/util/helper.py:644
+msgid "annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4720
-msgid ""
-"URL for the video, if it is available on a sharing website (Only Youtube for "
-"the moment).\n"
-" It can also be a h264/ogg file, which will in this case be handled by the "
-"HTML5 video player."
+#: ../lib/advene/util/helper.py:643 ../lib/advene/util/helper.py:644
+msgid "annotation types"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4770
-msgid "Could not export data: "
+#: ../lib/advene/util/helper.py:645
+msgid "relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4772
-#, fuzzy, python-format
-msgid "Website export to %s completed"
-msgstr "Datei _importieren"
-
-#: ../lib/advene/gui/main.py:4811
-msgid "This video player is not able to grab specific screenshots"
+#: ../lib/advene/util/helper.py:645
+msgid "relations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4821
-#, python-format
-msgid "Updating %d snapshots"
+#: ../lib/advene/util/helper.py:646 ../lib/advene/util/helper.py:647
+msgid "relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4826
-msgid "No snapshot to update"
+#: ../lib/advene/util/helper.py:646 ../lib/advene/util/helper.py:647
+msgid "relation types"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4835 ../lib/advene/gui/main.py:4947
-msgid "You first must load a movie into Advene"
+#: ../lib/advene/util/helper.py:648
+msgid "query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4838 ../lib/advene/gui/main.py:4950
-#, python-format
-msgid "The movie %s does not seem to exist."
+#: ../lib/advene/util/helper.py:648
+msgid "queries"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4895
-msgid "Generating screenshots"
+#: ../lib/advene/util/helper.py:649
+msgid "view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4900
-msgid ""
-"<b>Screenshot generation</b>\n"
-"\n"
-"Screenshots will be captured approximately every 500ms.\n"
-"\n"
-"If the movie was paused or playing, the capture will begin at the current "
-"position. Else, it will begin at the beginning of the movie.\n"
-"Note that the main interface will not be refreshed as long as this window is "
-"open."
+#: ../lib/advene/util/helper.py:649
+msgid "views"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4941
-msgid ""
-"The <b>shotdetect</b> application does not seem to be installed. Please "
-"check that it is present and that its path is correctly specified in "
-"preferences."
+#: ../lib/advene/util/helper.py:650
+msgid "package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4981
-msgid ""
-"Cannot import shotdetect output. Did you install the shotdetect software?"
+#: ../lib/advene/util/helper.py:650
+msgid "packages"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4998
-msgid "Incomplete shots"
+#: ../lib/advene/util/helper.py:662
+#, python-format
+msgid "No %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5001
+#: ../lib/advene/util/helper.py:664
 #, python-format
-msgid "Detected %s shots"
+msgid "1 %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5103
+#: ../lib/advene/util/helper.py:666
 #, python-format
-msgid "Could not run shotdetect: %s"
+msgid "%(count)d %(plural)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5107
+#: ../lib/advene/util/website_export.py:63
 #, python-format
-msgid "Detecting shots from %s"
+msgid "%s exists but is not a directory. Cancelling website export"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5160
-msgid "Shot detection"
+#: ../lib/advene/util/website_export.py:69
+#, python-format
+msgid "%s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5166
-msgid ""
-"<b>Shot detection</b>\n"
-"\n"
-"Advene will try to detect shots from the currently loaded movie. The "
-"threshold parameter is used to specify the sensitivity of the algorithm, and "
-"should typically be between 50 and 80. If too many shots are detected, try "
-"to augment its value."
+#: ../lib/advene/util/website_export.py:423
+msgid "Starting export"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5182
-msgid "Sensitivity"
+#: ../lib/advene/util/website_export.py:452
+#, python-format
+msgid "Depth %d"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:138
-msgid "Choose the file to insert"
+#: ../lib/advene/util/website_export.py:456
+#, python-format
+msgid "Depth %(depth)d: processing %(url)s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:146
-msgid "Select a valid identifier"
+#: ../lib/advene/util/website_export.py:478
+msgid "Finalizing"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:147
+#: ../lib/advene/util/website_export.py:512
 #, python-format
 msgid ""
-"The filename %s contains invalid characters\n"
-"that have been replaced.\n"
-"You can modify this identifier if necessary:"
+"<p><strong>You should probably begin at <a href=\"%(href)s\">%(title)s</a>.</"
+"strong></p>"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:158
-msgid "Choose the soundclip to insert"
+#: ../lib/advene/util/website_export.py:555
+#, fuzzy
+msgid "Export complete"
+msgstr "Datei _importieren"
+
+#: ../lib/advene/util/importer.py:134
+msgid "Generic importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:162
-msgid "Choose the directory to insert"
+#: ../lib/advene/util/importer.py:188
+msgid "Usage: %prog [options] source-file destination-file"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:177
-msgid "Named-Entity extraction using NERD"
+#: ../lib/advene/util/importer.py:192
+msgid "Specify the offset in ms"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:181
+#: ../lib/advene/util/importer.py:264
 msgid ""
-"Give the offset to use\n"
-"on specified element.\n"
-"It is in ms and can be\n"
-"either positive or negative."
+"Import filter error. The asynchronous API should be used, please report a "
+"bug."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:225
-#, python-format
-msgid "Replace content in %s"
+#: ../lib/advene/util/importer.py:266
+msgid ""
+"Import filter error. No conversion method is defined,  please report a bug."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:228
-#, fuzzy, python-format
-msgid "Replace content in annotations of type %s"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/popup.py:231
+#: ../lib/advene/util/importer.py:532
 #, fuzzy
-msgid "Replace content in all annotations"
-msgstr "Zeige die Transkription für eine Anmerkung"
-
-#: ../lib/advene/gui/popup.py:324
-#, python-format
-msgid "Copy id %s"
-msgstr ""
+msgid "ExternalApp importer"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/popup.py:358
+#: ../lib/advene/util/importer.py:546
 #, python-format
 msgid ""
-"<b>Statistics about %s</b>\n"
-"\n"
+"The <b>%s</b> application does not seem to be installed. Please check that "
+"it is present and that its path is correctly specified in preferences."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:364
-#, fuzzy, python-format
-msgid "Renumbering annotations of type %s"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/popup.py:371
-msgid ""
-"<b>Renumber all annotations according to their order.</b>\n"
-"\n"
-"<i>Note that this action cannot be undone.</i>\n"
-"Replace the first numeric value of the annotation content with the new "
-"annotation number.\n"
-"If no numeric value is found and the annotation is structured, it will "
-"insert the number.\n"
-"If no numeric value is found and the annotation is of type text/plain, it "
-"will overwrite the annotation content.\n"
-"The offset parameter allows you to renumber from a given annotation."
+#: ../lib/advene/util/importer.py:548
+#, python-format
+msgid "The file %s does not seem to exist."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:377 ../lib/advene/gui/popup.py:484
-msgid "Offset"
+#: ../lib/advene/util/importer.py:570
+#, python-format
+msgid "Could not run %(appname)s: %(msg)s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:399
-#, fuzzy, python-format
-msgid "Renumbering %d annotations"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/popup.py:408
+#: ../lib/advene/util/importer.py:572
 #, fuzzy, python-format
-msgid "Annotation #%d"
-msgstr "Kommentar Typ"
+msgid "Processing %s"
+msgstr "Datei _importieren"
 
-#: ../lib/advene/gui/popup.py:445
-#, python-format
-msgid ""
-"Exporting annotation %(title)s\n"
-"from %(begin)s to %(end)s\n"
-"to %%(filename)s"
+#: ../lib/advene/util/importer.py:576
+msgid "Cleaning up..."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:458
-msgid "Browse"
+#: ../lib/advene/util/importer.py:687
+msgid "Text importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:466 ../lib/advene/gui/popup.py:853
-msgid "Open in web browser"
+#: ../lib/advene/util/importer.py:700 ../lib/advene/util/importer.py:1225
+msgid "Specify the encoding of the input file (latin1, utf8...)"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:479
-msgid "Search/replace content"
+#: ../lib/advene/util/importer.py:703
+msgid "Should the timestamps be encoded relative to the first timestamp?"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:497
-msgid "Desactivate"
+#: ../lib/advene/util/importer.py:706
+msgid "Unit to consider for integers"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:514
-msgid "Loop"
+#: ../lib/advene/util/importer.py:709
+msgid ""
+"What timestamps are present in a line (only begin, both begin and end, or "
+"automatic recognition)"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:515
-msgid "Duplicate"
+#: ../lib/advene/util/importer.py:852
+msgid "lsdvd importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:519
-#, fuzzy
-msgid "Save snapshot..."
-msgstr "Zeige Shortcuts"
+#: ../lib/advene/util/importer.py:879
+msgid "Processing data"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:521
+#: ../lib/advene/util/importer.py:897 ../lib/advene/util/importer.py:957
 #, fuzzy
-msgid "Extract video fragment"
-msgstr "Gebe eine Video Stream Adresse ein"
+msgid "DVD Chapter"
+msgstr "Importiere _DVD Kapitel"
 
-#: ../lib/advene/gui/popup.py:551
-msgid "Incoming"
+#: ../lib/advene/util/importer.py:901
+msgid "Launching lsdvd..."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:567
-msgid "Outgoing"
+#: ../lib/advene/util/importer.py:913
+msgid "chaplin importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:582
-#, fuzzy
-msgid "Related annotations"
-msgstr "von einem Anmerkungs Typ"
-
-#: ../lib/advene/gui/popup.py:589
-msgid "Incoming relations"
+#: ../lib/advene/util/importer.py:971
+msgid "Xi importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:596
-msgid "Outgoing relations"
+#: ../lib/advene/util/importer.py:1039
+msgid "ELAN importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:612
+#: ../lib/advene/util/importer.py:1092
 #, python-format
-msgid "Begin: %s"
+msgid "Converting tier %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:614
-#, python-format
-msgid "End: %s"
+#: ../lib/advene/util/importer.py:1189
+msgid "Processing time slots"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:615
-#, fuzzy, python-format
-msgid "Duration: %s"
-msgstr "Verbindungs Type"
+#: ../lib/advene/util/importer.py:1204
+msgid "Fixing forward references"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:622
-msgid "Members:"
+#: ../lib/advene/util/importer.py:1206
+msgid "Creating relations"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:635
-#, fuzzy
-msgid "Edit package properties..."
-msgstr "Bearbeite Packet Eigentschaften"
+#: ../lib/advene/util/importer.py:1218
+msgid "Subtitle (SRT) importer"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:636 ../lib/advene/gui/popup.py:756
+#: ../lib/advene/util/importer.py:1276
 #, python-format
-msgid "%d annotations(s) - statistics"
+msgid "Subtitles from %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:638 ../lib/advene/gui/popup.py:864
-msgid "Create a new static view..."
+#: ../lib/advene/util/importer.py:1281
+msgid ""
+"Cannot decode subtitle file. Try to specify an encoding (latin1 perhaps?)."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:639 ../lib/advene/gui/popup.py:865
-msgid "Create a new dynamic view..."
+#: ../lib/advene/util/importer.py:1292
+msgid "PRAAT importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:640 ../lib/advene/gui/popup.py:751
-msgid "Create a new annotation..."
+#: ../lib/advene/util/importer.py:1381
+msgid "CMML importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:642 ../lib/advene/gui/popup.py:867
-msgid "Create a new schema..."
+#: ../lib/advene/util/importer.py:1444
+msgid "Parsing clip information"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:643 ../lib/advene/gui/popup.py:862
-msgid "Create a new query..."
+#: ../lib/advene/util/importer.py:1544
+msgid "Creating CMML schema"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:651
-msgid "Create a new folder..."
+#: ../lib/advene/util/importer.py:1568
+msgid "Parsing stream information"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:652
-msgid "Create a new resource file..."
+#: ../lib/advene/util/importer.py:1602
+msgid "IRI importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:653
-msgid "Insert a new resource file..."
+#: ../lib/advene/util/importer.py:1611
+msgid "Generate one type per view"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:654
-msgid "Insert a new resource directory..."
+#: ../lib/advene/util/importer.py:1630
+#, python-format
+msgid "Parsing ensemble %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:663 ../lib/advene/gui/popup.py:665
-msgid "Insert a soundclip..."
+#: ../lib/advene/util/importer.py:1641
+#, python-format
+msgid "Parsing decoupage %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:676
-msgid "Play sound"
+#: ../lib/advene/util/importer.py:1676
+msgid "Parsing views"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:686
-msgid "Create a new annotation type..."
+#: ../lib/advene/util/importer.py:1723 ../lib/advene/util/importer.py:1812
+msgid "Initializing package"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:688
-msgid "Create a new relation type..."
+#: ../lib/advene/util/importer.py:1761
+msgid "IRIData importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:699
-#, python-format
-msgid "A caption dynamic view for %s already seems to exist."
+#: ../lib/advene/util/importer.py:1775
+msgid "Parsing sound values"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:708
-#, fuzzy, python-format
-msgid "Caption %s annotations"
+#: ../lib/advene/util/importer.py:1787
+#, fuzzy
+msgid "Creating annotations"
 msgstr "von einem Anmerkungs Typ"
 
-#: ../lib/advene/gui/popup.py:740
+#~ msgid "<h1>No playlist</h1>"
+#~ msgstr "<h1>Keine Abspielliste</h1>"
+
+#~ msgid ""
+#~ "<h1>Current playlist</h1>\n"
+#~ "                <ul>%s</ul>"
+#~ msgstr ""
+#~ "<h1>Gegenwärtige Abspielliste</h1>\n"
+#~ "                <ul>%s</ul>"
+
 #, fuzzy
-msgid "Create a comment view"
-msgstr "von einem Anmerkungs Typ"
+#~ msgid "Cannot export to %(host)s:%(port)s %(error)s"
+#~ msgstr "Kann nicht stbvid %(stbvid)s: %(error)s aktivieren"
 
-#: ../lib/advene/gui/popup.py:741
-msgid "Generate a caption dynamic view..."
-msgstr ""
+#, fuzzy
+#~ msgid "Cannot send data to %(host)s:%(port)s %(error)s"
+#~ msgstr "Kann nicht stbvid %(stbvid)s: %(error)s aktivieren"
 
-#: ../lib/advene/gui/popup.py:742
-msgid "Display as transcription"
-msgstr ""
+#, fuzzy
+#~ msgid "Cannot send event %(nb)s to %(host)s:%(port)s %(error)s"
+#~ msgstr "Kann nicht stbvid %(stbvid)s: %(error)s aktivieren"
 
-#: ../lib/advene/gui/popup.py:743
 #, fuzzy
-msgid "Display annotations in table"
-msgstr "Zeige Kommentare an einer Timeline"
+#~ msgid "Display log file"
+#~ msgstr "Verbindungs Type"
 
-#: ../lib/advene/gui/popup.py:744
 #, fuzzy
-msgid "Export to another format..."
-msgstr "Importiere Daten von einer Externen Quelle"
+#~ msgid "Advene log"
+#~ msgstr "Advene"
 
-#: ../lib/advene/gui/popup.py:746
-msgid "Extract Named Entities..."
-msgstr ""
+#, fuzzy
+#~ msgid "WebAnnotation importer"
+#~ msgstr "Kommentar Typ"
 
-#: ../lib/advene/gui/popup.py:752
 #, fuzzy
-msgid "Delete all annotations"
-msgstr "von einem Anmerkungs Typ"
+#~ msgid "Schema editor"
+#~ msgstr "Schema"
 
-#: ../lib/advene/gui/popup.py:753
 #, fuzzy
-msgid "Renumber annotations..."
-msgstr "von einem Anmerkungs Typ"
+#~ msgid "Visualise the activity trace preview"
+#~ msgstr "Aktivieren und Abspielen"
 
-#: ../lib/advene/gui/popup.py:754
 #, fuzzy
-msgid "Shot validation view..."
-msgstr "Zeige Kommentare an einer Timeline"
+#~ msgid "Visualise the activity trace as a timeline"
+#~ msgstr "Aktivieren und Abspielen"
 
-#: ../lib/advene/gui/popup.py:766
-#, python-format
-msgid "A follow dynamic view for %s already seems to exist."
-msgstr ""
+#, fuzzy
+#~ msgid "Min duration"
+#~ msgstr "_Einstellung Spieler"
 
-#: ../lib/advene/gui/popup.py:775
-#, fuzzy, python-format
-msgid "Follow %s relation-type"
-msgstr "Verbindungs Type"
+#, fuzzy
+#~ msgid "Mean duration"
+#~ msgstr "Zeige die Anmerkung als Transkription"
 
-#: ../lib/advene/gui/popup.py:784
-msgid "Follow the relation"
-msgstr ""
+#, fuzzy
+#~ msgid "Total duration"
+#~ msgstr "Zeige die Anmerkung als Transkription"
 
-#: ../lib/advene/gui/popup.py:804
-msgid "Delete all relations..."
-msgstr ""
+#, fuzzy
+#~ msgid "Schema Editor"
+#~ msgstr "Schema"
 
-#: ../lib/advene/gui/popup.py:805
 #, fuzzy
-msgid "Create montage from related annotations"
-msgstr "von einem Anmerkungs Typ"
+#~ msgid "Display"
+#~ msgstr "Verbindungs Type"
 
-#: ../lib/advene/gui/popup.py:806
-msgid "Create dynamic view following relations"
-msgstr ""
+#, fuzzy
+#~ msgid "Remove relation type"
+#~ msgstr "Verbindungs Type"
 
-#: ../lib/advene/gui/popup.py:824
-msgid "Apply query on..."
-msgstr ""
+#, fuzzy
+#~ msgid "Remove annotation type"
+#~ msgstr "Kommentar Typ"
 
-#: ../lib/advene/gui/popup.py:849
-msgid "Activate view"
-msgstr ""
+#, fuzzy
+#~ msgid "New schema"
+#~ msgstr "Schema"
 
-#: ../lib/advene/gui/popup.py:851
-msgid "Open adhoc view"
-msgstr ""
+#, fuzzy
+#~ msgid "New annotation type"
+#~ msgstr "Kommentar Typ"
+
+#, fuzzy
+#~ msgid "New relation type"
+#~ msgstr "Verbindungs Type"
 
 #, fuzzy
 #~ msgid "Adjust annotation bounds..."
@@ -9215,10 +9254,6 @@ msgstr ""
 #~ msgid "Exporter"
 #~ msgstr "Datei _importieren"
 
-#, fuzzy
-#~ msgid "Display next annotation"
-#~ msgstr "von einem Anmerkungs Typ"
-
 #~ msgid "_Configure player"
 #~ msgstr "_Einstellung Spieler"
 
@@ -9269,10 +9304,6 @@ msgstr ""
 #~ msgstr "durchsuche Packet daten"
 
 #, fuzzy
-#~ msgid "Export trace"
-#~ msgstr "Datei _importieren"
-
-#, fuzzy
 #~ msgid "_New"
 #~ msgstr "_Zeige"
 
diff --git a/po/eo.po b/po/eo.po
index 5b2fddb..33a662d 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-07-09 17:25+0200\n"
+"POT-Creation-Date: 2017-10-12 22:02+0200\n"
 "PO-Revision-Date: 2006-04-07 11:42+0200\n"
 "Last-Translator: Olivier Aubert <olivier.aubert at liris.cnrs.fr>\n"
 "Language-Team: advene at liris.cnrs.fr\n"
@@ -15,3154 +15,2886 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../lib/advene/model/zippackage.py:187 ../lib/advene/model/zippackage.py:189
-#: ../lib/advene/util/helper.py:538 ../lib/advene/util/helper.py:540
-#, python-format
-msgid "File %s is not an Advene zip package."
-msgstr ""
-
-#: ../lib/advene/model/zippackage.py:243
-#, python-format
-msgid "Directory %s is not an extracted Advene zip package."
-msgstr ""
-
-#: ../lib/advene/model/bundle.py:296
+#: ../lib/advene/model/bundle.py:292
 #, python-format
 msgid "%s not in bundle"
 msgstr ""
 
-#: ../lib/advene/model/bundle.py:362
+#: ../lib/advene/model/bundle.py:358
 msgid "List of non-typed elements"
 msgstr ""
 
-#: ../lib/advene/model/bundle.py:367
+#: ../lib/advene/model/bundle.py:363
 #, fuzzy, python-format
 msgid "List of %s elements"
 msgstr "Arbvido"
 
-#: ../lib/advene/core/controller.py:263 ../lib/advene/rules/actions.py:36
-#: ../lib/advene/gui/plugins/actions.py:40
-msgid "Display a message"
+#: ../lib/advene/model/zippackage.py:161 ../lib/advene/model/zippackage.py:163
+#, python-format
+msgid "File %s is not an Advene zip package."
 msgstr ""
 
-#: ../lib/advene/core/controller.py:264
-#: ../lib/advene/gui/plugins/actions.py:41
-#: ../lib/advene/gui/plugins/actions.py:53
-#: ../lib/advene/gui/plugins/actions.py:71
-#: ../lib/advene/gui/plugins/actions.py:86
-#: ../lib/advene/gui/plugins/actions.py:102
-#: ../lib/advene/gui/plugins/actions.py:203
-msgid "String to display."
+#: ../lib/advene/model/zippackage.py:219
+#, python-format
+msgid "Directory %s is not an extracted Advene zip package."
 msgstr ""
 
-#: ../lib/advene/core/controller.py:362
-msgid "Exception (traceback in console):"
-msgstr ""
+#: ../lib/advene/gui/widget.py:295
+#, fuzzy, python-format
+msgid "Set of %s annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/controller.py:393
-msgid "No available GUI"
+#: ../lib/advene/gui/widget.py:1006
+#: ../lib/advene/gui/views/transcription.py:459
+#: ../lib/advene/gui/edit/montage.py:60
+msgid "Play"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:412
-msgid "No available event handler"
-msgstr ""
+#: ../lib/advene/gui/widget.py:1010 ../lib/advene/gui/edit/timeadjustment.py:77
+#, fuzzy
+msgid "Refresh snapshot"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/controller.py:420
-msgid "No available gui"
-msgstr ""
+#: ../lib/advene/gui/widget.py:1014
+#, fuzzy
+msgid "Save as..."
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/core/controller.py:436
-#, python-format
-msgid "Warning: redefining an existing feature %s"
+#: ../lib/advene/gui/widget.py:1019
+#, fuzzy
+msgid "Use current player position"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/widget.py:1025
+#, fuzzy
+msgid "Adjust timestamp"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/main.py:200 ../lib/advene/gui/main.py:314
+#, fuzzy
+msgid "_Select player"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/main.py:202 ../lib/advene/gui/main.py:299
+msgid "_View"
+msgstr "Vido"
+
+#: ../lib/advene/gui/main.py:204 ../lib/advene/gui/main.py:316
+#, fuzzy
+msgid "Packages"
+msgstr "Komentaraj attributoj"
+
+#: ../lib/advene/gui/main.py:207 ../lib/advene/gui/main.py:258
+#, fuzzy
+msgid "Open recent"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/main.py:252
+msgid "Input from the keyboard (function keys)"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:568
+#: ../lib/advene/gui/main.py:255
+msgid "_File"
+msgstr "Dosiero"
+
+#: ../lib/advene/gui/main.py:256
 #, fuzzy
-msgid "All annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "_New package"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/core/controller.py:569 ../lib/advene/gui/edit/rules.py:358
-#, fuzzy, python-format
-msgid "Annotations of type %s"
+#: ../lib/advene/gui/main.py:256
+#, fuzzy
+msgid "Create a new package"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/controller.py:570 ../lib/advene/gui/edit/imports.py:129
-#: ../lib/advene/gui/edit/imports.py:130
-msgid "Views"
-msgstr ""
+#: ../lib/advene/gui/main.py:257
+#, fuzzy
+msgid "_Open package"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/core/controller.py:570 ../lib/advene/gui/edit/elements.py:521
-msgid "Tags"
-msgstr ""
+#: ../lib/advene/gui/main.py:257
+#, fuzzy
+msgid "Open a package"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/core/controller.py:570
-msgid "Ids"
-msgstr ""
+#: ../lib/advene/gui/main.py:258
+#, fuzzy
+msgid "Show recently opened packages"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/core/controller.py:747
-#, python-format
-msgid ""
-"Cannot start the webserver\n"
-"The following processes seem to use the %(port)s port: %(processes)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:259
+#, fuzzy
+msgid "_Save package"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/core/controller.py:797 ../lib/advene/core/controller.py:808
-#, python-format
-msgid "Loaded %(uri)s as %(alias)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:259
+#, fuzzy
+msgid "Save the package"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/core/controller.py:799 ../lib/advene/core/controller.py:811
-#, python-format
-msgid "Cannot load package from file %(uri)s: %(error)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:260
+#, fuzzy
+msgid "Save package as..."
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/core/controller.py:850
-msgid "Deactivating web server"
-msgstr ""
+#: ../lib/advene/gui/main.py:260
+#, fuzzy
+msgid "Save the package as..."
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/core/controller.py:970
-#, python-format
-msgid "Cannot get audio volume: %s"
-msgstr ""
+#: ../lib/advene/gui/main.py:261
+#, fuzzy
+msgid "Close package"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/core/controller.py:1020
-#, python-format
-msgid "Cannot open Advene URL %s: the webserver is not running."
+#: ../lib/advene/gui/main.py:261
+#, fuzzy
+msgid "Close the package"
+msgstr "Komentaraj attributoj"
+
+#: ../lib/advene/gui/main.py:263
+msgid "Save session"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1128 ../lib/advene/gui/edit/merge.py:272
-msgid "None"
+#: ../lib/advene/gui/main.py:263
+#, fuzzy
+msgid "Save the current session (list of opened packages)"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/main.py:264
+msgid "Save workspace"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1222
-#, python-format
-msgid "Found matching video file in moviepath: %s"
+#: ../lib/advene/gui/main.py:265
+msgid "...as package view"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1263 ../lib/advene/core/controller.py:1265
-msgid "Analysis of "
+#: ../lib/advene/gui/main.py:266
+msgid "...as standard workspace"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1465
-msgid "Cannot split the annotation: the given position is outside."
+#: ../lib/advene/gui/main.py:266
+msgid "Use the current layout as standard workspace in the future"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1630
-#, python-format
-msgid "Cannot find the template package %(filename)s: %(error)s"
+#: ../lib/advene/gui/main.py:268
+msgid "Associate a video _File"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1672
-#, python-format
-msgid "Cannot read the imported package %(uri)s: %(error)s"
+#: ../lib/advene/gui/main.py:268
+msgid "Associate a video file"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1907
-msgid "Package URI has changed. Reloading package with new URI."
+#: ../lib/advene/gui/main.py:269
+msgid "Associate a _DVD"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1925
-msgid ""
-"Cannot load package: the following annotations do not have Millisecond "
-"fragments:"
+#: ../lib/advene/gui/main.py:269
+msgid "Associate a chapter from a DVD"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1952
-#, python-format
-msgid "Cannot handle master attribute, the package %s is not imported."
+#: ../lib/advene/gui/main.py:270
+msgid "Associate a _Video stream"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1954
-#, python-format
-msgid "Checking master package %s for not yet imported elements."
+#: ../lib/advene/gui/main.py:270
+msgid "Enter a video stream address"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1994
-#, fuzzy
-msgid "Standard summary"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/main.py:272
+msgid "_Import File"
+msgstr "Importi dosieron"
+
+#: ../lib/advene/gui/main.py:272
+msgid "Import data from an external source"
+msgstr "Importi datumo de alia ???"
 
-#: ../lib/advene/core/controller.py:1999
+#: ../lib/advene/gui/main.py:273
 #, fuzzy
-msgid "Default view"
-msgstr "Defauxlta regularo"
+msgid "_Process video"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/core/controller.py:2041
-#, python-format
-msgid ""
-"Infinite loop in STBV %(name)s: the %(imp)s view is invoked multiple times."
-msgstr ""
+#: ../lib/advene/gui/main.py:273
+#, fuzzy
+msgid "Import data from video processing algorithms"
+msgstr "Importi datumo de alia ???"
 
-#: ../lib/advene/core/controller.py:2131
-#, python-format
-msgid "Got exception %s when stopping player."
+#: ../lib/advene/gui/main.py:275
+msgid "Merge package"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2214
-#, python-format
-msgid "Raised exception in update_status: %s"
-msgstr ""
+#: ../lib/advene/gui/main.py:275
+#, fuzzy
+msgid "Merge elements from another package"
+msgstr "Redakti importitaj elementojn de aliaj komentaroj"
 
-#: ../lib/advene/core/controller.py:2241
-msgid "Unable to start the player."
-msgstr ""
+#: ../lib/advene/gui/main.py:276
+msgid "Import _DVD chapters"
+msgstr "Importi DVD cxapitrojn"
 
-#: ../lib/advene/core/controller.py:2448
-#, fuzzy, python-format
-msgid "Comment on set of %d annotations"
+#: ../lib/advene/gui/main.py:276
+msgid "Create annotations based on DVD chapters"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/controller.py:2450
-#, fuzzy, python-format
-msgid "Comment on %s"
-msgstr "Arbvido"
+#: ../lib/advene/gui/main.py:278
+#, fuzzy
+msgid "_Export..."
+msgstr "Importi dosieron"
 
-#: ../lib/advene/core/controller.py:2454
-#, python-format
-msgid ""
-"<h1>Comment on %(title)s</h1>\n"
-"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
-"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
-"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
-"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
-"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
-"\"%(imgurl)s\" ></img></a></span>"
+#: ../lib/advene/gui/main.py:278
+#, fuzzy
+msgid "Export data to another format"
+msgstr "Importi datumo de alia ???"
+
+#: ../lib/advene/gui/main.py:279
+msgid "_Website export..."
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2464
-#, fuzzy, python-format
-msgid "List of %s annotations"
+#: ../lib/advene/gui/main.py:279
+#, fuzzy
+msgid "Export views to a website"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/controller.py:2499
-#, python-format
-msgid "Cannot export to %(filename)s: %(e)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:281
+#, fuzzy
+msgid "_Quit"
+msgstr "Redakti"
 
-#: ../lib/advene/core/controller.py:2514 ../lib/advene/core/controller.py:2523
-#, python-format
-msgid "Error when exporting: %s"
-msgstr ""
+#: ../lib/advene/gui/main.py:283
+msgid "_Edit"
+msgstr "Redakti"
 
-#: ../lib/advene/core/controller.py:2525 ../lib/advene/gui/views/table.py:406
-#: ../lib/advene/gui/views/table.py:536
-#, python-format
-msgid "Data exported to %s"
+#: ../lib/advene/gui/main.py:284
+msgid "_Undo"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:51
-msgid "The webserver requires version 3.0 of CherryPy at least."
-msgstr ""
+#: ../lib/advene/gui/main.py:285
+#, fuzzy
+msgid "_Find"
+msgstr "Dosiero"
 
-#: ../lib/advene/core/webcherry.py:167
-#, python-format
-msgid ""
-"\n"
-"            <p>\n"
-"            <a href=\"/admin\">Server administration</a> |\n"
-"            <a href=\"/media\">Media control</a> |\n"
-"            <a href=\"%(path)s?mode=raw\">Raw view</a>\n"
-"            </p>\n"
-"            Location: %(locationbar)s\n"
-"            <hr>\n"
-"            "
+#: ../lib/advene/gui/main.py:286
+msgid "_Delete"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:227
-msgid "Unspecified Error"
+#: ../lib/advene/gui/main.py:287
+#, fuzzy
+msgid "Create"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/main.py:288 ../lib/advene/gui/main.py:3337
+#: ../lib/advene/util/helper.py:411
+msgid "Schema"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:228
-#, python-format
-msgid ""
-"\n"
-"        <h1>Error</h1>\n"
-"        <p>An error occurred:</p>\n"
-"        %s\n"
-"        "
+#: ../lib/advene/gui/main.py:289 ../lib/advene/gui/edit/rules.py:1086
+#: ../lib/advene/rules/actions.py:238 ../lib/advene/util/helper.py:414
+msgid "View"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:261
-msgid "<h1>No available mediaplayer</h1>"
+#: ../lib/advene/gui/main.py:290 ../lib/advene/gui/popup.py:488
+#: ../lib/advene/util/helper.py:415
+msgid "Query"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:265
-#, python-format
-msgid ""
-"\n"
-"            <h1>Current STBV: %(currentstbv)s</h1>\n"
-"\n"
-"            <h1>Player status</h1>\n"
-"            <table border=\"1\">\n"
-"            <tr>\n"
-"            <td>Current position</td><td>%(position)s</td>\n"
-"            <td>Duration</td><td>%(duration)s</td>\n"
-"            <td>Player status</td><td>%(status)s</td>\n"
-"            </tr>\n"
-"            </table>\n"
-"            "
+#: ../lib/advene/gui/main.py:291 ../lib/advene/util/helper.py:412
+msgid "Annotation Type"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:284
-msgid "<h1>No playlist</h1>"
+#: ../lib/advene/gui/main.py:292 ../lib/advene/util/helper.py:413
+msgid "Relation Type"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:286
-#, python-format
-msgid ""
-"<h1>Current playlist</h1>\n"
-"                <ul>%s</ul>"
+#: ../lib/advene/gui/main.py:296
+msgid "P_ackage properties"
+msgstr "Komentaraj attributoj"
+
+#: ../lib/advene/gui/main.py:296
+msgid "Edit package properties"
+msgstr "Redakti komentarajn attributojn"
+
+#: ../lib/advene/gui/main.py:297
+msgid "P_references"
+msgstr "Preferoj"
+
+#: ../lib/advene/gui/main.py:297
+msgid "Interface preferences"
+msgstr "Interfacaj preferoj"
+
+#: ../lib/advene/gui/main.py:301
+msgid "_Start Web Browser"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:288
-msgid ""
-"\n"
-"                <form action=\"/media/play\" method=\"GET\">\n"
-"                Starting pos: <input type=\"text\" name=\"position\" value="
-"\"0\">\n"
-"                <input type=\"submit\" value=\"Play\">\n"
-"                </form>\n"
-"                <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
-"\">Pause</a><br>\n"
-"                "
+#: ../lib/advene/gui/main.py:301
+msgid "Start the web browser"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:295
-msgid ""
-"<hr />\n"
-"            <form action=\"/media/load\" method=\"GET\">\n"
-"            Add a new file (<em>dvd</em> to play a DVD):\n"
-"            <input type=\"text\" name=\"filename\">\n"
-"            <input type=\"submit\" value=\"Add\">\n"
-"            </form>"
+#: ../lib/advene/gui/main.py:303
+msgid "Simplify interface"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:301
-msgid ""
-"<h3><a href=\"/media/snapshot\">Access to current packages snapshots</h3>"
+#: ../lib/advene/gui/main.py:303
+#, fuzzy
+msgid "Simplify the application interface (toggle)"
+msgstr "Vidi komentajxojn sur templinio"
+
+#: ../lib/advene/gui/main.py:304
+msgid "Evaluator"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:310
-#, python-format
-msgid "Unknown STBV identifier: %s"
+#: ../lib/advene/gui/main.py:304
+msgid "Open python evaluator window"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:385
-msgid "Media information"
+#: ../lib/advene/gui/main.py:305 ../lib/advene/gui/main.py:4096
+msgid "Webserver log"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:398
-msgid "File added"
+#: ../lib/advene/gui/main.py:307
+msgid "_Player"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:399
-#, python-format
-msgid "<p><strong>%s has been added to the playlist</strong></p>"
+#: ../lib/advene/gui/main.py:308
+msgid "Go to _Time"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:410 ../lib/advene/core/webcherry.py:472
-msgid "Access to packages snapshots"
+#: ../lib/advene/gui/main.py:308
+msgid "Goto a specified time code"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:420 ../lib/advene/core/webcherry.py:482
-msgid "Unknown package alias"
+#: ../lib/advene/gui/main.py:309
+msgid "Save _ImageCache"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:426
-#, python-format
-msgid "Available snapshots for %s"
+#: ../lib/advene/gui/main.py:309
+msgid "Save the contents of the ImageCache to disk"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:432
-#, python-format
-msgid ""
-"<p><a href=\"/media/snapshot/%s?mode=inline\">Display with inline images</"
-"a></p>"
+#: ../lib/advene/gui/main.py:310
+msgid "Reset ImageCache"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:439
-msgid "Done"
+#: ../lib/advene/gui/main.py:310
+msgid "Reset the ImageCache"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:441
-msgid "Pending"
+#: ../lib/advene/gui/main.py:311
+msgid "_Restart player"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:487
-#, fuzzy, python-format
-msgid "Unknown annotation id: %s"
+#: ../lib/advene/gui/main.py:311
+msgid "Restart the player"
+msgstr ""
+
+#: ../lib/advene/gui/main.py:312
+#, fuzzy
+msgid "Display _Media information"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:610 ../lib/advene/core/webcherry.py:728
-#, python-format
-msgid "Cannot activate stbvid %(stbvid)s: %(error)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:312
+#, fuzzy
+msgid "Display information about the current media"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/core/webcherry.py:675
-msgid "<p>No GUI is available."
-msgstr ""
+#: ../lib/advene/gui/main.py:313
+#, fuzzy
+msgid "Update annotation screenshots"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:677
-#, fuzzy, python-format
-msgid "<p>Opened adhoc views: %s</p>"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/main.py:313
+#, fuzzy
+msgid "Update screenshots for annotation bounds"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:678
-msgid "<p>Available adhoc views:</p><ul>"
+#: ../lib/advene/gui/main.py:314
+#, fuzzy
+msgid "Select the player plugin"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:317
+msgid "No package"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:699
-#, python-format
-msgid "<p>Current stbv: %s</p>"
+#: ../lib/advene/gui/main.py:319
+msgid "_Help"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:700
-#, python-format
-msgid "<p>You can activate the following STBV:</p><ul>%s</ul>"
+#: ../lib/advene/gui/main.py:320
+msgid "Help"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:702
-msgid "Activate and play"
+#: ../lib/advene/gui/main.py:321
+msgid "Get support"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:708
-msgid "Application information"
+#: ../lib/advene/gui/main.py:322
+msgid "Check for updates"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:778
-msgid "Missing element id parameter"
+#: ../lib/advene/gui/main.py:323
+msgid "Display shortcuts"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:782
-#, python-format
-msgid "No existing element with id %s"
+#: ../lib/advene/gui/main.py:324
+#, fuzzy
+msgid "Display logfile"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:324
+#, fuzzy
+msgid "Display log messages"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:325
+msgid "Open logfile folder"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:791
-#, python-format
-msgid "<p>The GUI view %s does not exist.</p>"
+#: ../lib/advene/gui/main.py:325
+msgid ""
+"Display logfile folder. It can help when sending the advene.log file by e-"
+"mail."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:798
-msgid "Invalid request"
+#: ../lib/advene/gui/main.py:326
+msgid "_About"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:803
-msgid "Invalid configuration variable name"
+#: ../lib/advene/gui/main.py:352
+msgid "Open a package file"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:815
-msgid "Invalid value"
+#: ../lib/advene/gui/main.py:353
+msgid "Save the current package"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:819
-#, python-format
-msgid "Unsupported method %s"
+#: ../lib/advene/gui/main.py:354
+msgid "Save the package with a new name"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:845
-#, python-format
-msgid ""
-"\n"
-"        <h1>Authorized hosts</h1>\n"
-"        <table border=\"1\">\n"
-"        <tr><th>Host</th><th>IP Addr</th><th>Action</th></tr>\n"
-"        %s\n"
-"        </table>\n"
-"        <form method=\"GET\">\n"
-"        Add a new hostname to the list :<br>\n"
-"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
-"\"Add\">\n"
-"        </form>\n"
-"        "
+#: ../lib/advene/gui/main.py:355
+msgid "Select movie file..."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:859
-msgid "Access control"
+#: ../lib/advene/gui/main.py:356
+msgid "Select DVD"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:864
-msgid "Access control - add a hostname"
+#: ../lib/advene/gui/main.py:358
+#: ../lib/advene/gui/plugins/shotvalidation.py:260
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:810
+#: ../lib/advene/gui/edit/transcribe.py:1178
+msgid "Undo"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:872 ../lib/advene/core/webcherry.py:886
-#, python-format
-msgid "<strong>Error: %s is an invalid hostname.</strong>"
+#: ../lib/advene/gui/main.py:360
+#, fuzzy
+msgid "Create a text annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:361
+#, fuzzy
+msgid "Create a graphical annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:367
+msgid "List recently opened packages"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:875
+#: ../lib/advene/gui/main.py:397
+#, fuzzy
+msgid "Snapshotter activity"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/main.py:399
 #, python-format
-msgid "<p>Added %s to authorized hosts list.</p>"
+msgid "%d queued requests"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:881
-msgid "Access control - delete a hostname"
+#: ../lib/advene/gui/main.py:400
+msgid "Cancel all requests"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:889
-msgid "<strong>Cannot remove the localhost access.</strong>"
-msgstr ""
+#: ../lib/advene/gui/main.py:405
+#, fuzzy
+msgid "No snapshotter"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/core/webcherry.py:894
-#, python-format
-msgid "<p>Removed %s from authorized hosts list.</p>"
+#: ../lib/advene/gui/main.py:427
+msgid "No snapshotting activity"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:896
-#, python-format
-msgid "<p>%s is not in authorized hosts list.</p>"
+#: ../lib/advene/gui/main.py:431
+#, fuzzy
+msgid "Snapshotting"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/main.py:447
+#, fuzzy
+msgid "Display application log messages"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:488
+msgid "Quicksearch lists"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:945
-msgid "Server Administration"
+#: ../lib/advene/gui/main.py:494
+msgid "Please specify the lists of elements to be searched."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:953
+#: ../lib/advene/gui/main.py:513
 #, python-format
 msgid ""
-"\n"
-"        <p><a href=\"/admin/access\">Update the access list</a></p>\n"
-"        <p><a href=\"/admin/methods\">List available TALES methods</a></p>\n"
-"        <p><a href=\"/action\">List available actions</a></p>\n"
-"        <p><a href=\"/admin/reset\">Reset the server</a></p>\n"
-"        <p><a href=\"/media\">Media control</a></p>\n"
-"        <p><a href=\"/application\">Display GUI status</a></p>\n"
-"        <p><a href=\"/admin/list\">List available files</a></p>\n"
-"        <p><a href=\"/packages\">List loaded packages</a> (%(packagelist)s)</"
-"p>\n"
-"        <p>Display mode : %(displaymode)s</p>\n"
-"        <hr>\n"
-"        <p>Load a package :\n"
-"        <form action=\"/admin/load\" method=\"GET\">\n"
-"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
-"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
-"        <input type=\"submit\" value=\"Load\" />\n"
-"        </form>\n"
-"        </body></html>\n"
-"        "
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:983
-msgid "Available files"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:1009
-msgid "You should specify an alias"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:1014
-msgid "You should specify an uri"
+"Searching on %s.\n"
+"Left click to launch the search, right-click to set the quicksearch options"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1020
+#: ../lib/advene/gui/main.py:514
 #, python-format
-msgid "Package %s loaded"
+msgid "String to search in %s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1021 ../lib/advene/core/webcherry.py:1057
-#, python-format
-msgid ""
-"<p>Go to the <a href=\"/packages/%(alias)s\">%(alias)s</a> package, or to "
-"the <a href=\"/packages\">package list</a>."
+#: ../lib/advene/gui/main.py:527 ../lib/advene/gui/main.py:531
+msgid "Tracing : "
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1024
-#, python-format
-msgid "<p>Cannot load package %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:527
+msgid "off"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1035
-#, python-format
-msgid "Package %s deleted"
+#: ../lib/advene/gui/main.py:531
+msgid "on"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1036
-msgid "<p>Go to the <a href=\"/packages\">package list</a>."
+#: ../lib/advene/gui/main.py:543
+#: ../lib/advene/gui/views/interactivequery.py:410
+msgid "String to search"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1039
-#, python-format
-msgid "<p>Cannot delete package %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:551
+msgid "Launch search"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1056
-#, python-format
-msgid "Package %s saved"
+#: ../lib/advene/gui/main.py:556
+msgid "Ignore case"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1060
-#, python-format
-msgid "<p>Cannot save package %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:561
+#, fuzzy
+msgid "Searched elements"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/main.py:645
+msgid "Playing"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1070
-msgid "Server reset"
+#: ../lib/advene/gui/main.py:646
+msgid "Pause"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1076
-msgid "Available TALES methods"
+#: ../lib/advene/gui/main.py:647
+msgid "Init"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1117
-msgid "Loaded package(s)"
+#: ../lib/advene/gui/main.py:648 ../lib/advene/gui/views/table.py:314
+#: ../lib/advene/gui/edit/elements.py:1809
+msgid "End"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1119
-msgid ""
-"\n"
-"        <h1>Loaded package(s)</h1>\n"
-"        <table border=\"1\" width=\"50%\">\n"
-"        <tr>\n"
-"        <th>Alias</th>\n"
-"        <th>Action</th>\n"
-"        <th>URI</th>\n"
-"        <th>Annotations</th>\n"
-"        </tr>\n"
-"        "
+#: ../lib/advene/gui/main.py:649
+msgid "Undefined"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1131
+#: ../lib/advene/gui/main.py:660
 #, python-format
 msgid ""
-"<tr>\n"
-"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
-"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
-"%(uri)s\">Reload</a>|<a href=\"/admin/delete?alias=%(alias)s\">Drop</a>|<a "
-"href=\"/admin/save?alias=%(alias)s\">Save</a></td>\n"
-"            <td>%(uri)s</td>\n"
-"            <td>%(size)d</td>\n"
-"            </tr>\n"
-"            "
+"Wrong player shortcut modifier %s in configuration. Fallback on Control."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1204 ../lib/advene/core/webcherry.py:1279
-#: ../lib/advene/core/webcherry.py:1288 ../lib/advene/core/webcherry.py:1296
-#: ../lib/advene/core/webcherry.py:1454 ../lib/advene/core/webcherry.py:1462
-#: ../lib/advene/core/webcherry.py:1470 ../lib/advene/core/webcherry.py:2032
-#: ../lib/advene/core/webcherry.py:2039
-msgid "Error"
-msgstr ""
+#: ../lib/advene/gui/main.py:679
+#, fuzzy
+msgid "Exception in update_annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:1205
-#, python-format
-msgid "The TALES expression %s is not valid."
-msgstr ""
+#: ../lib/advene/gui/main.py:707
+#, fuzzy
+msgid "Exception in update_relation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:1256
-msgid "Content mode not available on non-content data"
-msgstr ""
+#: ../lib/advene/gui/main.py:729
+#, fuzzy
+msgid "Exception in update_view"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:1280 ../lib/advene/core/webcherry.py:1289
-#: ../lib/advene/core/webcherry.py:1297 ../lib/advene/core/webcherry.py:1317
-#: ../lib/advene/core/webcherry.py:1321 ../lib/advene/core/webcherry.py:1455
-#: ../lib/advene/core/webcherry.py:1463 ../lib/advene/core/webcherry.py:1471
-#: ../lib/advene/core/webcherry.py:1530 ../lib/advene/core/webcherry.py:1607
-#: ../lib/advene/core/webcherry.py:1727 ../lib/advene/core/webcherry.py:1777
-msgid "<h1>Error</h1>"
-msgstr ""
+#: ../lib/advene/gui/main.py:758
+#, fuzzy
+msgid "Exception in update_query"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:1281 ../lib/advene/core/webcherry.py:1322
-#, python-format
-msgid ""
-"<p>There was an error in the template code.</p>\n"
-"                <p>Tag name: <strong>%(tagname)s</strong></p>\n"
-"                <p>Error message: <em>%(message)s</em></p>"
-msgstr ""
+#: ../lib/advene/gui/main.py:778
+#, fuzzy
+msgid "Exception in update_resource"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:1290
-#, python-format
-msgid ""
-"<p>An invalid character is in the Context:</p>\n"
-"                <p>Error message: <em>%(error)s</em></p><pre>%(message)s</"
-"pre>"
-msgstr ""
+#: ../lib/advene/gui/main.py:798
+#, fuzzy
+msgid "Exception in update_schema"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:1298
-#, python-format
-msgid ""
-"<p>There was an error in the TALES expression.</p>\n"
-"                <pre>%s</pre>"
+#: ../lib/advene/gui/main.py:818
+#, fuzzy
+msgid "Exception in update_annotationtype"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:845
+#, fuzzy
+msgid "Exception in update_relationtype"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:951
+msgid "Enter the new time value"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1318
-#, python-format
-msgid ""
-"<p>There was an error.</p>\n"
-"                <pre>%s</pre>"
+#: ../lib/advene/gui/main.py:975
+#, fuzzy, python-format
+msgid "Replace content in %d elements"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:988
+#, fuzzy
+msgid "Find word"
+msgstr "Dosiero"
+
+#: ../lib/advene/gui/main.py:995
+msgid "Replace by"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1342
+#: ../lib/advene/gui/main.py:1023
 #, python-format
-msgid ""
-"\n"
-"            <hr>\n"
-"            <p>\n"
-"            Location: %(location)s<br>\n"
-"            <form name=\"navigation\" method=\"GET\">\n"
-"            <a href=\"%(levelup)s\">Up one level</a> |\n"
-"            Next level :\n"
-"            <select name=\"path\" onchange=\"submit()\">\n"
-"            "
+msgid "%(search)s has been replaced by %(replace)s in %(count)d element(s)."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1360
-msgid ""
-"\n"
-"            </select> View: <select name=\"view\" onchange=\"submit()\">\n"
-"            <option selected></option>\n"
-"            "
+#: ../lib/advene/gui/main.py:1032
+msgid "The video extracting feature is not available."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1378
-#, python-format
-msgid ""
-"<hr>\n"
-"            <p>Evaluating expression \"<strong>%(expression)s</strong>\" on "
-"package %(uri)s returns %(value)s</p>\n"
-"            "
-msgstr ""
+#: ../lib/advene/gui/main.py:1035
+#, fuzzy
+msgid "Video export"
+msgstr "Vido"
 
-#: ../lib/advene/core/webcherry.py:1414
+#: ../lib/advene/gui/main.py:1037
 #, python-format
-msgid "<p>Package <strong>%s</strong> not loaded</p>"
+msgid "Exporting video montage/fragment to %%(filename)s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1456
-#, python-format
+#: ../lib/advene/gui/main.py:1039
+#, fuzzy
+msgid "Please choose a destination filename"
+msgstr "Elekti ilobretan stilon"
+
+#: ../lib/advene/gui/main.py:1117
 msgid ""
-"<p>There was an error in the template code.</p>\n"
-"            <p>Tag name: <strong>%(tagname)s</strong></p>\n"
-"            <p>Error message: <em>%(message)s</em></p>"
+"No media association is defined in the package. Please use the 'File/"
+"Associate a video file' menu item to associate a media file."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1464
+#: ../lib/advene/gui/main.py:1119
 #, python-format
 msgid ""
-"<p>There was an error in the expression.</p>\n"
-"            <pre>%s</pre>"
+"The associated media %s could not be found. Please use the 'File/Associate a "
+"video file' menu item to associate a media file."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1472
+#: ../lib/advene/gui/main.py:1121
 #, python-format
 msgid ""
-"<p>Cannot resolve TALES expression %(expr)s on package %(package)s<p><pre>\n"
-"            %(type)s\n"
-"            %(value)s\n"
-"            %(traceback)s</pre>"
+"You are now working with the following video:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1531 ../lib/advene/core/webcherry.py:1728
-msgid "<p>Cannot set the value : invalid path</p>"
-msgstr ""
+#: ../lib/advene/gui/main.py:1217
+#, fuzzy
+msgid "Open this view..."
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/core/webcherry.py:1593 ../lib/advene/core/webcherry.py:1846
-#, python-format
-msgid ""
-"<h1>Error</h1><p>When creating resource %(path)s, the resource folder "
-"%(folder)s could not be created.</p>"
+#: ../lib/advene/gui/main.py:1218 ../lib/advene/gui/plugins/actions.py:286
+#: ../lib/advene/gui/views/viewbook.py:130
+msgid "...in its own window"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1602 ../lib/advene/core/webcherry.py:1856
-msgid "Resource successfuly created/updated"
+#: ../lib/advene/gui/main.py:1219 ../lib/advene/gui/plugins/actions.py:287
+#: ../lib/advene/gui/views/viewbook.py:131
+#: ../lib/advene/gui/views/__init__.py:398
+msgid "...embedded east of the video"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1611
-msgid "Value successfuly updated"
+#: ../lib/advene/gui/main.py:1220 ../lib/advene/gui/plugins/actions.py:288
+#: ../lib/advene/gui/views/viewbook.py:132
+#: ../lib/advene/gui/views/__init__.py:399
+msgid "...embedded west of the video"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1613
-#, python-format
-msgid ""
-"Unable to update the attribute %(attribute)s for element %(element)s: "
-"%(error)s."
+#: ../lib/advene/gui/main.py:1221 ../lib/advene/gui/plugins/actions.py:289
+#: ../lib/advene/gui/views/viewbook.py:133
+#: ../lib/advene/gui/views/__init__.py:400
+msgid "...embedded south of the video"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1724
-msgid "<p>Invalid request</p>."
+#: ../lib/advene/gui/main.py:1222 ../lib/advene/gui/plugins/actions.py:290
+#: ../lib/advene/gui/views/viewbook.py:134
+#: ../lib/advene/gui/views/__init__.py:401
+msgid "...embedded at the right of the window"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1788 ../lib/advene/core/webcherry.py:1805
-msgid "Value updated"
-msgstr ""
+#: ../lib/advene/gui/main.py:1234
+#, fuzzy
+msgid "_All available views"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:1789
-#, python-format
-msgid ""
-"\n"
-"                <h1>Value updated</h1>\n"
-"                The value of %(path)s has been updated to\n"
-"                <pre>\n"
-"                %(value)s\n"
-"                </pre>\n"
-"                "
+#: ../lib/advene/gui/main.py:1250 ../lib/advene/gui/views/timeline.py:126
+msgid "Timeline"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1806
-#, python-format
-msgid ""
-"\n"
-"                    <h1>Value updated</h1>\n"
-"                    The value of %(path)s has been updated to\n"
-"                    <pre>\n"
-"                    %(value)s\n"
-"                    </pre>\n"
-"                    "
-msgstr ""
+#: ../lib/advene/gui/main.py:1251 ../lib/advene/gui/views/finder.py:808
+#, fuzzy
+msgid "Package finder"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/core/webcherry.py:1817
-#, python-format
-msgid ""
-"Malformed request: cannot update the value of %(attribute)s in %(tales)s."
+#: ../lib/advene/gui/main.py:1252
+#, fuzzy
+msgid "Transcription of annotations"
+msgstr "Importi transkribon"
+
+#: ../lib/advene/gui/main.py:1253
+#, fuzzy
+msgid "Annotation table"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:1256
+msgid "Note-taking editor"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1860
-msgid "Cannot create an element in something else than a package."
+#: ../lib/advene/gui/main.py:1257
+msgid "Active bookmarks"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1877
-#, python-format
-msgid "The identifier %s already exists."
+#: ../lib/advene/gui/main.py:1260 ../lib/advene/gui/views/tagbag.py:57
+msgid "Bag of tags"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1889
-#, python-format
-msgid "<p>Error while creating view %(id)s</p><pre>%(error)s</pre>"
+#: ../lib/advene/gui/main.py:1261
+msgid "TALES explorer"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1895
-msgid "View created"
-msgstr ""
+#: ../lib/advene/gui/main.py:1262
+#, fuzzy
+msgid "Dynamic montage"
+msgstr "Importi transkribon"
 
-#: ../lib/advene/core/webcherry.py:1896
-#, python-format
-msgid ""
-"\n"
-"                 <h1>View <em>%(id)s</em> created</h1>\n"
-"                 <p>The view <a href=\"%(url)s\">%(id)s</a> was successfully "
-"created.</p>\n"
-"                 "
-msgstr ""
+#: ../lib/advene/gui/main.py:1263 ../lib/advene/gui/plugins/videoplayer.py:37
+#, fuzzy
+msgid "Video player"
+msgstr "Vido"
 
-#: ../lib/advene/core/webcherry.py:1912
-#, python-format
-msgid "Missing %s parameter"
-msgstr ""
+#: ../lib/advene/gui/main.py:1266
+#, fuzzy
+msgid "Open a comment view in the web browser"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/core/webcherry.py:1915
-#, python-format
-msgid "Relation type %s does not exist"
+#: ../lib/advene/gui/main.py:1267
+#, fuzzy
+msgid "Create or open a comment view"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/main.py:1270
+msgid ""
+"Edit window placeholder (annotation and relation edit windows will be put "
+"here)"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1922 ../lib/advene/core/webcherry.py:1925
-#, fuzzy, python-format
-msgid "Annotation %s does not exist"
+#: ../lib/advene/gui/main.py:1271
+#, fuzzy
+msgid "Display edition history"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:1928
-#, python-format
-msgid ""
-"<p>Cannot create relation between %(member1)s and %(member2)s: invalid type</"
-"p>"
+#: ../lib/advene/gui/main.py:1300
+msgid "The webserver could not be started. Static views cannot be accessed."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1940
+#: ../lib/advene/gui/main.py:1381
 #, python-format
 msgid ""
-"<p>Error while creating relation between %(member1)s and %(member2)s :</"
-"p><pre>%(error)s</pre>"
+"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s has been "
+"released</b> on %(date)s, but you are running version %(current)s.\n"
+"You can download the latest version from the Advene website: http://advene."
+"org/</span>"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1943
+#: ../lib/advene/gui/main.py:1386
 #, fuzzy
-msgid "Relation created"
-msgstr "Defauxlta regularo"
+msgid "Go to the website"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:1944
-#, fuzzy, python-format
-msgid "<h1>Relation <em>%s</em> created</h1>"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/main.py:1392
+#, fuzzy
+msgid "Advene release"
+msgstr "Advene"
 
-#: ../lib/advene/core/webcherry.py:1954
+#: ../lib/advene/gui/main.py:1398
 #, python-format
-msgid "Annotation type %s does not exist"
+msgid "You are using a up-to-date version of Advene (%(current)s)."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1971
-#, python-format
-msgid ""
-"<p>Error while creating annotation of type %(type)s :<pre>\n"
-"                    %(errortype)s\n"
-"                    %(value)s\n"
-"                    %(traceback)s</pre>"
+#: ../lib/advene/gui/main.py:1398
+msgid "Advene is up-to-date"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1983
-#, fuzzy, python-format
-msgid "Annotation %s created"
+#: ../lib/advene/gui/main.py:1412
+#, fuzzy
+msgid "Choose a color"
+msgstr "Elekti ilobretan stilon"
+
+#: ../lib/advene/gui/main.py:1444
+#, fuzzy
+msgid "Select an annotation to loop on it"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/core/webcherry.py:1985
+#: ../lib/advene/gui/main.py:1446
 #, python-format
-msgid "Error: Cannot create an object of type %s."
+msgid "Looping on %s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1988
-#, python-format
-msgid ""
-"Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</"
-"code></p>"
-msgstr ""
+#: ../lib/advene/gui/main.py:1516 ../lib/advene/gui/main.py:2443
+#, fuzzy
+msgid "No active dynamic view"
+msgstr "Arbvido"
 
-#: ../lib/advene/core/webcherry.py:2001
-msgid "Available actions"
-msgstr ""
+#: ../lib/advene/gui/main.py:1527
+#, fuzzy
+msgid "Create a new dynamic view."
+msgstr "Arbvido"
 
-#: ../lib/advene/core/webcherry.py:2010
-#, python-format
-msgid "<li>%(name)s: %(value)s"
+#: ../lib/advene/gui/main.py:1546
+#, fuzzy
+msgid "Edit the current dynamic view."
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/main.py:1558
+#, fuzzy
+msgid "No dynamic view"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/main.py:1589
+msgid "Playing rate"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2033
-#, python-format
-msgid "<p>Unknown action</p><pre>Action: %s</pre>"
+#: ../lib/advene/gui/main.py:1737
+msgid "History"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2040
-msgid "Missing parameter(s) :<ul>"
+#: ../lib/advene/gui/main.py:1744
+msgid "Popups"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2076
-msgid "Advene web resources"
+#: ../lib/advene/gui/main.py:1748
+msgid ""
+"You can drag and drop view icons (timeline, treeview, transcription...) in "
+"notebooks to embed various views."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2082
-msgid "Advene webserver"
+#: ../lib/advene/gui/main.py:1748 ../lib/advene/gui/main.py:4123
+msgid "Information"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2083
-#, python-format
-msgid ""
-"<p>Welcome on the <a href=\"http://liris.cnrs.fr/advene/\">Advene</a> "
-"webserver run by %(userid)s on %(serveraddress)s.</p>"
+#: ../lib/advene/gui/main.py:2034
+msgid "Cannot create annotation. There is no schema to put it in."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2090
-msgid ""
-" <p>No package is loaded. You can access the <a href=\"/admin\">server "
-"administration page</a>.<p>"
+#: ../lib/advene/gui/main.py:2043
+#, fuzzy
+msgid "Default annotation type"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:2055
+#, fuzzy
+msgid "Annotation created"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:2088
+msgid "Play/Pause [Control-Tab / Control-Space]"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2100
+#: ../lib/advene/gui/main.py:2092
 #, python-format
-msgid ""
-"the <a href=\"/packages/%(alias)s/view/%(view)s\">loaded package's default "
-"view</a>"
+msgid "Rewind (%.02f s) [Control-Left]"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2102
+#: ../lib/advene/gui/main.py:2096
 #, python-format
-msgid "the <a href=\"/packages/%s\">loaded package's data</a>"
+msgid "Forward (%.02f s) [Control-Right]"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2104
-msgid "the <a href=\"/packages\">loaded packages' data</a>"
+#: ../lib/advene/gui/main.py:2100
+msgid "Previous frame [Control-Down]"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2105
-#, python-format
-msgid ""
-" <p>You can either access %s or the <a href=\"/admin\">server administration "
-"page</a>.<p>"
+#: ../lib/advene/gui/main.py:2104
+msgid "Next frame [Control-Up]"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2107
-#, python-format
-msgid ""
-"<hr><p align=\"right\"><em>Document generated by <a href=\"http://liris.cnrs."
-"fr/advene/\">Advene</a> v. %s.</em></p>"
+#: ../lib/advene/gui/main.py:2108
+msgid "Fullscreen"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2189 ../lib/advene/core/webcherry.py:2198
+#: ../lib/advene/gui/main.py:2290
 #, python-format
-msgid "Cannot start HTTP server: %s"
+msgid "Screenshot saved to %s"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:61
+#: ../lib/advene/gui/main.py:2292
 #, python-format
-msgid "%s exists but is not a directory. Cancelling website export"
+msgid ""
+"Screenshot saved in\n"
+" %s"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:67
+#: ../lib/advene/gui/main.py:2294
 #, fuzzy, python-format
-msgid "%s does not exist"
+msgid ""
+"Could not save screenshot:\n"
+" %s"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/util/website_export.py:422
-msgid "Starting export"
+#: ../lib/advene/gui/main.py:2302
+msgid "Save screenshot to..."
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:451
-#, python-format
-msgid "Depth %d"
+#: ../lib/advene/gui/main.py:2320
+msgid "Could not take snapshot with enough precision"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:455
-#, python-format
-msgid "Depth %(depth)d: processing %(url)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:2358
+#, fuzzy
+msgid "Export package data"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/util/website_export.py:477
-msgid "Finalizing"
-msgstr ""
+#: ../lib/advene/gui/main.py:2360
+#, fuzzy, python-format
+msgid "Export annotation type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/util/website_export.py:511
-#, python-format
-msgid ""
-"<p><strong>You should probably begin at <a href=\"%(href)s\">%(title)s</a>.</"
-"strong></p>"
-msgstr ""
+#: ../lib/advene/gui/main.py:2362
+#, fuzzy, python-format
+msgid "Export element %s"
+msgstr "Arbvido"
 
-#: ../lib/advene/util/website_export.py:554
+#: ../lib/advene/gui/main.py:2388
 #, fuzzy
-msgid "Export complete"
+msgid "Export format"
 msgstr "Importi dosieron"
 
-#: ../lib/advene/util/importer.py:134
-msgid "Generic importer"
+#: ../lib/advene/gui/main.py:2425
+#, fuzzy
+msgid " (modified)"
+msgstr "Komentaraj attributoj"
+
+#: ../lib/advene/gui/main.py:2428
+#, python-format
+msgid "Activate %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:161
-msgid "Usage: %prog [options] source-file destination-file"
+#: ../lib/advene/gui/main.py:2598
+msgid "Saved workspace"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:165
-msgid "Specify the offset in ms"
+#: ../lib/advene/gui/main.py:2651
+msgid "Restoring workspace..."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:210
-msgid ""
-"Import filter error. The asynchronous API should be used, please report a "
-"bug."
+#: ../lib/advene/gui/main.py:2657
+#, python-format
+msgid "Do you wish to restore the %s workspace ?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:212
-msgid ""
-"Import filter error. No conversion method is defined,  please report a bug."
+#: ../lib/advene/gui/main.py:2662
+#, fuzzy
+msgid "Clear the current workspace"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/main.py:2683
+#, python-format
+msgid "View %s is not an adhoc view"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:344
+#: ../lib/advene/gui/main.py:2694
 #, python-format
-msgid "Converted from %s"
+msgid "Cannot identify the adhoc view %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:469
-#, fuzzy
-msgid "ExternalApp importer"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/main.py:2708
+msgid "Choose the annotation type to display as transcription."
+msgstr ""
 
-#: ../lib/advene/util/importer.py:483
+#: ../lib/advene/gui/main.py:2743
 #, python-format
-msgid ""
-"The <b>%s</b> application does not seem to be installed. Please check that "
-"it is present and that its path is correctly specified in preferences."
+msgid "Error: unable to find an edit popup for %(element)s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:485
-#, fuzzy, python-format
-msgid "The file %s does not seem to exist."
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/util/importer.py:507
+#: ../lib/advene/gui/main.py:2750
 #, fuzzy, python-format
-msgid "Could not run %(appname)s: %(msg)s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Editing %s"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/util/importer.py:509
+#: ../lib/advene/gui/main.py:2762
 #, fuzzy, python-format
-msgid "Processing %s"
-msgstr "Importi dosieron"
+msgid "Comment view (%s)"
+msgstr "Arbvido"
 
-#: ../lib/advene/util/importer.py:513
-msgid "Cleaning up..."
+#: ../lib/advene/gui/main.py:2829
+#, python-format
+msgid "Package %(uri)s saved: %(annotations)s and %(relations)s."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:633
-msgid "Text importer"
+#: ../lib/advene/gui/main.py:2840
+#, python-format
+msgid "Activating package %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:646 ../lib/advene/util/importer.py:1176
-msgid "Specify the encoding of the input file (latin1, utf8...)"
+#: ../lib/advene/gui/main.py:2868
+#, python-format
+msgid "Package %(uri)s loaded: %(annotations)s and %(relations)s."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:649
-msgid "Should the timestamps be encoded relative to the first timestamp?"
+#: ../lib/advene/gui/main.py:2900
+msgid "Do you want to restore the saved workspace ?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:652
-msgid "Unit to consider for integers"
-msgstr ""
+#: ../lib/advene/gui/main.py:2907
+msgid "Advene"
+msgstr "Advene"
 
-#: ../lib/advene/util/importer.py:655
-msgid ""
-"What timestamps are present in a line (only begin, both begin and end, or "
-"automatic recognition)"
-msgstr ""
+#: ../lib/advene/gui/main.py:2957
+#, fuzzy, python-format
+msgid "Video player error: %s"
+msgstr "Vido"
 
-#: ../lib/advene/util/importer.py:798
-msgid "lsdvd importer"
-msgstr ""
+#: ../lib/advene/gui/main.py:3137 ../lib/advene/gui/main.py:3158
+#, fuzzy
+msgid "Unknown"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/util/importer.py:825
-msgid "Processing data"
+#: ../lib/advene/gui/main.py:3228
+#, python-format
+msgid ""
+"The package(s) %s are modified.\n"
+"Save them now?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:843 ../lib/advene/util/importer.py:903
-#, fuzzy
-msgid "DVD Chapter"
-msgstr "Importi DVD cxapitrojn"
-
-#: ../lib/advene/util/importer.py:847
-msgid "Launching lsdvd..."
+#: ../lib/advene/gui/main.py:3252
+#: ../lib/advene/gui/views/interactivequery.py:376
+msgid "Empty quicksearch string"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:859
-msgid "chaplin importer"
+#: ../lib/advene/gui/main.py:3255
+#: ../lib/advene/gui/views/interactivequery.py:281
+#, python-format
+msgid "'%s'"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:917
-msgid "Xi importer"
+#: ../lib/advene/gui/main.py:3270
+msgid "Choose an annotation type."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:986
-msgid "ELAN importer"
+#: ../lib/advene/gui/main.py:3289 ../lib/advene/gui/views/timeline.py:3035
+#: ../lib/advene/gui/edit/transcribe.py:994
+msgid "Create a new annotation type"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1039
-#, python-format
-msgid "Converting tier %s"
+#: ../lib/advene/gui/main.py:3314
+msgid "No annotation type is defined."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1140
-msgid "Processing time slots"
-msgstr ""
+#: ../lib/advene/gui/main.py:3323
+#, fuzzy
+msgid "Creating a new type."
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/util/importer.py:1155
+#: ../lib/advene/gui/main.py:3327
 #, fuzzy
-msgid "Fixing forward references"
-msgstr "Interfacaj preferoj"
+msgid "Title of the new type"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/util/importer.py:1157
-msgid "Creating relations"
+#: ../lib/advene/gui/main.py:3328
+msgid ""
+"Id of the new type. It is generated from the title, but you may change it if "
+"necessary."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1169
-msgid "Subtitle (SRT) importer"
+#: ../lib/advene/gui/main.py:3332
+#, fuzzy
+msgid "Specify the content-type for the annotation type"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/main.py:3334
+#, fuzzy
+msgid "Content type"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/main.py:3341 ../lib/advene/gui/main.py:3450
+msgid "Create a new schema"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1238
-#, python-format
-msgid "Subtitles from %s"
+#: ../lib/advene/gui/main.py:3354
+msgid "Choose an existing schema for the new type, or create a new one"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1251
-msgid "PRAAT importer"
+#: ../lib/advene/gui/main.py:3357 ../lib/advene/gui/main.py:3465
+msgid "Specify the schema title"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1341
-msgid "CMML importer"
+#: ../lib/advene/gui/main.py:3361
+msgid "Title of the new schema"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1404
-msgid "Parsing clip information"
+#: ../lib/advene/gui/main.py:3362
+msgid ""
+"Id of the new schema. It is generated from the title, but you may change it "
+"if necessary."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1501
-#: ../lib/advene/plugins/transcriber.py:254
-msgid "Creating package"
+#: ../lib/advene/gui/main.py:3385
+msgid ""
+"You specified a annotation-type identifier that already exists. Aborting."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1504
-msgid "Creating CMML schema"
+#: ../lib/advene/gui/main.py:3403
+msgid "You specified a existing schema identifier. Using the existing schema."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1508
-#: ../lib/advene/plugins/transcriber.py:260
-#, fuzzy
-msgid "Creating annotation types"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/main.py:3405
+msgid ""
+"You specified an existing identifier that does not reference a schema. "
+"Aborting."
+msgstr ""
 
-#: ../lib/advene/util/importer.py:1514
-#: ../lib/advene/plugins/transcriber.py:265
-msgid "Parsing header information"
+#: ../lib/advene/gui/main.py:3432
+msgid "Choose a schema."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1528
-msgid "Parsing stream information"
+#: ../lib/advene/gui/main.py:3492
+msgid "You specified an existing identifier. Aborting."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1562
-#, fuzzy
-msgid "IRI importer"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/main.py:3512
+#, fuzzy, python-format
+msgid "Package %s modified"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/util/importer.py:1571
-msgid "Generate one type per view"
+#: ../lib/advene/gui/main.py:3513
+#, python-format
+msgid ""
+"The package %s has been modified but not saved.\n"
+"Save it now?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1591
+#: ../lib/advene/gui/main.py:3523
 #, python-format
-msgid "Parsing ensemble %s"
+msgid "%s snapshots"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1602
+#: ../lib/advene/gui/main.py:3524
 #, python-format
-msgid "Parsing decoupage %s"
+msgid "Do you want to save the snapshots for media %s?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1638
-msgid "Parsing views"
+#: ../lib/advene/gui/main.py:3531 ../lib/advene/gui/main.py:3540
+#: ../lib/advene/gui/main.py:4541
+#, python-format
+msgid "Cannot save imagecache for %(media)s: %(e)s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1686 ../lib/advene/util/importer.py:1775
-msgid "Initializing package"
+#: ../lib/advene/gui/main.py:3554
+msgid "first frame"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1724
-#, fuzzy
-msgid "IRIData importer"
-msgstr "Importi dosieron"
-
-#: ../lib/advene/util/importer.py:1738
-msgid "Parsing sound values"
+#: ../lib/advene/gui/main.py:3555
+msgid "last frame"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1750
-#, fuzzy
-msgid "Creating annotations"
+#: ../lib/advene/gui/main.py:3563
+#, fuzzy, python-format
+msgid "Click on %(bound)s of %(annotation)s"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/util/helper.py:402
-msgid "Package"
-msgstr ""
+#: ../lib/advene/gui/main.py:3566
+#, fuzzy, python-format
+msgid "Update %(bound)s of %(annotation)s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/util/helper.py:403
-msgid "Annotation"
+#: ../lib/advene/gui/main.py:3585
+msgid "Click on the frame corresponding to the timestamp value"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:404
-msgid "Relation"
-msgstr ""
+#: ../lib/advene/gui/main.py:3587
+#, fuzzy
+msgid "Set new timestamp value"
+msgstr "Arbvido"
 
-#: ../lib/advene/util/helper.py:405 ../lib/advene/gui/edit/schemaeditor.py:111
-#: ../lib/advene/gui/main.py:276 ../lib/advene/gui/main.py:3270
-msgid "Schema"
-msgstr ""
+#: ../lib/advene/gui/main.py:3594
+#, fuzzy
+msgid ""
+"<b>Annotation statistics</b>\n"
+"\n"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/util/helper.py:406 ../lib/advene/gui/main.py:279
-msgid "Annotation Type"
-msgstr ""
+#: ../lib/advene/gui/main.py:3666
+#, fuzzy
+msgid "Text annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/util/helper.py:407 ../lib/advene/gui/main.py:280
-msgid "Relation Type"
-msgstr ""
+#: ../lib/advene/gui/main.py:3674 ../lib/advene/gui/main.py:3699
+#, fuzzy
+msgid "Cannot find an appropriate annotation type"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/util/helper.py:408 ../lib/advene/rules/actions.py:236
-#: ../lib/advene/gui/edit/rules.py:1087 ../lib/advene/gui/main.py:277
-msgid "View"
-msgstr ""
+#: ../lib/advene/gui/main.py:3676 ../lib/advene/gui/views/bookmarks.py:293
+#, fuzzy
+msgid "Comment here"
+msgstr "Arbvido"
 
-#: ../lib/advene/util/helper.py:409 ../lib/advene/gui/main.py:278
-#: ../lib/advene/gui/popup.py:459
-msgid "Query"
-msgstr ""
+#: ../lib/advene/gui/main.py:3692
+#, fuzzy
+msgid "Graphical annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/util/helper.py:410
-msgid "Resource Folder"
+#: ../lib/advene/gui/main.py:3744
+msgid ""
+"An unsaved template package exists\n"
+"Save it first."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:411 ../lib/advene/gui/edit/create.py:122
-msgid "Resource File"
+#: ../lib/advene/gui/main.py:3753
+msgid "Package modified"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:446
-msgid "---- Elements ----"
+#: ../lib/advene/gui/main.py:3754
+msgid ""
+"The package that you want to close has been modified but not saved.\n"
+"Save it now?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:452
-msgid "---- Attributes ----"
+#: ../lib/advene/gui/main.py:3787
+msgid "Load a package"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:455
-msgid "---- Methods ----"
+#: ../lib/advene/gui/main.py:3800
+msgid ""
+"A video file was selected. Pretend that the user selected 'Select a video "
+"file'..."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:531
+#: ../lib/advene/gui/main.py:3805
 #, python-format
-msgid "Cannot read %(filename)s: %(error)s"
+msgid ""
+"The file %s does not look like a valid Advene package. It should have a .azp "
+"or .xml extension. Try to open anyway?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:555
-#, python-format
+#: ../lib/advene/gui/main.py:3814
 msgid ""
-"Error:\n"
-"%s"
+"You are trying to load a session file, but there are unsaved packages. "
+"Proceed anyway?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:565
+#: ../lib/advene/gui/main.py:3823
 #, python-format
 msgid ""
-"Package %(title)s:\n"
-"%(schema)s\n"
-"%(annotation)s in %(annotation_type)s\n"
-"%(relation)s in %(relation_type)s\n"
-"%(query)s\n"
-"%(view)s\n"
-"\n"
-"Description:\n"
-"%(description)s\n"
+"Cannot load package %(filename)s:\n"
+"%(error)s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:592
-#, fuzzy
-msgid "Min duration"
-msgstr "Elekti ilobretan stilon"
-
-#: ../lib/advene/util/helper.py:593
-#, fuzzy
-msgid "Max duration"
-msgstr "Elekti ilobretan stilon"
-
-#: ../lib/advene/util/helper.py:594
+#: ../lib/advene/gui/main.py:3843 ../lib/advene/gui/main.py:3899
 #, fuzzy
-msgid "Mean duration"
-msgstr "Elekti ilobretan stilon"
+msgid "Do you want to save the current workspace ?"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/util/helper.py:595
-#, fuzzy
-msgid "Total duration"
+#: ../lib/advene/gui/main.py:3858 ../lib/advene/gui/main.py:3914
+#, fuzzy, python-format
+msgid "Could not save the package: %s"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/util/helper.py:601
-msgid "schema"
+#: ../lib/advene/gui/main.py:3871
+#, python-format
+msgid "Save the package %s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:601
-msgid "schemas"
+#: ../lib/advene/gui/main.py:3884
+msgid "Invalid file extension"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:602
-msgid "annotation"
+#: ../lib/advene/gui/main.py:3885
+#, python-format
+msgid ""
+"Your package contains resources,\n"
+"the filename (%s) should have a .azp extension.\n"
+"Should I put the correct extension?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:602
-msgid "annotations"
+#: ../lib/advene/gui/main.py:3889
+msgid "OK, the resources will be lost."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:603 ../lib/advene/util/helper.py:604
-msgid "annotation type"
+#: ../lib/advene/gui/main.py:3891
+msgid "Aborting package saving"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:603 ../lib/advene/util/helper.py:604
-msgid "annotation types"
+#: ../lib/advene/gui/main.py:3925
+msgid "Save the session in..."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:605
-msgid "relation"
+#: ../lib/advene/gui/main.py:3936
+#, python-format
+msgid "Session saved in %s"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:605
-msgid "relations"
+#: ../lib/advene/gui/main.py:3945
+msgid "Do you confirm the creation of annotations matching the DVD chapters?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:606 ../lib/advene/util/helper.py:607
-msgid "relation type"
+#: ../lib/advene/gui/main.py:3951
+msgid "Cannot import DVD chapters. Did you install the lsdvd software?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:606 ../lib/advene/util/helper.py:607
-msgid "relation types"
+#: ../lib/advene/gui/main.py:3959
+msgid "The associated media is not a DVD."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:608
-msgid "query"
+#: ../lib/advene/gui/main.py:3970
+#, fuzzy, python-format
+msgid "Processing %s video"
+msgstr "Importi dosieron"
+
+#: ../lib/advene/gui/main.py:3973
+#, fuzzy
+msgid "No associated video file"
+msgstr "Vido"
+
+#: ../lib/advene/gui/main.py:4000
+msgid "Standard RuleSet"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:608
-msgid "queries"
+#: ../lib/advene/gui/main.py:4112
+#, python-format
+msgid ""
+"Media information\n"
+"\n"
+"URI: %(uri)s\n"
+"Framerate: %(framerate_denom)d / %(framerate_num)d (%(framerate).02f )\n"
+"Duration: %(duration_formatted)s (%(duration)d ms) (cached: "
+"%(cached_duration_formatted)s)\n"
+"Current position: %(position_formatted)s (%(position)d ms)\n"
+"\n"
+"Original image size: %(width)d x %(height)d\n"
+"\n"
+"Image cache information: %(imagecache)s\n"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:609
-msgid "view"
+#: ../lib/advene/gui/main.py:4137
+msgid "Visit the Advene web site for examples and documentation."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:609
-msgid "views"
+#: ../lib/advene/gui/main.py:4170 ../lib/advene/gui/main.py:4258
+msgid "Select a movie file"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:610
-msgid "package"
+#: ../lib/advene/gui/main.py:4182
+msgid "Title/Chapter selection"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:610
-msgid "packages"
+#: ../lib/advene/gui/main.py:4224
+msgid "Select a video stream"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:622
-#, python-format
-msgid "No %s"
+#: ../lib/advene/gui/main.py:4225
+msgid "Enter the address of a video stream"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:624
+#: ../lib/advene/gui/main.py:4229
 #, python-format
-msgid "1 %s"
+msgid "Successfully extracted the video stream address (%s) from the url.\n"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:626
-#, python-format
-msgid "%(count)d %(plural)s"
+#: ../lib/advene/gui/main.py:4254
+msgid "Package properties"
 msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:76
-#, fuzzy
-msgid "Cinelab importer"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/main.py:4255 ../lib/advene/gui/edit/elements.py:516
+#: ../lib/advene/gui/edit/elements.py:565
+#: ../lib/advene/gui/edit/elements.py:652
+#: ../lib/advene/gui/edit/elements.py:732
+#: ../lib/advene/gui/edit/elements.py:789
+#: ../lib/advene/gui/edit/elements.py:881
+#: ../lib/advene/gui/edit/elements.py:950
+#: ../lib/advene/gui/edit/elements.py:1062
+#: ../lib/advene/gui/edit/elements.py:1124
+msgid "Author"
+msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:119 ../lib/advene/plugins/cinelab.py:121
-#, python-format
-msgid "File %s is not an Advene2 zip package."
+#: ../lib/advene/gui/main.py:4255
+msgid "Author name"
 msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:176
-#, fuzzy
-msgid "Converting annotation types"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/main.py:4256 ../lib/advene/gui/edit/elements.py:517
+#: ../lib/advene/gui/edit/elements.py:566
+#: ../lib/advene/gui/edit/elements.py:653
+#: ../lib/advene/gui/edit/elements.py:733
+#: ../lib/advene/gui/edit/elements.py:790
+#: ../lib/advene/gui/edit/elements.py:882
+#: ../lib/advene/gui/edit/elements.py:951
+#: ../lib/advene/gui/edit/elements.py:1063
+#: ../lib/advene/gui/edit/elements.py:1125
+msgid "Date"
+msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:217
+#: ../lib/advene/gui/main.py:4256
 #, fuzzy
-msgid "Converting views"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Package creation date"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/plugins/cinelab.py:249
-#: ../lib/advene/plugins/youtubeannotations.py:72
-#, fuzzy
-msgid "Importing annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/main.py:4257 ../lib/advene/gui/views/table.py:681
+#: ../lib/advene/gui/util/dialog.py:391 ../lib/advene/gui/edit/imports.py:334
+#: ../lib/advene/gui/edit/dvdselect.py:75
+#: ../lib/advene/gui/edit/transcribe.py:1022
+msgid "Title"
+msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:41
+#: ../lib/advene/gui/main.py:4257
 #, fuzzy
-msgid "ShotdetectApp importer"
-msgstr "Importi dosieron"
+msgid "Package title"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/plugins/shotdetectapp.py:52
-msgid ""
-"Sensitivity of the algorithm. It should typically be between 50 and 80. If "
-"too many shots are detected, try to increase its value."
+#: ../lib/advene/gui/main.py:4258
+msgid "Associated media"
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:80
-#: ../lib/advene/plugins/goodshotdetector.py:78
-msgid "Detected shots"
+#: ../lib/advene/gui/main.py:4259 ../lib/advene/gui/views/table.py:315
+msgid "Duration"
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:140 ../lib/advene/gui/main.py:5130
-#, fuzzy, python-format
-msgid "Detected shot #%(num)d at %(pos)s "
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/plugins/youtubeannotations.py:33
-#, fuzzy
-msgid "Youtube XML annotations importer"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/plugins/brltty.py:62
-msgid "Input from the braille table."
+#: ../lib/advene/gui/main.py:4259
+msgid "Media duration in ms"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:66
-msgid "BrlTTY not installed. There will be no braille support."
+#: ../lib/advene/gui/main.py:4259
+#: ../lib/advene/gui/plugins/eventaccumulator.py:143
+msgid "Reset"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:78
-msgid "Could not initialize BrlTTY. No braille support."
+#: ../lib/advene/gui/main.py:4320 ../lib/advene/gui/views/timeline.py:3522
+#: ../lib/advene/gui/views/timeline.py:3677
+#: ../lib/advene/gui/views/tagbag.py:64
+#: ../lib/advene/gui/edit/properties.py:181
+#: ../lib/advene/gui/edit/transcribe.py:148
+#: ../lib/advene/gui/edit/transcribe.py:1162
+msgid "Preferences"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:84
-#, fuzzy
-msgid "Display a message in Braille"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/main.py:4322
+msgid "Paths"
+msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:85
-msgid "Message to display."
+#: ../lib/advene/gui/main.py:4324
+msgid "Data"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:88 ../lib/advene/plugins/tts.py:81
-#: ../lib/advene/rules/actions.py:40 ../lib/advene/rules/actions.py:107
-#: ../lib/advene/rules/actions.py:123 ../lib/advene/gui/plugins/actions.py:44
-#: ../lib/advene/gui/plugins/actions.py:58
-#: ../lib/advene/gui/plugins/actions.py:110
-#: ../lib/advene/gui/plugins/actions.py:399
-#: ../lib/advene/gui/plugins/actions.py:527
-#: ../lib/advene/gui/edit/rules.py:766
-#, fuzzy
-msgid "The annotation content"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/main.py:4324
+msgid "Standard directory for data files"
+msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:240 ../lib/advene/plugins/tts.py:110
-#: ../lib/advene/gui/plugins/actions.py:234
-msgid "Unknown rule"
+#: ../lib/advene/gui/main.py:4325
+msgid "Movie path"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:241 ../lib/advene/plugins/tts.py:111
-#: ../lib/advene/gui/plugins/actions.py:235
+#: ../lib/advene/gui/main.py:4325
 #, python-format
 msgid ""
-"Rule %(rulename)s: Error in the evaluation of the parameter "
-"%(parametername)s:"
+"List of directories (separated by %s) to search for movie files (_ means "
+"package directory)"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:256
-#, python-format
-msgid "BrlTTY connection error: %s"
+#: ../lib/advene/gui/main.py:4326
+msgid "Imagecache"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:273
-msgid "Braille display: "
+#: ../lib/advene/gui/main.py:4326
+msgid "Directory for storing the snapshot cache"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:279
-msgid "No message"
+#: ../lib/advene/gui/main.py:4327
+msgid "Player"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:45
+#: ../lib/advene/gui/main.py:4327
+msgid "Directory of the video player"
+msgstr ""
+
+#: ../lib/advene/gui/main.py:4328
 #, fuzzy
-msgid "Shot detection (Delakis version)"
+msgid "Shotdetect"
 msgstr "Importi dosieron"
 
-#: ../lib/advene/plugins/goodshotdetector.py:60
-msgid "Cache histogram alongside video files."
-msgstr ""
+#: ../lib/advene/gui/main.py:4328
+#, fuzzy
+msgid "Shotdetect application"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/plugins/goodshotdetector.py:63
-msgid ""
-"Parameter profile: safe will detect less cuts, aggressive will detect more "
-"cuts (but more false ones too). default is a compromise."
+#: ../lib/advene/gui/main.py:4330
+msgid "GUI"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:77
-#, python-format
-msgid "Shot (%s profile)"
+#: ../lib/advene/gui/main.py:4331
+msgid "Interface language (after restart)"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:83
-msgid "Loading histogram"
+#: ../lib/advene/gui/main.py:4331
+msgid ""
+"Language used for the interface (necessitates to restart the application)"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:146
+#: ../lib/advene/gui/main.py:4332 ../lib/advene/gui/util/initialconfig.py:88
 #, fuzzy
-msgid "Computing hdiff"
-msgstr "Arbvido"
-
-#: ../lib/advene/plugins/goodshotdetector.py:153
-#, fuzzy
-msgid "Detecting cuts"
+msgid "System default"
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/plugins/goodshotdetector.py:180
-msgid "Detecting dissolves"
+#: ../lib/advene/gui/main.py:4337
+msgid "Record activity trace"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:265
-#, fuzzy
-msgid "Extracting histogram"
-msgstr "Importi dosieron"
-
-#: ../lib/advene/plugins/anvil.py:35
-#, fuzzy
-msgid "Anvil importer"
-msgstr "Importi dosieron"
-
-#: ../lib/advene/plugins/annotationgraph.py:40
-#, fuzzy
-msgid "AnnotationGraph importer"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/plugins/fcp.py:33
-msgid "Final Cut Pro XML importer"
+#: ../lib/advene/gui/main.py:4338
+msgid "Expert mode"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:55
-msgid "FCP clipitem"
+#: ../lib/advene/gui/main.py:4338
+msgid "Offer advanced possibilities"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:75
-#, fuzzy
-msgid "Importing subtitles"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/main.py:4339
+msgid "Prefer WYSIWYG"
+msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:90
-#, fuzzy
-msgid "Importing clips"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/main.py:4339
+msgid "Use WYSIWYG editors when possible (HTML, SVG)"
+msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:93
-msgid "No clip"
+#: ../lib/advene/gui/main.py:4340
+msgid "Player control modifier"
 msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:219
-#, python-format
-msgid "Cannot export to %(fname)s: %(e)s"
+#: ../lib/advene/gui/main.py:4340
+msgid ""
+"Generic player control modifier: key used in combination with arrows/space/"
+"tab to control the player. Click the button and press key+space to choose "
+"the modifier."
 msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:1129
-#: ../lib/advene/plugins/tracebuilder.py:1168
-#, python-format
-msgid "Cannot export to %(host)s:%(port)s %(error)s"
+#: ../lib/advene/gui/main.py:4341
+msgid "Player control in edit popups"
 msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:1143
-#, fuzzy, python-format
-msgid "Cannot send data to %(host)s:%(port)s %(error)s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/main.py:4341
+msgid ""
+"Enable generic player controls in edit windows. This may be undesirable "
+"since it overloads some standard text-edition behaviours (esp. control-left/"
+"right)."
+msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:1191
-#, fuzzy, python-format
-msgid "Cannot send event %(nb)s to %(host)s:%(port)s %(error)s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/main.py:4342
+msgid "Open popups"
+msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:1197
-#, python-format
-msgid "%(nb)s events sent to %(host)s:%(port)s during session."
+#: ../lib/advene/gui/main.py:4343
+msgid "Where should we open adhoc views?"
 msgstr ""
 
-#: ../lib/advene/plugins/dcp.py:65
-#, fuzzy
-msgid "DCP importer"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/main.py:4344
+msgid "as a popup window"
+msgstr ""
 
-#: ../lib/advene/plugins/dcp.py:120
-#, python-format
-msgid "Converting #%(num)d / %(count)d"
+#: ../lib/advene/gui/main.py:4345
+msgid "embedded east of the video"
 msgstr ""
 
-#: ../lib/advene/plugins/ttl.py:41
-#, fuzzy
-msgid "TurTLe (RDF) importer"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/main.py:4346
+msgid "embedded west of the video"
+msgstr ""
 
-#: ../lib/advene/plugins/aeidon_import.py:48
-#, fuzzy
-msgid "Aeidon (subtitles) importer"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/main.py:4347
+msgid "embedded south of the video"
+msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:47
-#: ../lib/advene/plugins/soundenveloppe.py:143
-#: ../lib/advene/plugins/soundenveloppe.py:145
-#, fuzzy
-msgid "Sound enveloppe"
-msgstr "Dosiero"
+#: ../lib/advene/gui/main.py:4348
+msgid "embedded at the right of the window"
+msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:60
-msgid "Interval (in ms) at which to take samples."
+#: ../lib/advene/gui/main.py:4351
+msgid "History size"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:63
-msgid "Maximum number of samples per annotation."
+#: ../lib/advene/gui/main.py:4351
+msgid "History filelist size limit"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:66
-#: ../lib/advene/plugins/cutter.py:56
-#, fuzzy
-msgid "Channel selection."
-msgstr "Vido"
+#: ../lib/advene/gui/main.py:4353
+msgid "Remember window size"
+msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:90
-#: ../lib/advene/plugins/pocketsphinx.py:119
-#: ../lib/advene/plugins/barcode.py:58
-#, fuzzy
-msgid "Generating annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/main.py:4353
+msgid "Remember the size of opened windows"
+msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:115
-#, python-format
-msgid "At %s"
+#: ../lib/advene/gui/main.py:4354
+msgid "Bookmark snapshot width"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:162
-#, fuzzy
-msgid "Extracting sound enveloppe"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/main.py:4354
+msgid "Width of the snapshots representing bookmarks"
+msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:39
-#, fuzzy
-msgid "Audio segmentation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/main.py:4355
+msgid "Bookmark snapshot precision"
+msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:53
-msgid "Volume threshold (in dB, can be negative) before trigger."
+#: ../lib/advene/gui/main.py:4355
+msgid "Precision (in ms) of the displayed bookmark snapshots."
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:101
-#, fuzzy, python-format
-msgid "Detected %(count)d segments until %(time)s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/main.py:4357
+msgid "Frame selector (shotvalidation...)"
+msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:119
-#, fuzzy
-msgid "Sound segment"
-msgstr "Dosiero"
+#: ../lib/advene/gui/main.py:4358
+msgid "Frameselector snapshot width"
+msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:120
-#, python-format
-msgid ""
-"Sound segmentation with a threshold of %(threshold)d dB - channel: "
-"%(channel)s"
+#: ../lib/advene/gui/main.py:4358
+msgid "Width of the snapshots in frameselector"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:138
-#, fuzzy
-msgid "Starting silence detection"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/main.py:4359
+msgid "Frameselector count"
+msgstr ""
 
-#: ../lib/advene/plugins/montagerenderer.py:43
-msgid "Cannot register montage renderer: Gnonlin plugins are not present."
+#: ../lib/advene/gui/main.py:4359
+msgid "Number of frames displayed in frameselector."
 msgstr ""
 
-#: ../lib/advene/plugins/mpeg7.py:54
-#, fuzzy
-msgid "MPEG7 importer"
-msgstr "Importi dosieron"
-
-#: ../lib/advene/plugins/transcriber.py:40
-#, fuzzy
-msgid "Transcriber importer"
-msgstr "Importi dosieron"
-
-#: ../lib/advene/plugins/transcriber.py:86
-msgid "Parsing section information"
-msgstr ""
-
-#: ../lib/advene/plugins/transcriber.py:276
-msgid "Parsing topic and speaker tables information"
+#: ../lib/advene/gui/main.py:4361
+msgid "General"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:42
-msgid "Feature detection (face...)"
+#: ../lib/advene/gui/main.py:4362
+msgid "Weekly update check"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:57
-msgid "Sensitivity level."
+#: ../lib/advene/gui/main.py:4362 ../lib/advene/gui/util/initialconfig.py:90
+msgid "Weekly check for updates on the Advene website"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:60
-msgid ""
-"Scale. Original image size will be divided by this factor, in order to speed "
-"up detection."
+#: ../lib/advene/gui/main.py:4363
+msgid "On exit,"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:63
-msgid "Classifier"
+#: ../lib/advene/gui/main.py:4364
+msgid "How to handle screenshots on exit"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:77
-#, python-format
-msgid "Feature %s"
+#: ../lib/advene/gui/main.py:4365
+msgid "never save screenshots"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:79
-#, fuzzy, python-format
-msgid "Detected %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/plugins/featuredetect.py:81
-#, fuzzy
-msgid "Detection started"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/plugins/featuredetect.py:171
-#, python-format
-msgid "Detected %(count)d feature(s) until %(time)s"
+#: ../lib/advene/gui/main.py:4366
+msgid "always save screenshots"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:37
-msgid ""
-"Cannot register speech recognition: Pocketsphinx plugins not found. See "
-"http://cmusphinx.sourceforge.net/wiki/gstreamer for details."
+#: ../lib/advene/gui/main.py:4367
+msgid "ask before saving screenshots"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:41
-msgid "Speech recognition (PocketSphinx)"
+#: ../lib/advene/gui/main.py:4369
+msgid "Auto-save"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:61
-msgid "Filtering noise level [0..1]."
+#: ../lib/advene/gui/main.py:4370
+msgid "Data auto-save functionality"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:65
-msgid ""
-"Minimum amount (in milliseconds) of silence required to terminate the "
-"current annotation and start a new one. Decreasing this length will result "
-"in a large amount of short annotations and increasing this length will "
-"result in a small amount of long annotations."
+#: ../lib/advene/gui/main.py:4371
+msgid "is desactivated"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:69
-msgid "Use default acoustic and language models."
+#: ../lib/advene/gui/main.py:4372
+msgid "is done automatically"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:73
-msgid "Acoustic model (directory)"
+#: ../lib/advene/gui/main.py:4373
+msgid "is done after confirmation"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:77
-msgid "Phonetic dictionary (.dic file)"
+#: ../lib/advene/gui/main.py:4375
+msgid "Auto-save interval (in s)"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:81
-msgid "Language model (.DMP file)"
+#: ../lib/advene/gui/main.py:4375
+msgid "Interval (in seconds) between package auto-saves"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:144
-#: ../lib/advene/plugins/barcode.py:83
-#, fuzzy, python-format
-msgid "%(count)d utterances until %(time)s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/main.py:4377
+#, fuzzy
+msgid "Workspace"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/plugins/pocketsphinx.py:153
-msgid "Speech"
+#: ../lib/advene/gui/main.py:4379
+msgid "On package saving,"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:155
-msgid "Recognized speech"
+#: ../lib/advene/gui/main.py:4380
+msgid "Do you wish to save the default workspace with the package?"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:191
-msgid "Recognizing speech"
-msgstr ""
+#: ../lib/advene/gui/main.py:4381
+#, fuzzy
+msgid "never save the current workspace"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/plugins/barcode.py:36
-msgid "Cannot register barcode extraction: zbar plugin not found."
+#: ../lib/advene/gui/main.py:4382
+#, fuzzy
+msgid "always save the current workspace"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/main.py:4383
+#, fuzzy
+msgid "ask before saving the current workspace"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/main.py:4385
+msgid "Auto-validation of edited elements"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:40
-msgid "Barcode (qr-code) extraction"
+#: ../lib/advene/gui/main.py:4385
+msgid "Automatically validate modified elements when saving the package."
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:95
-msgid "Barcode"
+#: ../lib/advene/gui/main.py:4387
+msgid "On package load,"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:97
-msgid "Extracted barcode information"
+#: ../lib/advene/gui/main.py:4388
+msgid "Do you wish to load the workspace saved with the package?"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:115
+#: ../lib/advene/gui/main.py:4389
 #, fuzzy
-msgid "Extraction barcodes"
-msgstr "Importi dosieron"
-
-#: ../lib/advene/plugins/nerd_plugin.py:47
-msgid "NERD (Named Entity Recognition and Disambiguation)"
-msgstr ""
+msgid "never load the saved workspace"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/plugins/nerd_plugin.py:68
-msgid "NERD API key"
-msgstr ""
+#: ../lib/advene/gui/main.py:4390
+#, fuzzy
+msgid "always load the saved workspace"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/plugins/nerd_plugin.py:82
-msgid "NER service to use"
-msgstr ""
+#: ../lib/advene/gui/main.py:4391
+#, fuzzy
+msgid "ask before loading the saved workspace"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/plugins/nerd_plugin.py:88
+#: ../lib/advene/gui/main.py:4394
 #, fuzzy
-msgid "Type of annotation to analyze"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Video Player"
+msgstr "Vido"
 
-#: ../lib/advene/plugins/nerd_plugin.py:93
-msgid "Language to analyze"
+#: ../lib/advene/gui/main.py:4395
+msgid "Autostart"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:98
-msgid "Minimum confidence level (between 0.0 and 1.0)"
+#: ../lib/advene/gui/main.py:4395
+msgid ""
+"Automatically start the player when loading a media file (either directly or "
+"through a package)"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:103
+#: ../lib/advene/gui/main.py:4396
 #, fuzzy
-msgid "Interpolate position of annotations"
-msgstr "Importi transkribon"
+msgid "Fulscreen timestamp"
+msgstr "Arbvido"
 
-#: ../lib/advene/plugins/nerd_plugin.py:108
-msgid "Split by entity type"
+#: ../lib/advene/gui/main.py:4396
+msgid "Display the timestamp over the video when in fullscreen mode"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:113
+#: ../lib/advene/gui/main.py:4397
 #, fuzzy
-msgid "Store results as markup in the annotation text"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/plugins/nerd_plugin.py:118
-msgid "Create relations between the original annotations and the new ones"
-msgstr ""
-
-#: ../lib/advene/plugins/nerd_plugin.py:150
-#, python-format
-msgid "NERD applied to %s"
-msgstr ""
-
-#: ../lib/advene/plugins/nerd_plugin.py:208
-#, python-format
-msgid "NERD %s"
-msgstr ""
+msgid "Enable captions"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/plugins/ted.py:39
+#: ../lib/advene/gui/main.py:4397
 #, fuzzy
-msgid "TED importer"
-msgstr "Importi dosieron"
+msgid "Enable captions over the video"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/plugins/shotdetect.py:35
+#: ../lib/advene/gui/main.py:4398
 #, fuzzy
-msgid "Shotdetect importer"
-msgstr "Importi dosieron"
+msgid "Caption font"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/plugins/shotdetect.py:79
-msgid "No shots"
+#: ../lib/advene/gui/main.py:4398
+msgid "TrueType font for captions"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:77
-msgid "Pronounce a text"
+#: ../lib/advene/gui/main.py:4399
+msgid "Enable SVG"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:78
-msgid "String to pronounce."
+#: ../lib/advene/gui/main.py:4399
+msgid "Enable SVG captions over the video"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:131 ../lib/advene/gui/plugins/actions.py:259
-#: ../lib/advene/gui/plugins/actions.py:340
-#: ../lib/advene/gui/plugins/actions.py:358
-msgid "No message..."
+#: ../lib/advene/gui/main.py:4401
+msgid "Enable snapshots"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:156
-msgid "TTS disabled. Cannot find the application 'festival' in PATH"
+#: ../lib/advene/gui/main.py:4402
+msgid "Snapshot width"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:158
-msgid "TTS disabled. Cannot find the application 'aplay' in PATH"
+#: ../lib/advene/gui/main.py:4402
+msgid "Snapshot width in pixels."
 msgstr ""
 
-#: ../lib/advene/player/gstreamer.py:434
-msgid "Cannot capture full-resolution snapshot, another capture is ongoing."
+#: ../lib/advene/gui/main.py:4403
+msgid "Verbosity"
 msgstr ""
 
-#: ../lib/advene/rules/importer.py:29
-msgid "Event history importer"
+#: ../lib/advene/gui/main.py:4403
+msgid "Verbosity level. -1 for no messages."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:37 ../lib/advene/rules/actions.py:102
-#: ../lib/advene/rules/actions.py:120
-msgid "Message to display"
+#: ../lib/advene/gui/main.py:4406
+msgid "Devices"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:48
-msgid "Start the player"
+#: ../lib/advene/gui/main.py:4408
+msgid "Standard"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:49
-msgid "Start position (in ms)"
+#: ../lib/advene/gui/main.py:4410
+msgid "DVD drive"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:52 ../lib/advene/rules/actions.py:384
-msgid "The movie start"
+#: ../lib/advene/gui/main.py:4410
+msgid "Drive letter for the DVD"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:53 ../lib/advene/rules/actions.py:385
-#, fuzzy
-msgid "The annotation begin"
-msgstr "Vidi komentajxojn sur templinio"
-
-#: ../lib/advene/rules/actions.py:54 ../lib/advene/rules/actions.py:386
-#, fuzzy
-msgid "The annotation end"
-msgstr "Vidi komentajxojn sur templinio"
-
-#: ../lib/advene/rules/actions.py:63 ../lib/advene/gui/views/logwindow.py:129
-msgid "Go to the given position"
+#: ../lib/advene/gui/main.py:4411
+msgid "GDI"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:64
-msgid "Goto position (in ms)"
+#: ../lib/advene/gui/main.py:4412
+msgid "Direct X"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:73
-msgid "Stop the player"
+#: ../lib/advene/gui/main.py:4414
+msgid "DVD device"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:80
-msgid "Pause the player"
+#: ../lib/advene/gui/main.py:4414
+msgid "Device for the DVD"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:87
-msgid "Resume the player"
+#: ../lib/advene/gui/main.py:4415
+msgid "X11"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:94
-msgid "Take a snapshot"
-msgstr ""
+#: ../lib/advene/gui/main.py:4416
+#, fuzzy
+msgid "XVideo"
+msgstr "Vido"
 
-#: ../lib/advene/rules/actions.py:101
-msgid "Display a caption"
+#: ../lib/advene/gui/main.py:4417
+msgid "GL"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:103
-msgid "Duration of the caption"
+#: ../lib/advene/gui/main.py:4419
+msgid "Video output"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:110 ../lib/advene/rules/actions.py:172
-#: ../lib/advene/gui/plugins/actions.py:61
-#: ../lib/advene/gui/plugins/actions.py:121
-#: ../lib/advene/gui/plugins/actions.py:403
-#: ../lib/advene/gui/plugins/actions.py:538
-msgid "1 second"
+#: ../lib/advene/gui/main.py:4419
+msgid "Video output module"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:111 ../lib/advene/rules/actions.py:173
-#: ../lib/advene/gui/plugins/actions.py:62
-#: ../lib/advene/gui/plugins/actions.py:122
-#: ../lib/advene/gui/plugins/actions.py:404
-#: ../lib/advene/gui/plugins/actions.py:539
-#: ../lib/advene/gui/edit/rules.py:773
+#: ../lib/advene/gui/main.py:4421
 #, fuzzy
-msgid "The annotation duration"
+msgid "Recorder options"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/actions.py:119 ../lib/advene/gui/popup.py:718
-msgid "Caption the annotation"
-msgstr ""
-
-#: ../lib/advene/rules/actions.py:131
+#: ../lib/advene/gui/main.py:4422
 #, fuzzy
-msgid "Display a graphical shape"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Audio input"
+msgstr "Vido"
 
-#: ../lib/advene/rules/actions.py:132
-msgid "Shape (square, circle, triangle)"
+#: ../lib/advene/gui/main.py:4422
+msgid "Device name for audio input (with gstrecorder plugin)"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:133
-#: ../lib/advene/gui/edit/shapewidget.py:342
-#: ../lib/advene/gui/edit/elements.py:891
-#: ../lib/advene/gui/edit/elements.py:971
-#: ../lib/advene/gui/edit/elements.py:1085
-#: ../lib/advene/gui/views/tagbag.py:138
-msgid "Color"
+#: ../lib/advene/gui/main.py:4423
+msgid "Record video"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:134
-msgid "x-position (percentage of screen)"
+#: ../lib/advene/gui/main.py:4423
+msgid "Record both video and audio"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:135
-msgid "y-position (percentage of screen)"
+#: ../lib/advene/gui/main.py:4426
+msgid "<i>Experimental</i>"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:136
-msgid "Size (arbitrary units)"
+#: ../lib/advene/gui/main.py:4427 ../lib/advene/gui/views/scroller.py:30
+msgid "Scroller"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:137
-msgid "Duration of the display in ms"
+#: ../lib/advene/gui/main.py:4427
+msgid "Embed the caption scroller below the video"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:145
-msgid "A square"
+#: ../lib/advene/gui/main.py:4428 ../lib/advene/gui/views/caption.py:29
+msgid "Caption"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:146
-msgid "A circle"
-msgstr ""
-
-#: ../lib/advene/rules/actions.py:147
-msgid "A triangle"
+#: ../lib/advene/gui/main.py:4428
+msgid "Embed the caption view below the video"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:150
-msgid "White"
+#: ../lib/advene/gui/main.py:4430
+msgid "Time-related"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:151
-msgid "Black"
-msgstr ""
+#: ../lib/advene/gui/main.py:4431
+#, fuzzy
+msgid "Time format"
+msgstr "Arbvido"
 
-#: ../lib/advene/rules/actions.py:152
-msgid "Red"
+#: ../lib/advene/gui/main.py:4431
+msgid "Format used to display timecodes"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:153
-msgid "Green"
-msgstr ""
+#: ../lib/advene/gui/main.py:4445
+#, fuzzy
+msgid "Default FPS"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/rules/actions.py:154
-msgid "Blue"
+#: ../lib/advene/gui/main.py:4446
+msgid ""
+"Default FPS (frame-per-second) value, when the information cannot be read "
+"from the media."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:155
-msgid "Yellow"
-msgstr ""
+#: ../lib/advene/gui/main.py:4447
+#, fuzzy
+msgid "Time increment"
+msgstr "Arbvido"
 
-#: ../lib/advene/rules/actions.py:158
-msgid "At the top of the screen"
+#: ../lib/advene/gui/main.py:4447
+msgid ""
+"Skip duration, when using control-left/right or forward/rewind buttons (in "
+"ms)."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:159 ../lib/advene/rules/actions.py:164
-msgid "In the middle of the screen"
-msgstr ""
+#: ../lib/advene/gui/main.py:4448
+#, fuzzy
+msgid "Second time increment"
+msgstr "Arbvido"
 
-#: ../lib/advene/rules/actions.py:160
-msgid "At the bottom of the screen"
+#: ../lib/advene/gui/main.py:4448
+msgid "Skip duration, when using control-shift-left/right (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:163
-msgid "At the left of the screen"
-msgstr ""
+#: ../lib/advene/gui/main.py:4449
+#, fuzzy
+msgid "Third time increment"
+msgstr "Arbvido"
 
-#: ../lib/advene/rules/actions.py:167
-#: ../lib/advene/gui/edit/transcribe.py:1164
-#: ../lib/advene/gui/views/activebookmarks.py:547
-msgid "Small"
+#: ../lib/advene/gui/main.py:4449
+msgid "Skip duration, when using control-shift-up/down (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:168
-#: ../lib/advene/gui/edit/transcribe.py:1165
-#: ../lib/advene/gui/views/activebookmarks.py:548
-msgid "Normal"
+#: ../lib/advene/gui/main.py:4450
+msgid "Custom Up/Down"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:169
-#: ../lib/advene/gui/edit/transcribe.py:1166
-#: ../lib/advene/gui/views/activebookmarks.py:549
-msgid "Large"
+#: ../lib/advene/gui/main.py:4450
+msgid ""
+"Use third time increment for up/down navigation without having to hold shift."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:181
-msgid "Zero the volume during the annotation"
+#: ../lib/advene/gui/main.py:4452
+msgid "Scroll increment"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:188
-msgid "Zero the volume"
+#: ../lib/advene/gui/main.py:4452
+msgid ""
+"On most annotations, control+scrollwheel will increment/decrement their "
+"bounds by this value (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:195
-msgid "Restore the volume"
+#: ../lib/advene/gui/main.py:4453
+msgid "Second scroll increment"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:203
-msgid "Activate a STBV"
+#: ../lib/advene/gui/main.py:4453
+msgid ""
+"On most annotations, control+shift+scrollwheel will increment/decrement "
+"their bounds by this value (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:204
-msgid "STBV id"
+#: ../lib/advene/gui/main.py:4455
+msgid "Player sync"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:213
-msgid "Send a user event"
+#: ../lib/advene/gui/main.py:4455
+msgid ""
+"Interval (in ms) with which we synchronize slave players. Setting a too-low "
+"value could render the application unusable. Use 0 to disable continuous "
+"synchronization."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:214
-msgid "Identifier"
+#: ../lib/advene/gui/main.py:4456
+msgid "Timeline parameters"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:215
-msgid "Delay in ms before sending the event."
+#: ../lib/advene/gui/main.py:4457 ../lib/advene/gui/edit/transcribe.py:156
+msgid "Font size"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:225
-msgid "Open a URL in the web browser"
+#: ../lib/advene/gui/main.py:4457
+msgid "Font size for annotation widgets"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:226 ../lib/advene/gui/plugins/actions.py:103
-#: ../lib/advene/gui/views/logwindow.py:159
-msgid "URL"
+#: ../lib/advene/gui/main.py:4458
+msgid "Button height"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:235
+#: ../lib/advene/gui/main.py:4458
 #, fuzzy
-msgid "Open a static view"
-msgstr "Arbvido"
+msgid "Height of annotation widgets"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/actions.py:246
-msgid "Set the audio volume"
+#: ../lib/advene/gui/main.py:4459
+msgid "Interline height"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:247
-msgid "Volume level (from 0 to 100)"
+#: ../lib/advene/gui/main.py:4459
+msgid "Height of interlines"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:256
-msgid "Set the playing rate"
-msgstr ""
+#: ../lib/advene/gui/main.py:4461
+#, fuzzy
+msgid "Text content"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/rules/actions.py:257
-msgid "Rate (100: normal rate, 200: twice slower)"
-msgstr ""
+#: ../lib/advene/gui/main.py:4462
+#, fuzzy
+msgid "Completion mode"
+msgstr "Arbvido"
 
-#: ../lib/advene/rules/actions.py:266
-msgid "Play a sound resource"
-msgstr ""
+#: ../lib/advene/gui/main.py:4462
+#, fuzzy
+msgid "Enable dynamic completion mode"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/rules/actions.py:267
-msgid "Clip id"
+#: ../lib/advene/gui/main.py:4463
+msgid "Predefined terms only"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:268 ../lib/advene/rules/actions.py:282
-msgid "Volume (0..100)"
+#: ../lib/advene/gui/main.py:4463
+msgid "If completion is enabled, complete only with predefined terms."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:269 ../lib/advene/rules/actions.py:283
-msgid "Left-right balance: -1 -> full left, 0 -> center, 1 -> full right"
+#: ../lib/advene/gui/main.py:4464
+msgid "Abbreviation mode"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:280
-#, fuzzy
-msgid "Play a sound file"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/rules/actions.py:281
-#, fuzzy
-msgid "Sound filename"
-msgstr "Dosiero"
-
-#: ../lib/advene/rules/actions.py:293
+#: ../lib/advene/gui/main.py:4464
 #, fuzzy
-msgid "Set a state variable"
-msgstr "Arbvido"
-
-#: ../lib/advene/rules/actions.py:294 ../lib/advene/rules/actions.py:306
-msgid "State variable name"
-msgstr ""
+msgid "Enable abbreviation mode"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/rules/actions.py:295
+#: ../lib/advene/gui/main.py:4465
 #, fuzzy
-msgid "State value"
-msgstr "Arbvido"
-
-#: ../lib/advene/rules/actions.py:305
-msgid "Increment a state variable"
-msgstr ""
+msgid "Abbreviations"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/rules/actions.py:315
-msgid "Clear all state variables"
+#: ../lib/advene/gui/main.py:4465
+msgid ""
+"Text abbreviations. 1 entry per line. Each line consists of the abbreviation "
+"followed by its replacement."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:330
-#, python-format
-msgid "Error in the evaluation of the parameter %s:"
+#: ../lib/advene/gui/main.py:4467
+msgid "Text-To-Speech"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:389 ../lib/advene/gui/plugins/actions.py:247
-#, fuzzy, python-format
-msgid "The %s-related outgoing annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/rules/actions.py:391 ../lib/advene/gui/plugins/actions.py:249
-#, fuzzy, python-format
-msgid "The %s-related incoming annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/main.py:4468
+#, fuzzy
+msgid "TTS language"
+msgstr "Interfacaj preferoj"
 
-#: ../lib/advene/rules/actions.py:551
-#, python-format
-msgid "Cannot find the stbv %s"
+#: ../lib/advene/gui/main.py:4469
+msgid "What language settings should be used for text-to-speech"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:615 ../lib/advene/gui/views/viewbook.py:263
-#, python-format
-msgid "Cannot find the view %s"
+#: ../lib/advene/gui/main.py:4470
+msgid "English"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:647
-msgid "The set_rate method is unavailable."
+#: ../lib/advene/gui/main.py:4471
+msgid "French"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:657
-msgid "No 'soundclips' resource folder in the package"
+#: ../lib/advene/gui/main.py:4472
+msgid "Spanish"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:683
-msgid "Full volume"
+#: ../lib/advene/gui/main.py:4474
+msgid "TTS Encoding"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:684
-msgid "Left"
+#: ../lib/advene/gui/main.py:4475
+msgid "What encoding should be used to communicate with the TTS engine"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:685
-#: ../lib/advene/gui/edit/transcribe.py:1196
+#: ../lib/advene/gui/main.py:4476
 #, fuzzy
-msgid "Center"
-msgstr "Arbvido"
+msgid "TTS Engine"
+msgstr "Interfacaj preferoj"
 
-#: ../lib/advene/rules/actions.py:686
-msgid "Right"
+#: ../lib/advene/gui/main.py:4477
+msgid ""
+"Which TTS engine should be used (modification requires restarting Advene to "
+"take into account)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:141
-msgid "is equal to"
+#: ../lib/advene/gui/main.py:4478
+msgid "Automatic"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:142
-msgid "is different from"
+#: ../lib/advene/gui/main.py:4479
+msgid "eSpeak"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:143
-msgid "contains"
+#: ../lib/advene/gui/main.py:4480
+msgid "Custom script with standard input"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:144
-msgid "is greater than"
+#: ../lib/advene/gui/main.py:4481
+msgid "Custom script with arguments"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:145
-msgid "is lower than"
+#: ../lib/advene/gui/main.py:4482
+msgid "SAPI"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:146
-msgid "matches the regexp"
+#: ../lib/advene/gui/main.py:4483
+msgid "MacOS X say"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:147
-msgid "is before"
+#: ../lib/advene/gui/main.py:4484
+msgid "Generic (text output)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:148
-msgid "meets"
+#: ../lib/advene/gui/main.py:4530
+msgid "You should restart Advene to take some options into account."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:149
-msgid "overlaps"
+#: ../lib/advene/gui/main.py:4539
+#, python-format
+msgid "Imagecache saved to %s"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:150
-msgid "during"
+#: ../lib/advene/gui/main.py:4552
+msgid "Restarting player..."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:151
-msgid "starts"
+#: ../lib/advene/gui/main.py:4647 ../lib/advene/gui/views/timeline.py:1121
+#: ../lib/advene/rules/elements.py:1010
+msgid "Creation of a new annotation type"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:152
-msgid "finishes"
+#: ../lib/advene/gui/main.py:4655 ../lib/advene/gui/views/timeline.py:1150
+msgid ""
+"Select the schema where you want to\n"
+"create the new relation type."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:157
-msgid "is not true"
-msgstr ""
+#: ../lib/advene/gui/main.py:4673
+#, fuzzy
+msgid "Select the package to merge"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:158
-msgid "is true"
+#: ../lib/advene/gui/main.py:4694
+msgid "Saving workspace"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:162
-msgid "Basic conditions"
+#: ../lib/advene/gui/main.py:4697
+msgid "Enter a view name to save the workspace"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:163
-msgid "Allen relations"
+#: ../lib/advene/gui/main.py:4698
+#, fuzzy
+msgid "Default workspace"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/main.py:4699
+msgid "Open this workspace when opening the package"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:226 ../lib/advene/rules/elements.py:232
-msgid "Unknown type for overlaps comparison"
+#: ../lib/advene/gui/main.py:4722 ../lib/advene/gui/views/__init__.py:305
+#, python-format
+msgid "Error: the identifier %s contains invalid characters."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:240 ../lib/advene/rules/elements.py:246
-msgid "Unknown type for during comparison"
+#: ../lib/advene/gui/main.py:4733
+#, python-format
+msgid "Error: the view %s exists and is not a workspace view."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:515 ../lib/advene/rules/elements.py:521
+#: ../lib/advene/gui/main.py:4764
 #, fuzzy, python-format
-msgid "Unknown action %s"
+msgid "Cannot save default workspace: %s"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:522
-#, python-format
-msgid "Unknown parameter %s"
+#: ../lib/advene/gui/main.py:4774
+msgid "Standard workspace has been saved"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:527
-#, fuzzy
-msgid "Unknown actions"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/rules/elements.py:972
-msgid "Start of the editing of an element"
+#: ../lib/advene/gui/main.py:4781
+msgid "Website export"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:973
-msgid "Cancel of the editing of an element"
+#: ../lib/advene/gui/main.py:4782
+msgid "Exporting views to a website"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:974
-msgid "Destruction of the edit window of an element"
+#: ../lib/advene/gui/main.py:4785
+msgid "Output directory"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:975
-msgid "Validation of the editing of an element"
+#: ../lib/advene/gui/main.py:4794
+msgid "Specify the output directory"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:976
-msgid "Ending editing of a package"
+#: ../lib/advene/gui/main.py:4803
+msgid "Maximum recursion depth"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:977
-msgid "Beginning of an annotation"
-msgstr ""
+#: ../lib/advene/gui/main.py:4810
+#, fuzzy
+msgid "Video URL"
+msgstr "Vido"
 
-#: ../lib/advene/rules/elements.py:978
-msgid "End of an annotation"
+#: ../lib/advene/gui/main.py:4812
+msgid ""
+"URL for the video, if it is available on a sharing website (Only Youtube for "
+"the moment).\n"
+" It can also be a h264/ogg file, which will in this case be handled by the "
+"HTML5 video player."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:979
-msgid "Creation of a new annotation"
-msgstr ""
+#: ../lib/advene/gui/main.py:4862
+#, fuzzy
+msgid "Could not export data: "
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:980
-msgid "Ending editing of an annotation"
-msgstr ""
+#: ../lib/advene/gui/main.py:4864
+#, fuzzy, python-format
+msgid "Website export to %s completed"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/rules/elements.py:981
-msgid "Suppression of an annotation"
+#: ../lib/advene/gui/main.py:4903
+msgid "This video player is not able to grab specific screenshots"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:982
-msgid "Activation of an annotation"
-msgstr ""
+#: ../lib/advene/gui/main.py:4909
+#, fuzzy, python-format
+msgid "Updating %d snapshots"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:983
-msgid "Deactivation of an annotation"
+#: ../lib/advene/gui/main.py:4914
+msgid "No snapshot to update"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:984
+#: ../lib/advene/gui/plugins/shotvalidation.py:37
 #, fuzzy
-msgid "Merging of two annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Shot validation view"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/rules/elements.py:985
+#: ../lib/advene/gui/plugins/shotvalidation.py:39
 #, fuzzy
-msgid "Moving an annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/rules/elements.py:986
-msgid "Activation of a relation"
-msgstr ""
-
-#: ../lib/advene/rules/elements.py:987
-msgid "Deactivation of a relation"
-msgstr ""
-
-#: ../lib/advene/rules/elements.py:988
-msgid "Creation of a new relation"
-msgstr ""
+msgid "Display shot validation interface"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/rules/elements.py:989
-msgid "Ending editing of a relation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:115
+#, python-format
+msgid "Merged #%(first)d-#%(second)d into #%(first)d"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:990
-msgid "Suppression of a relation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:145
+msgid "Last action undone"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:991
-msgid "Creation of a new view"
+#: ../lib/advene/gui/plugins/shotvalidation.py:163
+#, python-format
+msgid "Split annotation #%(current)d into #%(current)d and #%(next)d"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:992
-msgid "Ending editing of a view"
+#: ../lib/advene/gui/plugins/shotvalidation.py:168
+#, python-format
+msgid "Cannot split annotation #%(current)d: out of bounds."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:993
-msgid "Suppression of a view"
+#: ../lib/advene/gui/plugins/shotvalidation.py:188
+#, python-format
+msgid "Changed cut between #%(first)d and %(second)d"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:994
-msgid "Creation of a new query"
-msgstr ""
+#: ../lib/advene/gui/plugins/shotvalidation.py:191
+#, fuzzy
+msgid "Changed begin time for first annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:995
-msgid "Ending editing of a query"
-msgstr ""
+#: ../lib/advene/gui/plugins/shotvalidation.py:197
+#, fuzzy
+msgid "No annotations to adjust"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:996
-msgid "Suppression of a query"
+#: ../lib/advene/gui/plugins/shotvalidation.py:204
+msgid ""
+"Click on the frame just after the cut to adjust the cut time.\n"
+"Control-click on a frame to indicate a missing cut."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:997
-msgid "Creation of a new schema"
+#: ../lib/advene/gui/plugins/shotvalidation.py:212
+#, python-format
+msgid "Begin of #%(index)d (title: %(content)s)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:998
-msgid "Ending editing of a schema"
+#: ../lib/advene/gui/plugins/shotvalidation.py:226
+msgid "< Previous cut"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:999
-msgid "Suppression of a schema"
-msgstr ""
+#: ../lib/advene/gui/plugins/shotvalidation.py:227
+#, fuzzy
+msgid "Display previous cut"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:1000
-#: ../lib/advene/gui/views/timeline.py:1029 ../lib/advene/gui/main.py:4555
-msgid "Creation of a new annotation type"
+#: ../lib/advene/gui/plugins/shotvalidation.py:234
+msgid "Next cut >"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1001
-msgid "Ending editing an annotation type"
-msgstr ""
+#: ../lib/advene/gui/plugins/shotvalidation.py:235
+#, fuzzy
+msgid "Display next cut"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:1002
-msgid "Suppression of an annotation type"
-msgstr ""
+#: ../lib/advene/gui/plugins/shotvalidation.py:250
+#: ../lib/advene/gui/views/annotationdisplay.py:92
+#: ../lib/advene/gui/views/timeline.py:86
+#, fuzzy
+msgid "Current time"
+msgstr "Arbvido"
 
-#: ../lib/advene/rules/elements.py:1003
-msgid "Creation of a new relation type"
-msgstr ""
+#: ../lib/advene/gui/plugins/shotvalidation.py:251
+#, fuzzy
+msgid "Go to annotation containing current player time."
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/rules/elements.py:1004
-msgid "Ending editing a relation type"
-msgstr ""
+#: ../lib/advene/gui/plugins/shotvalidation.py:255
+#: ../lib/advene/gui/edit/frameselector.py:200
+#, fuzzy
+msgid "Refresh snapshots"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:1005
-msgid "Suppression of a relation type"
+#: ../lib/advene/gui/plugins/shotvalidation.py:256
+#: ../lib/advene/gui/edit/frameselector.py:201
+msgid "Refresh missing snapshots"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1006
-msgid "Creation of a new resource"
-msgstr ""
+#: ../lib/advene/gui/plugins/shotvalidation.py:261
+#, fuzzy
+msgid "Undo last modification"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:1007
-msgid "Ending editing of a resource"
+#: ../lib/advene/gui/plugins/shotvalidation.py:267
+msgid "Merge with previous"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1008
-msgid "Suppression of a resource"
+#: ../lib/advene/gui/plugins/shotvalidation.py:268
+msgid "Merge with previous annotation, i.e. remove this bound."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1009
+#: ../lib/advene/gui/plugins/shotvalidation.py:273
 #, fuzzy
-msgid "Modification of the tag"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/rules/elements.py:1010
-msgid "Activating a link"
-msgstr ""
+msgid "Close view."
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/rules/elements.py:1011
-msgid "Player start"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:44
+msgid "Activity trace"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1012
-msgid "Player stop"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:74
+#: ../lib/advene/gui/plugins/eventaccumulator.py:75
+#: ../lib/advene/gui/plugins/tracetimeline.py:65
+#: ../lib/advene/gui/plugins/tracetimeline.py:66
+#: ../lib/advene/gui/plugins/tracepreview.py:72
+#: ../lib/advene/gui/plugins/tracepreview.py:73
+msgid "Beginning edition"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1013
-msgid "Player pause"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:76
+#: ../lib/advene/gui/plugins/eventaccumulator.py:77
+#: ../lib/advene/gui/plugins/eventaccumulator.py:78
+#: ../lib/advene/gui/plugins/tracetimeline.py:67
+#: ../lib/advene/gui/plugins/tracetimeline.py:68
+#: ../lib/advene/gui/plugins/tracetimeline.py:69
+#: ../lib/advene/gui/plugins/tracepreview.py:74
+#: ../lib/advene/gui/plugins/tracepreview.py:75
+#: ../lib/advene/gui/plugins/tracepreview.py:76
+#, fuzzy
+msgid "Canceling edition"
+msgstr "Importi transkribon"
 
-#: ../lib/advene/rules/elements.py:1014
-msgid "Player resume"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:79
+#: ../lib/advene/gui/plugins/tracetimeline.py:70
+#: ../lib/advene/gui/plugins/tracepreview.py:77
+#, fuzzy
+msgid "Ending edition"
+msgstr "Importi transkribon"
 
-#: ../lib/advene/rules/elements.py:1015
-msgid "Going to a given position"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:135
+msgid " Trace : "
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1016
-msgid "Loading a new package"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:139
+#, fuzzy
+msgid " Filters"
+msgstr "Dosiero"
 
-#: ../lib/advene/rules/elements.py:1017
-msgid "Activating a package"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:168
+msgid " Time : "
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1018
-msgid "Saving the package"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:178
+msgid " Max. : "
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1019
-msgid "Start of the dynamic view"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:187
+#, fuzzy
+msgid "Export"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/rules/elements.py:1020
+#: ../lib/advene/gui/plugins/eventaccumulator.py:203
+#: ../lib/advene/gui/plugins/tracetimeline.py:665
 #, fuzzy
-msgid "End of the dynamic view"
-msgstr "Arbvido"
+msgid "Exporting traces"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/rules/elements.py:1021
-msgid "Start of the application"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:208
+#: ../lib/advene/gui/plugins/tracetimeline.py:670
+#, fuzzy, python-format
+msgid ""
+"Export done to\n"
+"%s"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/rules/elements.py:1022
-msgid "End of the application"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:254
+#, fuzzy
+msgid "Defining Filters"
+msgstr "Dosiero"
 
-#: ../lib/advene/rules/elements.py:1023
-msgid "User-defined event"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:560
+#: ../lib/advene/gui/plugins/eventaccumulator.py:615
+#: ../lib/advene/gui/plugins/tracepreview.py:214
+#, fuzzy, python-format
+msgid "of an annotation (%s)"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:1024
-msgid "Modification of the associated media"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:562
+#: ../lib/advene/gui/plugins/eventaccumulator.py:617
+#: ../lib/advene/gui/plugins/tracepreview.py:216
+#, fuzzy, python-format
+msgid "of a relation (%s)"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:1025
-#, fuzzy
-msgid "Highlight a bookmark"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:564
+#: ../lib/advene/gui/plugins/eventaccumulator.py:619
+#: ../lib/advene/gui/plugins/tracepreview.py:218
+#, fuzzy, python-format
+msgid "of an annotation type (%s)"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:1026
-#, fuzzy
-msgid "Unhighlight a bookmark"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:566
+#: ../lib/advene/gui/plugins/eventaccumulator.py:621
+#: ../lib/advene/gui/plugins/tracepreview.py:220
+#, fuzzy, python-format
+msgid "of a relation type (%s)"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:1027
-msgid "Updating duration of the movie"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:568
+#: ../lib/advene/gui/plugins/eventaccumulator.py:623
+#: ../lib/advene/gui/plugins/tracepreview.py:222
+#, fuzzy, python-format
+msgid "of a schema (%s)"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/rules/elements.py:1028
-msgid "Displaying a popup"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:570
+#: ../lib/advene/gui/plugins/eventaccumulator.py:625
+#: ../lib/advene/gui/plugins/tracepreview.py:224
+#, fuzzy, python-format
+msgid "of a view (%s)"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/plugins/eventaccumulator.py:572
+#: ../lib/advene/gui/plugins/eventaccumulator.py:627
+#: ../lib/advene/gui/plugins/tracepreview.py:226
+#, fuzzy, python-format
+msgid "of a package (%s)"
+msgstr "Komentaraj attributoj"
+
+#: ../lib/advene/gui/plugins/eventaccumulator.py:574
+#: ../lib/advene/gui/plugins/eventaccumulator.py:629
+#: ../lib/advene/gui/plugins/tracepreview.py:228
+#, fuzzy, python-format
+msgid "of an unknown item (%s)"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:382
+#, fuzzy, python-format
+msgid "Rendering type %(type)s as %(presentation)s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:527
+msgid "Snapshot only"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1029
-msgid "Updating a snapshot"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:528
+msgid "Overlayed snapshot only"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1067
-msgid "Player control"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:529
+msgid "Timestamp only"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1068
-msgid "Audio enrichment"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:530
+msgid "Snapshot+timestamp"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1069
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:531
 #, fuzzy
-msgid "Image enrichment"
-msgstr "Arbvido"
+msgid "Annotation content"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/rules/elements.py:1070
-msgid "External display control"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:546
+msgid "as a list"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1071
-msgid "Popup"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:547
+msgid "as a grid"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1073
-#, fuzzy
-msgid "State"
-msgstr "Arbvido"
-
-#: ../lib/advene/rules/elements.py:1074
-msgid "GUI actions"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:548
+msgid "as a table"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1075
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:549
+#: ../lib/advene/gui/views/viewbook.py:394
 #, fuzzy
-msgid "Expert"
-msgstr "Defauxlta regularo"
+msgid "as a transcription"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/util/initialconfig.py:82
-msgid "Initial Advene configuration"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:667
+#: ../lib/advene/gui/views/transcription.py:448
+#, python-format
+msgid "Annotation %s"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:83
-msgid ""
-"<span size='large'><b>Welcome in Advene</b>\n"
-"This is the first time that you run Advene. Please answer some basic "
-"configuration questions. You will be able to modify these choices from the "
-"Advene interface, in the Edit/Preferences menu.</span>"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:668
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:687
+msgid "Play video"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:84
-#, fuzzy
-msgid "Interface language"
-msgstr "Interfacaj preferoj"
-
-#: ../lib/advene/gui/util/initialconfig.py:84
-msgid "Language used for the interface"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:669
+msgid "Show timestamp only"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:88 ../lib/advene/gui/main.py:4247
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:670
 #, fuzzy
-msgid "System default"
+msgid "Show content only"
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/util/initialconfig.py:90
-msgid "Weekly check for Advene updates on the Advene website"
-msgstr ""
-
-#: ../lib/advene/gui/util/initialconfig.py:90 ../lib/advene/gui/main.py:4273
-msgid "Weekly check for updates on the Advene website"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:671
+#, fuzzy
+msgid "Show snapshot only"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/util/initialconfig.py:92
-msgid "Preferred directory for data files"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:673
+#, fuzzy
+msgid "Show overlayed timestamp"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/util/initialconfig.py:92
-msgid "Preferred directory for storing data files (Advene packages)"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:674
+#, fuzzy
+msgid "Show overlayed content"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/util/initialconfig.py:94
-msgid "Directories to search for movies"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:676
+#, fuzzy, python-format
+msgid "Annotation type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/util/initialconfig.py:94
-#, python-format
-msgid ""
-"List of directories (separated by %(pathsep)s) to search for movie files."
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:677
+#, fuzzy
+msgid "display as list"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/util/initialconfig.py:95
-msgid "First look for movie file in the same directory as the package"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:678
+#, fuzzy
+msgid "display as grid"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/util/initialconfig.py:95
-msgid ""
-"If checked, the movie file will be searched for in the same directory as the "
-"referencing package."
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:679
+#, fuzzy
+msgid "display as table"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/util/__init__.py:39
-#: ../lib/advene/gui/edit/schemaeditor.py:1081
-#: ../lib/advene/gui/edit/schemaeditor.py:1202
-#: ../lib/advene/gui/edit/create.py:106
-msgid "Plain text content"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:680
+#, fuzzy
+msgid "display as transcription"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/util/__init__.py:40
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:689
 #, fuzzy
-msgid "HTML content"
+msgid "Open link"
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/util/__init__.py:41
-#: ../lib/advene/gui/edit/schemaeditor.py:1082
-#: ../lib/advene/gui/edit/schemaeditor.py:1203
-#: ../lib/advene/gui/edit/create.py:107
-msgid "Simple-structured content"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:745
+#, fuzzy, python-format
+msgid "HTML editor: cannot parse content (%s)"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:776
+#, fuzzy, python-format
+msgid "Heading %d"
+msgstr "Importi dosieron"
+
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:787
+msgid "Bold"
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:42
-msgid "List of numeric values"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:788
+msgid "Italic"
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:43
-#: ../lib/advene/gui/edit/schemaeditor.py:1083
-#: ../lib/advene/gui/edit/schemaeditor.py:1204
-#: ../lib/advene/gui/edit/create.py:108
-msgid "SVG graphics content"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:789
+msgid "Header"
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:459
-#, python-format
-msgid ""
-"Annotation Type %(title)s:\n"
-"%(count)s"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:791
+msgid "Copy"
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:465
-#, python-format
-msgid ""
-"Relation Type %(title)s:\n"
-"%(count)s"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:792
+msgid "Cut"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:376 ../lib/advene/gui/edit/dvdselect.py:95
-#: ../lib/advene/gui/edit/imports.py:331
-#: ../lib/advene/gui/edit/transcribe.py:1055
-#: ../lib/advene/gui/views/table.py:557 ../lib/advene/gui/main.py:4176
-msgid "Title"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:793
+msgid "Paste"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:385 ../lib/advene/gui/edit/rules.py:1092
-#: ../lib/advene/gui/edit/imports.py:325
-#: ../lib/advene/gui/edit/elements.py:507
-#: ../lib/advene/gui/edit/elements.py:556
-#: ../lib/advene/gui/edit/elements.py:644
-#: ../lib/advene/gui/edit/elements.py:724
-#: ../lib/advene/gui/edit/elements.py:873
-#: ../lib/advene/gui/edit/elements.py:942
-#: ../lib/advene/gui/edit/elements.py:1054
-#: ../lib/advene/gui/edit/elements.py:1115
-#: ../lib/advene/gui/views/table.py:255 ../lib/advene/gui/views/table.py:559
-msgid "Id"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:795
+#: ../lib/advene/gui/views/timeline.py:139
+msgid "Refresh"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:404 ../lib/advene/gui/util/dialog.py:443
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:851
+msgid "WYSIWYG editor"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:861
 #, fuzzy
-msgid "Name the element"
-msgstr "Arbvido"
+msgid "Edit HTML source"
+msgstr "Preferoj"
 
-#: ../lib/advene/gui/util/dialog.py:407 ../lib/advene/gui/util/dialog.py:444
+#: ../lib/advene/gui/plugins/tracetimeline.py:71
+#: ../lib/advene/gui/plugins/tracepreview.py:78
 #, fuzzy
-msgid "Choose a name for the element"
-msgstr "Arbvido"
+msgid "Moving to"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/util/dialog.py:482
-msgid "Open a file"
+#: ../lib/advene/gui/plugins/tracetimeline.py:87
+msgid "Traces"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:507 ../lib/advene/gui/util/dialog.py:543
-msgid "N/C"
+#: ../lib/advene/gui/plugins/tracetimeline.py:213
+#, python-format
+msgid "%(name)s (%(index)d)"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:512
-msgid "Alias"
+#: ../lib/advene/gui/plugins/tracetimeline.py:241
+msgid "Search"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:532
-msgid ""
-"Press to\n"
-"display\n"
-"information"
+#: ../lib/advene/gui/plugins/tracetimeline.py:254
+#: ../lib/advene/gui/plugins/tracetimeline.py:1214
+#, python-format
+msgid "%(name)s (%(index)s)"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:551
-msgid "Wait..."
+#: ../lib/advene/gui/plugins/tracetimeline.py:426
+#: ../lib/advene/gui/views/timeline.py:3484
+#: ../lib/advene/gui/edit/montage.py:449
+msgid "Zoom out"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:555
-#, python-format
-msgid "Error: %s"
+#: ../lib/advene/gui/plugins/tracetimeline.py:431
+#: ../lib/advene/gui/views/timeline.py:3489
+#: ../lib/advene/gui/edit/montage.py:454
+msgid "Zoom in"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:575
-msgid "Any type of file"
+#: ../lib/advene/gui/plugins/tracetimeline.py:436
+msgid "Zoom 100%"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:577
-msgid "Advene files (.xml, .azp, .apl)"
+#: ../lib/advene/gui/plugins/tracetimeline.py:440
+msgid "Toggle links lock"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:579
-msgid "Advene session (.apl)"
+#: ../lib/advene/gui/plugins/tracetimeline.py:448
+msgid "Toggle link mode"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:580
+#: ../lib/advene/gui/plugins/tracetimeline.py:455
 #, fuzzy
-msgid "Audio files"
-msgstr "Vido"
+msgid "Open a trace file"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/util/dialog.py:581
-#, fuzzy
-msgid "Video files"
-msgstr "Vido"
+#: ../lib/advene/gui/plugins/tracetimeline.py:470
+msgid "Toggle auto refresh"
+msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:626
-#: ../lib/advene/gui/edit/properties.py:418
+#: ../lib/advene/gui/plugins/tracetimeline.py:481
 #, fuzzy
-msgid "Choose a directory"
-msgstr "Elekti ilobretan stilon"
+msgid "Open an existing trace"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/util/dialog.py:679
-msgid "Select an element"
-msgstr ""
+#: ../lib/advene/gui/plugins/tracetimeline.py:487
+#, fuzzy
+msgid "Save trace"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:32
+#: ../lib/advene/gui/plugins/tracetimeline.py:492
 #, fuzzy
-msgid "Shot validation view"
-msgstr "Defauxlta regularo"
+msgid "Configuration"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/plugins/tracetimeline.py:941
+msgid "Zoom and center on linked items"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:34
+#: ../lib/advene/gui/plugins/tracetimeline.py:950
 #, fuzzy
-msgid "Display shot validation interface"
-msgstr "Vidi komentajxojn sur templinio"
+msgid "Edit item"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:111
-#, python-format
-msgid "Merged #%(first)d-#%(second)d into #%(first)d"
+#: ../lib/advene/gui/plugins/tracetimeline.py:954
+msgid "Recreate item"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:136
-msgid "Last action undone"
+#: ../lib/advene/gui/plugins/tracetimeline.py:970
+#: ../lib/advene/gui/plugins/tracetimeline.py:991
+#: ../lib/advene/gui/views/timeline.py:2595 ../lib/advene/gui/popup.py:542
+#: ../lib/advene/gui/edit/transcribe.py:495
+msgid "Go to..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:154
-#, python-format
-msgid "Split annotation #%(current)d into #%(current)d and #%(next)d"
+#: ../lib/advene/gui/plugins/tracetimeline.py:974
+#, fuzzy
+msgid "Zoom on action"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/plugins/tracetimeline.py:2018
+#: ../lib/advene/gui/views/timeline.py:3362
+#: ../lib/advene/gui/edit/montage.py:544
+msgid "Inspector"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:159
-#, python-format
-msgid "Cannot split annotation #%(current)d: out of bounds."
+#: ../lib/advene/gui/plugins/tracetimeline.py:2023
+msgid "Item Id"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:179
-#, python-format
-msgid "Changed cut between #%(first)d and %(second)d"
+#: ../lib/advene/gui/plugins/tracetimeline.py:2026
+msgid "Item name or class"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:182
-#, fuzzy
-msgid "Changed begin time for first annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:188
-#, fuzzy
-msgid "No annotations to adjust"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:195
-msgid ""
-"Click on the frame just after the cut to adjust the cut time.\n"
-"Control-click on a frame to indicate a missing cut."
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:203
-#, python-format
-msgid "Begin of #%(index)d (title: %(content)s)"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:217
-msgid "< Previous cut"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:218
-#, fuzzy
-msgid "Display previous cut"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:225
-msgid "Next cut >"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:226
-#, fuzzy
-msgid "Display next cut"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:251
-#: ../lib/advene/gui/views/timeline.py:81
-#: ../lib/advene/gui/views/annotationdisplay.py:90
-#, fuzzy
-msgid "Current time"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:252
-#, fuzzy
-msgid "Go to annotation containing current player time."
-msgstr "Vidi komentajxojn sur templinio"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:256
-#: ../lib/advene/gui/edit/frameselector.py:193
-#, fuzzy
-msgid "Refresh snapshots"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:257
-#: ../lib/advene/gui/edit/frameselector.py:194
-msgid "Refresh missing snapshots"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:261
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:806
-#: ../lib/advene/gui/edit/transcribe.py:1211 ../lib/advene/gui/main.py:350
-msgid "Undo"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:262
-#, fuzzy
-msgid "Undo last modification"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:268
-msgid "Merge with previous"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:269
-msgid "Merge with previous annotation, i.e. remove this bound."
-msgstr ""
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:274
-#, fuzzy
-msgid "Close view."
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:60
-#: ../lib/advene/gui/plugins/tracetimeline.py:61
-#: ../lib/advene/gui/plugins/eventaccumulator.py:73
-#: ../lib/advene/gui/plugins/eventaccumulator.py:74
-#: ../lib/advene/gui/plugins/tracepreview.py:72
-#: ../lib/advene/gui/plugins/tracepreview.py:73
-msgid "Beginning edition"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:62
-#: ../lib/advene/gui/plugins/tracetimeline.py:63
-#: ../lib/advene/gui/plugins/tracetimeline.py:64
-#: ../lib/advene/gui/plugins/eventaccumulator.py:75
-#: ../lib/advene/gui/plugins/eventaccumulator.py:76
-#: ../lib/advene/gui/plugins/eventaccumulator.py:77
-#: ../lib/advene/gui/plugins/tracepreview.py:74
-#: ../lib/advene/gui/plugins/tracepreview.py:75
-#: ../lib/advene/gui/plugins/tracepreview.py:76
-#, fuzzy
-msgid "Canceling edition"
-msgstr "Importi transkribon"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:65
-#: ../lib/advene/gui/plugins/eventaccumulator.py:78
-#: ../lib/advene/gui/plugins/tracepreview.py:77
-#, fuzzy
-msgid "Ending edition"
-msgstr "Importi transkribon"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:66
-#: ../lib/advene/gui/plugins/tracepreview.py:78
-#, fuzzy
-msgid "Moving to"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:82
-msgid "Traces"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:208
-#, python-format
-msgid "%(name)s (%(index)d)"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:236
-msgid "Search"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:249
-#: ../lib/advene/gui/plugins/tracetimeline.py:1224
-#, python-format
-msgid "%(name)s (%(index)s)"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:421
-#: ../lib/advene/gui/edit/montage.py:439
-#: ../lib/advene/gui/views/timeline.py:3444
-msgid "Zoom out"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:426
-#: ../lib/advene/gui/edit/montage.py:444
-#: ../lib/advene/gui/views/timeline.py:3449
-msgid "Zoom in"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:431
-msgid "Zoom 100%"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:435
-msgid "Toggle links lock"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:443
-msgid "Toggle link mode"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:450
-#, fuzzy
-msgid "Open a trace file"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:465
-msgid "Toggle auto refresh"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:476
-#, fuzzy
-msgid "Open an existing trace"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:482
-#, fuzzy
-msgid "Save trace"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:487
-#, fuzzy
-msgid "Configuration"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:668
-#: ../lib/advene/gui/plugins/eventaccumulator.py:202
-#, fuzzy
-msgid "Exporting traces"
-msgstr "Importi dosieron"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:673
-#: ../lib/advene/gui/plugins/eventaccumulator.py:207
-#, fuzzy, python-format
-msgid ""
-"Export done to\n"
-"%s"
-msgstr "Importi dosieron"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:951
-msgid "Zoom and center on linked items"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:960
-#, fuzzy
-msgid "Edit item"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:964
-msgid "Recreate item"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:980
-#: ../lib/advene/gui/plugins/tracetimeline.py:1001
-#: ../lib/advene/gui/edit/transcribe.py:502
-#: ../lib/advene/gui/views/timeline.py:2556 ../lib/advene/gui/popup.py:513
-msgid "Go to..."
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:984
-#, fuzzy
-msgid "Zoom on action"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:2030
-#: ../lib/advene/gui/edit/montage.py:535
-#: ../lib/advene/gui/views/timeline.py:3318
-msgid "Inspector"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:2035
-msgid "Item Id"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:2038
-msgid "Item name or class"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:2042
+#: ../lib/advene/gui/plugins/tracetimeline.py:2030
 #, fuzzy
 msgid "Type or schema"
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2045
+#: ../lib/advene/gui/plugins/tracetimeline.py:2033
 #, fuzzy
 msgid "Operations"
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2087
+#: ../lib/advene/gui/plugins/tracetimeline.py:2076
 #, fuzzy
 msgid "Comment"
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2119
+#: ../lib/advene/gui/plugins/tracetimeline.py:2108
 #: ../lib/advene/gui/edit/merge.py:191
 msgid "Action"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/kinect.py:41
-msgid "Kinect Controller"
+#: ../lib/advene/gui/plugins/logmessages.py:35
+msgid "Log Messages"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/kinect.py:43
-msgid "Kinect control interface"
+#: ../lib/advene/gui/plugins/actions.py:40 ../lib/advene/core/controller.py:307
+#: ../lib/advene/rules/actions.py:38
+msgid "Display a message"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/actions.py:41
+#: ../lib/advene/gui/plugins/actions.py:53
+#: ../lib/advene/gui/plugins/actions.py:71
+#: ../lib/advene/gui/plugins/actions.py:86
+#: ../lib/advene/gui/plugins/actions.py:102
+#: ../lib/advene/gui/plugins/actions.py:203
+#: ../lib/advene/core/controller.py:308
+msgid "String to display."
 msgstr ""
 
+#: ../lib/advene/gui/plugins/actions.py:44
+#: ../lib/advene/gui/plugins/actions.py:58
+#: ../lib/advene/gui/plugins/actions.py:110
+#: ../lib/advene/gui/plugins/actions.py:399
+#: ../lib/advene/gui/plugins/actions.py:527 ../lib/advene/gui/edit/rules.py:766
+#: ../lib/advene/plugins/brltty.py:90 ../lib/advene/plugins/tts.py:84
+#: ../lib/advene/rules/actions.py:42 ../lib/advene/rules/actions.py:109
+#: ../lib/advene/rules/actions.py:125
+#, fuzzy
+msgid "The annotation content"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
 #: ../lib/advene/gui/plugins/actions.py:52
 msgid "Display a popup"
 msgstr ""
@@ -3176,6 +2908,23 @@ msgstr ""
 msgid "Display duration in ms. Ignored if empty."
 msgstr ""
 
+#: ../lib/advene/gui/plugins/actions.py:61
+#: ../lib/advene/gui/plugins/actions.py:121
+#: ../lib/advene/gui/plugins/actions.py:403
+#: ../lib/advene/gui/plugins/actions.py:538 ../lib/advene/rules/actions.py:112
+#: ../lib/advene/rules/actions.py:174
+msgid "1 second"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/actions.py:62
+#: ../lib/advene/gui/plugins/actions.py:122
+#: ../lib/advene/gui/plugins/actions.py:404
+#: ../lib/advene/gui/plugins/actions.py:539 ../lib/advene/gui/edit/rules.py:773
+#: ../lib/advene/rules/actions.py:113 ../lib/advene/rules/actions.py:175
+#, fuzzy
+msgid "The annotation duration"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
 #: ../lib/advene/gui/plugins/actions.py:70
 msgid "Popup an entry box"
 msgstr ""
@@ -3209,6 +2958,11 @@ msgstr "Krei komentajxojn de DVD cxapitroj"
 msgid "Display a popup linking to an URL"
 msgstr ""
 
+#: ../lib/advene/gui/plugins/actions.py:103
+#: ../lib/advene/gui/views/logwindow.py:159 ../lib/advene/rules/actions.py:228
+msgid "URL"
+msgstr ""
+
 #: ../lib/advene/gui/plugins/actions.py:106
 #, fuzzy
 msgid "string:Display annotation in web browser"
@@ -3252,7 +3006,7 @@ msgid "Destination: popup, south, east"
 msgstr ""
 
 #: ../lib/advene/gui/plugins/actions.py:144
-#: ../lib/advene/gui/views/viewbook.py:308
+#: ../lib/advene/gui/views/viewbook.py:313
 #, fuzzy
 msgid "Open a saved view"
 msgstr "Defauxlta regularo"
@@ -3339,38 +3093,38 @@ msgstr "Importi dosieron"
 msgid "Bookmark"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/plugins/actions.py:276
-#, python-format
-msgid "Error: undefined GUI view %s"
+#: ../lib/advene/gui/plugins/actions.py:234 ../lib/advene/plugins/brltty.py:242
+#: ../lib/advene/plugins/tts.py:113
+msgid "Unknown rule"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:286
-#: ../lib/advene/gui/views/viewbook.py:124 ../lib/advene/gui/main.py:1189
-msgid "...in its own window"
+#: ../lib/advene/gui/plugins/actions.py:235 ../lib/advene/plugins/brltty.py:243
+#: ../lib/advene/plugins/tts.py:114
+#, python-format
+msgid ""
+"Rule %(rulename)s: Error in the evaluation of the parameter "
+"%(parametername)s:"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:287
-#: ../lib/advene/gui/views/viewbook.py:125
-#: ../lib/advene/gui/views/__init__.py:381 ../lib/advene/gui/main.py:1190
-msgid "...embedded east of the video"
-msgstr ""
+#: ../lib/advene/gui/plugins/actions.py:247 ../lib/advene/rules/actions.py:385
+#, fuzzy, python-format
+msgid "The %s-related outgoing annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/plugins/actions.py:288
-#: ../lib/advene/gui/views/viewbook.py:126
-#: ../lib/advene/gui/views/__init__.py:382 ../lib/advene/gui/main.py:1191
-msgid "...embedded west of the video"
-msgstr ""
+#: ../lib/advene/gui/plugins/actions.py:249 ../lib/advene/rules/actions.py:387
+#, fuzzy, python-format
+msgid "The %s-related incoming annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/plugins/actions.py:289
-#: ../lib/advene/gui/views/viewbook.py:127
-#: ../lib/advene/gui/views/__init__.py:383 ../lib/advene/gui/main.py:1192
-msgid "...embedded south of the video"
+#: ../lib/advene/gui/plugins/actions.py:259
+#: ../lib/advene/gui/plugins/actions.py:340
+#: ../lib/advene/gui/plugins/actions.py:358 ../lib/advene/plugins/tts.py:134
+msgid "No message..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:290
-#: ../lib/advene/gui/views/viewbook.py:128
-#: ../lib/advene/gui/views/__init__.py:384 ../lib/advene/gui/main.py:1193
-msgid "...embedded at the right of the window"
+#: ../lib/advene/gui/plugins/actions.py:276
+#, python-format
+msgid "Error: undefined GUI view %s"
 msgstr ""
 
 #: ../lib/advene/gui/plugins/actions.py:322
@@ -3465,103 +3219,19 @@ msgstr "Defauxlta regularo"
 msgid "New bookmark"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:43
-msgid "Activity trace"
+#: ../lib/advene/gui/plugins/kinect.py:38
+msgid "Kinect Controller"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:134
-msgid " Trace : "
+#: ../lib/advene/gui/plugins/kinect.py:40
+msgid "Kinect control interface"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:138
-#, fuzzy
-msgid " Filters"
-msgstr "Dosiero"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:142
-#: ../lib/advene/gui/main.py:4178
-msgid "Reset"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:167
-msgid " Time : "
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:177
-msgid " Max. : "
-msgstr ""
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:186
-#, fuzzy
-msgid "Export"
-msgstr "Importi dosieron"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:253
-#, fuzzy
-msgid "Defining Filters"
-msgstr "Dosiero"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:559
-#: ../lib/advene/gui/plugins/eventaccumulator.py:614
-#: ../lib/advene/gui/plugins/tracepreview.py:214
-#, fuzzy, python-format
-msgid "of an annotation (%s)"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:561
-#: ../lib/advene/gui/plugins/eventaccumulator.py:616
-#: ../lib/advene/gui/plugins/tracepreview.py:216
-#, fuzzy, python-format
-msgid "of a relation (%s)"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:563
-#: ../lib/advene/gui/plugins/eventaccumulator.py:618
-#: ../lib/advene/gui/plugins/tracepreview.py:218
-#, fuzzy, python-format
-msgid "of an annotation type (%s)"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:565
-#: ../lib/advene/gui/plugins/eventaccumulator.py:620
-#: ../lib/advene/gui/plugins/tracepreview.py:220
-#, fuzzy, python-format
-msgid "of a relation type (%s)"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:567
-#: ../lib/advene/gui/plugins/eventaccumulator.py:622
-#: ../lib/advene/gui/plugins/tracepreview.py:222
-#, fuzzy, python-format
-msgid "of a schema (%s)"
-msgstr "Komentaraj attributoj"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:569
-#: ../lib/advene/gui/plugins/eventaccumulator.py:624
-#: ../lib/advene/gui/plugins/tracepreview.py:224
-#, fuzzy, python-format
-msgid "of a view (%s)"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:571
-#: ../lib/advene/gui/plugins/eventaccumulator.py:626
-#: ../lib/advene/gui/plugins/tracepreview.py:226
-#, fuzzy, python-format
-msgid "of a package (%s)"
-msgstr "Komentaraj attributoj"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:573
-#: ../lib/advene/gui/plugins/eventaccumulator.py:628
-#: ../lib/advene/gui/plugins/tracepreview.py:228
-#, fuzzy, python-format
-msgid "of an unknown item (%s)"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/contenthandlers.py:122
+#: ../lib/advene/gui/plugins/contenthandlers.py:127
 msgid "Label"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:172
+#: ../lib/advene/gui/plugins/contenthandlers.py:177
 #, python-format
 msgid ""
 "Error while parsing SVG content:\n"
@@ -3569,22 +3239,22 @@ msgid ""
 "%s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:247
+#: ../lib/advene/gui/plugins/contenthandlers.py:252
 msgid " created from "
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:315
+#: ../lib/advene/gui/plugins/contenthandlers.py:329
 msgid "Graphical editor"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:326
+#: ../lib/advene/gui/plugins/contenthandlers.py:340
 #, fuzzy
 msgid "Edit XML"
 msgstr "Redakti"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:378
-#: ../lib/advene/gui/plugins/contenthandlers.py:434
-#: ../lib/advene/gui/edit/rules.py:186
+#: ../lib/advene/gui/plugins/contenthandlers.py:392
+#: ../lib/advene/gui/plugins/contenthandlers.py:448
+#: ../lib/advene/gui/edit/rules.py:188
 #, python-format
 msgid ""
 "The following items seem to be\n"
@@ -3593,40 +3263,47 @@ msgid ""
 "%s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:36 ../lib/advene/gui/main.py:1235
+#: ../lib/advene/gui/plugins/tracepreview.py:61
 #, fuzzy
-msgid "Video player"
-msgstr "Vido"
+msgid "Trace preview"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/plugins/tracepreview.py:99
+#, fuzzy
+msgid "Full trace"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/plugins/tracepreview.py:100
+msgid "Open the trace timeline view fareast"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:38
+#: ../lib/advene/gui/plugins/videoplayer.py:39
 msgid "Complementary video player"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:44
-#: ../lib/advene/gui/edit/montage.py:54
-#: ../lib/advene/gui/edit/transcribe.py:85
-#: ../lib/advene/gui/views/transcription.py:56
-#: ../lib/advene/gui/views/bookmarks.py:245
-#: ../lib/advene/gui/views/timeline.py:135
+#: ../lib/advene/gui/plugins/videoplayer.py:45
+#: ../lib/advene/gui/views/bookmarks.py:246
+#: ../lib/advene/gui/views/transcription.py:59
+#: ../lib/advene/gui/views/timeline.py:140 ../lib/advene/gui/edit/montage.py:58
+#: ../lib/advene/gui/edit/transcribe.py:88
 #, fuzzy
 msgid "Save view"
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:45
-#: ../lib/advene/gui/edit/transcribe.py:86
-#: ../lib/advene/gui/views/tagbag.py:62
-#: ../lib/advene/gui/views/transcription.py:57
-#: ../lib/advene/gui/views/interactivequery.py:60
-#: ../lib/advene/gui/views/timeline.py:136
+#: ../lib/advene/gui/plugins/videoplayer.py:46
+#: ../lib/advene/gui/views/transcription.py:60
+#: ../lib/advene/gui/views/timeline.py:141 ../lib/advene/gui/views/tagbag.py:65
+#: ../lib/advene/gui/views/interactivequery.py:61
+#: ../lib/advene/gui/edit/transcribe.py:89
 msgid "Save default options"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:46
+#: ../lib/advene/gui/plugins/videoplayer.py:47
 #, fuzzy
 msgid "Select video file"
 msgstr "Vido"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:127
+#: ../lib/advene/gui/plugins/videoplayer.py:128
 #, fuzzy
 msgid "Select a video file"
 msgstr "Vido"
@@ -3635,5805 +3312,6167 @@ msgstr "Vido"
 msgid "Synchronize"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:266
+#: ../lib/advene/gui/plugins/videoplayer.py:268
 msgid "Offset in ms"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:274
+#: ../lib/advene/gui/plugins/videoplayer.py:276
 #, fuzzy
 msgid "Drag and drop to get player time"
 msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/plugins/tracepreview.py:61
-#, fuzzy
-msgid "Trace preview"
-msgstr "Arbvido"
+#: ../lib/advene/gui/views/singletonpopup.py:32
+msgid "SingletonPopup"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/tracepreview.py:99
+#: ../lib/advene/gui/views/caption.py:31
 #, fuzzy
-msgid "Full trace"
-msgstr "Arbvido"
+msgid "Display a text caption below the video output"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/plugins/tracepreview.py:100
-msgid "Open the trace timeline view fareast"
+#: ../lib/advene/gui/views/html.py:90
+#, python-format
+msgid "%s%% loaded"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:376
+#: ../lib/advene/gui/views/html.py:93
 #, fuzzy, python-format
-msgid "Rendering type %(type)s as %(presentation)s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:521
-msgid "Snapshot only"
-msgstr ""
+msgid "Title %s"
+msgstr "Dosiero"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:522
-msgid "Overlayed snapshot only"
+#: ../lib/advene/gui/views/html.py:157
+msgid "HTML Viewer"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:523
-msgid "Timestamp only"
+#: ../lib/advene/gui/views/html.py:159
+msgid "Embedded HTML widget"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:524
-msgid "Snapshot+timestamp"
+#: ../lib/advene/gui/views/html.py:187
+msgid "No available HTML rendering component"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:525
+#: ../lib/advene/gui/views/annotationdisplay.py:43
 #, fuzzy
-msgid "Annotation content"
+msgid "AnnotationDisplay"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:540
-msgid "as a list"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:541
-msgid "as a grid"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:542
-msgid "as a table"
-msgstr ""
+#: ../lib/advene/gui/views/annotationdisplay.py:45
+#, fuzzy
+msgid "Display the contents of an annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:543
-#: ../lib/advene/gui/views/viewbook.py:380
+#: ../lib/advene/gui/views/annotationdisplay.py:86
+#: ../lib/advene/util/helper.py:610
 #, fuzzy
-msgid "as a transcription"
-msgstr "Vidi komentajxojn sur templinio"
+msgid "No annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:661
-#: ../lib/advene/gui/views/transcription.py:461
+#: ../lib/advene/gui/views/annotationdisplay.py:112
 #, python-format
-msgid "Annotation %s"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:662
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:681
-msgid "Play video"
+msgid ""
+"Schema %(schema)s (id %(id)s)\n"
+"%(description)s\n"
+"%(stats)s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:663
-msgid "Show timestamp only"
+#: ../lib/advene/gui/views/annotationdisplay.py:233
+msgid "Screenshot"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:664
-#, fuzzy
-msgid "Show content only"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:665
+#: ../lib/advene/gui/views/annotationdisplay.py:255
+#: ../lib/advene/gui/views/relationdisplay.py:104
 #, fuzzy
-msgid "Show snapshot only"
+msgid "Contents"
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:667
+#: ../lib/advene/gui/views/annotationdisplay.py:258
+#: ../lib/advene/gui/views/editaccumulator.py:74
 #, fuzzy
-msgid "Show overlayed timestamp"
-msgstr "Arbvido"
+msgid "Validate"
+msgstr "Vido"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:668
+#: ../lib/advene/gui/views/relationdisplay.py:34
 #, fuzzy
-msgid "Show overlayed content"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:670
-#, fuzzy, python-format
-msgid "Annotation type %s"
+msgid "RelationDisplay"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:671
+#: ../lib/advene/gui/views/relationdisplay.py:36
 #, fuzzy
-msgid "display as list"
+msgid "Display the contents of a relation"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:672
+#: ../lib/advene/gui/views/relationdisplay.py:79
 #, fuzzy
-msgid "display as grid"
+msgid "No relation"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:673
-#, fuzzy
-msgid "display as table"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/views/relationdisplay.py:113
+#: ../lib/advene/gui/edit/elements.py:588
+#: ../lib/advene/gui/edit/elements.py:1071
+msgid "Members"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:674
+#: ../lib/advene/gui/views/viewplugin.py:60
+msgid "Generic view plugin"
+msgstr ""
+
+#: ../lib/advene/gui/views/viewplugin.py:62
+msgid "You should not ever see this tooltip..."
+msgstr ""
+
+#: ../lib/advene/gui/views/checker.py:37
+msgid "Checker"
+msgstr ""
+
+#: ../lib/advene/gui/views/checker.py:39
 #, fuzzy
-msgid "display as transcription"
-msgstr "Vidi komentajxojn sur templinio"
+msgid "Check various package properties"
+msgstr "Redakti komentarajn attributojn"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:683
+#: ../lib/advene/gui/views/checker.py:89
 #, fuzzy
-msgid "Open link"
+msgid "List of possible issues in the current package"
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:739
-#, fuzzy, python-format
-msgid "HTML editor: cannot parse content (%s)"
+#: ../lib/advene/gui/views/checker.py:107
+msgid "Overlapping"
+msgstr ""
+
+#: ../lib/advene/gui/views/table.py:61
+#, fuzzy
+msgid "Annotation table view"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:772
-#, fuzzy, python-format
-msgid "Heading %d"
+#: ../lib/advene/gui/views/table.py:63
+#, fuzzy
+msgid "Display annotations in a table"
+msgstr "Vidi komentajxojn sur templinio"
+
+#: ../lib/advene/gui/views/table.py:74
+#, fuzzy
+msgid "Export as CSV"
 msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:783
-msgid "Bold"
-msgstr ""
+#: ../lib/advene/gui/views/table.py:268 ../lib/advene/gui/views/table.py:550
+#, fuzzy
+msgid "Snapshot"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:784
-msgid "Italic"
+#: ../lib/advene/gui/views/table.py:281
+#: ../lib/advene/gui/views/timeline.py:1745
+msgid "Cannot update the annotation, its representation is too complex"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:785
-msgid "Header"
+#: ../lib/advene/gui/views/table.py:311 ../lib/advene/gui/edit/elements.py:606
+#: ../lib/advene/gui/edit/elements.py:683
+#: ../lib/advene/gui/edit/elements.py:743
+#: ../lib/advene/gui/edit/elements.py:1134
+msgid "Content"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:787
-msgid "Copy"
+#: ../lib/advene/gui/views/table.py:312 ../lib/advene/gui/views/table.py:682
+#: ../lib/advene/gui/views/browser.py:368 ../lib/advene/gui/edit/create.py:94
+#: ../lib/advene/gui/edit/elements.py:514
+#: ../lib/advene/gui/edit/elements.py:563
+#: ../lib/advene/gui/edit/elements.py:665
+msgid "Type"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:788
-msgid "Cut"
+#: ../lib/advene/gui/views/table.py:313 ../lib/advene/gui/edit/elements.py:1800
+msgid "Begin"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:789
-msgid "Paste"
+#: ../lib/advene/gui/views/table.py:316 ../lib/advene/gui/views/table.py:683
+#: ../lib/advene/gui/util/dialog.py:400 ../lib/advene/gui/edit/rules.py:1091
+#: ../lib/advene/gui/edit/imports.py:328 ../lib/advene/gui/edit/elements.py:513
+#: ../lib/advene/gui/edit/elements.py:562
+#: ../lib/advene/gui/edit/elements.py:650
+#: ../lib/advene/gui/edit/elements.py:730
+#: ../lib/advene/gui/edit/elements.py:879
+#: ../lib/advene/gui/edit/elements.py:948
+#: ../lib/advene/gui/edit/elements.py:1060
+#: ../lib/advene/gui/edit/elements.py:1121
+msgid "Id"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:791
-#: ../lib/advene/gui/edit/schemaeditor.py:64
-#: ../lib/advene/gui/views/timeline.py:134 ../lib/advene/gui/views/tree.py:428
-msgid "Refresh"
+#: ../lib/advene/gui/views/table.py:317 ../lib/advene/gui/views/finder.py:105
+#: ../lib/advene/util/helper.py:408
+msgid "Package"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:847
-msgid "WYSIWYG editor"
+#: ../lib/advene/gui/views/table.py:455 ../lib/advene/gui/views/table.py:633
+msgid "Export data to file..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:857
-#, fuzzy
-msgid "Edit HTML source"
-msgstr "Preferoj"
-
-#: ../lib/advene/gui/plugins/logmessages.py:35
-msgid "Log Messages"
+#: ../lib/advene/gui/views/table.py:464 ../lib/advene/gui/views/table.py:642
+#, python-format
+msgid "Error while exporting data to %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:73
-#: ../lib/advene/gui/edit/importer.py:143
-msgid "Stop"
+#: ../lib/advene/gui/views/table.py:475
+msgid "id"
 msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:82
-#: ../lib/advene/gui/edit/dvdselect.py:112
-msgid "Preview"
+#: ../lib/advene/gui/views/table.py:475
+msgid "type"
 msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:91
-msgid ""
-"Select the correct\n"
-"title and chapter\n"
-"of the DVD"
+#: ../lib/advene/gui/views/table.py:475
+msgid "begin"
 msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:104
-msgid "Chapter"
+#: ../lib/advene/gui/views/table.py:475
+msgid "end"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:33
+#: ../lib/advene/gui/views/table.py:475
 #, fuzzy
-msgid "Create element"
-msgstr "Arbvido"
+msgid "content"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/merge.py:34
-#, fuzzy
-msgid "Create annotation (duplicate id)"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/edit/merge.py:35
-msgid "Create relation (duplicate id)"
-msgstr ""
-
-#: ../lib/advene/gui/edit/merge.py:36
-msgid "Update the color"
+#: ../lib/advene/gui/views/table.py:479 ../lib/advene/gui/views/table.py:658
+#: ../lib/advene/core/controller.py:2646
+#, python-format
+msgid "Data exported to %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:37
-#, fuzzy
-msgid "Update the representation"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/edit/merge.py:38
-#, fuzzy
-msgid "Update the description"
-msgstr "Importi transkribon"
-
-#: ../lib/advene/gui/edit/merge.py:39
-msgid "Update the title"
+#: ../lib/advene/gui/views/table.py:499
+#, python-format
+msgid "Set %(attr)s time to %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:40
-msgid "Update the mimetype"
+#: ../lib/advene/gui/views/table.py:558
+msgid "Generic table view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:41
-msgid "Update the begin time"
+#: ../lib/advene/gui/views/table.py:560
+msgid "Display Advene elements in a table."
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:42
-msgid "Update the end time"
+#: ../lib/advene/gui/views/table.py:583
+#, python-format
+msgid "Error in source evaluation %(source)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:43
-msgid "Update the content"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element title"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:44
-msgid "Update the matchFilter"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element type"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:45
-#, fuzzy
-msgid "Update the member types"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/edit/merge.py:46
+#: ../lib/advene/gui/views/table.py:654
 #, fuzzy
-msgid "Update tags"
+msgid "Element id"
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/edit/merge.py:90
-msgid "Difference between original and merged elements"
+#: ../lib/advene/gui/views/accumulatorpopup.py:51
+msgid "PopupAccumulator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:136
-#, fuzzy
-msgid "Current element"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/edit/merge.py:141
+#: ../lib/advene/gui/views/bookmarks.py:51
 #, fuzzy
-msgid "Updated element"
-msgstr "Arbvido"
+msgid "Bookmarks importer"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/edit/merge.py:147
-msgid "Show diff"
+#: ../lib/advene/gui/views/bookmarks.py:72
+msgid "Bookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:180
-msgid "Merge?"
+#: ../lib/advene/gui/views/bookmarks.py:74
+msgid "Bookmark timecodes with their corresponding screenshots"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:197
-msgid "Element"
+#: ../lib/advene/gui/views/bookmarks.py:80 ../lib/advene/gui/views/tagbag.py:63
+#: ../lib/advene/gui/views/activebookmarks.py:62
+#: ../lib/advene/gui/views/logwindow.py:50 ../lib/advene/gui/edit/montage.py:59
+msgid "Clear"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:230 ../lib/advene/gui/edit/imports.py:406
-#, python-format
-msgid "Package %s"
+#: ../lib/advene/gui/views/bookmarks.py:145
+msgid "Select the annotation type to generate"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:230 ../lib/advene/gui/edit/imports.py:406
-msgid "No title"
-msgstr ""
+#: ../lib/advene/gui/views/bookmarks.py:150
+#, fuzzy
+msgid "Choose a duration"
+msgstr "Elekti ilobretan stilon"
 
-#: ../lib/advene/gui/edit/merge.py:267
-msgid "All"
+#: ../lib/advene/gui/views/bookmarks.py:151
+msgid "Enter the standard duration (in ms) of created annotations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/properties.py:32
-#: ../lib/advene/gui/edit/shapewidget.py:1588
-#, fuzzy
-msgid "Properties"
-msgstr "Komentaraj attributoj"
+#: ../lib/advene/gui/views/bookmarks.py:168
+msgid "Converted from bookmarks"
+msgstr ""
 
-#: ../lib/advene/gui/edit/properties.py:46
-#: ../lib/advene/gui/edit/transcribe.py:147
-#: ../lib/advene/gui/edit/transcribe.py:1195
-#: ../lib/advene/gui/views/tagbag.py:61
-#: ../lib/advene/gui/views/timeline.py:3483
-#: ../lib/advene/gui/views/timeline.py:3624 ../lib/advene/gui/main.py:4235
-msgid "Preferences"
+#: ../lib/advene/gui/views/bookmarks.py:172
+#: ../lib/advene/gui/edit/transcribe.py:1114
+#, python-format
+msgid ""
+"Conversion completed.\n"
+"%s annotations generated."
 msgstr ""
 
-#: ../lib/advene/gui/edit/properties.py:371
-#, fuzzy
-msgid "Choose a file"
-msgstr "Elekti ilobretan stilon"
+#: ../lib/advene/gui/views/bookmarks.py:226
+msgid "Drop a position here to remove it from the list"
+msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:45
-#, fuzzy
-msgid "Importer"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/views/bookmarks.py:244
+#: ../lib/advene/gui/views/activebookmarks.py:496
+msgid "Insert a bookmark for the current video time"
+msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:101
-#: ../lib/advene/gui/edit/importer.py:111
+#: ../lib/advene/gui/views/bookmarks.py:245
 #, fuzzy
-msgid "Advene package importer"
-msgstr "Redakti komentarajn attributojn"
+msgid "Convert bookmarks to annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/importer.py:115
+#: ../lib/advene/gui/views/viewbook.py:39
 #, fuzzy
-msgid "Not likely"
-msgstr "Defauxlta regularo"
+msgid "ViewBook"
+msgstr "Vido"
 
-#: ../lib/advene/gui/edit/importer.py:137
-#, python-format
-msgid "Completed conversion: %(statistics)s"
+#: ../lib/advene/gui/views/viewbook.py:60
+#: ../lib/advene/gui/views/viewbook.py:67
+msgid "Cannot remove this widget, it is essential."
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:253
-msgid "Choose the file to import"
+#: ../lib/advene/gui/views/viewbook.py:141
+msgid "Detach"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:272
-#, fuzzy
-msgid "Filter"
-msgstr "Dosiero"
+#: ../lib/advene/gui/views/viewbook.py:145
+#: ../lib/advene/gui/views/editaccumulator.py:80
+msgid "Close"
+msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:276
+#: ../lib/advene/gui/views/viewbook.py:162
 #, fuzzy
-msgid "Options"
-msgstr "Defauxlta regularo"
+msgid "Rename the view"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/edit/importer.py:287
-msgid "Start"
+#: ../lib/advene/gui/views/viewbook.py:163
+msgid "Please enter the new name of the view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:57
-msgid "Schema Editor"
+#: ../lib/advene/gui/views/viewbook.py:202
+msgid "Detach view in its own window, or drag-and-drop to another zone"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:132
+#: ../lib/advene/gui/views/viewbook.py:216
 #, fuzzy
-msgid "Display"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Close view"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:155
-#: ../lib/advene/gui/edit/shapewidget.py:1587 ../lib/advene/gui/popup.py:472
-#: ../lib/advene/gui/popup.py:476
-msgid "Delete"
+#: ../lib/advene/gui/views/viewbook.py:239
+#: ../lib/advene/gui/views/viewbook.py:245
+#: ../lib/advene/gui/edit/elements.py:336
+#, python-format
+msgid "Edit %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:762
-#, fuzzy
-msgid "Remove relation type"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/views/viewbook.py:268 ../lib/advene/rules/actions.py:601
+#, python-format
+msgid "Cannot find the view %s"
+msgstr ""
+
+#: ../lib/advene/gui/views/viewbook.py:291
+#, fuzzy, python-format
+msgid "Open a new %s for..."
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:765
-#: ../lib/advene/gui/edit/schemaeditor.py:997
+#: ../lib/advene/gui/views/viewbook.py:303
 #, fuzzy
-msgid "Create HTML view"
+msgid "Create a new comment view"
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:831
+#: ../lib/advene/gui/views/viewbook.py:305
 #, fuzzy
-msgid "Remove annotation type"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/edit/schemaeditor.py:834
-msgid "Create relation type between this one and..."
-msgstr ""
+msgid "Open a new view"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:969
-msgid "New schema"
-msgstr ""
+#: ../lib/advene/gui/views/viewbook.py:388
+#, fuzzy, python-format
+msgid "Use annotation-type %s :"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:985 ../lib/advene/gui/popup.py:690
-#: ../lib/advene/gui/popup.py:750 ../lib/advene/gui/popup.py:803
-msgid "Select a color"
+#: ../lib/advene/gui/views/viewbook.py:392
+#: ../lib/advene/gui/views/viewbook.py:418
+msgid "to edit it"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:988
+#: ../lib/advene/gui/views/viewbook.py:393
+#: ../lib/advene/gui/views/viewbook.py:419
+#: ../lib/advene/gui/views/viewbook.py:451
 #, fuzzy
-msgid "New annotation type"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "to create a new static view"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:991
+#: ../lib/advene/gui/views/viewbook.py:395
 #, fuzzy
-msgid "New relation type"
-msgstr "Defauxlta regularo"
+msgid "in a timeline"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:994
-msgid "Hide this schema"
+#: ../lib/advene/gui/views/viewbook.py:396
+msgid "as a montage"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:1000
-msgid "Export drawing to pdf"
+#: ../lib/advene/gui/views/viewbook.py:397
+#: ../lib/advene/gui/views/viewbook.py:450
+msgid "in a table"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:1042
-#, fuzzy
-msgid "Choose a filename to export the schema as PDF"
-msgstr "Arbvido"
+#: ../lib/advene/gui/views/viewbook.py:398
+#: ../lib/advene/gui/views/viewbook.py:420
+msgid "in a query"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:84 ../lib/advene/gui/edit/rules.py:86
-#: ../lib/advene/gui/edit/create.py:252
-msgid "Rule"
+#: ../lib/advene/gui/views/viewbook.py:398
+#: ../lib/advene/gui/views/viewbook.py:420
+#, python-format
+msgid "Query %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:95 ../lib/advene/gui/edit/create.py:242
+#: ../lib/advene/gui/views/viewbook.py:399
+#: ../lib/advene/gui/views/viewbook.py:421
 #, fuzzy
-msgid "Subviews"
-msgstr "Arbvido"
+msgid "in the TALES browser"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/gui/edit/rules.py:122
-msgid "Add a new rule"
+#: ../lib/advene/gui/views/viewbook.py:399
+#, python-format
+msgid "Browsing %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:126
-#, fuzzy
-msgid "Subview"
-msgstr "Arbvido"
+#: ../lib/advene/gui/views/viewbook.py:415
+#, fuzzy, python-format
+msgid "Use annotation %s :"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/rules.py:129
-msgid "Add a subview list"
+#: ../lib/advene/gui/views/viewbook.py:421
+#, python-format
+msgid "Browse %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:135
+#: ../lib/advene/gui/views/viewbook.py:422
 #, fuzzy
-msgid "Remove the current rule"
-msgstr "Defauxlta regularo"
+msgid "to display its contents"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/rules.py:275
-msgid "Source expression"
+#: ../lib/advene/gui/views/viewbook.py:422
+#, python-format
+msgid "%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:277
-msgid "Return expression"
+#: ../lib/advene/gui/views/viewbook.py:423
+msgid "as a bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:351
-msgid "For all elements in "
+#: ../lib/advene/gui/views/viewbook.py:441
+msgid "as the context for the query..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:352
+#: ../lib/advene/gui/views/viewbook.py:445
 #, fuzzy
-msgid "All annotations of the package"
+msgid "Set of annotations"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/rules.py:353
-msgid "All views of the package"
-msgstr ""
-
-#: ../lib/advene/gui/edit/rules.py:354 ../lib/advene/gui/edit/rules.py:798
+#: ../lib/advene/gui/views/viewbook.py:446
 #, fuzzy
-msgid "The context annotations"
+msgid "Use annotations:"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/rules.py:355 ../lib/advene/gui/edit/rules.py:799
+#: ../lib/advene/gui/views/viewbook.py:449
+msgid "to edit them"
+msgstr ""
+
+#: ../lib/advene/gui/views/viewbook.py:452
 #, fuzzy
-msgid "The annotations of the context type"
+msgid "as bookmarks"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/rules.py:370
-msgid "Return "
+#: ../lib/advene/gui/views/transcription.py:51
+msgid "Transcription"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:372 ../lib/advene/gui/edit/rules.py:787
+#: ../lib/advene/gui/views/transcription.py:53
 #, fuzzy
-msgid "The element"
-msgstr "Arbvido"
+msgid "Display annotations as a text transcription"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/rules.py:373 ../lib/advene/gui/edit/rules.py:788
+#: ../lib/advene/gui/views/transcription.py:158
 #, fuzzy
-msgid "The element's content"
-msgstr "Arbvido"
+msgid "Transcription options"
+msgstr "Importi transkribon"
 
-#: ../lib/advene/gui/edit/rules.py:388
-msgid "If the element matches "
+#: ../lib/advene/gui/views/transcription.py:159
+#, fuzzy
+msgid "Default representation"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/views/transcription.py:159
+msgid "Use the default representation for annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:390
-msgid "Return the element if it matches "
+#: ../lib/advene/gui/views/transcription.py:160
+#: ../lib/advene/gui/edit/elements.py:988
+msgid "Representation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:408 ../lib/advene/gui/edit/rules.py:617
-msgid "All conditions must be met"
+#: ../lib/advene/gui/views/transcription.py:160
+msgid ""
+"If default representation is unchecked,\n"
+"this TALES expression that will be used to format the annotations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:409 ../lib/advene/gui/edit/rules.py:618
-msgid "Any condition can be met"
+#: ../lib/advene/gui/views/transcription.py:161
+msgid "Separator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:493 ../lib/advene/gui/edit/rules.py:563
-#, python-format
-msgid "Rule <b>%s</b>"
+#: ../lib/advene/gui/views/transcription.py:162
+msgid "This separator will be inserted between the annotations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:574
-msgid "Rule name"
+#: ../lib/advene/gui/views/transcription.py:163
+msgid "Whitespace"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:591
-msgid "Event"
-msgstr ""
+#: ../lib/advene/gui/views/transcription.py:164
+#, fuzzy
+msgid "Newline"
+msgstr "Templinio"
 
-#: ../lib/advene/gui/edit/rules.py:599
-msgid "If"
-msgstr ""
+#: ../lib/advene/gui/views/transcription.py:165
+#, fuzzy
+msgid "Tabulation"
+msgstr "Vido"
 
-#: ../lib/advene/gui/edit/rules.py:638
-msgid "Then"
+#: ../lib/advene/gui/views/transcription.py:166
+msgid "Dash"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:683
-msgid "When the "
+#: ../lib/advene/gui/views/transcription.py:167
+msgid "User defined"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:696
-msgid " occurs,"
+#: ../lib/advene/gui/views/transcription.py:169
+msgid "User-defined separator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:723 ../lib/advene/gui/edit/rules.py:726
-#, python-format
-msgid "Condition expression: %s"
+#: ../lib/advene/gui/views/transcription.py:169
+msgid ""
+"Separator used if user-defined is selected.Use \\n for a newline and \\t for "
+"a tabulation."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:765
-#, fuzzy
-msgid "The annotation type"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/edit/rules.py:768
-#, fuzzy, python-format
-msgid "The value of the %s attribute"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/views/transcription.py:170
+msgid "Display timestamps"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:770
-#, fuzzy
-msgid "The annotation fragment"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/views/transcription.py:170
+msgid "Insert timestsamp values"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:771
-#, fuzzy
-msgid "The annotation begin time"
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/gui/views/transcription.py:171
+msgid "Display annotation bounds"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:772
-#, fuzzy
-msgid "The annotation end time"
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/gui/views/transcription.py:231
+#, python-format
+msgid ""
+"Cannot convert the following annotations,\n"
+"the representation pattern is too complex.\n"
+"%s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:774
-#, fuzzy
-msgid "The annotation MIME-type"
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/gui/views/transcription.py:242
+msgid ""
+"Cannot validate the update.\n"
+"The representation pattern is too complex."
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:775
+#: ../lib/advene/gui/views/transcription.py:268
 #, fuzzy
-msgid "The annotation's incoming relations"
+msgid "Save transcription to a text file"
 msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/rules.py:776
-#, fuzzy
-msgid "The annotation's outgoing relations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/edit/rules.py:779
-#, fuzzy, python-format
-msgid "The %s-related incoming annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/views/transcription.py:269
+msgid "Apply the modifications"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:783
-#, fuzzy, python-format
-msgid "The %s-related outgoing annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/views/transcription.py:270
+msgid "Find text"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:789
-#, fuzzy
-msgid "The element fragment"
-msgstr "Arbvido"
+#: ../lib/advene/gui/views/transcription.py:271
+msgid "Quickly switch display options"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:790
+#: ../lib/advene/gui/views/transcription.py:272
 #, fuzzy
-msgid "The element begin time"
+msgid "Refresh the transcription"
 msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/rules.py:791
-#, fuzzy
-msgid "The element end time"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/edit/rules.py:792
-#, fuzzy
-msgid "The element duration"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/edit/rules.py:793
+#: ../lib/advene/gui/views/transcription.py:273
 #, fuzzy
-msgid "The element type"
-msgstr "Arbvido"
+msgid "Edit preferences"
+msgstr "Preferoj"
 
-#: ../lib/advene/gui/edit/rules.py:794
-#, fuzzy
-msgid "The element's incoming relations"
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/gui/views/transcription.py:692
+#, python-format
+msgid "Cannot write to %(filename)s: %(error)s:"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:795
-#, fuzzy
-msgid "The element's outgoing relations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/views/transcription.py:698
+#: ../lib/advene/gui/edit/transcribe.py:859
+#, python-format
+msgid "Transcription saved to %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:796
+#: ../lib/advene/gui/views/browser.py:169
+#: ../lib/advene/gui/views/browser.py:171
 #, fuzzy
-msgid "The context"
-msgstr "Defauxlta regularo"
+msgid "TALES browser"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/gui/edit/rules.py:797
+#: ../lib/advene/gui/views/browser.py:176
 #, fuzzy
-msgid "The context fragment"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/edit/rules.py:809
-#, fuzzy, python-format
-msgid "annotation-type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/edit/rules.py:812
-#, fuzzy, python-format
-msgid "relation-type %s"
+msgid "Display result in table"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/rules.py:834
-msgid "Select a condition"
-msgstr ""
-
-#: ../lib/advene/gui/edit/rules.py:878
-#, python-format
-msgid "Parameter %s"
-msgstr ""
-
-#: ../lib/advene/gui/edit/rules.py:992
-msgid "Select an action"
+#: ../lib/advene/gui/views/browser.py:199
+msgid "Insert path"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:1083
-msgid "Activate?"
+#: ../lib/advene/gui/views/browser.py:200
+msgid "Insert value"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:83
-msgid "Generic shape"
+#: ../lib/advene/gui/views/browser.py:255
+msgid "Expression returned None (there was an exception)"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:234
-#: ../lib/advene/gui/edit/shapewidget.py:741
-#, python-format
-msgid "Link to %s"
+#: ../lib/advene/gui/views/browser.py:308
+msgid "Result is not a list"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:321
-#: ../lib/advene/gui/views/tagbag.py:132
-msgid "Name"
+#: ../lib/advene/gui/views/browser.py:365
+#: ../lib/advene/gui/edit/shapewidget.py:944
+msgid "Path"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:326
-#: ../lib/advene/gui/edit/shapewidget.py:1299
-msgid "Link"
+#: ../lib/advene/gui/views/browser.py:372
+#: ../lib/advene/gui/edit/elements.py:2163
+msgid "Value"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:331
-msgid "Link label"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:128
+msgid "Display annotations on a timeline"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/shapewidget.py:349
-msgid "Linewidth"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:142
+#, fuzzy
+msgid "Limit display to current area"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/shapewidget.py:354
+#: ../lib/advene/gui/views/timeline.py:143
+#: ../lib/advene/gui/views/timeline.py:3307
 #, fuzzy
-msgid "Filled"
-msgstr "Dosiero"
+msgid "Display whole movie"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/shapewidget.py:362
-msgid "Opacity"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:173
+#, fuzzy, python-format
+msgid "Cannot find annotation type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/shapewidget.py:404
-#, python-format
-msgid "Properties of %s"
+#: ../lib/advene/gui/views/timeline.py:234
+msgid "No scrolling"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:451
-msgid "Rectangle"
+#: ../lib/advene/gui/views/timeline.py:235
+msgid "Continuous scrolling"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:532
-#: ../lib/advene/gui/edit/shapewidget.py:652
-msgid "Text"
+#: ../lib/advene/gui/views/timeline.py:236
+msgid "Discrete scrolling"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:663
-msgid "Textsize"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:237
+#, fuzzy
+msgid "Annotation scrolling"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/shapewidget.py:677
-msgid "Image"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:582
+#, fuzzy, python-format
+msgid "%d annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/shapewidget.py:761
-msgid "Href"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:585
+#, fuzzy
+msgid "Display all types"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/shapewidget.py:771
-msgid "Line"
+#: ../lib/advene/gui/views/timeline.py:587
+#, python-format
+msgid ""
+"There are %d annotations.\n"
+"The current timeline may take a long time to display them, so only the first "
+"two annotation types are displayed. Use the annotation type selector (second "
+"button in the timeline) to select other annotations types to display, or "
+"click on the 'Display all types' button below."
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:872
-msgid "Draw an arrow"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:1055
+#, fuzzy
+msgid "Split at current player position"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/shapewidget.py:883
-msgid "Arrow size"
+#: ../lib/advene/gui/views/timeline.py:1059
+msgid "Center and zoom"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:935
-#: ../lib/advene/gui/views/browser.py:359
-msgid "Path"
+#: ../lib/advene/gui/views/timeline.py:1163
+msgid "Create a relation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:1102
+#: ../lib/advene/gui/views/timeline.py:1173
 #, fuzzy
-msgid "Close path"
-msgstr "Komentaraj attributoj"
+msgid "Create a new relation-type."
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/shapewidget.py:1181
-msgid "Circle"
+#: ../lib/advene/gui/views/timeline.py:1199
+#, fuzzy
+msgid "Merge with this annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/timeline.py:1208
+msgid "Align both begin times"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:1239
-msgid "Ellipse"
+#: ../lib/advene/gui/views/timeline.py:1209
+msgid "Align both end times"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:1589
-msgid "SVG"
+#: ../lib/advene/gui/views/timeline.py:1210
+msgid "Align end time to selected begin time"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:2172
-msgid "Load SVG"
+#: ../lib/advene/gui/views/timeline.py:1211
+msgid "Align begin time to selected end time"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:2178
-msgid "Save SVG"
+#: ../lib/advene/gui/views/timeline.py:1212
+msgid "Align all times"
+msgstr ""
+
+#: ../lib/advene/gui/views/timeline.py:1250
+msgid "Cannot delete the annotation : it has relations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:74
-#: ../lib/advene/gui/widget.py:1063
+#: ../lib/advene/gui/views/timeline.py:1325
 #, fuzzy
-msgid "Refresh snapshot"
+msgid "Select the appropriate relation type"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:102
-#, python-format
-msgid "Decrement value by %.2f s"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:1344
+#, fuzzy, python-format
+msgid "Duplicate selection to type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/timeline.py:1347
+#, fuzzy, python-format
+msgid "Move selection to type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/timeline.py:1356
+#, fuzzy, python-format
+msgid "Duplicate annotation to type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/timeline.py:1360
+#, fuzzy, python-format
+msgid "Move annotation to type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/timeline.py:1367
+#, fuzzy, python-format
+msgid "Duplicate to type %(type)s at %(position)s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:104
+#: ../lib/advene/gui/views/timeline.py:1373
 #, python-format
-msgid "Increment value by %.2f s"
+msgid "Move to type %(type)s at %(position)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:130
-msgid ""
-"Click to play\n"
-"Control+click to set to current time\n"
-"Scroll to modify value (with control/shift)\n"
-"Right-click to invalidate screenshot"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:1383
+#, fuzzy
+msgid "Duplicate and create a relation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:145
-msgid ""
-"Enter a timecode.\n"
-"An integer value will be considered as milliseconds.\n"
-"A float value (12.2) will be considered as seconds.\n"
-"HH:MM:SS.sss values are possible."
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:1394
+#, fuzzy, python-format
+msgid "Duplicate at %s and create a relation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:159
-msgid "Set to current player position"
+#: ../lib/advene/gui/views/timeline.py:1425
+#, fuzzy
+msgid "Annotation filter"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/timeline.py:1426
+msgid "Enter the searched string"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:81
+#: ../lib/advene/gui/views/timeline.py:1534
+#, fuzzy, python-format
+msgid "Duplicate all annotations to type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/timeline.py:1536
+#, fuzzy, python-format
+msgid "Move all annotations to type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/timeline.py:1538
+#, fuzzy, python-format
+msgid "Duplicate all annotations matching a string to type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/timeline.py:1540
+#, fuzzy, python-format
+msgid "Move all annotations matching a string to type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/timeline.py:1542
 #, python-format
-msgid "%s creation"
+msgid "Align all annotation time codes using %s as reference."
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:82
+#: ../lib/advene/gui/views/timeline.py:1544
 #, python-format
-msgid ""
-"To create a new element of type %s,\n"
-"you must give the following information."
+msgid "Align all annotation contents using %s as reference"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:92 ../lib/advene/gui/edit/elements.py:508
-#: ../lib/advene/gui/edit/elements.py:557
-#: ../lib/advene/gui/edit/elements.py:659
-#: ../lib/advene/gui/views/browser.py:362 ../lib/advene/gui/views/table.py:251
-#: ../lib/advene/gui/views/table.py:558
-msgid "Type"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:2038
+#: ../lib/advene/gui/views/timeline.py:2060
+#, fuzzy, python-format
+msgid "Displaying %(count)d / %(total)d annotations..."
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/create.py:111
-msgid "Dynamic view"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:2049
+#, fuzzy
+msgid "Displaying done."
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/create.py:112
-msgid "HTML template"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:2478
+#, fuzzy
+msgid "Create a new annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/create.py:113
-msgid "Plain XML"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:2479
+#, fuzzy
+msgid "Zoom on region"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/create.py:114
-msgid "SVG template"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:2480
+#, fuzzy
+msgid "Restrict display to region"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/create.py:115
-msgid "Plain text template"
+#: ../lib/advene/gui/views/timeline.py:2589
+#: ../lib/advene/gui/edit/transcribe.py:489
+#, python-format
+msgid "Position %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:118
-msgid "Simple query"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:2599
+#, fuzzy
+msgid "New annotation at player time"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/create.py:120
-msgid "Directory"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:2603
+#, fuzzy
+msgid "New annotation at mouse position"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/create.py:128
-msgid "No available type."
+#: ../lib/advene/gui/views/timeline.py:2607
+msgid "Selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:172
+#: ../lib/advene/gui/views/timeline.py:2728
 #, python-format
-msgid ""
-"The identifier %s is not valid.\n"
-"It must be composed of non-accentuated alphabetic characters\n"
-"Underscore is allowed."
+msgid "Cannot zoom more %f"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:177
+#: ../lib/advene/gui/views/timeline.py:2940
 #, python-format
-msgid "The identifier %s is already defined."
+msgid "From schema %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:310
-msgid "New resource data"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3003
+#, fuzzy
+msgid "Restrict playing to this annotation-type"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/imports.py:143 ../lib/advene/gui/edit/imports.py:144
-msgid "Schemas"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3010
+#, fuzzy
+msgid "Goto previous annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/imports.py:181 ../lib/advene/gui/edit/imports.py:182
-#: ../lib/advene/gui/views/interactivequery.py:464
-msgid "Annotations"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3021
+#, fuzzy
+msgid "Goto next annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/imports.py:195 ../lib/advene/gui/edit/imports.py:196
-#: ../lib/advene/gui/edit/elements.py:517
-msgid "Relations"
+#: ../lib/advene/gui/views/timeline.py:3032
+msgid "+"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:209 ../lib/advene/gui/edit/imports.py:210
-msgid "Queries"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3091
+#, fuzzy
+msgid "Open an annotation display view"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/imports.py:320
-msgid "Imported?"
+#: ../lib/advene/gui/views/timeline.py:3098
+msgid "Open a slave montage view (coordinated zoom level)"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:337
-#: ../lib/advene/gui/edit/elements.py:509
-#: ../lib/advene/gui/edit/elements.py:558
-#: ../lib/advene/gui/edit/elements.py:645
-#: ../lib/advene/gui/edit/elements.py:725
-#: ../lib/advene/gui/edit/elements.py:782
-#: ../lib/advene/gui/edit/elements.py:874
-#: ../lib/advene/gui/edit/elements.py:943
-#: ../lib/advene/gui/edit/elements.py:1055
-#: ../lib/advene/gui/edit/elements.py:1117
-msgid "URI"
+#: ../lib/advene/gui/views/timeline.py:3133
+msgid ""
+"<b>Statistics about current selection</b>\n"
+"\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:359
-msgid "Choose the package to import, and its alias"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3156
+#, fuzzy
+msgid "No selected annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/montage.py:47
-msgid "Montage"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3160
+#, fuzzy, python-format
+msgid "%d selected annotation(s)"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/montage.py:49
+#: ../lib/advene/gui/views/timeline.py:3167
 #, fuzzy
-msgid "Dynamic montage of annotations"
-msgstr "Importi transkribon"
-
-#: ../lib/advene/gui/edit/montage.py:55
-#: ../lib/advene/gui/views/logwindow.py:50
-#: ../lib/advene/gui/views/tagbag.py:60
-#: ../lib/advene/gui/views/activebookmarks.py:59
-#: ../lib/advene/gui/views/bookmarks.py:77
-msgid "Clear"
-msgstr ""
+msgid "Unselect all annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/montage.py:56
-#: ../lib/advene/gui/views/transcription.py:472
-#: ../lib/advene/gui/widget.py:1059
-msgid "Play"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3168
+#, fuzzy
+msgid "Create a static view"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/edit/montage.py:57
-msgid "Render"
+#: ../lib/advene/gui/views/timeline.py:3169
+msgid "Highlight selection in other views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:171
-msgid "Remove from montage"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3170
+#: ../lib/advene/gui/views/timeline.py:3766
+#, fuzzy
+msgid "Tag selection"
+msgstr "Vido"
 
-#: ../lib/advene/gui/edit/montage.py:303 ../lib/advene/gui/popup.py:444
-#, fuzzy, python-format
-msgid "Extracting %s"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/views/timeline.py:3171
+#, fuzzy
+msgid "Delete selected annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/montage.py:304
-#, python-format
-msgid ""
-"Exporting montage %(title)s\n"
-"to %%(filename)s"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3172
+#, fuzzy
+msgid "Display selection in a table"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/montage.py:396
-msgid "Drop an annotation here to remove it from the list"
+#: ../lib/advene/gui/views/timeline.py:3173
+msgid "Center and zoom on selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:407
-msgid "Play the montage"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3174
+#, fuzzy
+msgid "Edit selected annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/montage.py:412
+#: ../lib/advene/gui/views/timeline.py:3175
 #, fuzzy
-msgid "Save the view in the package"
-msgstr "Komentaraj attributoj"
+msgid "Merge annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/montage.py:460
-msgid "Set zoom level"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3176
+#, fuzzy
+msgid "Display statistics"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/montage.py:465
-msgid "Set 100% zoom"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3183
+#, fuzzy
+msgid "Select all annotations of the same type in this time range"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/montage.py:471
-#: ../lib/advene/gui/views/interactivequery.py:439
+#: ../lib/advene/gui/views/timeline.py:3186
 #, fuzzy
-msgid "Unhighlight annotations"
+msgid "Select all annotations in this time range"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/montage.py:475 ../lib/advene/gui/edit/montage.py:484
-#: ../lib/advene/gui/views/interactivequery.py:443
-#: ../lib/advene/gui/views/interactivequery.py:480
+#: ../lib/advene/gui/views/timeline.py:3300
 #, fuzzy
-msgid "Highlight annotations"
+msgid "Goto previous page"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/montage.py:545
+#: ../lib/advene/gui/views/timeline.py:3312
 #, fuzzy
-msgid "Total duration:"
+msgid "Goto next page"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/frameselector.py:43
-msgid "Click on a frame to select its time."
+#: ../lib/advene/gui/views/timeline.py:3368
+msgid "Inspector locked. Click here or in the timeline background to unlock."
 msgstr ""
 
-#: ../lib/advene/gui/edit/frameselector.py:177
+#: ../lib/advene/gui/views/timeline.py:3395
 #, fuzzy
-msgid "Select the appropriate snapshot"
+msgid ""
+"Delete the selected annotations or drop an annotation here to delete it."
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/frameselector.py:230
-#: ../lib/advene/gui/edit/frameselector.py:283
-msgid "Click to see more frames or scroll with the mouse wheel"
+#: ../lib/advene/gui/views/timeline.py:3418
+msgid ""
+"Drag an annotation type here to remove it from display.\n"
+"Click to edit all displayed types"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:67
-msgid "Transcription importer"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3430
+#, fuzzy
+msgid "Selection actions"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/transcribe.py:78
-msgid "Note taking"
+#: ../lib/advene/gui/views/timeline.py:3441
+msgid "Display relations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:80
+#: ../lib/advene/gui/views/timeline.py:3447
 #, fuzzy
-msgid "Take notes on the fly as a timestamped transcription"
-msgstr "Importi annotajxojn de tempmarkita transkribo"
+msgid "Display all relations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/transcribe.py:87
-#: ../lib/advene/gui/views/activebookmarks.py:60
-#, fuzzy
-msgid "Export as static view"
-msgstr "Arbvido"
+#: ../lib/advene/gui/views/timeline.py:3523
+msgid "Center on current player position."
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:148
-msgid "Timestamp"
+#: ../lib/advene/gui/views/timeline.py:3539
+msgid "Automatically activate loop when clicking on an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:148
-msgid "Click inserts timestamp marks"
+#: ../lib/advene/gui/views/timeline.py:3563
+msgid "Displayed"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:149
-msgid "Insert on single-click"
+#: ../lib/advene/gui/views/timeline.py:3571
+#, fuzzy
+msgid "Not displayed"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/views/timeline.py:3620
+msgid "< All <"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:149
-msgid "A single click will insert the mark (else a double click is needed)"
+#: ../lib/advene/gui/views/timeline.py:3624
+msgid "> All >"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:150
-msgid "Play on scroll"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3648
+#, fuzzy
+msgid "Displayed annotation types"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/transcribe.py:150
-msgid "Play the new position upon timestamp modification"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3678
+#, fuzzy
+msgid "Relation type"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/transcribe.py:151
+#: ../lib/advene/gui/views/timeline.py:3678
 #, fuzzy
-msgid "Generate empty annotations"
+msgid "Display relation types"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/transcribe.py:151
+#: ../lib/advene/gui/views/timeline.py:3679
 #, fuzzy
-msgid "If checked, generate annotations for empty text"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Relation content"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/transcribe.py:152
-msgid "Reaction time"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3679
+#, fuzzy
+msgid "Display relation content"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/transcribe.py:152
-msgid ""
-"Reaction time (substracted from current player time, except when paused.)"
+#: ../lib/advene/gui/views/timeline.py:3680 ../lib/advene/gui/popup.py:545
+msgid "Highlight"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:153
-msgid "Auto-insert"
+#: ../lib/advene/gui/views/timeline.py:3680
+msgid "Highlight active annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:153
-msgid "Automatic timestamp mark insertion"
+#: ../lib/advene/gui/views/timeline.py:3767
+msgid "Enter the tag for the selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:154
-msgid "Automatic insertion delay"
+#: ../lib/advene/gui/views/timeline.py:3773
+#: ../lib/advene/gui/views/tagbag.py:165
+msgid "The tag contains invalid characters"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:154
-msgid ""
-"If autoinsert is active, timestamp marks will be automatically inserted when "
-"text is entered after no interaction since this delay (in ms).\n"
-"1000 is typically a good value."
-msgstr ""
+#: ../lib/advene/gui/views/relation.py:71
+#, fuzzy
+msgid "Relations view"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/transcribe.py:155 ../lib/advene/gui/main.py:4368
-msgid "Font size"
-msgstr ""
+#: ../lib/advene/gui/views/editionhistory.py:40
+#, fuzzy
+msgid "Edition History"
+msgstr "Preferoj"
 
-#: ../lib/advene/gui/edit/transcribe.py:155
-msgid "Font size for text (0 for standard size)"
+#: ../lib/advene/gui/views/editionhistory.py:42
+msgid "Access last edited/created elements"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:215
-#: ../lib/advene/gui/edit/transcribe.py:219
-#: ../lib/advene/gui/edit/transcribe.py:379
-#: ../lib/advene/gui/edit/transcribe.py:383
-msgid "Invalid timestamp mark"
-msgstr ""
+#: ../lib/advene/gui/views/editionhistory.py:102
+#, fuzzy
+msgid "Created"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/edit/transcribe.py:496
-#: ../lib/advene/gui/views/timeline.py:2550
-#, python-format
-msgid "Position %s"
-msgstr ""
+#: ../lib/advene/gui/views/editionhistory.py:103
+#, fuzzy
+msgid "Edited"
+msgstr "Redakti"
 
-#: ../lib/advene/gui/edit/transcribe.py:506 ../lib/advene/gui/popup.py:456
-msgid "Edit"
+#: ../lib/advene/gui/views/tagbag.py:55
+msgid "Tag Bag"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:510
-msgid "Ignore the following text (toggle)"
+#: ../lib/advene/gui/views/tagbag.py:62
+msgid "New tag"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:514
-msgid "Remove mark"
+#: ../lib/advene/gui/views/tagbag.py:125
+msgid "New tag name"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:518
-msgid "Reaction-time offset"
+#: ../lib/advene/gui/views/tagbag.py:131
+msgid "Enter a new tag name and select its color."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:522
-msgid "-1 sec"
+#: ../lib/advene/gui/views/tagbag.py:135
+#: ../lib/advene/gui/edit/shapewidget.py:343
+msgid "Name"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:525
-msgid "-0.5 sec"
+#: ../lib/advene/gui/views/tagbag.py:141
+#: ../lib/advene/gui/edit/shapewidget.py:364
+#: ../lib/advene/gui/edit/elements.py:897
+#: ../lib/advene/gui/edit/elements.py:977
+#: ../lib/advene/gui/edit/elements.py:1091 ../lib/advene/rules/actions.py:135
+msgid "Color"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:528
-msgid "-0.1 sec"
-msgstr ""
+#: ../lib/advene/gui/views/tagbag.py:178
+#, fuzzy
+msgid "Tag bag options"
+msgstr "Vido"
 
-#: ../lib/advene/gui/edit/transcribe.py:532
-msgid "+1 sec"
+#: ../lib/advene/gui/views/tagbag.py:179
+#, fuzzy
+msgid "Update with new tags"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/views/tagbag.py:179
+msgid "Automatically display new defined tags"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:535
-msgid "+0.5 sec"
+#: ../lib/advene/gui/views/tagbag.py:228
+#, fuzzy, python-format
+msgid "Choose the color for tag %s"
+msgstr "Elekti ilobretan stilon"
+
+#: ../lib/advene/gui/views/tagbag.py:252
+msgid "Set color"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:538
-msgid "+0.1 sec"
+#: ../lib/advene/gui/views/tagbag.py:253
+msgid "Remove"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:629
-msgid "Invalid timestamp"
+#: ../lib/advene/gui/views/tagbag.py:326
+msgid "Drop a tag here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:762
-#, python-format
-msgid "Invalid timestamp mark in conversion: %s"
+#: ../lib/advene/gui/views/tagbag.py:336
+#, fuzzy
+msgid "Save as adhoc view"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/views/tagbag.py:337
+#, fuzzy
+msgid "Add a new tag"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/views/tagbag.py:338
+#, fuzzy
+msgid "Display all defined tags"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/__init__.py:197
+msgid "Invalid view id"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:879
+#: ../lib/advene/gui/views/__init__.py:243
 #, python-format
-msgid "Cannot save the file: %s"
+msgid "Cannot save default options: %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:884
-#: ../lib/advene/gui/views/transcription.py:703
+#: ../lib/advene/gui/views/__init__.py:254
+#, fuzzy, python-format
+msgid "Default options saved for view %s"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/views/__init__.py:282
 #, python-format
-msgid "Transcription saved to %s"
+msgid "Error in source evaluation %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:890
-#: ../lib/advene/gui/edit/transcribe.py:980
-msgid "This will overwrite the current textual content. Are you sure?"
+#: ../lib/advene/gui/views/__init__.py:299
+#, python-format
+msgid "Saving %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:893
-msgid "Select transcription file to load"
+#: ../lib/advene/gui/views/__init__.py:302
+msgid "Enter a view name to save this parametered view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:910
+#: ../lib/advene/gui/views/__init__.py:320
 #, python-format
-msgid "Cannot open %(filename)s: %(error)s"
+msgid "Error: the view %s is not an adhoc view."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:965
-msgid "Cannot import annotations: no existing interface"
+#: ../lib/advene/gui/views/__init__.py:345
+msgid "HTML export"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:967
+#: ../lib/advene/gui/views/__init__.py:346
 #, fuzzy
-msgid "Select the annotation type to import"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Specify a name for the export view"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/edit/transcribe.py:976
-#, fuzzy, python-format
-msgid "There are no annotations of type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/views/__init__.py:365
+#, python-format
+msgid ""
+"View successfully exported as %s.\n"
+"Open it in the web browser ?"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1005
-msgid "Cannot convert the data: no associated package"
+#: ../lib/advene/gui/views/__init__.py:444
+msgid "Actions"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1008
-#, fuzzy
-msgid "Converting transcription"
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/gui/views/__init__.py:469
+msgid "Click or drag-and-drop to reattach view"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1014
-#, fuzzy
-msgid "Choose the annotation-type where to create annotations.\n"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/views/finder.py:106
+msgid "List of views"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1022
+#: ../lib/advene/gui/views/finder.py:107
 #, fuzzy
-msgid "Delete existing annotations in this type"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Static views"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/edit/transcribe.py:1027
-#: ../lib/advene/gui/views/timeline.py:3009 ../lib/advene/gui/main.py:3222
-msgid "Create a new annotation type"
+#: ../lib/advene/gui/views/finder.py:108
+msgid "Dynamic views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1045
+#: ../lib/advene/gui/views/finder.py:109
 #, fuzzy
-msgid "Select type"
+msgid "Admin views"
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/transcribe.py:1049
-msgid "You want to create a new type. Please specify its schema and title."
-msgstr ""
+#: ../lib/advene/gui/views/finder.py:110
+#, fuzzy
+msgid "Adhoc views"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/transcribe.py:1061
-msgid "Containing schema"
-msgstr ""
+#: ../lib/advene/gui/views/finder.py:174
+#, fuzzy
+msgid "No resources"
+msgstr "Preferoj"
 
-#: ../lib/advene/gui/edit/transcribe.py:1074
-msgid "Export options"
+#: ../lib/advene/gui/views/finder.py:551
+#, python-format
+msgid ""
+"View <b>%(title)s</b>\n"
+"Id: %(id)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1079
+#: ../lib/advene/gui/views/finder.py:558
 #, fuzzy
-msgid "Generate annotations for empty contents"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Open in webbrowser"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/gui/edit/transcribe.py:1104
+#: ../lib/advene/gui/views/finder.py:559
 #, python-format
-msgid "The %s identifier already exists. Choose another one."
+msgid "View applied to %s\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1143
-msgid "Notes converted"
+#: ../lib/advene/gui/views/finder.py:564 ../lib/advene/gui/popup.py:525
+msgid "Activate"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1147
-#: ../lib/advene/gui/views/bookmarks.py:169
-#, python-format
-msgid ""
-"Conversion completed.\n"
-"%s annotations generated."
+#: ../lib/advene/gui/views/finder.py:567
+msgid "Open in GUI"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1163
-#: ../lib/advene/gui/views/activebookmarks.py:546
-msgid "Smallish"
+#: ../lib/advene/gui/views/finder.py:569
+msgid "Unknown type of view??"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1167
-#: ../lib/advene/gui/views/activebookmarks.py:550
-msgid "Larger"
-msgstr ""
+#: ../lib/advene/gui/views/finder.py:597
+#, fuzzy
+msgid "Edit view"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/edit/transcribe.py:1168
-#: ../lib/advene/gui/views/activebookmarks.py:551
-msgid "Huge"
-msgstr ""
+#: ../lib/advene/gui/views/finder.py:606
+#, fuzzy
+msgid "Open view"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/transcribe.py:1190
-msgid "Open"
+#: ../lib/advene/gui/views/finder.py:646 ../lib/advene/gui/views/finder.py:710
+#, python-format
+msgid ""
+"%(type)s <b>%(title)s</b>\n"
+"Id: %(id)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1191
-msgid "Save"
+#: ../lib/advene/gui/views/finder.py:661
+#: ../lib/advene/gui/views/interactivequery.py:401
+msgid "Edit query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1192
-msgid "Save As"
+#: ../lib/advene/gui/views/finder.py:669
+msgid "Try to apply the query on..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1193
+#: ../lib/advene/gui/views/finder.py:687 ../lib/advene/gui/popup.py:860
 #, fuzzy
-msgid "Import"
-msgstr "Importi dosieron"
+msgid "the package"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/gui/edit/transcribe.py:1193
+#: ../lib/advene/gui/views/finder.py:688 ../lib/advene/gui/popup.py:861
 #, fuzzy
-msgid "Import from annotations"
+msgid "all annotations of the package"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/transcribe.py:1194
-msgid "Convert"
-msgstr ""
-
-#: ../lib/advene/gui/edit/transcribe.py:1194
+#: ../lib/advene/gui/views/finder.py:689 ../lib/advene/gui/popup.py:862
 #, fuzzy
-msgid "Convert to annotations"
+msgid "the first annotation of the package"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/transcribe.py:1196
-#, fuzzy
-msgid "Center on the current mark"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/edit/transcribe.py:1197
+#: ../lib/advene/gui/views/finder.py:734
 #, fuzzy
-msgid "Find"
-msgstr "Dosiero"
-
-#: ../lib/advene/gui/edit/transcribe.py:1197
-msgid "Search a string"
-msgstr ""
-
-#: ../lib/advene/gui/edit/transcribe.py:1198
-msgid "Scale"
-msgstr ""
-
-#: ../lib/advene/gui/edit/transcribe.py:1198
-#: ../lib/advene/gui/views/activebookmarks.py:564
-msgid "Set the size of snaphots"
-msgstr ""
+msgid "Edit resource"
+msgstr "Preferoj"
 
-#: ../lib/advene/gui/edit/transcribe.py:1221
-msgid "Automatically scroll to the mark position when playing"
-msgstr ""
-
-#: ../lib/advene/gui/edit/transcribe.py:1223
-msgid "Autoscroll"
-msgstr ""
-
-#: ../lib/advene/gui/edit/transcribe.py:1230
-msgid "Autoinsert"
-msgstr ""
-
-#: ../lib/advene/gui/edit/transcribe.py:1232
-msgid "Automatically insert marks"
-msgstr ""
-
-#: ../lib/advene/gui/edit/elements.py:74
+#: ../lib/advene/gui/views/finder.py:769 ../lib/advene/util/helper.py:569
 #, python-format
-msgid "No edit popup available for element %s"
-msgstr ""
-
-#: ../lib/advene/gui/edit/elements.py:95
-msgid "Edit Window"
+msgid ""
+"Package %(title)s:\n"
+"%(schema)s\n"
+"%(annotation)s in %(annotation_type)s\n"
+"%(relation)s in %(relation_type)s\n"
+"%(query)s\n"
+"%(view)s\n"
+"\n"
+"Description:\n"
+"%(description)s\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:134
-msgid "Apply changes and close the edit window"
+#: ../lib/advene/gui/views/finder.py:790
+#, python-format
+msgid "%(type)s %(title)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:139
-msgid "Apply changes"
+#: ../lib/advene/gui/views/finder.py:793 ../lib/advene/gui/edit/elements.py:519
+#: ../lib/advene/gui/edit/elements.py:568
+#: ../lib/advene/gui/edit/elements.py:655
+#: ../lib/advene/gui/edit/elements.py:735
+#: ../lib/advene/gui/edit/elements.py:793
+#: ../lib/advene/gui/edit/elements.py:884
+#: ../lib/advene/gui/edit/elements.py:954
+#: ../lib/advene/gui/edit/elements.py:1066
+msgid "Metadata"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:273
-msgid "Content has been modified. Close anyway and lose data?"
-msgstr ""
+#: ../lib/advene/gui/views/finder.py:810
+#, fuzzy
+msgid "Column-based package finder"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/gui/edit/elements.py:331
-#: ../lib/advene/gui/views/viewbook.py:234
-#: ../lib/advene/gui/views/viewbook.py:240
-#, python-format
-msgid "Edit %s"
+#: ../lib/advene/gui/views/editaccumulator.py:46
+msgid "EditAccumulator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:333
-#, python-format
-msgid "View %s (read-only)"
+#: ../lib/advene/gui/views/activebookmarks.py:55
+#: ../lib/advene/gui/views/activebookmarks.py:57
+msgid "ActiveBookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:369
-#, python-format
-msgid "Display %s"
-msgstr ""
+#: ../lib/advene/gui/views/activebookmarks.py:63
+#, fuzzy
+msgid "Export as static view"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/edit/elements.py:453
+#: ../lib/advene/gui/views/activebookmarks.py:434
 #, fuzzy
-msgid "Apply changes and edit previous annotation of same type"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Bookmark duration"
+msgstr "Elekti ilobretan stilon"
 
-#: ../lib/advene/gui/edit/elements.py:457
+#: ../lib/advene/gui/views/activebookmarks.py:435
 #, fuzzy
-msgid "Apply changes and edit next annotation of same type"
+msgid "Enter the duration (in ms) to convert bookmarks into annotations"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/elements.py:463
+#: ../lib/advene/gui/views/activebookmarks.py:457
+msgid "User-specified duration"
+msgstr ""
+
+#: ../lib/advene/gui/views/activebookmarks.py:458
 #, fuzzy
-msgid "Unhighlight annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "2s duration"
+msgstr "Elekti ilobretan stilon"
 
-#: ../lib/advene/gui/edit/elements.py:467
+#: ../lib/advene/gui/views/activebookmarks.py:459
 #, fuzzy
-msgid "Highlight annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Complete coverage"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/edit/elements.py:498
-msgid "Fragment"
+#: ../lib/advene/gui/views/activebookmarks.py:477
+msgid "Drop a bookmark here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:510
-#: ../lib/advene/gui/edit/elements.py:559
-#: ../lib/advene/gui/edit/elements.py:646
-#: ../lib/advene/gui/edit/elements.py:726
-#: ../lib/advene/gui/edit/elements.py:783
-#: ../lib/advene/gui/edit/elements.py:875
-#: ../lib/advene/gui/edit/elements.py:944
-#: ../lib/advene/gui/edit/elements.py:1056
-#: ../lib/advene/gui/edit/elements.py:1118 ../lib/advene/gui/main.py:4174
-msgid "Author"
-msgstr ""
+#: ../lib/advene/gui/views/activebookmarks.py:504
+#, fuzzy
+msgid "Type of the annotations that will be created"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/elements.py:511
-#: ../lib/advene/gui/edit/elements.py:560
-#: ../lib/advene/gui/edit/elements.py:647
-#: ../lib/advene/gui/edit/elements.py:727
-#: ../lib/advene/gui/edit/elements.py:784
-#: ../lib/advene/gui/edit/elements.py:876
-#: ../lib/advene/gui/edit/elements.py:945
-#: ../lib/advene/gui/edit/elements.py:1057
-#: ../lib/advene/gui/edit/elements.py:1119 ../lib/advene/gui/main.py:4175
-msgid "Date"
+#: ../lib/advene/gui/views/activebookmarks.py:522
+#: ../lib/advene/gui/edit/transcribe.py:1130
+msgid "Smallish"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:513
-#: ../lib/advene/gui/edit/elements.py:562
-#: ../lib/advene/gui/edit/elements.py:649
-#: ../lib/advene/gui/edit/elements.py:729
-#: ../lib/advene/gui/edit/elements.py:787
-#: ../lib/advene/gui/edit/elements.py:878
-#: ../lib/advene/gui/edit/elements.py:948
-#: ../lib/advene/gui/edit/elements.py:1060
-msgid "Metadata"
+#: ../lib/advene/gui/views/activebookmarks.py:523
+#: ../lib/advene/gui/edit/transcribe.py:1131 ../lib/advene/rules/actions.py:169
+msgid "Small"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:582
-#: ../lib/advene/gui/edit/elements.py:1065
-#: ../lib/advene/gui/views/relationdisplay.py:113
-msgid "Members"
+#: ../lib/advene/gui/views/activebookmarks.py:524
+#: ../lib/advene/gui/edit/transcribe.py:1132 ../lib/advene/rules/actions.py:170
+msgid "Normal"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:600
-#: ../lib/advene/gui/edit/elements.py:677
-#: ../lib/advene/gui/edit/elements.py:737
-#: ../lib/advene/gui/edit/elements.py:1128
-#: ../lib/advene/gui/views/table.py:250
-msgid "Content"
+#: ../lib/advene/gui/views/activebookmarks.py:525
+#: ../lib/advene/gui/edit/transcribe.py:1133 ../lib/advene/rules/actions.py:171
+msgid "Large"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:617
-msgid "Apply changes and visualise in web browser"
+#: ../lib/advene/gui/views/activebookmarks.py:526
+#: ../lib/advene/gui/edit/transcribe.py:1134
+msgid "Larger"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:622
-msgid "Apply changes and activate the view"
+#: ../lib/advene/gui/views/activebookmarks.py:527
+#: ../lib/advene/gui/edit/transcribe.py:1135
+msgid "Huge"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:630
-#: ../lib/advene/gui/edit/elements.py:711
-#: ../lib/advene/gui/edit/elements.py:768
-#: ../lib/advene/gui/edit/elements.py:859
-#: ../lib/advene/gui/edit/elements.py:928
-#: ../lib/advene/gui/edit/elements.py:1030
+#: ../lib/advene/gui/views/activebookmarks.py:537
 #, fuzzy
-msgid "Title (name)"
-msgstr "Dosiero"
+msgid "Complete bookmarks into annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/elements.py:634
+#: ../lib/advene/gui/views/activebookmarks.py:538
 #, fuzzy
-msgid "Name of the view"
-msgstr "Arbvido"
+msgid "Save the current state"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/edit/elements.py:658
-msgid "Class"
+#: ../lib/advene/gui/views/activebookmarks.py:539
+#: ../lib/advene/gui/edit/transcribe.py:1165
+msgid "Set the size of snaphots"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:661
-msgid "Match Filter"
+#: ../lib/advene/gui/views/activebookmarks.py:806
+#, fuzzy
+msgid "Remove end timestamp"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/views/activebookmarks.py:1014
+msgid ""
+"Error: cannot find an appropriate schema to create the Active-bookmark type."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:699 ../lib/advene/gui/popup.py:821
-#, python-format
-msgid "Exception in query: %s"
+#: ../lib/advene/gui/views/activebookmarks.py:1019
+msgid "Active bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:704
+#: ../lib/advene/gui/views/activebookmarks.py:1057
 #, fuzzy
-msgid "Validate and run query on package"
+msgid "Validate the annotation"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/elements.py:715
+#: ../lib/advene/gui/views/activebookmarks.py:1201
 #, fuzzy
-msgid "Name of the query"
-msgstr "Arbvido"
+msgid "Duplicate bookmark"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/activebookmarks.py:1202
+msgid "Remove bookmark"
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:772
+#: ../lib/advene/gui/views/activebookmarks.py:1211
 #, fuzzy
-msgid "Name of the package"
-msgstr "Komentaraj attributoj"
+msgid "Remove begin timestamp"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/edit/elements.py:790
-#: ../lib/advene/gui/edit/elements.py:881
-#: ../lib/advene/gui/edit/elements.py:960
-#: ../lib/advene/gui/edit/elements.py:1074
-msgid "Description"
+#: ../lib/advene/gui/views/activebookmarks.py:1218
+msgid "Complete bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:794
-#: ../lib/advene/gui/edit/elements.py:885
-#: ../lib/advene/gui/edit/elements.py:964
-#: ../lib/advene/gui/edit/elements.py:1078
-msgid "Textual description of the package"
+#: ../lib/advene/gui/views/activebookmarks.py:1222
+msgid "Change type to"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:799
-msgid "Default dynamic view"
+#: ../lib/advene/gui/views/logwindow.py:43
+msgid "Links"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:803
-msgid "Dynamic view to activate on package load"
+#: ../lib/advene/gui/views/logwindow.py:45
+msgid "URL stack"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:808
-msgid "Default static view"
+#: ../lib/advene/gui/views/logwindow.py:123
+#, python-format
+msgid "Go to %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:812
-msgid "Static view to open on package load"
+#: ../lib/advene/gui/views/logwindow.py:129 ../lib/advene/rules/actions.py:65
+msgid "Go to the given position"
+msgstr ""
+
+#: ../lib/advene/gui/views/logwindow.py:157
+msgid "Push a URL on the stack"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:817
+#: ../lib/advene/gui/views/logwindow.py:158
 #, fuzzy
-msgid "Default adhoc view"
-msgstr "Defauxlta regularo"
+msgid "Description of the URL"
+msgstr "Importi transkribon"
 
-#: ../lib/advene/gui/edit/elements.py:821
-msgid "Adhoc view to open on package load"
+#: ../lib/advene/gui/views/interactivequery.py:52
+#: ../lib/advene/gui/views/interactivequery.py:100
+msgid "Interactive query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:826
-msgid "Cached duration"
+#: ../lib/advene/gui/views/interactivequery.py:54
+#, fuzzy
+msgid "Interactive query dialog"
+msgstr "Interfacaj preferoj"
+
+#: ../lib/advene/gui/views/interactivequery.py:60
+#: ../lib/advene/gui/views/interactivequery.py:257
+#, fuzzy
+msgid "Save query"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/views/interactivequery.py:123
+#: ../lib/advene/gui/views/interactivequery.py:173
+#, python-format
+msgid ""
+"Invalid query.\n"
+"The following fields have an invalid value:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:830
-msgid "Cached duration in ms"
+#: ../lib/advene/gui/views/interactivequery.py:137
+#: ../lib/advene/gui/views/interactivequery.py:297
+msgid "Saving the query..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:835
-msgid "Mediafile"
+#: ../lib/advene/gui/views/interactivequery.py:138
+#: ../lib/advene/gui/views/interactivequery.py:298
+msgid "Give a title and identifier for saving the query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:839
-msgid "Location of associated media file"
+#: ../lib/advene/gui/views/interactivequery.py:181
+msgid "Expert search"
+msgstr ""
+
+#: ../lib/advene/gui/views/interactivequery.py:187
+#, python-format
+msgid ""
+"TALES error in interactive expression:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:863
+#: ../lib/advene/gui/views/interactivequery.py:248
 #, fuzzy
-msgid "Name of the schema"
-msgstr "Arbvido"
+msgid "Interactive result"
+msgstr "Interfacaj preferoj"
 
-#: ../lib/advene/gui/edit/elements.py:895
-#: ../lib/advene/gui/edit/elements.py:975
-msgid "TALES expression returning a color for the element"
-msgstr ""
+#: ../lib/advene/gui/views/interactivequery.py:250
+#, fuzzy
+msgid "Interactive result display"
+msgstr "Interfacaj preferoj"
 
-#: ../lib/advene/gui/edit/elements.py:902
-#: ../lib/advene/gui/edit/elements.py:993
-msgid "Item color"
+#: ../lib/advene/gui/views/interactivequery.py:275
+msgid "Result of interactive query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:906
-#: ../lib/advene/gui/edit/elements.py:997
-msgid ""
-"TALES expression returning a color for the items contained by the element"
+#: ../lib/advene/gui/views/interactivequery.py:279
+msgid "Result of a query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:932
-#: ../lib/advene/gui/edit/elements.py:1034
-#, fuzzy
-msgid "Name of the type"
+#: ../lib/advene/gui/views/interactivequery.py:334
+#, fuzzy, python-format
+msgid "Comment on annotations containing %s"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/elements.py:950
-#: ../lib/advene/gui/edit/elements.py:1039
-#: ../lib/advene/gui/edit/elements.py:1308
-msgid "MIME Type"
+#: ../lib/advene/gui/views/interactivequery.py:353
+msgid "Choose the annotation type where annotations will be created."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:954
-#: ../lib/advene/gui/edit/elements.py:1043
-msgid "MIMEType of the content"
+#: ../lib/advene/gui/views/interactivequery.py:357
+#, python-format
+msgid "Copied result of the '%s' query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:982
-#: ../lib/advene/gui/views/transcription.py:165
-msgid "Representation"
+#: ../lib/advene/gui/views/interactivequery.py:369
+#, fuzzy, python-format
+msgid "Search/replace content in %d elements"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/views/interactivequery.py:397
+msgid "Edit query again"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:986
-msgid ""
-"TALES expression used to get a compact representation of the annotations"
+#: ../lib/advene/gui/views/interactivequery.py:411
+msgid "Search again"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:987
-#, fuzzy, python-format
-msgid "Display %s key"
+#: ../lib/advene/gui/views/interactivequery.py:417
+#, fuzzy
+msgid "Empty result"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/elements.py:1003
-#, fuzzy
-msgid "Completions"
-msgstr "Arbvido"
+#: ../lib/advene/gui/views/interactivequery.py:426
+#, fuzzy, python-format
+msgid "Result is a list of %d annotations."
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/elements.py:1007
-msgid "Space-separated list of words used for content completion"
+#: ../lib/advene/gui/views/interactivequery.py:428
+#, python-format
+msgid "Result is a list of  %(number)d elements with %(elements)s."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1013
+#: ../lib/advene/gui/views/interactivequery.py:440
+#: ../lib/advene/gui/edit/montage.py:481
 #, fuzzy
-msgid "Advanced"
-msgstr "Advene"
+msgid "Unhighlight annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/elements.py:1063
+#: ../lib/advene/gui/views/interactivequery.py:444
+#: ../lib/advene/gui/views/interactivequery.py:481
+#: ../lib/advene/gui/edit/montage.py:485 ../lib/advene/gui/edit/montage.py:494
 #, fuzzy
-msgid "Any annotation type"
+msgid "Highlight annotations"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/elements.py:1089
-msgid "TALES expression specifying a color"
-msgstr ""
-
-#: ../lib/advene/gui/edit/elements.py:1116
-msgid "MIMEType"
+#: ../lib/advene/gui/views/interactivequery.py:465
+#: ../lib/advene/gui/edit/imports.py:184 ../lib/advene/gui/edit/imports.py:185
+msgid "Annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1341
-#, python-format
-msgid "Error: cannot find a content handler for %s"
-msgstr ""
+#: ../lib/advene/gui/views/interactivequery.py:471
+#, fuzzy
+msgid "Other elements"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/edit/elements.py:1457
-#: ../lib/advene/gui/edit/elements.py:1682
-#, python-format
-msgid ""
-"Cannot read the data:\n"
-"%s"
+#: ../lib/advene/gui/views/interactivequery.py:475
+#, fuzzy
+msgid "Display annotations in timeline"
+msgstr "Vidi komentajxojn sur templinio"
+
+#: ../lib/advene/gui/views/interactivequery.py:476
+#, fuzzy
+msgid "Display annotations as transcription"
+msgstr "Vidi komentajxojn sur templinio"
+
+#: ../lib/advene/gui/views/interactivequery.py:482
+#: ../lib/advene/gui/views/interactivequery.py:504
+msgid "Export table"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1481
-#: ../lib/advene/gui/edit/elements.py:1707
-msgid "Save content to..."
+#: ../lib/advene/gui/views/interactivequery.py:483
+#, fuzzy
+msgid "Create annotations from the result"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/interactivequery.py:484
+msgid "Define a montage with the result"
+msgstr ""
+
+#: ../lib/advene/gui/views/interactivequery.py:485
+#, fuzzy
+msgid "Create a comment view with the result"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/views/interactivequery.py:486
+#, fuzzy
+msgid "Search and replace strings in the annotations content"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/views/interactivequery.py:511
+#, fuzzy
+msgid "Edit elements"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/views/interactivequery.py:517
+msgid "Open in python evaluator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1492
-#: ../lib/advene/gui/edit/elements.py:1720
+#: ../lib/advene/gui/views/interactivequery.py:520
 #, python-format
 msgid ""
-"Cannot save the data:\n"
+"Result:\n"
 "%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1511
-#: ../lib/advene/gui/edit/elements.py:1734
-msgid "Open a file (C-o)"
+#: ../lib/advene/gui/views/interactivequery.py:562
+msgid "Results of _interactive query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1516
-#: ../lib/advene/gui/edit/elements.py:1739
-msgid "Save to a file (C-s)"
-msgstr ""
+#: ../lib/advene/gui/popup.py:135
+#, fuzzy
+msgid "Choose the file to insert"
+msgstr "Elekti ilobretan stilon"
 
-#: ../lib/advene/gui/edit/elements.py:1521
-#: ../lib/advene/gui/edit/elements.py:1744
-msgid "Reload the file (C-r)"
+#: ../lib/advene/gui/popup.py:143
+msgid "Select a valid identifier"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1527
-msgid "Insert a value from the browser (C-i)"
+#: ../lib/advene/gui/popup.py:144
+#, python-format
+msgid ""
+"The filename %s contains invalid characters\n"
+"that have been replaced.\n"
+"You can modify this identifier if necessary:"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1773
-msgid "Begin time is greater than end time"
-msgstr ""
+#: ../lib/advene/gui/popup.py:155
+#, fuzzy
+msgid "Choose the soundclip to insert"
+msgstr "Elekti ilobretan stilon"
 
-#: ../lib/advene/gui/edit/elements.py:1803
-#: ../lib/advene/gui/views/table.py:252
-msgid "Begin"
-msgstr ""
+#: ../lib/advene/gui/popup.py:159
+#, fuzzy
+msgid "Choose the directory to insert"
+msgstr "Elekti ilobretan stilon"
 
-#: ../lib/advene/gui/edit/elements.py:1812
-#: ../lib/advene/gui/views/table.py:253 ../lib/advene/gui/main.py:628
-msgid "End"
+#: ../lib/advene/gui/popup.py:171
+#, python-format
+msgid "Apply %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2044
-msgid "Expecting an integer."
+#: ../lib/advene/gui/popup.py:175
+msgid ""
+"Give the offset to use\n"
+"on specified element.\n"
+"It is in ms and can be\n"
+"either positive or negative."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2076
+#: ../lib/advene/gui/popup.py:219
+#, fuzzy, python-format
+msgid "Replace content in %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/popup.py:222
+#, fuzzy, python-format
+msgid "Replace content in annotations of type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/popup.py:225
+#, fuzzy
+msgid "Replace content in all annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/popup.py:318
 #, python-format
-msgid ""
-"The %(attribute)s attribute could not be updated:\n"
-"\n"
-"%(error)s\n"
-"\n"
-"Resetting to the original value."
+msgid "Copy id %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2103
+#: ../lib/advene/gui/popup.py:352
 #, python-format
 msgid ""
-"The following attributes cannot be updated:\n"
+"<b>Statistics about %s</b>\n"
 "\n"
-"%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2143
-#, python-format
+#: ../lib/advene/gui/popup.py:358
+#, fuzzy, python-format
+msgid "Renumbering annotations of type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/popup.py:365
 msgid ""
-"The following attributes could not be updated:\n"
+"<b>Renumber all annotations according to their order.</b>\n"
 "\n"
-"%s"
-msgstr ""
-
-#: ../lib/advene/gui/edit/elements.py:2160
-msgid "Attribute"
+"<i>Note that this action cannot be undone.</i>\n"
+"Replace the first numeric value of the annotation content with the new "
+"annotation number.\n"
+"If no numeric value is found and the annotation is structured, it will "
+"insert the number.\n"
+"If no numeric value is found and the annotation is of type text/plain, it "
+"will overwrite the annotation content.\n"
+"The offset parameter allows you to renumber from a given annotation."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2168
-#: ../lib/advene/gui/views/browser.py:366
-msgid "Value"
+#: ../lib/advene/gui/popup.py:371 ../lib/advene/gui/popup.py:513
+msgid "Offset"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2259
-msgid "Insert an element"
-msgstr ""
+#: ../lib/advene/gui/popup.py:393
+#, fuzzy, python-format
+msgid "Renumbering %d annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/elements.py:2260
-msgid "Choose the element to insert."
-msgstr ""
+#: ../lib/advene/gui/popup.py:402
+#, fuzzy, python-format
+msgid "Annotation #%d"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/edit/elements.py:2330
-#: ../lib/advene/gui/edit/elements.py:2373
+#: ../lib/advene/gui/popup.py:433
 #, python-format
-msgid "Some tags contain invalid characters: %s"
+msgid "Splitting package according to %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2353
-msgid "Tags:"
+#: ../lib/advene/gui/popup.py:436
+#, python-format
+msgid ""
+"For each of the %(count)d annotations in %(atype)s, create a package named "
+"after the source package and the annotation content, copying only "
+"annotations contained in the reference annotation."
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:163
-#: ../lib/advene/gui/views/browser.py:165
-#, fuzzy
-msgid "TALES browser"
-msgstr "Komentaraj attributoj"
-
-#: ../lib/advene/gui/views/browser.py:170
+#: ../lib/advene/gui/popup.py:456
 #, fuzzy
-msgid "Display result in table"
+msgid "Created %(name)s - %(n) annotations"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/browser.py:193
-msgid "Insert path"
-msgstr ""
-
-#: ../lib/advene/gui/views/browser.py:194
-msgid "Insert value"
-msgstr ""
+#: ../lib/advene/gui/popup.py:473 ../lib/advene/gui/edit/montage.py:309
+#, fuzzy, python-format
+msgid "Extracting %s"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/views/browser.py:249
-msgid "Expression returned None (there was an exception)"
+#: ../lib/advene/gui/popup.py:474
+#, python-format
+msgid ""
+"Exporting annotation %(title)s\n"
+"from %(begin)s to %(end)s\n"
+"to %%(filename)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:302
-msgid "Result is not a list"
+#: ../lib/advene/gui/popup.py:485 ../lib/advene/gui/edit/transcribe.py:499
+msgid "Edit"
 msgstr ""
 
-#: ../lib/advene/gui/views/accumulatorpopup.py:49
-msgid "PopupAccumulator"
+#: ../lib/advene/gui/popup.py:487
+msgid "Browse"
 msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:40
+#: ../lib/advene/gui/popup.py:495 ../lib/advene/gui/popup.py:884
 #, fuzzy
-msgid "Edition History"
-msgstr "Preferoj"
+msgid "Open in web browser"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/gui/views/editionhistory.py:42
-msgid "Access last edited/created elements"
+#: ../lib/advene/gui/popup.py:501 ../lib/advene/gui/popup.py:505
+#: ../lib/advene/gui/edit/shapewidget.py:1601
+msgid "Delete"
 msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:102
+#: ../lib/advene/gui/popup.py:508
 #, fuzzy
-msgid "Created"
+msgid "Search/replace content"
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/editionhistory.py:103
-#, fuzzy
-msgid "Edited"
-msgstr "Redakti"
-
-#: ../lib/advene/gui/views/logwindow.py:43
-msgid "Links"
+#: ../lib/advene/gui/popup.py:526
+msgid "Desactivate"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:45
-msgid "URL stack"
+#: ../lib/advene/gui/popup.py:543
+msgid "Loop"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:123
-#, python-format
-msgid "Go to %s"
+#: ../lib/advene/gui/popup.py:544
+msgid "Duplicate"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:157
-msgid "Push a URL on the stack"
-msgstr ""
+#: ../lib/advene/gui/popup.py:548
+#, fuzzy
+msgid "Save snapshot..."
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/views/logwindow.py:158
+#: ../lib/advene/gui/popup.py:550
 #, fuzzy
-msgid "Description of the URL"
-msgstr "Importi transkribon"
+msgid "Extract video fragment"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/checker.py:37
-msgid "Checker"
+#: ../lib/advene/gui/popup.py:580
+msgid "Incoming"
 msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:39
-#, fuzzy
-msgid "Check various package properties"
-msgstr "Redakti komentarajn attributojn"
+#: ../lib/advene/gui/popup.py:596
+msgid "Outgoing"
+msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:90
+#: ../lib/advene/gui/popup.py:611
 #, fuzzy
-msgid "List of possible issues in the current package"
-msgstr "Defauxlta regularo"
+msgid "Related annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/checker.py:108
-msgid "Overlapping"
+#: ../lib/advene/gui/popup.py:618
+msgid "Incoming relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:52
-msgid "Tag Bag"
+#: ../lib/advene/gui/popup.py:625
+msgid "Outgoing relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:54 ../lib/advene/gui/main.py:1232
-msgid "Bag of tags"
+#: ../lib/advene/gui/popup.py:642
+#, python-format
+msgid "Begin: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:59
-msgid "New tag"
+#: ../lib/advene/gui/popup.py:644
+#, python-format
+msgid "End: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:122
-msgid "New tag name"
-msgstr ""
+#: ../lib/advene/gui/popup.py:645
+#, fuzzy, python-format
+msgid "Duration: %s"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/views/tagbag.py:128
-msgid "Enter a new tag name and select its color."
+#: ../lib/advene/gui/popup.py:652
+msgid "Members:"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:162
-#: ../lib/advene/gui/views/timeline.py:3720
-msgid "The tag contains invalid characters"
-msgstr ""
+#: ../lib/advene/gui/popup.py:665
+#, fuzzy
+msgid "Edit package properties..."
+msgstr "Redakti komentarajn attributojn"
+
+#: ../lib/advene/gui/popup.py:666 ../lib/advene/gui/popup.py:787
+#, fuzzy, python-format
+msgid "%d annotations(s) - statistics"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/tagbag.py:175
+#: ../lib/advene/gui/popup.py:668 ../lib/advene/gui/popup.py:895
 #, fuzzy
-msgid "Tag bag options"
-msgstr "Vido"
+msgid "Create a new static view..."
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/tagbag.py:176
+#: ../lib/advene/gui/popup.py:669 ../lib/advene/gui/popup.py:896
 #, fuzzy
-msgid "Update with new tags"
+msgid "Create a new dynamic view..."
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/tagbag.py:176
-msgid "Automatically display new defined tags"
+#: ../lib/advene/gui/popup.py:670 ../lib/advene/gui/popup.py:782
+msgid "Create a new annotation..."
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:225
-#, fuzzy, python-format
-msgid "Choose the color for tag %s"
-msgstr "Elekti ilobretan stilon"
-
-#: ../lib/advene/gui/views/tagbag.py:249
-msgid "Set color"
+#: ../lib/advene/gui/popup.py:672 ../lib/advene/gui/popup.py:898
+msgid "Create a new schema..."
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:250
-msgid "Remove"
+#: ../lib/advene/gui/popup.py:673 ../lib/advene/gui/popup.py:893
+msgid "Create a new query..."
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:324
-msgid "Drop a tag here to remove it from the list"
+#: ../lib/advene/gui/popup.py:681
+msgid "Create a new folder..."
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:333
-#, fuzzy
-msgid "Save as adhoc view"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/popup.py:682
+msgid "Create a new resource file..."
+msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:334
+#: ../lib/advene/gui/popup.py:683
+msgid "Insert a new resource file..."
+msgstr ""
+
+#: ../lib/advene/gui/popup.py:684
+msgid "Insert a new resource directory..."
+msgstr ""
+
+#: ../lib/advene/gui/popup.py:693 ../lib/advene/gui/popup.py:695
+msgid "Insert a soundclip..."
+msgstr ""
+
+#: ../lib/advene/gui/popup.py:706
+msgid "Play sound"
+msgstr ""
+
+#: ../lib/advene/gui/popup.py:716
+msgid "Create a new annotation type..."
+msgstr ""
+
+#: ../lib/advene/gui/popup.py:718
+msgid "Create a new relation type..."
+msgstr ""
+
+#: ../lib/advene/gui/popup.py:720 ../lib/advene/gui/popup.py:781
+#: ../lib/advene/gui/popup.py:834
+msgid "Select a color"
+msgstr ""
+
+#: ../lib/advene/gui/popup.py:729
+#, python-format
+msgid "A caption dynamic view for %s already seems to exist."
+msgstr ""
+
+#: ../lib/advene/gui/popup.py:738
+#, fuzzy, python-format
+msgid "Caption %s annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/popup.py:748 ../lib/advene/rules/actions.py:121
+msgid "Caption the annotation"
+msgstr ""
+
+#: ../lib/advene/gui/popup.py:770
 #, fuzzy
-msgid "Add a new tag"
+msgid "Create a comment view"
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/tagbag.py:335
+#: ../lib/advene/gui/popup.py:771
 #, fuzzy
-msgid "Display all defined tags"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Generate a caption dynamic view..."
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/transcription.py:48
-msgid "Transcription"
+#: ../lib/advene/gui/popup.py:772
+msgid "Display as transcription"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:50
+#: ../lib/advene/gui/popup.py:773
 #, fuzzy
-msgid "Display annotations as a text transcription"
+msgid "Display annotations in table"
 msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/views/transcription.py:146
+#: ../lib/advene/gui/popup.py:774
+#, fuzzy
+msgid "Export to another format..."
+msgstr "Importi datumo de alia ???"
+
+#: ../lib/advene/gui/popup.py:775
+#, fuzzy
+msgid "Split according to annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/popup.py:777
 #, python-format
-msgid "Error in source evaluation %(source)s: %(error)s"
+msgid "Apply %s..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:163
+#: ../lib/advene/gui/popup.py:783
 #, fuzzy
-msgid "Transcription options"
-msgstr "Importi transkribon"
+msgid "Delete all annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/transcription.py:164
+#: ../lib/advene/gui/popup.py:784
 #, fuzzy
-msgid "Default representation"
+msgid "Renumber annotations..."
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/popup.py:785
+#, fuzzy
+msgid "Shot validation view..."
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/views/transcription.py:164
-msgid "Use the default representation for annotations"
+#: ../lib/advene/gui/popup.py:797
+#, python-format
+msgid "A follow dynamic view for %s already seems to exist."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:165
-msgid ""
-"If default representation is unchecked,\n"
-"this TALES expression that will be used to format the annotations."
+#: ../lib/advene/gui/popup.py:806
+#, fuzzy, python-format
+msgid "Follow %s relation-type"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/popup.py:815
+#, fuzzy
+msgid "Follow the relation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/popup.py:835
+msgid "Delete all relations..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:166
-msgid "Separator"
+#: ../lib/advene/gui/popup.py:836
+#, fuzzy
+msgid "Create montage from related annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/popup.py:837
+#, fuzzy
+msgid "Create dynamic view following relations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/popup.py:852 ../lib/advene/gui/edit/elements.py:705
+#, python-format
+msgid "Exception in query: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:167
-msgid "This separator will be inserted between the annotations."
+#: ../lib/advene/gui/popup.py:855
+msgid "Apply query on..."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:168
-msgid "Whitespace"
+#: ../lib/advene/gui/popup.py:880
+msgid "Activate view"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:169
+#: ../lib/advene/gui/popup.py:882
 #, fuzzy
-msgid "Newline"
-msgstr "Templinio"
+msgid "Open adhoc view"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/views/transcription.py:170
+#: ../lib/advene/gui/util/initialconfig.py:82
+msgid "Initial Advene configuration"
+msgstr ""
+
+#: ../lib/advene/gui/util/initialconfig.py:83
+msgid ""
+"<span size='large'><b>Welcome in Advene</b>\n"
+"This is the first time that you run Advene. Please answer some basic "
+"configuration questions. You will be able to modify these choices from the "
+"Advene interface, in the Edit/Preferences menu.</span>"
+msgstr ""
+
+#: ../lib/advene/gui/util/initialconfig.py:84
 #, fuzzy
-msgid "Tabulation"
-msgstr "Vido"
+msgid "Interface language"
+msgstr "Interfacaj preferoj"
 
-#: ../lib/advene/gui/views/transcription.py:171
-msgid "Dash"
+#: ../lib/advene/gui/util/initialconfig.py:84
+msgid "Language used for the interface"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:172
-msgid "User defined"
+#: ../lib/advene/gui/util/initialconfig.py:90
+msgid "Weekly check for Advene updates on the Advene website"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:174
-msgid "User-defined separator"
+#: ../lib/advene/gui/util/initialconfig.py:92
+msgid "Preferred directory for data files"
+msgstr ""
+
+#: ../lib/advene/gui/util/initialconfig.py:92
+msgid "Preferred directory for storing data files (Advene packages)"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:174
+#: ../lib/advene/gui/util/initialconfig.py:94
+msgid "Directories to search for movies"
+msgstr ""
+
+#: ../lib/advene/gui/util/initialconfig.py:94
+#, python-format
 msgid ""
-"Separator used if user-defined is selected.Use \\n for a newline and \\t for "
-"a tabulation."
+"List of directories (separated by %(pathsep)s) to search for movie files."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:175
-msgid "Display timestamps"
+#: ../lib/advene/gui/util/initialconfig.py:95
+msgid "First look for movie file in the same directory as the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:175
-msgid "Insert timestsamp values"
+#: ../lib/advene/gui/util/initialconfig.py:95
+msgid ""
+"If checked, the movie file will be searched for in the same directory as the "
+"referencing package."
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:176
-msgid "Display annotation bounds"
+#: ../lib/advene/gui/util/__init__.py:44 ../lib/advene/gui/edit/create.py:108
+msgid "Plain text content"
+msgstr ""
+
+#: ../lib/advene/gui/util/__init__.py:45
+#, fuzzy
+msgid "HTML content"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/util/__init__.py:46 ../lib/advene/gui/edit/create.py:109
+msgid "Simple-structured content"
+msgstr ""
+
+#: ../lib/advene/gui/util/__init__.py:47
+msgid "List of numeric values"
+msgstr ""
+
+#: ../lib/advene/gui/util/__init__.py:48 ../lib/advene/gui/edit/create.py:110
+msgid "SVG graphics content"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:236
+#: ../lib/advene/gui/util/__init__.py:387
 #, python-format
 msgid ""
-"Cannot convert the following annotations,\n"
-"the representation pattern is too complex.\n"
-"%s"
+"Annotation Type %(title)s:\n"
+"%(count)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:247
+#: ../lib/advene/gui/util/__init__.py:393
+#, python-format
 msgid ""
-"Cannot validate the update.\n"
-"The representation pattern is too complex."
+"Relation Type %(title)s:\n"
+"%(count)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:273
+#: ../lib/advene/gui/util/dialog.py:419 ../lib/advene/gui/util/dialog.py:458
 #, fuzzy
-msgid "Save transcription to a text file"
-msgstr "Vidi komentajxojn sur templinio"
+msgid "Name the element"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/transcription.py:274
-msgid "Apply the modifications"
+#: ../lib/advene/gui/util/dialog.py:422 ../lib/advene/gui/util/dialog.py:459
+#, fuzzy
+msgid "Choose a name for the element"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/util/dialog.py:497
+msgid "Open a file"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:275
-msgid "Find text"
+#: ../lib/advene/gui/util/dialog.py:522 ../lib/advene/gui/util/dialog.py:560
+msgid "N/C"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:276
-msgid "Quickly switch display options"
+#: ../lib/advene/gui/util/dialog.py:527
+msgid "Alias"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:277
-#, fuzzy
-msgid "Refresh the transcription"
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/gui/util/dialog.py:545
+msgid ""
+"Press to\n"
+"display\n"
+"information"
+msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:278
-#, fuzzy
-msgid "Edit preferences"
-msgstr "Preferoj"
+#: ../lib/advene/gui/util/dialog.py:568
+msgid "Wait..."
+msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:697
+#: ../lib/advene/gui/util/dialog.py:572
 #, python-format
-msgid "Cannot write to %(filename)s: %(error)s:"
+msgid "Error: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:52
-#: ../lib/advene/gui/views/activebookmarks.py:54
-msgid "ActiveBookmarks"
+#: ../lib/advene/gui/util/dialog.py:592
+msgid "Any type of file"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:441
-msgid "Chronological order"
+#: ../lib/advene/gui/util/dialog.py:594
+msgid "Advene files (.xml, .azp, .apl)"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:442
-msgid "Completeness and chronological order"
+#: ../lib/advene/gui/util/dialog.py:596
+msgid "Advene session (.apl)"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:458
+#: ../lib/advene/gui/util/dialog.py:597
 #, fuzzy
-msgid "Bookmark duration"
-msgstr "Elekti ilobretan stilon"
+msgid "Audio files"
+msgstr "Vido"
 
-#: ../lib/advene/gui/views/activebookmarks.py:459
+#: ../lib/advene/gui/util/dialog.py:598
 #, fuzzy
-msgid "Enter the duration (in ms) to convert bookmarks into annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/views/activebookmarks.py:481
-msgid "User-specified duration"
-msgstr ""
+msgid "Video files"
+msgstr "Vido"
 
-#: ../lib/advene/gui/views/activebookmarks.py:482
+#: ../lib/advene/gui/util/dialog.py:637
+#: ../lib/advene/gui/edit/properties.py:578
 #, fuzzy
-msgid "2s duration"
+msgid "Choose a directory"
 msgstr "Elekti ilobretan stilon"
 
-#: ../lib/advene/gui/views/activebookmarks.py:483
-#, fuzzy
-msgid "Complete coverage"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/views/activebookmarks.py:501
-msgid "Drop a bookmark here to remove it from the list"
+#: ../lib/advene/gui/util/dialog.py:690
+msgid "Select an element"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:520
-#: ../lib/advene/gui/views/bookmarks.py:243
-msgid "Insert a bookmark for the current video time"
+#: ../lib/advene/gui/edit/rules.py:88 ../lib/advene/gui/edit/rules.py:90
+#: ../lib/advene/gui/edit/create.py:254
+msgid "Rule"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:528
+#: ../lib/advene/gui/edit/rules.py:99 ../lib/advene/gui/edit/create.py:244
 #, fuzzy
-msgid "Type of the annotations that will be created"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Subviews"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/activebookmarks.py:561
-msgid "Reorder active bookmarks"
+#: ../lib/advene/gui/edit/rules.py:126
+msgid "Add a new rule"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:562
+#: ../lib/advene/gui/edit/rules.py:130
 #, fuzzy
-msgid "Complete bookmarks into annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Subview"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/edit/rules.py:133
+msgid "Add a subview list"
+msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:563
+#: ../lib/advene/gui/edit/rules.py:139
 #, fuzzy
-msgid "Save the current state"
+msgid "Remove the current rule"
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/views/activebookmarks.py:863
-#, fuzzy
-msgid "Remove end timestamp"
-msgstr "Arbvido"
+#: ../lib/advene/gui/edit/rules.py:275
+msgid "Source expression"
+msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1071
-msgid ""
-"Error: cannot find an appropriate schema to create the Active-bookmark type."
+#: ../lib/advene/gui/edit/rules.py:277
+msgid "Return expression"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1076
-msgid "Active bookmark"
+#: ../lib/advene/gui/edit/rules.py:351
+msgid "For all elements in "
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1114
-#, fuzzy
-msgid "Validate the annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/views/activebookmarks.py:1260
+#: ../lib/advene/gui/edit/rules.py:352
 #, fuzzy
-msgid "Duplicate bookmark"
+msgid "All annotations of the package"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1261
-msgid "Remove bookmark"
-msgstr ""
-
-#: ../lib/advene/gui/views/activebookmarks.py:1270
-#, fuzzy
-msgid "Remove begin timestamp"
-msgstr "Vidi komentajxojn sur templinio"
-
-#: ../lib/advene/gui/views/activebookmarks.py:1277
-msgid "Complete bookmark"
-msgstr ""
-
-#: ../lib/advene/gui/views/activebookmarks.py:1281
-msgid "Change type to"
+#: ../lib/advene/gui/edit/rules.py:353
+msgid "All views of the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:48
+#: ../lib/advene/gui/edit/rules.py:354 ../lib/advene/gui/edit/rules.py:798
 #, fuzzy
-msgid "Bookmarks importer"
-msgstr "Importi dosieron"
-
-#: ../lib/advene/gui/views/bookmarks.py:69
-msgid "Bookmarks"
-msgstr ""
-
-#: ../lib/advene/gui/views/bookmarks.py:71
-msgid "Bookmark timecodes with their corresponding screenshots"
-msgstr ""
-
-#: ../lib/advene/gui/views/bookmarks.py:142
-msgid "Select the annotation type to generate"
-msgstr ""
+msgid "The context annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/bookmarks.py:147
+#: ../lib/advene/gui/edit/rules.py:355 ../lib/advene/gui/edit/rules.py:799
 #, fuzzy
-msgid "Choose a duration"
-msgstr "Elekti ilobretan stilon"
-
-#: ../lib/advene/gui/views/bookmarks.py:148
-msgid "Enter the standard duration (in ms) of created annotations."
-msgstr ""
+msgid "The annotations of the context type"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/bookmarks.py:165
-msgid "Converted from bookmarks"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:358 ../lib/advene/core/controller.py:610
+#, fuzzy, python-format
+msgid "Annotations of type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/bookmarks.py:223
-msgid "Drop a position here to remove it from the list"
+#: ../lib/advene/gui/edit/rules.py:370
+msgid "Return "
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:244
+#: ../lib/advene/gui/edit/rules.py:372 ../lib/advene/gui/edit/rules.py:787
 #, fuzzy
-msgid "Convert bookmarks to annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "The element"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/bookmarks.py:292 ../lib/advene/gui/main.py:3609
+#: ../lib/advene/gui/edit/rules.py:373 ../lib/advene/gui/edit/rules.py:788
 #, fuzzy
-msgid "Comment here"
+msgid "The element's content"
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/viewplugin.py:60
-msgid "Generic view plugin"
+#: ../lib/advene/gui/edit/rules.py:388
+msgid "If the element matches "
 msgstr ""
 
-#: ../lib/advene/gui/views/viewplugin.py:62
-msgid "You should not ever see this tooltip..."
+#: ../lib/advene/gui/edit/rules.py:390
+msgid "Return the element if it matches "
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:51
-#: ../lib/advene/gui/views/interactivequery.py:99
-msgid "Interactive query"
+#: ../lib/advene/gui/edit/rules.py:408 ../lib/advene/gui/edit/rules.py:617
+msgid "All conditions must be met"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:53
-#, fuzzy
-msgid "Interactive query dialog"
-msgstr "Interfacaj preferoj"
-
-#: ../lib/advene/gui/views/interactivequery.py:59
-#: ../lib/advene/gui/views/interactivequery.py:256
-#, fuzzy
-msgid "Save query"
-msgstr "Arbvido"
+#: ../lib/advene/gui/edit/rules.py:409 ../lib/advene/gui/edit/rules.py:618
+msgid "Any condition can be met"
+msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:122
-#: ../lib/advene/gui/views/interactivequery.py:172
+#: ../lib/advene/gui/edit/rules.py:493 ../lib/advene/gui/edit/rules.py:563
 #, python-format
-msgid ""
-"Invalid query.\n"
-"The following fields have an invalid value:\n"
-"%s"
+msgid "Rule <b>%s</b>"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:136
-#: ../lib/advene/gui/views/interactivequery.py:296
-msgid "Saving the query..."
+#: ../lib/advene/gui/edit/rules.py:574
+msgid "Rule name"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:137
-#: ../lib/advene/gui/views/interactivequery.py:297
-msgid "Give a title and identifier for saving the query"
+#: ../lib/advene/gui/edit/rules.py:591
+msgid "Event"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:180
-msgid "Expert search"
+#: ../lib/advene/gui/edit/rules.py:599
+msgid "If"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:186
-#, python-format
-msgid ""
-"TALES error in interactive expression:\n"
-"%s"
+#: ../lib/advene/gui/edit/rules.py:638
+msgid "Then"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:247
-#, fuzzy
-msgid "Interactive result"
-msgstr "Interfacaj preferoj"
-
-#: ../lib/advene/gui/views/interactivequery.py:249
-#, fuzzy
-msgid "Interactive result display"
-msgstr "Interfacaj preferoj"
-
-#: ../lib/advene/gui/views/interactivequery.py:274
-msgid "Result of interactive query"
+#: ../lib/advene/gui/edit/rules.py:683
+msgid "When the "
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:278
-msgid "Result of a query"
+#: ../lib/advene/gui/edit/rules.py:696
+msgid " occurs,"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:280
-#: ../lib/advene/gui/main.py:3188
+#: ../lib/advene/gui/edit/rules.py:723 ../lib/advene/gui/edit/rules.py:726
 #, python-format
-msgid "'%s'"
+msgid "Condition expression: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:333
-#, fuzzy, python-format
-msgid "Comment on annotations containing %s"
+#: ../lib/advene/gui/edit/rules.py:765
+#, fuzzy
+msgid "The annotation type"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/interactivequery.py:352
-msgid "Choose the annotation type where annotations will be created."
-msgstr ""
-
-#: ../lib/advene/gui/views/interactivequery.py:356
-#, python-format
-msgid "Copied result of the '%s' query"
-msgstr ""
-
-#: ../lib/advene/gui/views/interactivequery.py:368
+#: ../lib/advene/gui/edit/rules.py:768
 #, fuzzy, python-format
-msgid "Search/replace content in %d elements"
-msgstr "Arbvido"
+msgid "The value of the %s attribute"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/interactivequery.py:375
-#: ../lib/advene/gui/main.py:3185
-msgid "Empty quicksearch string"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:770
+#, fuzzy
+msgid "The annotation fragment"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/interactivequery.py:396
-msgid "Edit query again"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:771
+#, fuzzy
+msgid "The annotation begin time"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/views/interactivequery.py:400
-#: ../lib/advene/gui/views/finder.py:436
-msgid "Edit query"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:772
+#, fuzzy
+msgid "The annotation end time"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/views/interactivequery.py:409
-#: ../lib/advene/gui/main.py:537
-msgid "String to search"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:774
+#, fuzzy
+msgid "The annotation MIME-type"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/views/interactivequery.py:410
-msgid "Search again"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:775
+#, fuzzy
+msgid "The annotation's incoming relations"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/views/interactivequery.py:416
+#: ../lib/advene/gui/edit/rules.py:776
 #, fuzzy
-msgid "Empty result"
+msgid "The annotation's outgoing relations"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/interactivequery.py:425
+#: ../lib/advene/gui/edit/rules.py:779
 #, fuzzy, python-format
-msgid "Result is a list of %d annotations."
+msgid "The %s-related incoming annotations"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/interactivequery.py:427
-#, python-format
-msgid "Result is a list of  %(number)d elements with %(elements)s."
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:783
+#, fuzzy, python-format
+msgid "The %s-related outgoing annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/interactivequery.py:470
+#: ../lib/advene/gui/edit/rules.py:789
 #, fuzzy
-msgid "Other elements"
+msgid "The element fragment"
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/interactivequery.py:474
+#: ../lib/advene/gui/edit/rules.py:790
 #, fuzzy
-msgid "Display annotations in timeline"
+msgid "The element begin time"
 msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/views/interactivequery.py:475
+#: ../lib/advene/gui/edit/rules.py:791
 #, fuzzy
-msgid "Display annotations as transcription"
-msgstr "Vidi komentajxojn sur templinio"
-
-#: ../lib/advene/gui/views/interactivequery.py:481
-#: ../lib/advene/gui/views/interactivequery.py:503
-msgid "Export table"
-msgstr ""
+msgid "The element end time"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/interactivequery.py:482
+#: ../lib/advene/gui/edit/rules.py:792
 #, fuzzy
-msgid "Create annotations from the result"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/views/interactivequery.py:483
-msgid "Define a montage with the result"
-msgstr ""
+msgid "The element duration"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/interactivequery.py:484
+#: ../lib/advene/gui/edit/rules.py:793
 #, fuzzy
-msgid "Create a comment view with the result"
+msgid "The element type"
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/interactivequery.py:485
+#: ../lib/advene/gui/edit/rules.py:794
 #, fuzzy
-msgid "Search and replace strings in the annotations content"
+msgid "The element's incoming relations"
+msgstr "Vidi komentajxojn sur templinio"
+
+#: ../lib/advene/gui/edit/rules.py:795
+#, fuzzy
+msgid "The element's outgoing relations"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/interactivequery.py:510
+#: ../lib/advene/gui/edit/rules.py:796
 #, fuzzy
-msgid "Edit elements"
+msgid "The context"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/edit/rules.py:797
+#, fuzzy
+msgid "The context fragment"
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/interactivequery.py:516
-msgid "Open in python evaluator"
+#: ../lib/advene/gui/edit/rules.py:809
+#, fuzzy, python-format
+msgid "annotation-type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/edit/rules.py:812
+#, fuzzy, python-format
+msgid "relation-type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/edit/rules.py:834
+msgid "Select a condition"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:519
+#: ../lib/advene/gui/edit/rules.py:878
 #, python-format
-msgid ""
-"Result:\n"
-"%s"
+msgid "Parameter %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:561
-msgid "Results of _interactive query"
+#: ../lib/advene/gui/edit/rules.py:991
+msgid "Select an action"
 msgstr ""
 
-#: ../lib/advene/gui/views/relationdisplay.py:34
+#: ../lib/advene/gui/edit/rules.py:1082
+msgid "Activate?"
+msgstr ""
+
+#: ../lib/advene/gui/edit/properties.py:110
+msgid "Please press the new key combination"
+msgstr ""
+
+#: ../lib/advene/gui/edit/properties.py:161
+msgid "Disabled"
+msgstr ""
+
+#: ../lib/advene/gui/edit/properties.py:167
+#: ../lib/advene/gui/edit/shapewidget.py:1602
 #, fuzzy
-msgid "RelationDisplay"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Properties"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/gui/views/relationdisplay.py:36
+#: ../lib/advene/gui/edit/properties.py:531
 #, fuzzy
-msgid "Display the contents of a relation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Choose a file"
+msgstr "Elekti ilobretan stilon"
 
-#: ../lib/advene/gui/views/relationdisplay.py:79
+#: ../lib/advene/gui/edit/frameselector.py:46
+msgid "Click on a frame to select its time."
+msgstr ""
+
+#: ../lib/advene/gui/edit/frameselector.py:184
 #, fuzzy
-msgid "No relation"
+msgid "Select the appropriate snapshot"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/relationdisplay.py:104
-#: ../lib/advene/gui/views/annotationdisplay.py:253
-#, fuzzy
-msgid "Contents"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/edit/frameselector.py:237
+#: ../lib/advene/gui/edit/frameselector.py:268
+msgid "Click to see more frames or scroll with the mouse wheel"
+msgstr ""
 
-#: ../lib/advene/gui/views/html.py:62
-msgid "Cannot go back: first item in history"
+#: ../lib/advene/gui/edit/create.py:83
+#, python-format
+msgid "%s creation"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:220
+#: ../lib/advene/gui/edit/create.py:84
 #, python-format
-msgid "%s%% loaded"
+msgid ""
+"To create a new element of type %s,\n"
+"you must give the following information."
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:223
-#, fuzzy, python-format
-msgid "Title %s"
-msgstr "Dosiero"
+#: ../lib/advene/gui/edit/create.py:113
+msgid "Dynamic view"
+msgstr ""
 
-#: ../lib/advene/gui/views/html.py:287
-msgid "HTML Viewer"
+#: ../lib/advene/gui/edit/create.py:114
+msgid "HTML template"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:289
-msgid "Embedded HTML widget"
+#: ../lib/advene/gui/edit/create.py:115
+msgid "Plain XML"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:319
-msgid "No available HTML rendering component"
+#: ../lib/advene/gui/edit/create.py:116
+msgid "SVG template"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:36
-#, fuzzy
-msgid "ViewBook"
-msgstr "Vido"
+#: ../lib/advene/gui/edit/create.py:117
+msgid "Plain text template"
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:57
-#: ../lib/advene/gui/views/viewbook.py:64
-msgid "Cannot remove this widget, it is essential."
+#: ../lib/advene/gui/edit/create.py:120
+msgid "Simple query"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:135
-msgid "Detach"
+#: ../lib/advene/gui/edit/create.py:122
+msgid "Directory"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:139
-#: ../lib/advene/gui/views/editaccumulator.py:76
-msgid "Close"
+#: ../lib/advene/gui/edit/create.py:124 ../lib/advene/util/helper.py:417
+msgid "Resource File"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:157
-#, fuzzy
-msgid "Rename the view"
-msgstr "Arbvido"
+#: ../lib/advene/gui/edit/create.py:130
+msgid "No available type."
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:158
-msgid "Please enter the new name of the view"
+#: ../lib/advene/gui/edit/create.py:174
+#, python-format
+msgid ""
+"The identifier %s is not valid.\n"
+"It must be composed of non-accentuated alphabetic characters\n"
+"Underscore is allowed."
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:197
-msgid "Detach view in its own window, or drag-and-drop to another zone"
+#: ../lib/advene/gui/edit/create.py:179
+#, python-format
+msgid "The identifier %s is already defined."
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:211
-#, fuzzy
-msgid "Close view"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/edit/create.py:312
+msgid "New resource data"
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:286
-#, fuzzy
-msgid "Open a new transcription for..."
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/gui/edit/imports.py:132 ../lib/advene/gui/edit/imports.py:133
+#: ../lib/advene/core/controller.py:611
+msgid "Views"
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:298
-#, fuzzy
-msgid "Create a new comment view"
-msgstr "Arbvido"
+#: ../lib/advene/gui/edit/imports.py:146 ../lib/advene/gui/edit/imports.py:147
+msgid "Schemas"
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:300
-#, fuzzy
-msgid "Open a new view"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/edit/imports.py:198 ../lib/advene/gui/edit/imports.py:199
+#: ../lib/advene/gui/edit/elements.py:523
+msgid "Relations"
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:375
-#, fuzzy, python-format
-msgid "Use annotation-type %s :"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/imports.py:212 ../lib/advene/gui/edit/imports.py:213
+msgid "Queries"
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:378
-#: ../lib/advene/gui/views/viewbook.py:404
-msgid "to edit it"
+#: ../lib/advene/gui/edit/imports.py:323
+msgid "Imported?"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:379
-#: ../lib/advene/gui/views/viewbook.py:405
-#: ../lib/advene/gui/views/viewbook.py:437
-#, fuzzy
-msgid "to create a new static view"
-msgstr "Arbvido"
+#: ../lib/advene/gui/edit/imports.py:340 ../lib/advene/gui/edit/elements.py:515
+#: ../lib/advene/gui/edit/elements.py:564
+#: ../lib/advene/gui/edit/elements.py:651
+#: ../lib/advene/gui/edit/elements.py:731
+#: ../lib/advene/gui/edit/elements.py:788
+#: ../lib/advene/gui/edit/elements.py:880
+#: ../lib/advene/gui/edit/elements.py:949
+#: ../lib/advene/gui/edit/elements.py:1061
+#: ../lib/advene/gui/edit/elements.py:1123
+msgid "URI"
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:381
-#, fuzzy
-msgid "in a timeline"
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/gui/edit/imports.py:362
+msgid "Choose the package to import, and its alias"
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:382
-msgid "as a montage"
+#: ../lib/advene/gui/edit/imports.py:408 ../lib/advene/gui/edit/merge.py:230
+#, python-format
+msgid "Package %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:383
-#: ../lib/advene/gui/views/viewbook.py:436
-msgid "in a table"
+#: ../lib/advene/gui/edit/imports.py:408 ../lib/advene/gui/edit/merge.py:230
+msgid "No title"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:384
-#: ../lib/advene/gui/views/viewbook.py:406
-msgid "in a query"
+#: ../lib/advene/gui/edit/shapewidget.py:91
+msgid "Generic shape"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:384
-#: ../lib/advene/gui/views/viewbook.py:406
+#: ../lib/advene/gui/edit/shapewidget.py:256
+#: ../lib/advene/gui/edit/shapewidget.py:755
 #, python-format
-msgid "Query %s"
+msgid "Link to %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:385
-#: ../lib/advene/gui/views/viewbook.py:407
-#, fuzzy
-msgid "in the TALES browser"
-msgstr "Komentaraj attributoj"
-
-#: ../lib/advene/gui/views/viewbook.py:385
-#, python-format
-msgid "Browsing %s"
+#: ../lib/advene/gui/edit/shapewidget.py:348
+#: ../lib/advene/gui/edit/shapewidget.py:1304
+msgid "Link"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:401
-#, fuzzy, python-format
-msgid "Use annotation %s :"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/shapewidget.py:353
+msgid "Link label"
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:407
-#, python-format
-msgid "Browse %s"
+#: ../lib/advene/gui/edit/shapewidget.py:371
+msgid "Linewidth"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:408
+#: ../lib/advene/gui/edit/shapewidget.py:376
 #, fuzzy
-msgid "to display its contents"
-msgstr "Vidi komentajxojn sur templinio"
+msgid "Filled"
+msgstr "Dosiero"
 
-#: ../lib/advene/gui/views/viewbook.py:408
-#, python-format
-msgid "%s"
+#: ../lib/advene/gui/edit/shapewidget.py:384
+msgid "Opacity"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:409
-msgid "as a bookmark"
+#: ../lib/advene/gui/edit/shapewidget.py:426
+#, python-format
+msgid "Properties of %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:427
-msgid "as the context for the query..."
+#: ../lib/advene/gui/edit/shapewidget.py:473
+msgid "Rectangle"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:431
-#, fuzzy
-msgid "Set of annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/shapewidget.py:553
+#: ../lib/advene/gui/edit/shapewidget.py:666
+msgid "Text"
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:432
-#, fuzzy
-msgid "Use annotations:"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/shapewidget.py:677
+msgid "Textsize"
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:435
-msgid "to edit them"
+#: ../lib/advene/gui/edit/shapewidget.py:691
+msgid "Image"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:438
-#, fuzzy
-msgid "as bookmarks"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/shapewidget.py:775
+msgid "Href"
+msgstr ""
 
-#: ../lib/advene/gui/views/singletonpopup.py:32
-msgid "SingletonPopup"
+#: ../lib/advene/gui/edit/shapewidget.py:785
+msgid "Line"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:121 ../lib/advene/gui/main.py:1221
-msgid "Timeline"
+#: ../lib/advene/gui/edit/shapewidget.py:881
+msgid "Draw an arrow"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:123
-msgid "Display annotations on a timeline"
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/gui/edit/shapewidget.py:892
+msgid "Arrow size"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:137
+#: ../lib/advene/gui/edit/shapewidget.py:1107
 #, fuzzy
-msgid "Limit display to current area"
-msgstr "Vidi komentajxojn sur templinio"
+msgid "Close path"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/gui/views/timeline.py:138
-#: ../lib/advene/gui/views/timeline.py:3265
-#, fuzzy
-msgid "Display whole movie"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/shapewidget.py:1186
+msgid "Circle"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:168
-#, fuzzy, python-format
-msgid "Cannot find annotation type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/shapewidget.py:1241
+msgid "Ellipse"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:218
-msgid "No scrolling"
+#: ../lib/advene/gui/edit/shapewidget.py:1603
+msgid "SVG"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:219
-msgid "Continuous scrolling"
+#: ../lib/advene/gui/edit/shapewidget.py:2162
+msgid "Load SVG"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:220
-msgid "Discrete scrolling"
+#: ../lib/advene/gui/edit/shapewidget.py:2168
+msgid "Save SVG"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:221
+#: ../lib/advene/gui/edit/importer.py:49
 #, fuzzy
-msgid "Annotation scrolling"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Importer"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/views/timeline.py:483
-#, fuzzy, python-format
-msgid "%d annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/importer.py:108
+#: ../lib/advene/gui/edit/importer.py:118
+#, fuzzy
+msgid "Advene package importer"
+msgstr "Redakti komentarajn attributojn"
 
-#: ../lib/advene/gui/views/timeline.py:486
+#: ../lib/advene/gui/edit/importer.py:122
 #, fuzzy
-msgid "Display all types"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Not likely"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/views/timeline.py:488
+#: ../lib/advene/gui/edit/importer.py:144
 #, python-format
 msgid ""
-"There are %d annotations.\n"
-"The current timeline may take a long time to display them, so only the first "
-"two annotation types are displayed. Use the annotation type selector (second "
-"button in the timeline) to select other annotations types to display, or "
-"click on the 'Display all types' button below."
+"Completed conversion: %(message)s\n"
+"%(statistics)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:963
-#, fuzzy
-msgid "Split at current player position"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/views/timeline.py:967
-msgid "Center and zoom"
+#: ../lib/advene/gui/edit/importer.py:151
+msgid "Stop"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1058
-#: ../lib/advene/gui/views/tree.py:808 ../lib/advene/gui/main.py:4563
+#: ../lib/advene/gui/edit/importer.py:190
+#, python-format
 msgid ""
-"Select the schema where you want to\n"
-"create the new relation type."
+"The filter is not ready.\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1071
-#: ../lib/advene/gui/views/tree.py:821
-msgid "Create a relation"
+#: ../lib/advene/gui/edit/importer.py:279
+msgid "Choose the file to import"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1081
-#: ../lib/advene/gui/views/tree.py:831
+#: ../lib/advene/gui/edit/importer.py:299
 #, fuzzy
-msgid "Create a new relation-type."
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Filter"
+msgstr "Dosiero"
 
-#: ../lib/advene/gui/views/timeline.py:1107
+#: ../lib/advene/gui/edit/importer.py:308
 #, fuzzy
-msgid "Merge with this annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/views/timeline.py:1116
-msgid "Align both begin times"
-msgstr ""
-
-#: ../lib/advene/gui/views/timeline.py:1117
-msgid "Align both end times"
-msgstr ""
+msgid "Options"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/views/timeline.py:1118
-msgid "Align end time to selected begin time"
+#: ../lib/advene/gui/edit/importer.py:318
+msgid "Start"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1119
-msgid "Align begin time to selected end time"
+#: ../lib/advene/gui/edit/dvdselect.py:71
+msgid ""
+"Select the correct\n"
+"title and chapter\n"
+"of the DVD"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1120
-msgid "Align all times"
+#: ../lib/advene/gui/edit/dvdselect.py:84
+msgid "Chapter"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1158
-#: ../lib/advene/gui/views/tree.py:700
-msgid "Cannot delete the annotation : it has relations."
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:33
+#, fuzzy
+msgid "Create element"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/timeline.py:1233
+#: ../lib/advene/gui/edit/merge.py:34
 #, fuzzy
-msgid "Select the appropriate relation type"
+msgid "Create annotation (duplicate id)"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/timeline.py:1252
-#: ../lib/advene/gui/views/tree.py:757
-#, fuzzy, python-format
-msgid "Duplicate selection to type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/merge.py:35
+msgid "Create relation (duplicate id)"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1255
-#: ../lib/advene/gui/views/tree.py:760
-#, fuzzy, python-format
-msgid "Move selection to type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/merge.py:36
+msgid "Update the color"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1264
-#: ../lib/advene/gui/views/tree.py:769
-#, fuzzy, python-format
-msgid "Duplicate annotation to type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/merge.py:37
+#, fuzzy
+msgid "Update the representation"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/views/timeline.py:1268
-#: ../lib/advene/gui/views/tree.py:773
-#, fuzzy, python-format
-msgid "Move annotation to type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/merge.py:38
+#, fuzzy
+msgid "Update the description"
+msgstr "Importi transkribon"
 
-#: ../lib/advene/gui/views/timeline.py:1275
-#, fuzzy, python-format
-msgid "Duplicate to type %(type)s at %(position)s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/merge.py:39
+msgid "Update the title"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1281
-#, python-format
-msgid "Move to type %(type)s at %(position)s"
+#: ../lib/advene/gui/edit/merge.py:40
+msgid "Update the mimetype"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1291
-#: ../lib/advene/gui/views/tree.py:784
-#, fuzzy
-msgid "Duplicate and create a relation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/merge.py:41
+msgid "Update the begin time"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1302
-#, fuzzy, python-format
-msgid "Duplicate at %s and create a relation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/merge.py:42
+msgid "Update the end time"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1333
-#, fuzzy
-msgid "Annotation filter"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/merge.py:43
+msgid "Update the content"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1334
-msgid "Enter the searched string"
+#: ../lib/advene/gui/edit/merge.py:44
+msgid "Update the matchFilter"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1442
-#, fuzzy, python-format
-msgid "Duplicate all annotations to type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/merge.py:45
+#, fuzzy
+msgid "Update the member types"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/timeline.py:1444
-#, fuzzy, python-format
-msgid "Move all annotations to type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/merge.py:46
+#, fuzzy
+msgid "Update tags"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/timeline.py:1446
-#, fuzzy, python-format
-msgid "Duplicate all annotations matching a string to type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/merge.py:90
+msgid "Difference between original and merged elements"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1448
-#, fuzzy, python-format
-msgid "Move all annotations matching a string to type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/merge.py:136
+#, fuzzy
+msgid "Current element"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/timeline.py:1450
-#, python-format
-msgid "Align all annotation time codes using %s as reference."
+#: ../lib/advene/gui/edit/merge.py:141
+#, fuzzy
+msgid "Updated element"
+msgstr "Arbvido"
+
+#: ../lib/advene/gui/edit/merge.py:147
+msgid "Show diff"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1452
-#, python-format
-msgid "Align all annotation contents using %s as reference"
+#: ../lib/advene/gui/edit/merge.py:180
+msgid "Merge?"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1642
-#: ../lib/advene/gui/views/table.py:240
-msgid "Cannot update the annotation, its representation is too complex"
+#: ../lib/advene/gui/edit/merge.py:197
+msgid "Element"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1936
-#: ../lib/advene/gui/views/timeline.py:1965
+#: ../lib/advene/gui/edit/merge.py:215
 #, fuzzy, python-format
-msgid "Displaying %(count)d / %(total)d annotations..."
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/views/timeline.py:1947
-#, fuzzy
-msgid "Displaying done."
-msgstr "Vidi komentajxojn sur templinio"
-
-#: ../lib/advene/gui/views/timeline.py:2439
-#, fuzzy
-msgid "Create a new annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Merge elements from %(source)s into %(dest)s"
+msgstr "Redakti importitaj elementojn de aliaj komentaroj"
 
-#: ../lib/advene/gui/views/timeline.py:2440
-#, fuzzy
-msgid "Zoom on region"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/edit/merge.py:266
+msgid "All"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2441
-#, fuzzy
-msgid "Restrict display to region"
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/gui/edit/merge.py:271 ../lib/advene/core/controller.py:1097
+msgid "None"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2560
-#, fuzzy
-msgid "New annotation at player time"
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/gui/edit/montage.py:51
+msgid "Montage"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2564
+#: ../lib/advene/gui/edit/montage.py:53
 #, fuzzy
-msgid "New annotation at mouse position"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Dynamic montage of annotations"
+msgstr "Importi transkribon"
 
-#: ../lib/advene/gui/views/timeline.py:2568
-msgid "Selection"
+#: ../lib/advene/gui/edit/montage.py:61
+msgid "Render"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2694
-msgid "Cannot zoom more"
+#: ../lib/advene/gui/edit/montage.py:176
+msgid "Remove from montage"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2915
+#: ../lib/advene/gui/edit/montage.py:310
 #, python-format
-msgid "From schema %s"
+msgid ""
+"Exporting montage %(title)s\n"
+"to %%(filename)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2977
-#, fuzzy
-msgid "Restrict playing to this annotation-type"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/montage.py:405
+msgid "Drop an annotation here to remove it from the list"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2984
-#, fuzzy
-msgid "Goto previous annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/montage.py:417
+msgid "Play the montage"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2995
+#: ../lib/advene/gui/edit/montage.py:422
 #, fuzzy
-msgid "Goto next annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Save the view in the package"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/gui/views/timeline.py:3006
-msgid "+"
+#: ../lib/advene/gui/edit/montage.py:470
+msgid "Set zoom level"
+msgstr ""
+
+#: ../lib/advene/gui/edit/montage.py:475
+msgid "Set 100% zoom"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3064
+#: ../lib/advene/gui/edit/montage.py:554
 #, fuzzy
-msgid "Open an annotation display view"
+msgid "Total duration:"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/timeline.py:3071
-msgid "Open a slave montage view (coordinated zoom level)"
+#: ../lib/advene/gui/edit/timeadjustment.py:97
+#, python-format
+msgid "Decrement value by %.2f s"
+msgstr ""
+
+#: ../lib/advene/gui/edit/timeadjustment.py:99
+#, python-format
+msgid "Increment value by %.2f s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3106
+#: ../lib/advene/gui/edit/timeadjustment.py:128
 msgid ""
-"<b>Statistics about current selection</b>\n"
-"\n"
+"Click to play\n"
+"Control+click to set to current time\n"
+"Scroll to modify value (with control/shift)\n"
+"Right-click to invalidate screenshot"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3113
-#, fuzzy
-msgid "No selected annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/timeadjustment.py:143
+msgid ""
+"Enter a timecode.\n"
+"An integer value will be considered as milliseconds.\n"
+"A float value (12.2) will be considered as seconds.\n"
+"HH:MM:SS.sss values are possible."
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3117
-#, fuzzy, python-format
-msgid "%d selected annotation(s)"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/timeadjustment.py:157
+msgid "Set to current player position"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3124
-#, fuzzy
-msgid "Unselect all annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/elements.py:80
+#, python-format
+msgid "No edit popup available for element %s"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3125
-#, fuzzy
-msgid "Create a static view"
-msgstr "Arbvido"
+#: ../lib/advene/gui/edit/elements.py:100
+msgid "Edit Window"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3126
-msgid "Highlight selection in other views"
+#: ../lib/advene/gui/edit/elements.py:139
+msgid "Apply changes and close the edit window"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3127
-#: ../lib/advene/gui/views/timeline.py:3713
-#, fuzzy
-msgid "Tag selection"
-msgstr "Vido"
+#: ../lib/advene/gui/edit/elements.py:144
+msgid "Apply changes"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3128
-#, fuzzy
-msgid "Delete selected annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/elements.py:278
+msgid "Content has been modified. Close anyway and lose data?"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3129
-#, fuzzy
-msgid "Display selection in a table"
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/gui/edit/elements.py:338
+#, python-format
+msgid "View %s (read-only)"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3130
-msgid "Center and zoom on selection"
+#: ../lib/advene/gui/edit/elements.py:374
+#, python-format
+msgid "Display %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3131
+#: ../lib/advene/gui/edit/elements.py:459
 #, fuzzy
-msgid "Edit selected annotations"
+msgid "Apply changes and edit previous annotation of same type"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/timeline.py:3132
+#: ../lib/advene/gui/edit/elements.py:463
 #, fuzzy
-msgid "Merge annotations"
+msgid "Apply changes and edit next annotation of same type"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/timeline.py:3133
+#: ../lib/advene/gui/edit/elements.py:469
 #, fuzzy
-msgid "Display statistics"
+msgid "Unhighlight annotation"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/timeline.py:3258
+#: ../lib/advene/gui/edit/elements.py:473
 #, fuzzy
-msgid "Goto previous page"
+msgid "Highlight annotation"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/timeline.py:3270
-#, fuzzy
-msgid "Goto next page"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/elements.py:504
+msgid "Fragment"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3324
-msgid "Inspector locked. Click here or in the timeline background to unlock."
+#: ../lib/advene/gui/edit/elements.py:527 ../lib/advene/core/controller.py:611
+msgid "Tags"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3352
-#, fuzzy
-msgid ""
-"Delete the selected annotations or drop an annotation here to delete it."
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/elements.py:623
+msgid "Apply changes and visualise in web browser"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3374
-msgid ""
-"Drag an annotation type here to remove it from display.\n"
-"Click to edit all displayed types"
+#: ../lib/advene/gui/edit/elements.py:628
+msgid "Apply changes and activate the view"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3386
+#: ../lib/advene/gui/edit/elements.py:636
+#: ../lib/advene/gui/edit/elements.py:717
+#: ../lib/advene/gui/edit/elements.py:774
+#: ../lib/advene/gui/edit/elements.py:865
+#: ../lib/advene/gui/edit/elements.py:934
+#: ../lib/advene/gui/edit/elements.py:1036
 #, fuzzy
-msgid "Selection actions"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/views/timeline.py:3401
-msgid "Display relations"
-msgstr ""
+msgid "Title (name)"
+msgstr "Dosiero"
 
-#: ../lib/advene/gui/views/timeline.py:3407
+#: ../lib/advene/gui/edit/elements.py:640
 #, fuzzy
-msgid "Display all relations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Name of the view"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/timeline.py:3484
-msgid "Center on current player position."
-msgstr ""
-
-#: ../lib/advene/gui/views/timeline.py:3500
-msgid "Automatically activate loop when clicking on an annotation"
-msgstr ""
-
-#: ../lib/advene/gui/views/timeline.py:3524
-msgid "Displayed"
-msgstr ""
-
-#: ../lib/advene/gui/views/timeline.py:3532
-#, fuzzy
-msgid "Not displayed"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/views/timeline.py:3580
-msgid "< All <"
+#: ../lib/advene/gui/edit/elements.py:664
+msgid "Class"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3584
-msgid "> All >"
+#: ../lib/advene/gui/edit/elements.py:667
+msgid "Match Filter"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3600
-#, fuzzy
-msgid "Displayed annotation types"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/views/timeline.py:3625
-#, fuzzy
-msgid "Relation type"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/views/timeline.py:3625
+#: ../lib/advene/gui/edit/elements.py:710
 #, fuzzy
-msgid "Display relation types"
+msgid "Validate and run query on package"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/timeline.py:3626
+#: ../lib/advene/gui/edit/elements.py:721
 #, fuzzy
-msgid "Relation content"
-msgstr "Defauxlta regularo"
+msgid "Name of the query"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/timeline.py:3626
+#: ../lib/advene/gui/edit/elements.py:778
 #, fuzzy
-msgid "Display relation content"
-msgstr "Vidi komentajxojn sur templinio"
-
-#: ../lib/advene/gui/views/timeline.py:3627 ../lib/advene/gui/popup.py:516
-msgid "Highlight"
-msgstr ""
+msgid "Name of the package"
+msgstr "Komentaraj attributoj"
 
-#: ../lib/advene/gui/views/timeline.py:3627
-msgid "Highlight active annotations"
+#: ../lib/advene/gui/edit/elements.py:796
+#: ../lib/advene/gui/edit/elements.py:887
+#: ../lib/advene/gui/edit/elements.py:966
+#: ../lib/advene/gui/edit/elements.py:1080
+msgid "Description"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3714
-msgid "Enter the tag for the selection"
+#: ../lib/advene/gui/edit/elements.py:800
+#: ../lib/advene/gui/edit/elements.py:891
+#: ../lib/advene/gui/edit/elements.py:970
+#: ../lib/advene/gui/edit/elements.py:1084
+msgid "Textual description of the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:248
-msgid "No children in on_iter_children()!"
+#: ../lib/advene/gui/edit/elements.py:805
+msgid "Default dynamic view"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:263
-msgid "No children in on_iter_nth_child()"
+#: ../lib/advene/gui/edit/elements.py:809
+msgid "Dynamic view to activate on package load"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:317
-msgid "List of views"
+#: ../lib/advene/gui/edit/elements.py:814
+msgid "Default static view"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:318
-#, fuzzy
-msgid "Static views"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/views/tree.py:319
-msgid "Dynamic views"
+#: ../lib/advene/gui/edit/elements.py:818
+msgid "Static view to open on package load"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:320
-#, fuzzy
-msgid "Admin views"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/views/tree.py:321
+#: ../lib/advene/gui/edit/elements.py:823
 #, fuzzy
-msgid "Adhoc views"
+msgid "Default adhoc view"
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/views/tree.py:421 ../lib/advene/gui/main.py:1222
-#, fuzzy
-msgid "Tree view"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/views/tree.py:453
-msgid "Package View"
+#: ../lib/advene/gui/edit/elements.py:827
+msgid "Adhoc view to open on package load"
 msgstr ""
 
-#: ../lib/advene/gui/views/editaccumulator.py:42
-msgid "EditAccumulator"
+#: ../lib/advene/gui/edit/elements.py:832
+msgid "Cached duration"
 msgstr ""
 
-#: ../lib/advene/gui/views/editaccumulator.py:70
-#: ../lib/advene/gui/views/annotationdisplay.py:256
-#, fuzzy
-msgid "Validate"
-msgstr "Vido"
-
-#: ../lib/advene/gui/views/relation.py:68
-#, fuzzy
-msgid "Relations view"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/views/caption.py:30 ../lib/advene/gui/main.py:4339
-msgid "Caption"
+#: ../lib/advene/gui/edit/elements.py:836
+msgid "Cached duration in ms"
 msgstr ""
 
-#: ../lib/advene/gui/views/caption.py:32
-#, fuzzy
-msgid "Display a text caption below the video output"
-msgstr "Vidi komentajxojn sur templinio"
-
-#: ../lib/advene/gui/views/scroller.py:29 ../lib/advene/gui/main.py:4338
-msgid "Scroller"
+#: ../lib/advene/gui/edit/elements.py:841
+msgid "Mediafile"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:329
-#, python-format
-msgid ""
-"View <b>%(title)s</b>\n"
-"Id: %(id)s"
+#: ../lib/advene/gui/edit/elements.py:845
+msgid "Location of associated media file"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:336
+#: ../lib/advene/gui/edit/elements.py:869
 #, fuzzy
-msgid "Open in webbrowser"
-msgstr "Komentaraj attributoj"
-
-#: ../lib/advene/gui/views/finder.py:337
-#, python-format
-msgid "View applied to %s\n"
-msgstr ""
+msgid "Name of the schema"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/finder.py:342 ../lib/advene/gui/popup.py:496
-msgid "Activate"
+#: ../lib/advene/gui/edit/elements.py:901
+#: ../lib/advene/gui/edit/elements.py:981
+msgid "TALES expression returning a color for the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:345
-msgid "Open in GUI"
+#: ../lib/advene/gui/edit/elements.py:908
+#: ../lib/advene/gui/edit/elements.py:999
+msgid "Item color"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:347
-msgid "Unknown type of view??"
+#: ../lib/advene/gui/edit/elements.py:912
+#: ../lib/advene/gui/edit/elements.py:1003
+msgid ""
+"TALES expression returning a color for the items contained by the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:372
-#, fuzzy
-msgid "Edit view"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/views/finder.py:381
+#: ../lib/advene/gui/edit/elements.py:938
+#: ../lib/advene/gui/edit/elements.py:1040
 #, fuzzy
-msgid "Open view"
-msgstr "Defauxlta regularo"
+msgid "Name of the type"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/finder.py:421 ../lib/advene/gui/views/finder.py:487
-#, python-format
-msgid ""
-"%(type)s <b>%(title)s</b>\n"
-"Id: %(id)s"
+#: ../lib/advene/gui/edit/elements.py:956
+#: ../lib/advene/gui/edit/elements.py:1045
+#: ../lib/advene/gui/edit/elements.py:1314
+msgid "MIME Type"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:444
-msgid "Try to apply the query on..."
+#: ../lib/advene/gui/edit/elements.py:960
+#: ../lib/advene/gui/edit/elements.py:1049
+msgid "MIMEType of the content"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:464 ../lib/advene/gui/popup.py:829
-#, fuzzy
-msgid "the package"
-msgstr "Komentaraj attributoj"
-
-#: ../lib/advene/gui/views/finder.py:465 ../lib/advene/gui/popup.py:830
-#, fuzzy
-msgid "all annotations of the package"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/elements.py:992
+msgid ""
+"TALES expression used to get a compact representation of the annotations"
+msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:466 ../lib/advene/gui/popup.py:831
-#, fuzzy
-msgid "the first annotation of the package"
+#: ../lib/advene/gui/edit/elements.py:993
+#, fuzzy, python-format
+msgid "Display %s key"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/finder.py:509
+#: ../lib/advene/gui/edit/elements.py:1009
 #, fuzzy
-msgid "Edit resource"
-msgstr "Preferoj"
+msgid "Completions"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/views/finder.py:523 ../lib/advene/gui/main.py:1223
-#, fuzzy
-msgid "Package finder"
-msgstr "Komentaraj attributoj"
+#: ../lib/advene/gui/edit/elements.py:1013
+msgid "Space-separated list of words used for content completion"
+msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:525
+#: ../lib/advene/gui/edit/elements.py:1019
 #, fuzzy
-msgid "Column-based package finder"
-msgstr "Komentaraj attributoj"
+msgid "Advanced"
+msgstr "Advene"
 
-#: ../lib/advene/gui/views/annotationdisplay.py:41
+#: ../lib/advene/gui/edit/elements.py:1069
 #, fuzzy
-msgid "AnnotationDisplay"
+msgid "Any annotation type"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/views/annotationdisplay.py:43
-#, fuzzy
-msgid "Display the contents of an annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/elements.py:1095
+msgid "TALES expression specifying a color"
+msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:84
-#, fuzzy
-msgid "No annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/gui/edit/elements.py:1122
+msgid "MIMEType"
+msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:110
+#: ../lib/advene/gui/edit/elements.py:1347
 #, python-format
-msgid ""
-"Schema %(schema)s (id %(id)s)\n"
-"%(description)s\n"
-"%(stats)s"
+msgid "Error: cannot find a content handler for %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:231
-msgid "Screenshot"
+#: ../lib/advene/gui/edit/elements.py:1466
+#: ../lib/advene/gui/edit/elements.py:1679
+#, python-format
+msgid ""
+"Cannot read the data:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:193
-msgid "Invalid view id"
+#: ../lib/advene/gui/edit/elements.py:1479
+#: ../lib/advene/gui/edit/elements.py:1704
+msgid "Save content to..."
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:239
+#: ../lib/advene/gui/edit/elements.py:1493
+#: ../lib/advene/gui/edit/elements.py:1717
 #, python-format
-msgid "Cannot save default options: %s"
+msgid ""
+"Cannot save the data:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:250
-#, fuzzy, python-format
-msgid "Default options saved for view %s"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/views/__init__.py:282
-#, python-format
-msgid "Saving %s"
+#: ../lib/advene/gui/edit/elements.py:1508
+#: ../lib/advene/gui/edit/elements.py:1731
+msgid "Open a file (C-o)"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:285
-msgid "Enter a view name to save this parametered view"
+#: ../lib/advene/gui/edit/elements.py:1513
+#: ../lib/advene/gui/edit/elements.py:1736
+msgid "Save to a file (C-s)"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:288 ../lib/advene/gui/main.py:4630
-#, python-format
-msgid "Error: the identifier %s contains invalid characters."
+#: ../lib/advene/gui/edit/elements.py:1518
+#: ../lib/advene/gui/edit/elements.py:1741
+msgid "Reload the file (C-r)"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:303
-#, python-format
-msgid "Error: the view %s is not an adhoc view."
+#: ../lib/advene/gui/edit/elements.py:1524
+msgid "Insert a value from the browser (C-i)"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:328
-msgid "HTML export"
+#: ../lib/advene/gui/edit/elements.py:1770
+msgid "Begin time is greater than end time"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:329
-#, fuzzy
-msgid "Specify a name for the export view"
-msgstr "Arbvido"
+#: ../lib/advene/gui/edit/elements.py:2042
+msgid "Expecting an integer."
+msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:348
+#: ../lib/advene/gui/edit/elements.py:2074
 #, python-format
 msgid ""
-"View successfully exported as %s.\n"
-"Open it in the web browser ?"
+"The %(attribute)s attribute could not be updated:\n"
+"\n"
+"%(error)s\n"
+"\n"
+"Resetting to the original value."
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:427
-msgid "Actions"
+#: ../lib/advene/gui/edit/elements.py:2100
+#, python-format
+msgid ""
+"The following attributes cannot be updated:\n"
+"\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:452
-msgid "Click or drag-and-drop to reattach view"
+#: ../lib/advene/gui/edit/elements.py:2138
+#, python-format
+msgid ""
+"The following attributes could not be updated:\n"
+"\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:55
-#, fuzzy
-msgid "Annotation table view"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/views/table.py:57
-#, fuzzy
-msgid "Display annotations in a table"
-msgstr "Vidi komentajxojn sur templinio"
-
-#: ../lib/advene/gui/views/table.py:227 ../lib/advene/gui/views/table.py:452
-#, fuzzy
-msgid "Snapshot"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/views/table.py:254 ../lib/advene/gui/main.py:4178
-msgid "Duration"
+#: ../lib/advene/gui/edit/elements.py:2155
+msgid "Attribute"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:382 ../lib/advene/gui/views/table.py:511
-msgid "Export data to file..."
+#: ../lib/advene/gui/edit/elements.py:2254
+msgid "Insert an element"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:391 ../lib/advene/gui/views/table.py:520
-#, python-format
-msgid "Error while exporting data to %(filename)s: %(error)s"
+#: ../lib/advene/gui/edit/elements.py:2255
+msgid "Choose the element to insert."
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "id"
+#: ../lib/advene/gui/edit/elements.py:2325
+#: ../lib/advene/gui/edit/elements.py:2368
+#, python-format
+msgid "Some tags contain invalid characters: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "type"
+#: ../lib/advene/gui/edit/elements.py:2348
+msgid "Tags:"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "begin"
+#: ../lib/advene/gui/edit/transcribe.py:70
+msgid "Transcription importer"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "end"
+#: ../lib/advene/gui/edit/transcribe.py:81
+msgid "Note taking"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
+#: ../lib/advene/gui/edit/transcribe.py:83
 #, fuzzy
-msgid "content"
-msgstr "Defauxlta regularo"
+msgid "Take notes on the fly as a timestamped transcription"
+msgstr "Importi annotajxojn de tempmarkita transkribo"
 
-#: ../lib/advene/gui/views/table.py:460
-msgid "Generic table view"
+#: ../lib/advene/gui/edit/transcribe.py:149
+msgid "Timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:462
-msgid "Display Advene elements in a table."
-msgstr ""
-
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element title"
+#: ../lib/advene/gui/edit/transcribe.py:149
+msgid "Click inserts timestamp marks"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element type"
+#: ../lib/advene/gui/edit/transcribe.py:150
+msgid "Insert on single-click"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:532
-#, fuzzy
-msgid "Element id"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/widget.py:327
-#, fuzzy, python-format
-msgid "Set of %s annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/widget.py:1067
-#, fuzzy
-msgid "Save as..."
-msgstr "Komentaraj attributoj"
-
-#: ../lib/advene/gui/widget.py:1072
-#, fuzzy
-msgid "Use current player position"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/widget.py:1078
-#, fuzzy
-msgid "Adjust timestamp"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/main.py:193 ../lib/advene/gui/main.py:304
-#, fuzzy
-msgid "_Select player"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/main.py:195 ../lib/advene/gui/main.py:287
-msgid "_View"
-msgstr "Vido"
-
-#: ../lib/advene/gui/main.py:197 ../lib/advene/gui/main.py:306
-#, fuzzy
-msgid "Packages"
-msgstr "Komentaraj attributoj"
-
-#: ../lib/advene/gui/main.py:200 ../lib/advene/gui/main.py:246
-#, fuzzy
-msgid "Open recent"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/edit/transcribe.py:150
+msgid "A single click will insert the mark (else a double click is needed)"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:239
-msgid "Input from the keyboard (function keys)"
+#: ../lib/advene/gui/edit/transcribe.py:151
+msgid "Play on scroll"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:243
-msgid "_File"
-msgstr "Dosiero"
+#: ../lib/advene/gui/edit/transcribe.py:151
+msgid "Play the new position upon timestamp modification"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:244
+#: ../lib/advene/gui/edit/transcribe.py:152
 #, fuzzy
-msgid "_New package"
-msgstr "Komentaraj attributoj"
+msgid "Generate empty annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:244
+#: ../lib/advene/gui/edit/transcribe.py:152
 #, fuzzy
-msgid "Create a new package"
+msgid "If checked, generate annotations for empty text"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:245
-#, fuzzy
-msgid "_Open package"
-msgstr "Komentaraj attributoj"
+#: ../lib/advene/gui/edit/transcribe.py:153
+msgid "Reaction time"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:245
-#, fuzzy
-msgid "Open a package"
-msgstr "Komentaraj attributoj"
+#: ../lib/advene/gui/edit/transcribe.py:153
+msgid ""
+"Reaction time (substracted from current player time, except when paused.)"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:246
-#, fuzzy
-msgid "Show recently opened packages"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/edit/transcribe.py:154
+msgid "Auto-insert"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:247
-#, fuzzy
-msgid "_Save package"
-msgstr "Komentaraj attributoj"
+#: ../lib/advene/gui/edit/transcribe.py:154
+msgid "Automatic timestamp mark insertion"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:247
-#, fuzzy
-msgid "Save the package"
-msgstr "Komentaraj attributoj"
+#: ../lib/advene/gui/edit/transcribe.py:155
+msgid "Automatic insertion delay"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:248
-#, fuzzy
-msgid "Save package as..."
-msgstr "Komentaraj attributoj"
+#: ../lib/advene/gui/edit/transcribe.py:155
+msgid ""
+"If autoinsert is active, timestamp marks will be automatically inserted when "
+"text is entered after no interaction since this delay (in ms).\n"
+"1000 is typically a good value."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:248
-#, fuzzy
-msgid "Save the package as..."
-msgstr "Komentaraj attributoj"
+#: ../lib/advene/gui/edit/transcribe.py:156
+msgid "Font size for text (0 for standard size)"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:249
-#, fuzzy
-msgid "Close package"
-msgstr "Komentaraj attributoj"
+#: ../lib/advene/gui/edit/transcribe.py:216
+#: ../lib/advene/gui/edit/transcribe.py:220
+#: ../lib/advene/gui/edit/transcribe.py:378
+#: ../lib/advene/gui/edit/transcribe.py:382
+msgid "Invalid timestamp mark"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:249
-#, fuzzy
-msgid "Close the package"
-msgstr "Komentaraj attributoj"
+#: ../lib/advene/gui/edit/transcribe.py:503
+msgid "Ignore the following text (toggle)"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:251
-msgid "Save session"
+#: ../lib/advene/gui/edit/transcribe.py:507
+msgid "Remove mark"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:251
-#, fuzzy
-msgid "Save the current session (list of opened packages)"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/gui/edit/transcribe.py:511
+msgid "Reaction-time offset"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:252
-msgid "Save workspace"
+#: ../lib/advene/gui/edit/transcribe.py:515
+msgid "-1 sec"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:253
-msgid "...as package view"
+#: ../lib/advene/gui/edit/transcribe.py:518
+msgid "-0.5 sec"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:254
-msgid "...as standard workspace"
+#: ../lib/advene/gui/edit/transcribe.py:521
+msgid "-0.1 sec"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:254
-msgid "Use the current layout as standard workspace in the future"
+#: ../lib/advene/gui/edit/transcribe.py:525
+msgid "+1 sec"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:256
-msgid "Associate a video _File"
+#: ../lib/advene/gui/edit/transcribe.py:528
+msgid "+0.5 sec"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:256
-msgid "Associate a video file"
+#: ../lib/advene/gui/edit/transcribe.py:531
+msgid "+0.1 sec"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:257
-msgid "Associate a _DVD"
+#: ../lib/advene/gui/edit/transcribe.py:618
+msgid "Invalid timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:257
-msgid "Associate a chapter from a DVD"
+#: ../lib/advene/gui/edit/transcribe.py:738
+#, python-format
+msgid "Invalid timestamp mark in conversion: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:258
-msgid "Associate a _Video stream"
+#: ../lib/advene/gui/edit/transcribe.py:856
+#, python-format
+msgid "Cannot save the file: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:258
-msgid "Enter a video stream address"
+#: ../lib/advene/gui/edit/transcribe.py:865
+#: ../lib/advene/gui/edit/transcribe.py:947
+msgid "This will overwrite the current textual content. Are you sure?"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:260
-msgid "_Import File"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/edit/transcribe.py:868
+msgid "Select transcription file to load"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:260
-msgid "Import data from an external source"
-msgstr "Importi datumo de alia ???"
+#: ../lib/advene/gui/edit/transcribe.py:885
+#, python-format
+msgid "Cannot open %(filename)s: %(error)s"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:261
-#, fuzzy
-msgid "_Process video"
-msgstr "Importi dosieron"
+#: ../lib/advene/gui/edit/transcribe.py:932
+msgid "Cannot import annotations: no existing interface"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:261
+#: ../lib/advene/gui/edit/transcribe.py:934
 #, fuzzy
-msgid "Import data from video processing algorithms"
-msgstr "Importi datumo de alia ???"
+msgid "Select the annotation type to import"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:263
-msgid "Merge package"
+#: ../lib/advene/gui/edit/transcribe.py:943
+#, fuzzy, python-format
+msgid "There are no annotations of type %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/gui/edit/transcribe.py:972
+msgid "Cannot convert the data: no associated package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:263
+#: ../lib/advene/gui/edit/transcribe.py:975
 #, fuzzy
-msgid "Merge elements from another package"
-msgstr "Redakti importitaj elementojn de aliaj komentaroj"
-
-#: ../lib/advene/gui/main.py:264
-msgid "Import _DVD chapters"
-msgstr "Importi DVD cxapitrojn"
+msgid "Converting transcription"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/main.py:264
-msgid "Create annotations based on DVD chapters"
+#: ../lib/advene/gui/edit/transcribe.py:981
+#, fuzzy
+msgid "Choose the annotation-type where to create annotations.\n"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:266
+#: ../lib/advene/gui/edit/transcribe.py:989
 #, fuzzy
-msgid "_Export..."
-msgstr "Importi dosieron"
+msgid "Delete existing annotations in this type"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:266
+#: ../lib/advene/gui/edit/transcribe.py:1012
 #, fuzzy
-msgid "Export data to another format"
-msgstr "Importi datumo de alia ???"
+msgid "Select type"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/main.py:267
-msgid "_Website export..."
+#: ../lib/advene/gui/edit/transcribe.py:1016
+msgid "You want to create a new type. Please specify its schema and title."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:267
+#: ../lib/advene/gui/edit/transcribe.py:1028
+msgid "Containing schema"
+msgstr ""
+
+#: ../lib/advene/gui/edit/transcribe.py:1041
+msgid "Export options"
+msgstr ""
+
+#: ../lib/advene/gui/edit/transcribe.py:1046
 #, fuzzy
-msgid "Export views to a website"
+msgid "Generate annotations for empty contents"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:269
-#, fuzzy
-msgid "_Quit"
-msgstr "Redakti"
+#: ../lib/advene/gui/edit/transcribe.py:1071
+#, python-format
+msgid "The %s identifier already exists. Choose another one."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:271
-msgid "_Edit"
-msgstr "Redakti"
+#: ../lib/advene/gui/edit/transcribe.py:1110
+msgid "Notes converted"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:272
-msgid "_Undo"
+#: ../lib/advene/gui/edit/transcribe.py:1157
+msgid "Open"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:273
-#, fuzzy
-msgid "_Find"
-msgstr "Dosiero"
+#: ../lib/advene/gui/edit/transcribe.py:1158
+msgid "Save"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:274
-msgid "_Delete"
+#: ../lib/advene/gui/edit/transcribe.py:1159
+msgid "Save As"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:275
+#: ../lib/advene/gui/edit/transcribe.py:1160
 #, fuzzy
-msgid "Create"
-msgstr "Arbvido"
+msgid "Import"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/main.py:284
-msgid "P_ackage properties"
-msgstr "Komentaraj attributoj"
+#: ../lib/advene/gui/edit/transcribe.py:1160
+#, fuzzy
+msgid "Import from annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:284
-msgid "Edit package properties"
-msgstr "Redakti komentarajn attributojn"
+#: ../lib/advene/gui/edit/transcribe.py:1161
+msgid "Convert"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:285
-msgid "P_references"
-msgstr "Preferoj"
+#: ../lib/advene/gui/edit/transcribe.py:1161
+#, fuzzy
+msgid "Convert to annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:285
-msgid "Interface preferences"
-msgstr "Interfacaj preferoj"
+#: ../lib/advene/gui/edit/transcribe.py:1163 ../lib/advene/rules/actions.py:670
+#, fuzzy
+msgid "Center"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/main.py:289
-msgid "_Start Web Browser"
+#: ../lib/advene/gui/edit/transcribe.py:1163
+#, fuzzy
+msgid "Center on the current mark"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/gui/edit/transcribe.py:1164
+#, fuzzy
+msgid "Find"
+msgstr "Dosiero"
+
+#: ../lib/advene/gui/edit/transcribe.py:1164
+msgid "Search a string"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:289
-msgid "Start the web browser"
+#: ../lib/advene/gui/edit/transcribe.py:1165
+msgid "Scale"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:291
-msgid "Simplify interface"
+#: ../lib/advene/gui/edit/transcribe.py:1188
+msgid "Automatically scroll to the mark position when playing"
+msgstr ""
+
+#: ../lib/advene/gui/edit/transcribe.py:1190
+msgid "Autoscroll"
+msgstr ""
+
+#: ../lib/advene/gui/edit/transcribe.py:1197
+msgid "Autoinsert"
+msgstr ""
+
+#: ../lib/advene/gui/edit/transcribe.py:1199
+msgid "Automatically insert marks"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:53
+msgid "The webserver requires version 3.0 of CherryPy at least."
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:169
+#, python-format
+msgid ""
+"\n"
+"            <p>\n"
+"            <a href=\"/admin\">Server administration</a> |\n"
+"            <a href=\"/media\">Media control</a> |\n"
+"            <a href=\"%(path)s?mode=raw\">Raw view</a>\n"
+"            </p>\n"
+"            Location: %(locationbar)s\n"
+"            <hr>\n"
+"            "
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:229
+msgid "Unspecified Error"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:230
+#, python-format
+msgid ""
+"\n"
+"        <h1>Error</h1>\n"
+"        <p>An error occurred:</p>\n"
+"        %s\n"
+"        "
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:263
+msgid "<h1>No available mediaplayer</h1>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:266
+#, python-format
+msgid ""
+"\n"
+"            <h1>Current STBV: %(currentstbv)s</h1>\n"
+"\n"
+"            <h1>Player status</h1>\n"
+"            <table border=\"1\">\n"
+"            <tr>\n"
+"            <td>Current media</td><td>%(uri)s</td>\n"
+"            <td>Current position</td><td>%(position)s</td>\n"
+"            <td>Duration</td><td>%(duration)s</td>\n"
+"            <td>Player status</td><td>%(status)s</td>\n"
+"            </tr>\n"
+"            </table>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:291
+#: ../lib/advene/core/webcherry.py:279
 #, fuzzy
-msgid "Simplify the application interface (toggle)"
-msgstr "Vidi komentajxojn sur templinio"
+msgid "No media file"
+msgstr "Elekti ilobretan stilon"
 
-#: ../lib/advene/gui/main.py:292
-msgid "Evaluator"
+#: ../lib/advene/core/webcherry.py:286
+msgid ""
+"\n"
+"            <form action=\"/media/play\" method=\"GET\">\n"
+"            Starting pos: <input type=\"text\" name=\"position\" value="
+"\"0\">\n"
+"            <input type=\"submit\" value=\"Play\">\n"
+"            </form>\n"
+"            <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
+"\">Pause</a><br>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:292
-msgid "Open python evaluator window"
+#: ../lib/advene/core/webcherry.py:293
+msgid ""
+"<hr />\n"
+"            <form action=\"/media/load\" method=\"GET\">\n"
+"            Add a new file (<em>dvd</em> to play a DVD):\n"
+"            <input type=\"text\" name=\"filename\">\n"
+"            <input type=\"submit\" value=\"Add\">\n"
+"            </form>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:293 ../lib/advene/gui/main.py:4022
-msgid "Webserver log"
+#: ../lib/advene/core/webcherry.py:299
+msgid ""
+"<h3><a href=\"/media/snapshot\">Access to current packages snapshots</h3>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:296
-msgid "_Player"
+#: ../lib/advene/core/webcherry.py:308
+#, python-format
+msgid "Unknown STBV identifier: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:297
-msgid "Go to _Time"
+#: ../lib/advene/core/webcherry.py:383
+msgid "Media information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:297
-msgid "Goto a specified time code"
+#: ../lib/advene/core/webcherry.py:396
+msgid "File added"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:298
-msgid "Save _ImageCache"
+#: ../lib/advene/core/webcherry.py:397
+#, python-format
+msgid "<p><strong>%s has been loaded.</strong></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:298
-msgid "Save the contents of the ImageCache to disk"
+#: ../lib/advene/core/webcherry.py:408 ../lib/advene/core/webcherry.py:466
+msgid "Access to packages snapshots"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:299
-msgid "Reset ImageCache"
+#: ../lib/advene/core/webcherry.py:418 ../lib/advene/core/webcherry.py:476
+msgid "Unknown package alias"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:424
+#, python-format
+msgid "Available snapshots for %s"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:430
+#, python-format
+msgid ""
+"<p><a href=\"/media/snapshot/%s?mode=inline\">Display with inline images</"
+"a></p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:437
+msgid "Done"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:439
+msgid "Pending"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:481
+#, fuzzy, python-format
+msgid "Unknown annotation id: %s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/core/webcherry.py:597 ../lib/advene/core/webcherry.py:715
+#, python-format
+msgid "Cannot activate stbvid %(stbvid)s: %(error)s"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:662
+msgid "<p>No GUI is available."
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:664
+#, fuzzy, python-format
+msgid "<p>Opened adhoc views: %s</p>"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/core/webcherry.py:665
+msgid "<p>Available adhoc views:</p><ul>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:686
+#, python-format
+msgid "<p>Current stbv: %s</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:687
+#, python-format
+msgid "<p>You can activate the following STBV:</p><ul>%s</ul>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:689
+msgid "Activate and play"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:695
+msgid "Application information"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:765
+msgid "Missing element id parameter"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:769
+#, python-format
+msgid "No existing element with id %s"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:778
+#, python-format
+msgid "<p>The GUI view %s does not exist.</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:785
+msgid "Invalid request"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:790
+msgid "Invalid configuration variable name"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:802
+msgid "Invalid value"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:806
+#, python-format
+msgid "Unsupported method %s"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:832
+#, python-format
+msgid ""
+"\n"
+"        <h1>Authorized hosts</h1>\n"
+"        <table border=\"1\">\n"
+"        <tr><th>Host</th><th>IP Addr</th><th>Action</th></tr>\n"
+"        %s\n"
+"        </table>\n"
+"        <form method=\"GET\">\n"
+"        Add a new hostname to the list :<br>\n"
+"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
+"\"Add\">\n"
+"        </form>\n"
+"        "
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:846
+msgid "Access control"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:851
+msgid "Access control - add a hostname"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:859 ../lib/advene/core/webcherry.py:873
+#, python-format
+msgid "<strong>Error: %s is an invalid hostname.</strong>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:862
+#, python-format
+msgid "<p>Added %s to authorized hosts list.</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:868
+msgid "Access control - delete a hostname"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:876
+msgid "<strong>Cannot remove the localhost access.</strong>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:881
+#, python-format
+msgid "<p>Removed %s from authorized hosts list.</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:883
+#, python-format
+msgid "<p>%s is not in authorized hosts list.</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:932
+msgid "Server Administration"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:940
+#, python-format
+msgid ""
+"\n"
+"        <p><a href=\"/admin/access\">Update the access list</a></p>\n"
+"        <p><a href=\"/admin/methods\">List available TALES methods</a></p>\n"
+"        <p><a href=\"/action\">List available actions</a></p>\n"
+"        <p><a href=\"/admin/reset\">Reset the server</a></p>\n"
+"        <p><a href=\"/media\">Media control</a></p>\n"
+"        <p><a href=\"/application\">Display GUI status</a></p>\n"
+"        <p><a href=\"/admin/list\">List available files</a></p>\n"
+"        <p><a href=\"/packages\">List loaded packages</a> (%(packagelist)s)</"
+"p>\n"
+"        <p>Display mode : %(displaymode)s</p>\n"
+"        <hr>\n"
+"        <p>Load a package :\n"
+"        <form action=\"/admin/load\" method=\"GET\">\n"
+"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
+"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
+"        <input type=\"submit\" value=\"Load\" />\n"
+"        </form>\n"
+"        </body></html>\n"
+"        "
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:970
+msgid "Available files"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:996
+msgid "You should specify an alias"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1001
+msgid "You should specify an uri"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1007
+#, python-format
+msgid "Package %s loaded"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1008 ../lib/advene/core/webcherry.py:1044
+#, python-format
+msgid ""
+"<p>Go to the <a href=\"/packages/%(alias)s\">%(alias)s</a> package, or to "
+"the <a href=\"/packages\">package list</a>."
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1011
+#, python-format
+msgid "<p>Cannot load package %(alias)s : %(error)s</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1022
+#, python-format
+msgid "Package %s deleted"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1023
+msgid "<p>Go to the <a href=\"/packages\">package list</a>."
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1026
+#, python-format
+msgid "<p>Cannot delete package %(alias)s : %(error)s</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1043
+#, python-format
+msgid "Package %s saved"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1047
+#, python-format
+msgid "<p>Cannot save package %(alias)s : %(error)s</p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1057
+msgid "Server reset"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1063
+msgid "Available TALES methods"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1104
+msgid "Loaded package(s)"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1106
+msgid ""
+"\n"
+"        <h1>Loaded package(s)</h1>\n"
+"        <table border=\"1\" width=\"50%\">\n"
+"        <tr>\n"
+"        <th>Alias</th>\n"
+"        <th>Action</th>\n"
+"        <th>URI</th>\n"
+"        <th>Annotations</th>\n"
+"        </tr>\n"
+"        "
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1118
+#, python-format
+msgid ""
+"<tr>\n"
+"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
+"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
+"%(uri)s\">Reload</a>|<a href=\"/admin/delete?alias=%(alias)s\">Drop</a>|<a "
+"href=\"/admin/save?alias=%(alias)s\">Save</a></td>\n"
+"            <td>%(uri)s</td>\n"
+"            <td>%(size)d</td>\n"
+"            </tr>\n"
+"            "
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1191 ../lib/advene/core/webcherry.py:1267
+#: ../lib/advene/core/webcherry.py:1276 ../lib/advene/core/webcherry.py:1284
+#: ../lib/advene/core/webcherry.py:1444 ../lib/advene/core/webcherry.py:1452
+#: ../lib/advene/core/webcherry.py:1460 ../lib/advene/core/webcherry.py:2022
+#: ../lib/advene/core/webcherry.py:2029
+msgid "Error"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1192
+#, python-format
+msgid "The TALES expression %s is not valid."
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1244
+msgid "Content mode not available on non-content data"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1268 ../lib/advene/core/webcherry.py:1277
+#: ../lib/advene/core/webcherry.py:1285 ../lib/advene/core/webcherry.py:1306
+#: ../lib/advene/core/webcherry.py:1310 ../lib/advene/core/webcherry.py:1445
+#: ../lib/advene/core/webcherry.py:1453 ../lib/advene/core/webcherry.py:1461
+#: ../lib/advene/core/webcherry.py:1520 ../lib/advene/core/webcherry.py:1597
+#: ../lib/advene/core/webcherry.py:1717 ../lib/advene/core/webcherry.py:1767
+msgid "<h1>Error</h1>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1269 ../lib/advene/core/webcherry.py:1311
+#, python-format
+msgid ""
+"<p>There was an error in the template code.</p>\n"
+"                <p>Tag name: <strong>%(tagname)s</strong></p>\n"
+"                <p>Error message: <em>%(message)s</em></p>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1278
+#, python-format
+msgid ""
+"<p>An invalid character is in the Context:</p>\n"
+"                <p>Error message: <em>%(error)s</em></p><pre>%(message)s</"
+"pre>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1286
+#, python-format
+msgid ""
+"<p>There was an error in the TALES expression.</p>\n"
+"                <pre>%s</pre>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1307
+#, python-format
+msgid ""
+"<p>There was an error.</p>\n"
+"                <pre>%s</pre>"
+msgstr ""
+
+#: ../lib/advene/core/webcherry.py:1331
+#, python-format
+msgid ""
+"\n"
+"            <hr>\n"
+"            <p>\n"
+"            Location: %(location)s<br>\n"
+"            <form name=\"navigation\" method=\"GET\">\n"
+"            <a href=\"%(levelup)s\">Up one level</a> |\n"
+"            Next level :\n"
+"            <select name=\"path\" onchange=\"submit()\">\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:299
-msgid "Reset the ImageCache"
+#: ../lib/advene/core/webcherry.py:1349
+msgid ""
+"\n"
+"            </select> View: <select name=\"view\" onchange=\"submit()\">\n"
+"            <option selected></option>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:300
-msgid "_Restart player"
+#: ../lib/advene/core/webcherry.py:1367
+#, python-format
+msgid ""
+"<hr>\n"
+"            <p>Evaluating expression \"<strong>%(expression)s</strong>\" on "
+"package %(uri)s returns %(value)s</p>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:300
-msgid "Restart the player"
+#: ../lib/advene/core/webcherry.py:1403
+#, python-format
+msgid "<p>Package <strong>%s</strong> not loaded</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:302
-#, fuzzy
-msgid "Update annotation screenshots"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:302
-#, fuzzy
-msgid "Update screenshots for annotation bounds"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:303
-msgid "Detect shots"
+#: ../lib/advene/core/webcherry.py:1446
+#, python-format
+msgid ""
+"<p>There was an error in the template code.</p>\n"
+"            <p>Tag name: <strong>%(tagname)s</strong></p>\n"
+"            <p>Error message: <em>%(message)s</em></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:303
-msgid "Automatically detect shots"
+#: ../lib/advene/core/webcherry.py:1454
+#, python-format
+msgid ""
+"<p>There was an error in the expression.</p>\n"
+"            <pre>%s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:304
-#, fuzzy
-msgid "Select the player plugin"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:307
-msgid "No package"
+#: ../lib/advene/core/webcherry.py:1462
+#, python-format
+msgid ""
+"<p>Cannot resolve TALES expression %(expr)s on package %(package)s<p><pre>\n"
+"            %(type)s\n"
+"            %(value)s\n"
+"            %(traceback)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:309
-msgid "_Help"
+#: ../lib/advene/core/webcherry.py:1521 ../lib/advene/core/webcherry.py:1718
+msgid "<p>Cannot set the value : invalid path</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:310
-msgid "Help"
+#: ../lib/advene/core/webcherry.py:1583 ../lib/advene/core/webcherry.py:1836
+#, python-format
+msgid ""
+"<h1>Error</h1><p>When creating resource %(path)s, the resource folder "
+"%(folder)s could not be created.</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:311
-msgid "Get support"
+#: ../lib/advene/core/webcherry.py:1592 ../lib/advene/core/webcherry.py:1846
+msgid "Resource successfuly created/updated"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:312
-msgid "Check for updates"
+#: ../lib/advene/core/webcherry.py:1601
+msgid "Value successfuly updated"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:313
-msgid "Display shortcuts"
+#: ../lib/advene/core/webcherry.py:1603
+#, python-format
+msgid ""
+"Unable to update the attribute %(attribute)s for element %(element)s: "
+"%(error)s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:314
-#, fuzzy
-msgid "Display logfile"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:314
-#, fuzzy
-msgid "Display log file"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/core/webcherry.py:1714
+msgid "<p>Invalid request</p>."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:315
-msgid "Open logfile folder"
+#: ../lib/advene/core/webcherry.py:1778 ../lib/advene/core/webcherry.py:1795
+msgid "Value updated"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:315
+#: ../lib/advene/core/webcherry.py:1779
+#, python-format
 msgid ""
-"Display logfile folder. It can help when sending the advene.log file by e-"
-"mail."
+"\n"
+"                <h1>Value updated</h1>\n"
+"                The value of %(path)s has been updated to\n"
+"                <pre>\n"
+"                %(value)s\n"
+"                </pre>\n"
+"                "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:316
-msgid "_About"
+#: ../lib/advene/core/webcherry.py:1796
+#, python-format
+msgid ""
+"\n"
+"                    <h1>Value updated</h1>\n"
+"                    The value of %(path)s has been updated to\n"
+"                    <pre>\n"
+"                    %(value)s\n"
+"                    </pre>\n"
+"                    "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:336 ../lib/advene/gui/main.py:3750
+#: ../lib/advene/core/webcherry.py:1807
 #, python-format
 msgid ""
-"Cannot load package %(filename)s:\n"
-"%(error)s"
+"Malformed request: cannot update the value of %(attribute)s in %(tales)s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:344
-msgid "Open a package file"
+#: ../lib/advene/core/webcherry.py:1850
+msgid "Cannot create an element in something else than a package."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:345
-msgid "Save the current package"
+#: ../lib/advene/core/webcherry.py:1867
+#, python-format
+msgid "The identifier %s already exists."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:346
-msgid "Save the package with a new name"
+#: ../lib/advene/core/webcherry.py:1879
+#, python-format
+msgid "<p>Error while creating view %(id)s</p><pre>%(error)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:347
-msgid "Select movie file..."
+#: ../lib/advene/core/webcherry.py:1885
+msgid "View created"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:348
-msgid "Select DVD"
+#: ../lib/advene/core/webcherry.py:1886
+#, python-format
+msgid ""
+"\n"
+"                 <h1>View <em>%(id)s</em> created</h1>\n"
+"                 <p>The view <a href=\"%(url)s\">%(id)s</a> was successfully "
+"created.</p>\n"
+"                 "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:352
-#, fuzzy
-msgid "Create a text annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:353
-#, fuzzy
-msgid "Create a graphical annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/core/webcherry.py:1902
+#, python-format
+msgid "Missing %s parameter"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:359
-msgid "List recently opened packages"
+#: ../lib/advene/core/webcherry.py:1905
+#, python-format
+msgid "Relation type %s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:389
-#, fuzzy
-msgid "Snapshotter activity"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/core/webcherry.py:1912 ../lib/advene/core/webcherry.py:1915
+#, fuzzy, python-format
+msgid "Annotation %s does not exist"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:391
+#: ../lib/advene/core/webcherry.py:1918
 #, python-format
-msgid "%d queued requests"
+msgid ""
+"<p>Cannot create relation between %(member1)s and %(member2)s: invalid type</"
+"p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:392
-msgid "Cancel all requests"
+#: ../lib/advene/core/webcherry.py:1930
+#, python-format
+msgid ""
+"<p>Error while creating relation between %(member1)s and %(member2)s :</"
+"p><pre>%(error)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:397
+#: ../lib/advene/core/webcherry.py:1933
 #, fuzzy
-msgid "No snapshotter"
+msgid "Relation created"
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/main.py:419
-msgid "No snapshotting activity"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:423
-#, fuzzy
-msgid "Snapshotting"
+#: ../lib/advene/core/webcherry.py:1934
+#, fuzzy, python-format
+msgid "<h1>Relation <em>%s</em> created</h1>"
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/main.py:440
-#, fuzzy
-msgid "Display application log messages"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:482
-msgid "Quicksearch lists"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:488
-msgid "Please specify the lists of elements to be searched."
-msgstr ""
-
-#: ../lib/advene/gui/main.py:507
+#: ../lib/advene/core/webcherry.py:1944
 #, python-format
-msgid ""
-"Searching on %s.\n"
-"Left click to launch the search, right-click to set the quicksearch options"
+msgid "Annotation type %s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:508
+#: ../lib/advene/core/webcherry.py:1961
 #, python-format
-msgid "String to search in %s"
+msgid ""
+"<p>Error while creating annotation of type %(type)s :<pre>\n"
+"                    %(errortype)s\n"
+"                    %(value)s\n"
+"                    %(traceback)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:521 ../lib/advene/gui/main.py:525
-msgid "Tracing : "
-msgstr ""
+#: ../lib/advene/core/webcherry.py:1973
+#, fuzzy, python-format
+msgid "Annotation %s created"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:521
-msgid "off"
+#: ../lib/advene/core/webcherry.py:1975
+#, python-format
+msgid "Error: Cannot create an object of type %s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:525
-msgid "on"
+#: ../lib/advene/core/webcherry.py:1978
+#, python-format
+msgid ""
+"Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</"
+"code></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:545
-msgid "Launch search"
+#: ../lib/advene/core/webcherry.py:1991
+msgid "Available actions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:550
-msgid "Ignore case"
+#: ../lib/advene/core/webcherry.py:2000
+#, python-format
+msgid "<li>%(name)s: %(value)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:555
-#, fuzzy
-msgid "Searched elements"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/main.py:625
-msgid "Playing"
+#: ../lib/advene/core/webcherry.py:2023
+#, python-format
+msgid "<p>Unknown action</p><pre>Action: %s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:626
-msgid "Pause"
+#: ../lib/advene/core/webcherry.py:2030
+msgid "Missing parameter(s) :<ul>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:627
-msgid "Init"
+#: ../lib/advene/core/webcherry.py:2066
+msgid "Advene web resources"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:629
-msgid "Undefined"
+#: ../lib/advene/core/webcherry.py:2072
+msgid "Advene webserver"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:901
-msgid "Enter the new time value"
+#: ../lib/advene/core/webcherry.py:2073
+#, python-format
+msgid ""
+"<p>Welcome on the <a href=\"http://advene.org/\">Advene</a> webserver run by "
+"%(userid)s on %(serveraddress)s.</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:925
-#, fuzzy, python-format
-msgid "Replace content in %d elements"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:938
-#, fuzzy
-msgid "Find word"
-msgstr "Dosiero"
-
-#: ../lib/advene/gui/main.py:945
-msgid "Replace by"
+#: ../lib/advene/core/webcherry.py:2080
+msgid ""
+" <p>No package is loaded. You can access the <a href=\"/admin\">server "
+"administration page</a>.<p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:973
+#: ../lib/advene/core/webcherry.py:2090
 #, python-format
-msgid "%(search)s has been replaced by %(replace)s in %(count)d element(s)."
-msgstr ""
-
-#: ../lib/advene/gui/main.py:982
-msgid "The video extracting feature is not available."
+msgid ""
+"the <a href=\"/packages/%(alias)s/view/%(view)s\">loaded package's default "
+"view</a>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:985
-#, fuzzy
-msgid "Video export"
-msgstr "Vido"
-
-#: ../lib/advene/gui/main.py:987
+#: ../lib/advene/core/webcherry.py:2092
 #, python-format
-msgid "Exporting video montage/fragment to %%(filename)s"
+msgid "the <a href=\"/packages/%s\">loaded package's data</a>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:989
-#, fuzzy
-msgid "Please choose a destination filename"
-msgstr "Elekti ilobretan stilon"
-
-#: ../lib/advene/gui/main.py:1067
-msgid ""
-"No media association is defined in the package. Please use the 'File/"
-"Associate a video file' menu item to associate a media file."
+#: ../lib/advene/core/webcherry.py:2094
+msgid "the <a href=\"/packages\">loaded packages' data</a>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1069
+#: ../lib/advene/core/webcherry.py:2095
 #, python-format
 msgid ""
-"The associated media %s could not be found. Please use the 'File/Associate a "
-"video file' menu item to associate a media file."
+" <p>You can either access %s or the <a href=\"/admin\">server administration "
+"page</a>.<p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1071
+#: ../lib/advene/core/webcherry.py:2097
 #, python-format
 msgid ""
-"You are now working with the following video:\n"
-"%s"
+"<hr><p align=\"right\"><em>Document generated by <a href=\"http://advene.org/"
+"\">Advene</a> v. %s.</em></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1188
-#, fuzzy
-msgid "Open this view..."
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/main.py:1205
-#, fuzzy
-msgid "_All available views"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:1224
-#, fuzzy
-msgid "Transcription of annotations"
-msgstr "Importi transkribon"
+#: ../lib/advene/core/webcherry.py:2182 ../lib/advene/core/webcherry.py:2191
+#, python-format
+msgid "Cannot start HTTP server: %s"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1227
-msgid "Note-taking editor"
+#: ../lib/advene/core/controller.py:433
+msgid "No available GUI"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1228
-msgid "Active bookmarks"
+#: ../lib/advene/core/controller.py:452
+msgid "No available event handler"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1229
-msgid "Schema editor"
+#: ../lib/advene/core/controller.py:460
+msgid "No available gui"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1233
-msgid "TALES explorer"
+#: ../lib/advene/core/controller.py:476
+#, python-format
+msgid "Warning: redefining an existing feature %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1234
+#: ../lib/advene/core/controller.py:608
 #, fuzzy
-msgid "Dynamic montage"
-msgstr "Importi transkribon"
+msgid "Annotations in current package"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:1238
+#: ../lib/advene/core/controller.py:609
 #, fuzzy
-msgid "Open a comment view in the web browser"
-msgstr "Komentaraj attributoj"
+msgid "Annotations in all packages"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:1239
-#, fuzzy
-msgid "Create or open a comment view"
-msgstr "Arbvido"
+#: ../lib/advene/core/controller.py:611
+msgid "Ids"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1242
+#: ../lib/advene/core/controller.py:803
+#, python-format
 msgid ""
-"Edit window placeholder (annotation and relation edit windows will be put "
-"here)"
+"Cannot start the webserver\n"
+"The following processes seem to use the %(port)s port: %(processes)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1243
-#, fuzzy
-msgid "Display edition history"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/core/controller.py:852 ../lib/advene/core/controller.py:863
+#, python-format
+msgid "Loaded %(uri)s as %(alias)s"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1244
-msgid "Visualise the activity trace preview"
+#: ../lib/advene/core/controller.py:854 ../lib/advene/core/controller.py:866
+#, python-format
+msgid "Cannot load package from file %(uri)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1245
-msgid "Visualise the activity trace as a timeline"
+#: ../lib/advene/core/controller.py:905
+msgid "Deactivating web server"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1274
-msgid "The webserver could not be started. Static views cannot be accessed."
+#: ../lib/advene/core/controller.py:1013
+#, python-format
+msgid "Cannot get audio volume: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1352
+#: ../lib/advene/core/controller.py:1025
 #, python-format
-msgid ""
-"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s has been "
-"released</b> on %(date)s, but you are running version %(current)s.\n"
-"You can download the latest version from the Advene website: http://liris."
-"cnrs.fr/advene/</span>"
+msgid "Cannot open Advene URL %s: the webserver is not running."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1357
-#, fuzzy
-msgid "Go to the website"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/core/controller.py:1284
+#, python-format
+msgid "Found matching video file in moviepath: %s"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1363
-#, fuzzy
-msgid "Advene release"
-msgstr "Advene"
+#: ../lib/advene/core/controller.py:1310 ../lib/advene/core/controller.py:1312
+msgid "Analysis of "
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1369
+#: ../lib/advene/core/controller.py:1536
+msgid "Cannot split the annotation: the given position is outside."
+msgstr ""
+
+#: ../lib/advene/core/controller.py:1785
 #, python-format
-msgid "You are using a up-to-date version of Advene (%(current)s)."
+msgid "Cannot find the template package %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1369
-msgid "Advene is up-to-date"
+#: ../lib/advene/core/controller.py:1832
+#, python-format
+msgid "Cannot read the imported package %(uri)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1383
-#, fuzzy
-msgid "Choose a color"
-msgstr "Elekti ilobretan stilon"
+#: ../lib/advene/core/controller.py:2064
+msgid "Package URI has changed. Reloading package with new URI."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1415
-#, fuzzy
-msgid "Select an annotation to loop on it"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/core/controller.py:2082
+msgid ""
+"Cannot load package: the following annotations do not have Millisecond "
+"fragments:"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1417
+#: ../lib/advene/core/controller.py:2108
 #, python-format
-msgid "Looping on %s"
+msgid "Cannot handle master attribute, the package %s is not imported."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1476 ../lib/advene/gui/main.py:2367
-#, fuzzy
-msgid "No active dynamic view"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/main.py:1487
-#, fuzzy
-msgid "Create a new dynamic view."
-msgstr "Arbvido"
+#: ../lib/advene/core/controller.py:2110
+#, python-format
+msgid "Checking master package %s for not yet imported elements."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1506
+#: ../lib/advene/core/controller.py:2150
 #, fuzzy
-msgid "Edit the current dynamic view."
-msgstr "Arbvido"
+msgid "Standard summary"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/main.py:1518
+#: ../lib/advene/core/controller.py:2155
 #, fuzzy
-msgid "No dynamic view"
-msgstr "Arbvido"
+msgid "Default view"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/main.py:1550
-msgid "Playing rate"
+#: ../lib/advene/core/controller.py:2197
+#, python-format
+msgid ""
+"Infinite loop in STBV %(name)s: the %(imp)s view is invoked multiple times."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1698
-msgid "History"
+#: ../lib/advene/core/controller.py:2283
+msgid "Got exception when stopping player."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1705
-msgid "Popups"
-msgstr ""
+#: ../lib/advene/core/controller.py:2335
+#, fuzzy
+msgid "Video player problem"
+msgstr "Vido"
 
-#: ../lib/advene/gui/main.py:1709
-msgid ""
-"You can drag and drop view icons (timeline, treeview, transcription...) in "
-"notebooks to embed various views."
+#: ../lib/advene/core/controller.py:2362
+msgid "Unable to start the player."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1709
-msgid "Information"
-msgstr ""
+#: ../lib/advene/core/controller.py:2569
+#, fuzzy, python-format
+msgid "Comment on set of %d annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:2004
-msgid "Cannot create annotation. There is no schema to put it in."
-msgstr ""
+#: ../lib/advene/core/controller.py:2571
+#, fuzzy, python-format
+msgid "Comment on %s"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/main.py:2013
-#, fuzzy
-msgid "Default annotation type"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/core/controller.py:2575
+#, python-format
+msgid ""
+"<h1>Comment on %(title)s</h1>\n"
+"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
+"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
+"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
+"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
+"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
+"\"%(imgurl)s\" ></img></a></span>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:2025
-#, fuzzy
-msgid "Annotation created"
+#: ../lib/advene/core/controller.py:2585
+#, fuzzy, python-format
+msgid "List of %s annotations"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:2057
-msgid "Play/Pause [Control-Tab / Control-Space]"
+#: ../lib/advene/core/controller.py:2620
+#, python-format
+msgid "Cannot export to %(filename)s: %(e)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2058
-#, python-format
-msgid "Rewind (%.02f s) [Control-Left]"
+#: ../lib/advene/core/controller.py:2635
+msgid "Error when exporting text template"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2059
-#, python-format
-msgid "Forward (%.02f s) [Control-Right]"
+#: ../lib/advene/core/controller.py:2644
+msgid "Error when exporting XML template"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2060
-msgid "Previous frame [Control-Down]"
+#: ../lib/advene/plugins/featuredetect.py:45
+msgid "Feature detection (face...)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2061
-msgid "Next frame [Control-Up]"
+#: ../lib/advene/plugins/featuredetect.py:60
+msgid "Sensitivity level."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2062
-msgid "Fullscreen"
+#: ../lib/advene/plugins/featuredetect.py:63
+msgid ""
+"Scale. Original image size will be divided by this factor, in order to speed "
+"up detection."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2214
-#, python-format
-msgid "Screenshot saved to %s"
+#: ../lib/advene/plugins/featuredetect.py:66
+msgid "Classifier"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2216
+#: ../lib/advene/plugins/featuredetect.py:80
 #, python-format
-msgid ""
-"Screenshot saved in\n"
-" %s"
+msgid "Feature %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2218
+#: ../lib/advene/plugins/featuredetect.py:82
 #, fuzzy, python-format
-msgid ""
-"Could not save screenshot:\n"
-" %s"
+msgid "Detected %s"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:2226
-msgid "Save screenshot to..."
+#: ../lib/advene/plugins/featuredetect.py:84
+#, fuzzy
+msgid "Detection started"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/plugins/featuredetect.py:175
+#, python-format
+msgid "Detected %(count)d feature(s) until %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2244
-msgid "Could not take snapshot with enough precision"
+#: ../lib/advene/plugins/ted.py:39
+#, fuzzy
+msgid "TED importer"
+msgstr "Importi dosieron"
+
+#: ../lib/advene/plugins/cutter.py:40
+#, fuzzy
+msgid "Audio segmentation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/plugins/cutter.py:55
+msgid "Volume threshold (in dB, can be negative) before trigger."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2282
+#: ../lib/advene/plugins/cutter.py:58
+#: ../lib/advene/plugins/soundenveloppe.py:64
 #, fuzzy
-msgid "Export package data"
-msgstr "Komentaraj attributoj"
+msgid "Channel selection."
+msgstr "Vido"
+
+#: ../lib/advene/plugins/cutter.py:61
+msgid "Length (in ms) of drop below threshold before silence is detected"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:2284
+#: ../lib/advene/plugins/cutter.py:104
 #, fuzzy, python-format
-msgid "Export annotation type %s"
+msgid "Detected %(count)d segments until %(time)s"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:2286
-#, fuzzy, python-format
-msgid "Export element %s"
-msgstr "Arbvido"
+#: ../lib/advene/plugins/cutter.py:122
+#, fuzzy
+msgid "Sound segment"
+msgstr "Dosiero"
 
-#: ../lib/advene/gui/main.py:2312
+#: ../lib/advene/plugins/cutter.py:123
+#, python-format
+msgid ""
+"Sound segmentation with a threshold of %(threshold)d dB - channel: "
+"%(channel)s"
+msgstr ""
+
+#: ../lib/advene/plugins/cutter.py:141
 #, fuzzy
-msgid "Export format"
+msgid "Starting silence detection"
+msgstr "Defauxlta regularo"
+
+#: ../lib/advene/plugins/ttl.py:41
+#, fuzzy
+msgid "TurTLe (RDF) importer"
 msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/main.py:2349
+#: ../lib/advene/plugins/shotdetect.py:38
 #, fuzzy
-msgid " (modified)"
-msgstr "Komentaraj attributoj"
+msgid "Shotdetect XML importer"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/main.py:2352
-#, python-format
-msgid "Activate %s"
+#: ../lib/advene/plugins/shotdetect.py:82
+msgid "No shots"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2523
-msgid "Saved workspace"
+#: ../lib/advene/plugins/pocketsphinx.py:44
+msgid ""
+"Cannot register speech recognition: Pocketsphinx plugins not found. See "
+"http://cmusphinx.sourceforge.net/wiki/gstreamer for details."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2575
-msgid "Restoring workspace..."
+#: ../lib/advene/plugins/pocketsphinx.py:48
+msgid "Speech recognition (PocketSphinx)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2581
-#, python-format
-msgid "Do you wish to restore the %s workspace ?"
+#: ../lib/advene/plugins/pocketsphinx.py:68
+msgid "Filtering noise level [0..1]."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2586
-#, fuzzy
-msgid "Clear the current workspace"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/plugins/pocketsphinx.py:72
+msgid ""
+"Minimum amount (in milliseconds) of silence required to terminate the "
+"current annotation and start a new one. Decreasing this length will result "
+"in a large amount of short annotations and increasing this length will "
+"result in a small amount of long annotations."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:2607
-#, python-format
-msgid "View %s is not an adhoc view"
+#: ../lib/advene/plugins/pocketsphinx.py:76
+msgid "Use default acoustic and language models."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2618
-#, python-format
-msgid "Cannot identify the adhoc view %s"
+#: ../lib/advene/plugins/pocketsphinx.py:80
+msgid "Acoustic model (directory)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2632
-msgid "Choose the annotation type to display as transcription."
+#: ../lib/advene/plugins/pocketsphinx.py:84
+msgid "Phonetic dictionary (.dic file)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2667
-#, python-format
-msgid ""
-"Error: unable to find an edit popup for %(element)s:\n"
-"%(error)s"
+#: ../lib/advene/plugins/pocketsphinx.py:88
+msgid "Language model (.DMP file)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2675
-#, fuzzy, python-format
-msgid "Editing %s"
-msgstr "Importi dosieron"
+#: ../lib/advene/plugins/pocketsphinx.py:107
+#: ../lib/advene/plugins/soundenveloppe.py:88
+#: ../lib/advene/plugins/barcode.py:62
+#, fuzzy
+msgid "Generating annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:2687
+#: ../lib/advene/plugins/pocketsphinx.py:146
+#: ../lib/advene/plugins/barcode.py:87
 #, fuzzy, python-format
-msgid "Comment view (%s)"
-msgstr "Arbvido"
+msgid "%(count)d utterances until %(time)s"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:2754
-#, python-format
-msgid "Package %(uri)s saved: %(annotations)s and %(relations)s."
+#: ../lib/advene/plugins/pocketsphinx.py:155
+msgid "Speech"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2765
-#, python-format
-msgid "Activating package %s"
+#: ../lib/advene/plugins/pocketsphinx.py:157
+msgid "Recognized speech"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2793
-#, python-format
-msgid "Package %(uri)s loaded: %(annotations)s and %(relations)s."
+#: ../lib/advene/plugins/pocketsphinx.py:186
+msgid "Recognizing speech"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2826
-msgid "Do you want to restore the saved workspace ?"
+#: ../lib/advene/plugins/brltty.py:64
+msgid "Input from the braille table."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2833
-msgid "Advene"
-msgstr "Advene"
+#: ../lib/advene/plugins/brltty.py:68
+msgid "BrlTTY not installed. There will be no braille support."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3038
-#, python-format
-msgid "Got exception %s. Trying to continue."
+#: ../lib/advene/plugins/brltty.py:80
+msgid "Could not initialize BrlTTY. No braille support."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3062 ../lib/advene/gui/main.py:3083
-#: ../lib/advene/gui/main.py:4033
+#: ../lib/advene/plugins/brltty.py:86
 #, fuzzy
-msgid "Unknown"
-msgstr "Defauxlta regularo"
+msgid "Display a message in Braille"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/plugins/brltty.py:87
+msgid "Message to display."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3153
+#: ../lib/advene/plugins/brltty.py:258
 #, python-format
-msgid ""
-"The package(s) %s are modified.\n"
-"Save them now?"
+msgid "BrlTTY connection error: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3203
-msgid "Choose an annotation type."
+#: ../lib/advene/plugins/brltty.py:275
+msgid "Braille display: "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3247
-msgid "No annotation type is defined."
+#: ../lib/advene/plugins/brltty.py:281
+msgid "No message"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3256
+#: ../lib/advene/plugins/transcript.py:34
 #, fuzzy
-msgid "Creating a new type."
+msgid "Youtube XML importer"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:3260
+#: ../lib/advene/plugins/transcript.py:71
 #, fuzzy
-msgid "Title of the new type"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Importing transcript"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/main.py:3261
-msgid ""
-"Id of the new type. It is generated from the title, but you may change it if "
-"necessary."
+#: ../lib/advene/plugins/aeidon_import.py:50
+#, fuzzy
+msgid "Aeidon (subtitles) importer"
+msgstr "Importi dosieron"
+
+#: ../lib/advene/plugins/anvil.py:38
+#, fuzzy
+msgid "Anvil importer"
+msgstr "Importi dosieron"
+
+#: ../lib/advene/plugins/fcp.py:35
+msgid "Final Cut Pro XML importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3265
+#: ../lib/advene/plugins/fcp.py:57
+msgid "FCP clipitem"
+msgstr ""
+
+#: ../lib/advene/plugins/fcp.py:77
 #, fuzzy
-msgid "Specify the content-type for the annotation type"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Importing subtitles"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/main.py:3267
+#: ../lib/advene/plugins/fcp.py:92
 #, fuzzy
-msgid "Content type"
-msgstr "Defauxlta regularo"
+msgid "Importing clips"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/main.py:3274 ../lib/advene/gui/main.py:3383
-msgid "Create a new schema"
+#: ../lib/advene/plugins/fcp.py:95
+msgid "No clip"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3287
-msgid "Choose an existing schema for the new type, or create a new one"
+#: ../lib/advene/plugins/hpi.py:43
+msgid "HPI concept extraction"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3290 ../lib/advene/gui/main.py:3398
-msgid "Specify the schema title"
-msgstr ""
+#: ../lib/advene/plugins/hpi.py:109
+#, fuzzy
+msgid "Type of annotation to analyze"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:3294
-msgid "Title of the new schema"
+#: ../lib/advene/plugins/hpi.py:114
+#, fuzzy
+msgid "URL of the webservice"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/plugins/hpi.py:119
+msgid "Minimum confidence level (between 0.0 and 1.0)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3295
-msgid ""
-"Id of the new schema. It is generated from the title, but you may change it "
-"if necessary."
+#: ../lib/advene/plugins/hpi.py:124
+#, fuzzy
+msgid "Use detected position for created annotations"
+msgstr "Importi transkribon"
+
+#: ../lib/advene/plugins/hpi.py:129
+msgid "Split by entity type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3318
-msgid ""
-"You specified a annotation-type identifier that already exists. Aborting."
+#: ../lib/advene/plugins/hpi.py:134
+msgid "Model to be used for detection"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3336
-msgid "You specified a existing schema identifier. Using the existing schema."
+#: ../lib/advene/plugins/hpi.py:139
+msgid "Create relations between the original annotations and the new ones"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3338
-msgid ""
-"You specified an existing identifier that does not reference a schema. "
-"Aborting."
+#: ../lib/advene/plugins/hpi.py:167
+msgid "Cannot connect to VCD server. Check that it is running and accessible."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3365
-msgid "Choose a schema."
+#: ../lib/advene/plugins/hpi.py:179
+#, python-format
+msgid "%d / %d screenshots are missing. Wait for extraction to complete."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3425
-msgid "You specified an existing identifier. Aborting."
+#: ../lib/advene/plugins/hpi.py:196
+#, python-format
+msgid "Concepts for %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3445
+#: ../lib/advene/plugins/hpi.py:264
 #, fuzzy, python-format
-msgid "Package %s modified"
-msgstr "Komentaraj attributoj"
+msgid "Server error: %s"
+msgstr "Vido"
 
-#: ../lib/advene/gui/main.py:3446
-#, python-format
-msgid ""
-"The package %s has been modified but not saved.\n"
-"Save it now?"
+#: ../lib/advene/plugins/hpi.py:264
+msgid "Server transmission error."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3456
+#: ../lib/advene/plugins/hpi.py:272
 #, python-format
-msgid "%s snapshots"
+msgid "Parsing %d results"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3457
+#: ../lib/advene/plugins/hpi.py:289
 #, python-format
-msgid "Do you want to save the snapshots for media %s?"
+msgid "%s concept"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3464 ../lib/advene/gui/main.py:3473
-#: ../lib/advene/gui/main.py:4449
-#, python-format
-msgid "Cannot save imagecache for %(media)s: %(e)s"
-msgstr ""
+#: ../lib/advene/plugins/goodshotdetector.py:45
+#, fuzzy
+msgid "Shot detection (Delakis version)"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/main.py:3487
-msgid "first frame"
+#: ../lib/advene/plugins/goodshotdetector.py:60
+msgid "Cache histogram alongside video files."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3488
-msgid "last frame"
+#: ../lib/advene/plugins/goodshotdetector.py:63
+msgid ""
+"Parameter profile: safe will detect less cuts, aggressive will detect more "
+"cuts (but more false ones too). default is a compromise."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3496
-#, fuzzy, python-format
-msgid "Click on %(bound)s of %(annotation)s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/plugins/goodshotdetector.py:77
+#, python-format
+msgid "Shot (%s profile)"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3499
-#, fuzzy, python-format
-msgid "Update %(bound)s of %(annotation)s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/plugins/goodshotdetector.py:78
+#: ../lib/advene/plugins/shotdetectapp.py:84
+msgid "Detected shots"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3518
-msgid "Click on the frame corresponding to the timestamp value"
+#: ../lib/advene/plugins/goodshotdetector.py:83
+msgid "Loading histogram"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3520
+#: ../lib/advene/plugins/goodshotdetector.py:144
 #, fuzzy
-msgid "Set new timestamp value"
+msgid "Computing hdiff"
 msgstr "Arbvido"
 
-#: ../lib/advene/gui/main.py:3527
-#, fuzzy
-msgid ""
-"<b>Annotation statistics</b>\n"
-"\n"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:3599
-#, fuzzy
-msgid "Text annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:3607 ../lib/advene/gui/main.py:3632
-#, fuzzy
-msgid "Cannot find an appropriate annotation type"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:3625
+#: ../lib/advene/plugins/goodshotdetector.py:151
 #, fuzzy
-msgid "Graphical annotation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:3677
-msgid ""
-"An unsaved template package exists\n"
-"Save it first."
-msgstr ""
+msgid "Detecting cuts"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/main.py:3686
-msgid "Package modified"
+#: ../lib/advene/plugins/goodshotdetector.py:178
+msgid "Detecting dissolves"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3687
-msgid ""
-"The package that you want to close has been modified but not saved.\n"
-"Save it now?"
-msgstr ""
+#: ../lib/advene/plugins/goodshotdetector.py:263
+#, fuzzy
+msgid "Extracting histogram"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/main.py:3718
-msgid "Load a package"
+#: ../lib/advene/plugins/montagerenderer.py:43
+msgid "Cannot register montage renderer: Gnonlin plugins are not present."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3727
-msgid ""
-"A video file was selected. Pretend that the user selected 'Select a video "
-"file'..."
-msgstr ""
+#: ../lib/advene/plugins/transcriber.py:43
+#, fuzzy
+msgid "Transcriber importer"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/main.py:3732
-#, python-format
-msgid ""
-"The file %s does not look like a valid Advene package. It should have a .azp "
-"or .xml extension. Try to open anyway?"
+#: ../lib/advene/plugins/transcriber.py:89
+msgid "Parsing section information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3741
-msgid ""
-"You are trying to load a session file, but there are unsaved packages. "
-"Proceed anyway?"
+#: ../lib/advene/plugins/transcriber.py:257 ../lib/advene/util/importer.py:1541
+msgid "Creating package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3769 ../lib/advene/gui/main.py:3825
+#: ../lib/advene/plugins/transcriber.py:263 ../lib/advene/util/importer.py:1548
 #, fuzzy
-msgid "Do you want to save the current workspace ?"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/main.py:3784 ../lib/advene/gui/main.py:3840
-#, fuzzy, python-format
-msgid "Could not save the package: %s"
+msgid "Creating annotation types"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:3797
-#, python-format
-msgid "Save the package %s"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:3810
-msgid "Invalid file extension"
-msgstr ""
-
-#: ../lib/advene/gui/main.py:3811
-#, python-format
-msgid ""
-"Your package contains resources,\n"
-"the filename (%s) should have a .azp extension.\n"
-"Should I put the correct extension?"
+#: ../lib/advene/plugins/transcriber.py:268 ../lib/advene/util/importer.py:1554
+msgid "Parsing header information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3815
-msgid "OK, the resources will be lost."
+#: ../lib/advene/plugins/transcriber.py:279
+msgid "Parsing topic and speaker tables information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3817
-msgid "Aborting package saving"
+#: ../lib/advene/plugins/tts.py:80
+msgid "Pronounce a text"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3851
-msgid "Save the session in..."
+#: ../lib/advene/plugins/tts.py:81
+msgid "String to pronounce."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3862
-#, python-format
-msgid "Session saved in %s"
+#: ../lib/advene/plugins/tts.py:159
+msgid "TTS disabled. Cannot find the application 'festival' in PATH"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3871
-msgid "Do you confirm the creation of annotations matching the DVD chapters?"
+#: ../lib/advene/plugins/tts.py:161
+msgid "TTS disabled. Cannot find the application 'aplay' in PATH"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3877
-msgid "Cannot import DVD chapters. Did you install the lsdvd software?"
-msgstr ""
+#: ../lib/advene/plugins/soundenveloppe.py:42
+#: ../lib/advene/plugins/soundenveloppe.py:149
+#: ../lib/advene/plugins/soundenveloppe.py:151
+#, fuzzy
+msgid "Sound enveloppe"
+msgstr "Dosiero"
 
-#: ../lib/advene/gui/main.py:3885
-msgid "The associated media is not a DVD."
+#: ../lib/advene/plugins/soundenveloppe.py:58
+msgid "Interval (in ms) at which to take samples."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3896
-#, fuzzy, python-format
-msgid "Processing %s video"
-msgstr "Importi dosieron"
-
-#: ../lib/advene/gui/main.py:3899
-#, fuzzy
-msgid "No associated video file"
-msgstr "Vido"
-
-#: ../lib/advene/gui/main.py:3926
-msgid "Standard RuleSet"
+#: ../lib/advene/plugins/soundenveloppe.py:61
+msgid "Maximum number of samples per annotation."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4042
+#: ../lib/advene/plugins/soundenveloppe.py:121
 #, python-format
-msgid ""
-"Player not active - cached duration   : %(duration)s (%(durationms)d ms)"
+msgid "At %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4054
-msgid ""
-"GNU General Public License v. 2\n"
-"See http://www.gnu.org/copyleft/gpl.html for more details"
-msgstr ""
+#: ../lib/advene/plugins/soundenveloppe.py:168
+#, fuzzy
+msgid "Extracting sound enveloppe"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/main.py:4056
-msgid "Visit the Advene web site for examples and documentation."
+#: ../lib/advene/plugins/barcode.py:39
+msgid "Cannot register barcode extraction: zbar plugin not found."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4089 ../lib/advene/gui/main.py:4177
-msgid "Select a movie file"
+#: ../lib/advene/plugins/barcode.py:43
+msgid "Barcode (qr-code) extraction"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4101
-msgid "Title/Chapter selection"
+#: ../lib/advene/plugins/barcode.py:99
+msgid "Barcode"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4143
-msgid "Select a video stream"
+#: ../lib/advene/plugins/barcode.py:101
+msgid "Extracted barcode information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4144
-msgid "Enter the address of a video stream"
-msgstr ""
+#: ../lib/advene/plugins/barcode.py:119
+#, fuzzy
+msgid "Extraction barcodes"
+msgstr "Importi dosieron"
+
+#: ../lib/advene/plugins/dcp.py:67
+#, fuzzy
+msgid "DCP importer"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/main.py:4148
+#: ../lib/advene/plugins/dcp.py:122
 #, python-format
-msgid "Successfully extracted the video stream address (%s) from the url.\n"
+msgid "Converting #%(num)d / %(count)d"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4173
-msgid "Package properties"
-msgstr ""
+#: ../lib/advene/plugins/annotationgraph.py:43
+#, fuzzy
+msgid "AnnotationGraph importer"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:4174
-msgid "Author name"
+#: ../lib/advene/plugins/shotdetectapp.py:45
+#, fuzzy
+msgid "ShotdetectApp importer"
+msgstr "Importi dosieron"
+
+#: ../lib/advene/plugins/shotdetectapp.py:56
+msgid ""
+"Sensitivity of the algorithm. It should typically be between 50 and 80. If "
+"too many shots are detected, try to increase its value."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4175
+#: ../lib/advene/plugins/shotdetectapp.py:139
+#, fuzzy, python-format
+msgid "Detected shot #%(num)d at %(pos)s "
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/plugins/mpeg7.py:57
 #, fuzzy
-msgid "Package creation date"
-msgstr "Komentaraj attributoj"
+msgid "MPEG7 importer"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/main.py:4176
+#: ../lib/advene/plugins/cinelab.py:76
 #, fuzzy
-msgid "Package title"
-msgstr "Komentaraj attributoj"
+msgid "Cinelab importer"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/main.py:4177
-msgid "Associated media"
+#: ../lib/advene/plugins/cinelab.py:114 ../lib/advene/plugins/cinelab.py:116
+#, python-format
+msgid "File %s is not an Advene2 zip package."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4178
-msgid "Media duration in ms"
-msgstr ""
+#: ../lib/advene/plugins/cinelab.py:171
+#, fuzzy
+msgid "Converting annotation types"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:4237
-msgid "Paths"
-msgstr ""
+#: ../lib/advene/plugins/cinelab.py:212
+#, fuzzy
+msgid "Converting views"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:4239
-msgid "Data"
-msgstr ""
+#: ../lib/advene/plugins/cinelab.py:244
+#, fuzzy
+msgid "Importing annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:4239
-msgid "Standard directory for data files"
+#: ../lib/advene/plugins/owl_import.py:43
+#, fuzzy
+msgid "OWL (schema) importer"
+msgstr "Importi dosieron"
+
+#: ../lib/advene/plugins/owl_import.py:62 ../lib/advene/util/importer.py:398
+#, python-format
+msgid "Converted from %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4240
-msgid "Movie path"
+#: ../lib/advene/player/gstreamer.py:344
+msgid "Problem when seeking into media"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4240
-#, python-format
-msgid ""
-"List of directories (separated by %s) to search for movie files (_ means "
-"package directory)"
+#: ../lib/advene/player/gstreamer.py:385
+msgid "Cannot capture full-resolution snapshot, another capture is ongoing."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4241
-msgid "Imagecache"
+#: ../lib/advene/rules/actions.py:39 ../lib/advene/rules/actions.py:104
+#: ../lib/advene/rules/actions.py:122
+msgid "Message to display"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4241
-msgid "Directory for storing the snapshot cache"
+#: ../lib/advene/rules/actions.py:50
+msgid "Start the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4242
-msgid "Player"
+#: ../lib/advene/rules/actions.py:51
+msgid "Start position (in ms)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4242
-msgid "Directory of the video player"
+#: ../lib/advene/rules/actions.py:54 ../lib/advene/rules/actions.py:380
+msgid "The movie start"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4243
+#: ../lib/advene/rules/actions.py:55 ../lib/advene/rules/actions.py:381
 #, fuzzy
-msgid "Shotdetect"
-msgstr "Importi dosieron"
+msgid "The annotation begin"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/main.py:4243
+#: ../lib/advene/rules/actions.py:56 ../lib/advene/rules/actions.py:382
 #, fuzzy
-msgid "Shotdetect application"
-msgstr "Importi dosieron"
-
-#: ../lib/advene/gui/main.py:4245
-msgid "GUI"
-msgstr ""
+msgid "The annotation end"
+msgstr "Vidi komentajxojn sur templinio"
 
-#: ../lib/advene/gui/main.py:4246
-msgid "Interface language (after restart)"
+#: ../lib/advene/rules/actions.py:66
+msgid "Goto position (in ms)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4246
-msgid ""
-"Language used for the interface (necessitates to restart the application)"
+#: ../lib/advene/rules/actions.py:75
+msgid "Stop the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4252
-msgid "Record activity trace"
+#: ../lib/advene/rules/actions.py:82
+msgid "Pause the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4253
-msgid "Expert mode"
+#: ../lib/advene/rules/actions.py:89
+msgid "Resume the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4253
-msgid "Offer advanced possibilities"
+#: ../lib/advene/rules/actions.py:96
+msgid "Take a snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4254
-msgid "Prefer WYSIWYG"
+#: ../lib/advene/rules/actions.py:103
+msgid "Display a caption"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4254
-msgid "Use WYSIWYG editors when possible (HTML, SVG)"
+#: ../lib/advene/rules/actions.py:105
+msgid "Duration of the caption"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4255
-msgid "Player control in edit popups"
-msgstr ""
+#: ../lib/advene/rules/actions.py:133
+#, fuzzy
+msgid "Display a graphical shape"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:4255
-msgid ""
-"Enable generic player controls in edit windows. This may be undesirable "
-"since it overloads some standard text-edition behaviours (esp. control-left/"
-"right)."
+#: ../lib/advene/rules/actions.py:134
+msgid "Shape (square, circle, triangle)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4257
-msgid "Open popups"
+#: ../lib/advene/rules/actions.py:136
+msgid "x-position (percentage of screen)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4258
-msgid "Where should we open adhoc views?"
+#: ../lib/advene/rules/actions.py:137
+msgid "y-position (percentage of screen)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4259
-msgid "as a popup window"
+#: ../lib/advene/rules/actions.py:138
+msgid "Size (arbitrary units)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4260
-msgid "embedded east of the video"
+#: ../lib/advene/rules/actions.py:139
+msgid "Duration of the display in ms"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4261
-msgid "embedded west of the video"
+#: ../lib/advene/rules/actions.py:147
+msgid "A square"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4262
-msgid "embedded south of the video"
+#: ../lib/advene/rules/actions.py:148
+msgid "A circle"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4263
-msgid "embedded at the right of the window"
+#: ../lib/advene/rules/actions.py:149
+msgid "A triangle"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4266
-msgid "History size"
+#: ../lib/advene/rules/actions.py:152
+msgid "White"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4266
-msgid "History filelist size limit"
+#: ../lib/advene/rules/actions.py:153
+msgid "Black"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4268
-msgid "Remember window size"
+#: ../lib/advene/rules/actions.py:154
+msgid "Red"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4268
-msgid "Remember the size of opened windows"
+#: ../lib/advene/rules/actions.py:155
+msgid "Green"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4269
-msgid "Bookmark snapshot width"
+#: ../lib/advene/rules/actions.py:156
+msgid "Blue"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4269
-msgid "Width of the snapshots representing bookmarks"
+#: ../lib/advene/rules/actions.py:157
+msgid "Yellow"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4270
-msgid "Bookmark snapshot precision"
+#: ../lib/advene/rules/actions.py:160
+msgid "At the top of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4270
-msgid "Precision (in ms) of the displayed bookmark snapshots."
+#: ../lib/advene/rules/actions.py:161 ../lib/advene/rules/actions.py:166
+msgid "In the middle of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4272
-msgid "General"
+#: ../lib/advene/rules/actions.py:162
+msgid "At the bottom of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4273
-msgid "Weekly update check"
+#: ../lib/advene/rules/actions.py:165
+msgid "At the left of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4274
-msgid "On exit,"
+#: ../lib/advene/rules/actions.py:183
+msgid "Zero the volume during the annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4275
-msgid "How to handle screenshots on exit"
+#: ../lib/advene/rules/actions.py:190
+msgid "Zero the volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4276
-msgid "never save screenshots"
+#: ../lib/advene/rules/actions.py:197
+msgid "Restore the volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4277
-msgid "always save screenshots"
+#: ../lib/advene/rules/actions.py:205
+msgid "Activate a STBV"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4278
-msgid "ask before saving screenshots"
+#: ../lib/advene/rules/actions.py:206
+msgid "STBV id"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4280
-msgid "Auto-save"
+#: ../lib/advene/rules/actions.py:215
+msgid "Send a user event"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4281
-msgid "Data auto-save functionality"
+#: ../lib/advene/rules/actions.py:216
+msgid "Identifier"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4282
-msgid "is desactivated"
+#: ../lib/advene/rules/actions.py:217
+msgid "Delay in ms before sending the event."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4283
-msgid "is done automatically"
+#: ../lib/advene/rules/actions.py:227
+msgid "Open a URL in the web browser"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4284
-msgid "is done after confirmation"
-msgstr ""
+#: ../lib/advene/rules/actions.py:237
+#, fuzzy
+msgid "Open a static view"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/main.py:4286
-msgid "Auto-save interval (in s)"
+#: ../lib/advene/rules/actions.py:248
+msgid "Set the audio volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4286
-msgid "Interval (in seconds) between package auto-saves"
+#: ../lib/advene/rules/actions.py:249
+msgid "Volume level (from 0 to 100)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4288
-#, fuzzy
-msgid "Workspace"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/main.py:4290
-msgid "On package saving,"
+#: ../lib/advene/rules/actions.py:258
+msgid "Set the playing rate"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4291
-msgid "Do you wish to save the default workspace with the package?"
+#: ../lib/advene/rules/actions.py:259
+msgid "Rate (100: normal rate, 200: twice slower)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4292
-#, fuzzy
-msgid "never save the current workspace"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/main.py:4293
-#, fuzzy
-msgid "always save the current workspace"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/main.py:4294
-#, fuzzy
-msgid "ask before saving the current workspace"
-msgstr "Defauxlta regularo"
-
-#: ../lib/advene/gui/main.py:4296
-msgid "Auto-validation of edited elements"
+#: ../lib/advene/rules/actions.py:268
+msgid "Play a sound resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4296
-msgid "Automatically validate modified elements when saving the package."
+#: ../lib/advene/rules/actions.py:269
+msgid "Clip id"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4298
-msgid "On package load,"
+#: ../lib/advene/rules/actions.py:270 ../lib/advene/rules/actions.py:284
+msgid "Volume (0..100)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4299
-msgid "Do you wish to load the workspace saved with the package?"
+#: ../lib/advene/rules/actions.py:271 ../lib/advene/rules/actions.py:285
+msgid "Left-right balance: -1 -> full left, 0 -> center, 1 -> full right"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4300
+#: ../lib/advene/rules/actions.py:282
 #, fuzzy
-msgid "never load the saved workspace"
-msgstr "Defauxlta regularo"
+msgid "Play a sound file"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:4301
+#: ../lib/advene/rules/actions.py:283
 #, fuzzy
-msgid "always load the saved workspace"
-msgstr "Defauxlta regularo"
+msgid "Sound filename"
+msgstr "Dosiero"
 
-#: ../lib/advene/gui/main.py:4302
+#: ../lib/advene/rules/actions.py:295
 #, fuzzy
-msgid "ask before loading the saved workspace"
-msgstr "Defauxlta regularo"
+msgid "Set a state variable"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/main.py:4305
+#: ../lib/advene/rules/actions.py:296 ../lib/advene/rules/actions.py:308
+msgid "State variable name"
+msgstr ""
+
+#: ../lib/advene/rules/actions.py:297
 #, fuzzy
-msgid "Video Player"
-msgstr "Vido"
+msgid "State value"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/main.py:4306
-msgid "Autostart"
+#: ../lib/advene/rules/actions.py:307
+msgid "Increment a state variable"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4306
-msgid ""
-"Automatically start the player when loading a media file (either directly or "
-"through a package)"
+#: ../lib/advene/rules/actions.py:317
+msgid "Clear all state variables"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4307
-#, fuzzy
-msgid "Fulscreen timestamp"
-msgstr "Arbvido"
+#: ../lib/advene/rules/actions.py:332
+#, python-format
+msgid "Error in the evaluation of the parameter %s:"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4307
-msgid "Display the timestamp over the video when in fullscreen mode"
+#: ../lib/advene/rules/actions.py:537
+#, python-format
+msgid "Cannot find the stbv %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4308
-#, fuzzy
-msgid "Enable captions"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/rules/actions.py:633
+msgid "The set_rate method is unavailable."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4308
-#, fuzzy
-msgid "Enable captions over the video"
-msgstr "Vidi komentajxojn sur templinio"
+#: ../lib/advene/rules/actions.py:643
+msgid "No 'soundclips' resource folder in the package"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4309
-#, fuzzy
-msgid "Caption font"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/rules/actions.py:668
+msgid "Full volume"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4309
-msgid "TrueType font for captions"
+#: ../lib/advene/rules/actions.py:669
+msgid "Left"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4310
-msgid "Enable SVG"
+#: ../lib/advene/rules/actions.py:671
+msgid "Right"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4310
-msgid "Enable SVG captions over the video"
+#: ../lib/advene/rules/importer.py:29
+msgid "Event history importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4312
-msgid "Enable snapshots"
+#: ../lib/advene/rules/elements.py:144
+msgid "is equal to"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4313
-msgid "Snapshot width"
+#: ../lib/advene/rules/elements.py:145
+msgid "is different from"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4313
-msgid "Snapshot width in pixels."
+#: ../lib/advene/rules/elements.py:146
+msgid "contains"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4314
-msgid "Verbosity"
+#: ../lib/advene/rules/elements.py:147
+msgid "is greater than"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4314
-msgid "Verbosity level. -1 for no messages."
+#: ../lib/advene/rules/elements.py:148
+msgid "is lower than"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4317
-msgid "Devices"
+#: ../lib/advene/rules/elements.py:149
+msgid "matches the regexp"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4319
-msgid "Standard"
+#: ../lib/advene/rules/elements.py:150
+msgid "is before"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4321
-msgid "DVD drive"
+#: ../lib/advene/rules/elements.py:151
+msgid "meets"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4321
-msgid "Drive letter for the DVD"
+#: ../lib/advene/rules/elements.py:152
+msgid "overlaps"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4322
-msgid "GDI"
+#: ../lib/advene/rules/elements.py:153
+msgid "during"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4323
-msgid "Direct X"
+#: ../lib/advene/rules/elements.py:154
+msgid "starts"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4325
-msgid "DVD device"
+#: ../lib/advene/rules/elements.py:155
+msgid "finishes"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4325
-msgid "Device for the DVD"
+#: ../lib/advene/rules/elements.py:160
+msgid "is not true"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4326
-msgid "X11"
+#: ../lib/advene/rules/elements.py:161
+msgid "is true"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4327
-#, fuzzy
-msgid "XVideo"
-msgstr "Vido"
+#: ../lib/advene/rules/elements.py:165
+msgid "Basic conditions"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4328
-msgid "GL"
+#: ../lib/advene/rules/elements.py:166
+msgid "Allen relations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4330
-msgid "Video output"
+#: ../lib/advene/rules/elements.py:229 ../lib/advene/rules/elements.py:235
+msgid "Unknown type for overlaps comparison"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4330
-msgid "Video output module"
+#: ../lib/advene/rules/elements.py:243 ../lib/advene/rules/elements.py:249
+msgid "Unknown type for during comparison"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4332
-#, fuzzy
-msgid "Recorder options"
+#: ../lib/advene/rules/elements.py:518 ../lib/advene/rules/elements.py:524
+#, fuzzy, python-format
+msgid "Unknown action %s"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:4333
+#: ../lib/advene/rules/elements.py:525
+#, python-format
+msgid "Unknown parameter %s"
+msgstr ""
+
+#: ../lib/advene/rules/elements.py:530
 #, fuzzy
-msgid "Audio input"
-msgstr "Vido"
+msgid "Unknown actions"
+msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/main.py:4333
-msgid "Device name for audio input (with gstrecorder plugin)"
+#: ../lib/advene/rules/elements.py:982
+msgid "Start of the editing of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4334
-msgid "Record video"
+#: ../lib/advene/rules/elements.py:983
+msgid "Cancel of the editing of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4334
-msgid "Record both video and audio"
+#: ../lib/advene/rules/elements.py:984
+msgid "Destruction of the edit window of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4337
-msgid "<i>Experimental</i>"
+#: ../lib/advene/rules/elements.py:985
+msgid "Validation of the editing of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4338
-msgid "Embed the caption scroller below the video"
+#: ../lib/advene/rules/elements.py:986
+msgid "Ending editing of a package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4339
-msgid "Embed the caption view below the video"
+#: ../lib/advene/rules/elements.py:987
+msgid "Beginning of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4341
-msgid "Time-related"
+#: ../lib/advene/rules/elements.py:988
+msgid "End of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4342
-#, fuzzy
-msgid "Time format"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/main.py:4342
-msgid "Format used to display timecodes"
+#: ../lib/advene/rules/elements.py:989
+msgid "Creation of a new annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4356
-#, fuzzy
-msgid "Default FPS"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/rules/elements.py:990
+msgid "Ending editing of an annotation"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4357
-msgid ""
-"Default FPS (frame-per-second) value, when entering or displaying timestamps "
-"with frame numbers."
+#: ../lib/advene/rules/elements.py:991
+msgid "Suppression of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4358
-#, fuzzy
-msgid "Time increment"
-msgstr "Arbvido"
+#: ../lib/advene/rules/elements.py:992
+msgid "Activation of an annotation"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4358
-msgid ""
-"Skip duration, when using control-left/right or forward/rewind buttons (in "
-"ms)."
+#: ../lib/advene/rules/elements.py:993
+msgid "Deactivation of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4359
+#: ../lib/advene/rules/elements.py:994
 #, fuzzy
-msgid "Second time increment"
-msgstr "Arbvido"
+msgid "Merging of two annotations"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:4359
-msgid "Skip duration, when using control-shift-left/right (in ms)."
+#: ../lib/advene/rules/elements.py:995
+#, fuzzy
+msgid "Moving an annotation"
+msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#: ../lib/advene/rules/elements.py:996
+msgid "Activation of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4360
-#, fuzzy
-msgid "Third time increment"
-msgstr "Arbvido"
+#: ../lib/advene/rules/elements.py:997
+msgid "Deactivation of a relation"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4360
-msgid "Skip duration, when using control-shift-up/down (in ms)."
+#: ../lib/advene/rules/elements.py:998
+msgid "Creation of a new relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4361
-msgid "Custom Up/Down"
+#: ../lib/advene/rules/elements.py:999
+msgid "Ending editing of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4361
-msgid ""
-"Use third time increment for up/down navigation without having to hold shift."
+#: ../lib/advene/rules/elements.py:1000
+msgid "Suppression of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4363
-msgid "Scroll increment"
+#: ../lib/advene/rules/elements.py:1001
+msgid "Creation of a new view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4363
-msgid ""
-"On most annotations, control+scrollwheel will increment/decrement their "
-"bounds by this value (in ms)."
+#: ../lib/advene/rules/elements.py:1002
+msgid "Ending editing of a view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4364
-msgid "Second scroll increment"
+#: ../lib/advene/rules/elements.py:1003
+msgid "Suppression of a view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4364
-msgid ""
-"On most annotations, control+shift+scrollwheel will increment/decrement "
-"their bounds by this value (in ms)."
+#: ../lib/advene/rules/elements.py:1004
+msgid "Creation of a new query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4366
-msgid "Player sync"
+#: ../lib/advene/rules/elements.py:1005
+msgid "Ending editing of a query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4366
-msgid ""
-"Interval (in ms) with which we synchronize slave players. Setting a too-low "
-"value could render the application unusable. Use 0 to disable continuous "
-"synchronization."
+#: ../lib/advene/rules/elements.py:1006
+msgid "Suppression of a query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4367
-msgid "Timeline parameters"
+#: ../lib/advene/rules/elements.py:1007
+msgid "Creation of a new schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4368
-msgid "Font size for annotation widgets"
+#: ../lib/advene/rules/elements.py:1008
+msgid "Ending editing of a schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4369
-msgid "Button height"
+#: ../lib/advene/rules/elements.py:1009
+msgid "Suppression of a schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4369
-#, fuzzy
-msgid "Height of annotation widgets"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/rules/elements.py:1011
+msgid "Ending editing an annotation type"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4370
-msgid "Interline height"
+#: ../lib/advene/rules/elements.py:1012
+msgid "Suppression of an annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4370
-msgid "Height of interlines"
+#: ../lib/advene/rules/elements.py:1013
+msgid "Creation of a new relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4372
-#, fuzzy
-msgid "Text content"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/rules/elements.py:1014
+msgid "Ending editing a relation type"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4373
-#, fuzzy
-msgid "Completion mode"
-msgstr "Arbvido"
+#: ../lib/advene/rules/elements.py:1015
+msgid "Suppression of a relation type"
+msgstr ""
+
+#: ../lib/advene/rules/elements.py:1016
+msgid "Creation of a new resource"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4373
-#, fuzzy
-msgid "Enable dynamic completion mode"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/rules/elements.py:1017
+msgid "Ending editing of a resource"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4374
-msgid "Abbreviation mode"
+#: ../lib/advene/rules/elements.py:1018
+msgid "Suppression of a resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4374
+#: ../lib/advene/rules/elements.py:1019
 #, fuzzy
-msgid "Enable abbreviation mode"
-msgstr "Defauxlta regularo"
+msgid "Modification of the tag"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:4375
-#, fuzzy
-msgid "Abbreviations"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/rules/elements.py:1020
+msgid "Activating a link"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4375
-msgid ""
-"Text abbreviations. 1 entry per line. Each line consists of the abbreviation "
-"followed by its replacement."
+#: ../lib/advene/rules/elements.py:1021
+msgid "Player start"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4377
-msgid "Text-To-Speech"
+#: ../lib/advene/rules/elements.py:1022
+msgid "Player stop"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4378
-#, fuzzy
-msgid "TTS language"
-msgstr "Interfacaj preferoj"
+#: ../lib/advene/rules/elements.py:1023
+msgid "Player pause"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4379
-msgid "What language settings should be used for text-to-speech"
+#: ../lib/advene/rules/elements.py:1024
+msgid "Player resume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4380
-msgid "English"
+#: ../lib/advene/rules/elements.py:1025
+msgid "Going to a given position"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4381
-msgid "French"
+#: ../lib/advene/rules/elements.py:1026
+msgid "Loading a new package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4382
-msgid "Spanish"
+#: ../lib/advene/rules/elements.py:1027
+msgid "Activating a package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4384
-msgid "TTS Encoding"
+#: ../lib/advene/rules/elements.py:1028
+msgid "Saving the package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4385
-msgid "What encoding should be used to communicate with the TTS engine"
+#: ../lib/advene/rules/elements.py:1029
+msgid "Start of the dynamic view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4386
+#: ../lib/advene/rules/elements.py:1030
 #, fuzzy
-msgid "TTS Engine"
-msgstr "Interfacaj preferoj"
+msgid "End of the dynamic view"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/main.py:4387
-msgid ""
-"Which TTS engine should be used (modification requires restarting Advene to "
-"take into account)"
+#: ../lib/advene/rules/elements.py:1031
+msgid "Start of the application"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4388
-msgid "Automatic"
+#: ../lib/advene/rules/elements.py:1032
+msgid "End of the application"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4389
-msgid "eSpeak"
+#: ../lib/advene/rules/elements.py:1033
+msgid "User-defined event"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4390
-msgid "Custom script with standard input"
+#: ../lib/advene/rules/elements.py:1034
+msgid "Modification of the associated media"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4391
-msgid "Custom script with arguments"
-msgstr ""
+#: ../lib/advene/rules/elements.py:1035
+#, fuzzy
+msgid "Highlight a bookmark"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:4392
-msgid "SAPI"
-msgstr ""
+#: ../lib/advene/rules/elements.py:1036
+#, fuzzy
+msgid "Unhighlight a bookmark"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/main.py:4393
-msgid "MacOS X say"
+#: ../lib/advene/rules/elements.py:1037
+msgid "Updating duration of the movie"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4394
-msgid "Generic (text output)"
+#: ../lib/advene/rules/elements.py:1038
+msgid "Displaying a popup"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4438
-msgid "You should restart Advene to take some options into account."
+#: ../lib/advene/rules/elements.py:1039
+msgid "Updating a snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4447
-#, python-format
-msgid "Imagecache saved to %s"
+#: ../lib/advene/rules/elements.py:1077
+msgid "Player control"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4460
-msgid "Restarting player..."
+#: ../lib/advene/rules/elements.py:1078
+msgid "Audio enrichment"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4512
+#: ../lib/advene/rules/elements.py:1079
 #, fuzzy
-msgid "Advene log"
-msgstr "Advene"
+msgid "Image enrichment"
+msgstr "Arbvido"
 
-#: ../lib/advene/gui/main.py:4581
-#, fuzzy
-msgid "Select the package to merge"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/rules/elements.py:1080
+msgid "External display control"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4602
-msgid "Saving workspace"
+#: ../lib/advene/rules/elements.py:1081
+msgid "Popup"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4605
-msgid "Enter a view name to save the workspace"
+#: ../lib/advene/rules/elements.py:1083
+#, fuzzy
+msgid "State"
+msgstr "Arbvido"
+
+#: ../lib/advene/rules/elements.py:1084
+msgid "GUI actions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4606
+#: ../lib/advene/rules/elements.py:1085
 #, fuzzy
-msgid "Default workspace"
+msgid "Expert"
 msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/main.py:4607
-msgid "Open this workspace when opening the package"
+#: ../lib/advene/util/helper.py:409
+msgid "Annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4641
-#, python-format
-msgid "Error: the view %s exists and is not a workspace view."
+#: ../lib/advene/util/helper.py:410
+msgid "Relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4672
-#, fuzzy, python-format
-msgid "Cannot save default workspace: %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:4682
-msgid "Standard workspace has been saved"
+#: ../lib/advene/util/helper.py:416
+msgid "Resource Folder"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4689
-msgid "Website export"
+#: ../lib/advene/util/helper.py:452
+msgid "---- Elements ----"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4690
-msgid "Exporting views to a website"
+#: ../lib/advene/util/helper.py:458
+msgid "---- Attributes ----"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4693
-msgid "Output directory"
+#: ../lib/advene/util/helper.py:461
+msgid "---- Methods ----"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4702
-msgid "Specify the output directory"
+#: ../lib/advene/util/helper.py:534
+#, python-format
+msgid "Cannot read %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4711
-msgid "Maximum recursion depth"
+#: ../lib/advene/util/helper.py:541
+#, python-format
+msgid "File %s is not an Advene zip package - no mimetype."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4718
-#, fuzzy
-msgid "Video URL"
-msgstr "Vido"
+#: ../lib/advene/util/helper.py:543
+#, python-format
+msgid "File %(fname)s is not an Advene zip package - wrong mimetype %(type)s."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4720
+#: ../lib/advene/util/helper.py:559
+#, python-format
 msgid ""
-"URL for the video, if it is available on a sharing website (Only Youtube for "
-"the moment).\n"
-" It can also be a h264/ogg file, which will in this case be handled by the "
-"HTML5 video player."
+"Error:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4770
-#, fuzzy
-msgid "Could not export data: "
-msgstr "Krei komentajxojn de DVD cxapitroj"
-
-#: ../lib/advene/gui/main.py:4772
-#, fuzzy, python-format
-msgid "Website export to %s completed"
-msgstr "Importi dosieron"
+#: ../lib/advene/util/helper.py:641
+msgid "schema"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4811
-msgid "This video player is not able to grab specific screenshots"
+#: ../lib/advene/util/helper.py:641
+msgid "schemas"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4821
-#, fuzzy, python-format
-msgid "Updating %d snapshots"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/util/helper.py:642
+msgid "annotation"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4826
-msgid "No snapshot to update"
+#: ../lib/advene/util/helper.py:642
+msgid "annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4835 ../lib/advene/gui/main.py:4947
-msgid "You first must load a movie into Advene"
+#: ../lib/advene/util/helper.py:643 ../lib/advene/util/helper.py:644
+msgid "annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4838 ../lib/advene/gui/main.py:4950
-#, fuzzy, python-format
-msgid "The movie %s does not seem to exist."
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/util/helper.py:643 ../lib/advene/util/helper.py:644
+msgid "annotation types"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4895
-msgid "Generating screenshots"
+#: ../lib/advene/util/helper.py:645
+msgid "relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4900
-msgid ""
-"<b>Screenshot generation</b>\n"
-"\n"
-"Screenshots will be captured approximately every 500ms.\n"
-"\n"
-"If the movie was paused or playing, the capture will begin at the current "
-"position. Else, it will begin at the beginning of the movie.\n"
-"Note that the main interface will not be refreshed as long as this window is "
-"open."
+#: ../lib/advene/util/helper.py:645
+msgid "relations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4941
-msgid ""
-"The <b>shotdetect</b> application does not seem to be installed. Please "
-"check that it is present and that its path is correctly specified in "
-"preferences."
+#: ../lib/advene/util/helper.py:646 ../lib/advene/util/helper.py:647
+msgid "relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4981
-msgid ""
-"Cannot import shotdetect output. Did you install the shotdetect software?"
+#: ../lib/advene/util/helper.py:646 ../lib/advene/util/helper.py:647
+msgid "relation types"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4998
-msgid "Incomplete shots"
+#: ../lib/advene/util/helper.py:648
+msgid "query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5001
-#, python-format
-msgid "Detected %s shots"
+#: ../lib/advene/util/helper.py:648
+msgid "queries"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5103
-#, fuzzy, python-format
-msgid "Could not run shotdetect: %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/util/helper.py:649
+msgid "view"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:5107
-#, python-format
-msgid "Detecting shots from %s"
+#: ../lib/advene/util/helper.py:649
+msgid "views"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5160
-#, fuzzy
-msgid "Shot detection"
-msgstr "Importi dosieron"
+#: ../lib/advene/util/helper.py:650
+msgid "package"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:5166
-msgid ""
-"<b>Shot detection</b>\n"
-"\n"
-"Advene will try to detect shots from the currently loaded movie. The "
-"threshold parameter is used to specify the sensitivity of the algorithm, and "
-"should typically be between 50 and 80. If too many shots are detected, try "
-"to augment its value."
+#: ../lib/advene/util/helper.py:650
+msgid "packages"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5182
-msgid "Sensitivity"
+#: ../lib/advene/util/helper.py:662
+#, python-format
+msgid "No %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:138
-#, fuzzy
-msgid "Choose the file to insert"
-msgstr "Elekti ilobretan stilon"
+#: ../lib/advene/util/helper.py:664
+#, python-format
+msgid "1 %s"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:146
-msgid "Select a valid identifier"
+#: ../lib/advene/util/helper.py:666
+#, python-format
+msgid "%(count)d %(plural)s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:147
+#: ../lib/advene/util/website_export.py:63
 #, python-format
-msgid ""
-"The filename %s contains invalid characters\n"
-"that have been replaced.\n"
-"You can modify this identifier if necessary:"
+msgid "%s exists but is not a directory. Cancelling website export"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:158
-#, fuzzy
-msgid "Choose the soundclip to insert"
-msgstr "Elekti ilobretan stilon"
+#: ../lib/advene/util/website_export.py:69
+#, fuzzy, python-format
+msgid "%s does not exist"
+msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:162
-#, fuzzy
-msgid "Choose the directory to insert"
-msgstr "Elekti ilobretan stilon"
+#: ../lib/advene/util/website_export.py:423
+msgid "Starting export"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:177
-msgid "Named-Entity extraction using NERD"
+#: ../lib/advene/util/website_export.py:452
+#, python-format
+msgid "Depth %d"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:181
-msgid ""
-"Give the offset to use\n"
-"on specified element.\n"
-"It is in ms and can be\n"
-"either positive or negative."
+#: ../lib/advene/util/website_export.py:456
+#, python-format
+msgid "Depth %(depth)d: processing %(url)s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:225
-#, fuzzy, python-format
-msgid "Replace content in %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/util/website_export.py:478
+msgid "Finalizing"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:228
-#, fuzzy, python-format
-msgid "Replace content in annotations of type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/util/website_export.py:512
+#, python-format
+msgid ""
+"<p><strong>You should probably begin at <a href=\"%(href)s\">%(title)s</a>.</"
+"strong></p>"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:231
+#: ../lib/advene/util/website_export.py:555
 #, fuzzy
-msgid "Replace content in all annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "Export complete"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/popup.py:324
-#, python-format
-msgid "Copy id %s"
+#: ../lib/advene/util/importer.py:134
+msgid "Generic importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:358
-#, python-format
-msgid ""
-"<b>Statistics about %s</b>\n"
-"\n"
+#: ../lib/advene/util/importer.py:188
+msgid "Usage: %prog [options] source-file destination-file"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:364
-#, fuzzy, python-format
-msgid "Renumbering annotations of type %s"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/util/importer.py:192
+msgid "Specify the offset in ms"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:371
+#: ../lib/advene/util/importer.py:264
 msgid ""
-"<b>Renumber all annotations according to their order.</b>\n"
-"\n"
-"<i>Note that this action cannot be undone.</i>\n"
-"Replace the first numeric value of the annotation content with the new "
-"annotation number.\n"
-"If no numeric value is found and the annotation is structured, it will "
-"insert the number.\n"
-"If no numeric value is found and the annotation is of type text/plain, it "
-"will overwrite the annotation content.\n"
-"The offset parameter allows you to renumber from a given annotation."
+"Import filter error. The asynchronous API should be used, please report a "
+"bug."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:377 ../lib/advene/gui/popup.py:484
-msgid "Offset"
+#: ../lib/advene/util/importer.py:266
+msgid ""
+"Import filter error. No conversion method is defined,  please report a bug."
+msgstr ""
+
+#: ../lib/advene/util/importer.py:532
+#, fuzzy
+msgid "ExternalApp importer"
+msgstr "Importi dosieron"
+
+#: ../lib/advene/util/importer.py:546
+#, python-format
+msgid ""
+"The <b>%s</b> application does not seem to be installed. Please check that "
+"it is present and that its path is correctly specified in preferences."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:399
+#: ../lib/advene/util/importer.py:548
 #, fuzzy, python-format
-msgid "Renumbering %d annotations"
+msgid "The file %s does not seem to exist."
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:408
+#: ../lib/advene/util/importer.py:570
 #, fuzzy, python-format
-msgid "Annotation #%d"
+msgid "Could not run %(appname)s: %(msg)s"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:445
-#, python-format
-msgid ""
-"Exporting annotation %(title)s\n"
-"from %(begin)s to %(end)s\n"
-"to %%(filename)s"
-msgstr ""
+#: ../lib/advene/util/importer.py:572
+#, fuzzy, python-format
+msgid "Processing %s"
+msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/popup.py:458
-msgid "Browse"
+#: ../lib/advene/util/importer.py:576
+msgid "Cleaning up..."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:466 ../lib/advene/gui/popup.py:853
-#, fuzzy
-msgid "Open in web browser"
-msgstr "Komentaraj attributoj"
-
-#: ../lib/advene/gui/popup.py:479
-#, fuzzy
-msgid "Search/replace content"
-msgstr "Arbvido"
-
-#: ../lib/advene/gui/popup.py:497
-msgid "Desactivate"
+#: ../lib/advene/util/importer.py:687
+msgid "Text importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:514
-msgid "Loop"
+#: ../lib/advene/util/importer.py:700 ../lib/advene/util/importer.py:1225
+msgid "Specify the encoding of the input file (latin1, utf8...)"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:515
-msgid "Duplicate"
+#: ../lib/advene/util/importer.py:703
+msgid "Should the timestamps be encoded relative to the first timestamp?"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:519
-#, fuzzy
-msgid "Save snapshot..."
-msgstr "Defauxlta regularo"
+#: ../lib/advene/util/importer.py:706
+msgid "Unit to consider for integers"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:521
-#, fuzzy
-msgid "Extract video fragment"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/util/importer.py:709
+msgid ""
+"What timestamps are present in a line (only begin, both begin and end, or "
+"automatic recognition)"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:551
-msgid "Incoming"
+#: ../lib/advene/util/importer.py:852
+msgid "lsdvd importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:567
-msgid "Outgoing"
+#: ../lib/advene/util/importer.py:879
+msgid "Processing data"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:582
+#: ../lib/advene/util/importer.py:897 ../lib/advene/util/importer.py:957
 #, fuzzy
-msgid "Related annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+msgid "DVD Chapter"
+msgstr "Importi DVD cxapitrojn"
 
-#: ../lib/advene/gui/popup.py:589
-msgid "Incoming relations"
+#: ../lib/advene/util/importer.py:901
+msgid "Launching lsdvd..."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:596
-msgid "Outgoing relations"
+#: ../lib/advene/util/importer.py:913
+msgid "chaplin importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:612
-#, python-format
-msgid "Begin: %s"
+#: ../lib/advene/util/importer.py:971
+msgid "Xi importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:614
-#, python-format
-msgid "End: %s"
+#: ../lib/advene/util/importer.py:1039
+msgid "ELAN importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:615
-#, fuzzy, python-format
-msgid "Duration: %s"
-msgstr "Defauxlta regularo"
+#: ../lib/advene/util/importer.py:1092
+#, python-format
+msgid "Converting tier %s"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:622
-msgid "Members:"
+#: ../lib/advene/util/importer.py:1189
+msgid "Processing time slots"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:635
+#: ../lib/advene/util/importer.py:1204
 #, fuzzy
-msgid "Edit package properties..."
-msgstr "Redakti komentarajn attributojn"
+msgid "Fixing forward references"
+msgstr "Interfacaj preferoj"
 
-#: ../lib/advene/gui/popup.py:636 ../lib/advene/gui/popup.py:756
-#, fuzzy, python-format
-msgid "%d annotations(s) - statistics"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#: ../lib/advene/util/importer.py:1206
+msgid "Creating relations"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:638 ../lib/advene/gui/popup.py:864
-#, fuzzy
-msgid "Create a new static view..."
-msgstr "Arbvido"
+#: ../lib/advene/util/importer.py:1218
+msgid "Subtitle (SRT) importer"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:639 ../lib/advene/gui/popup.py:865
-#, fuzzy
-msgid "Create a new dynamic view..."
-msgstr "Arbvido"
+#: ../lib/advene/util/importer.py:1276
+#, python-format
+msgid "Subtitles from %s"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:640 ../lib/advene/gui/popup.py:751
-msgid "Create a new annotation..."
+#: ../lib/advene/util/importer.py:1281
+msgid ""
+"Cannot decode subtitle file. Try to specify an encoding (latin1 perhaps?)."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:642 ../lib/advene/gui/popup.py:867
-msgid "Create a new schema..."
+#: ../lib/advene/util/importer.py:1292
+msgid "PRAAT importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:643 ../lib/advene/gui/popup.py:862
-msgid "Create a new query..."
+#: ../lib/advene/util/importer.py:1381
+msgid "CMML importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:651
-msgid "Create a new folder..."
+#: ../lib/advene/util/importer.py:1444
+msgid "Parsing clip information"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:652
-msgid "Create a new resource file..."
+#: ../lib/advene/util/importer.py:1544
+msgid "Creating CMML schema"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:653
-msgid "Insert a new resource file..."
+#: ../lib/advene/util/importer.py:1568
+msgid "Parsing stream information"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:654
-msgid "Insert a new resource directory..."
+#: ../lib/advene/util/importer.py:1602
+#, fuzzy
+msgid "IRI importer"
+msgstr "Importi dosieron"
+
+#: ../lib/advene/util/importer.py:1611
+msgid "Generate one type per view"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:663 ../lib/advene/gui/popup.py:665
-msgid "Insert a soundclip..."
+#: ../lib/advene/util/importer.py:1630
+#, python-format
+msgid "Parsing ensemble %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:676
-msgid "Play sound"
+#: ../lib/advene/util/importer.py:1641
+#, python-format
+msgid "Parsing decoupage %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:686
-msgid "Create a new annotation type..."
+#: ../lib/advene/util/importer.py:1676
+msgid "Parsing views"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:688
-msgid "Create a new relation type..."
+#: ../lib/advene/util/importer.py:1723 ../lib/advene/util/importer.py:1812
+msgid "Initializing package"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:699
-#, python-format
-msgid "A caption dynamic view for %s already seems to exist."
+#: ../lib/advene/util/importer.py:1761
+#, fuzzy
+msgid "IRIData importer"
+msgstr "Importi dosieron"
+
+#: ../lib/advene/util/importer.py:1775
+msgid "Parsing sound values"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:708
-#, fuzzy, python-format
-msgid "Caption %s annotations"
+#: ../lib/advene/util/importer.py:1787
+#, fuzzy
+msgid "Creating annotations"
 msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:740
 #, fuzzy
-msgid "Create a comment view"
-msgstr "Arbvido"
+#~ msgid "The movie %s does not seem to exist."
+#~ msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:741
 #, fuzzy
-msgid "Generate a caption dynamic view..."
-msgstr "Arbvido"
+#~ msgid "Cannot send data to %(host)s:%(port)s %(error)s"
+#~ msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:742
-msgid "Display as transcription"
-msgstr ""
+#, fuzzy
+#~ msgid "Cannot send event %(nb)s to %(host)s:%(port)s %(error)s"
+#~ msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:743
 #, fuzzy
-msgid "Display annotations in table"
-msgstr "Vidi komentajxojn sur templinio"
+#~ msgid "Store results as markup in the annotation text"
+#~ msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:744
 #, fuzzy
-msgid "Export to another format..."
-msgstr "Importi datumo de alia ???"
+#~ msgid "All annotations"
+#~ msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:746
-msgid "Extract Named Entities..."
-msgstr ""
+#, fuzzy
+#~ msgid "Display log file"
+#~ msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:752
 #, fuzzy
-msgid "Delete all annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#~ msgid "Advene log"
+#~ msgstr "Advene"
 
-#: ../lib/advene/gui/popup.py:753
 #, fuzzy
-msgid "Renumber annotations..."
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#~ msgid "WebAnnotation importer"
+#~ msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:754
 #, fuzzy
-msgid "Shot validation view..."
-msgstr "Defauxlta regularo"
+#~ msgid "Tree view"
+#~ msgstr "Arbvido"
 
-#: ../lib/advene/gui/popup.py:766
-#, python-format
-msgid "A follow dynamic view for %s already seems to exist."
-msgstr ""
+#, fuzzy
+#~ msgid "Could not run shotdetect: %s"
+#~ msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:775
-#, fuzzy, python-format
-msgid "Follow %s relation-type"
-msgstr "Defauxlta regularo"
+#, fuzzy
+#~ msgid "Shot detection"
+#~ msgstr "Importi dosieron"
 
-#: ../lib/advene/gui/popup.py:784
 #, fuzzy
-msgid "Follow the relation"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#~ msgid "Min duration"
+#~ msgstr "Elekti ilobretan stilon"
 
-#: ../lib/advene/gui/popup.py:804
-msgid "Delete all relations..."
-msgstr ""
+#, fuzzy
+#~ msgid "Max duration"
+#~ msgstr "Elekti ilobretan stilon"
 
-#: ../lib/advene/gui/popup.py:805
 #, fuzzy
-msgid "Create montage from related annotations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#~ msgid "Mean duration"
+#~ msgstr "Elekti ilobretan stilon"
 
-#: ../lib/advene/gui/popup.py:806
 #, fuzzy
-msgid "Create dynamic view following relations"
-msgstr "Krei komentajxojn de DVD cxapitroj"
+#~ msgid "Total duration"
+#~ msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:824
-msgid "Apply query on..."
-msgstr ""
+#, fuzzy
+#~ msgid "Display"
+#~ msgstr "Krei komentajxojn de DVD cxapitroj"
 
-#: ../lib/advene/gui/popup.py:849
-msgid "Activate view"
-msgstr ""
+#, fuzzy
+#~ msgid "Remove relation type"
+#~ msgstr "Defauxlta regularo"
 
-#: ../lib/advene/gui/popup.py:851
 #, fuzzy
-msgid "Open adhoc view"
-msgstr "Defauxlta regularo"
+#~ msgid "Create HTML view"
+#~ msgstr "Arbvido"
+
+#, fuzzy
+#~ msgid "Remove annotation type"
+#~ msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#, fuzzy
+#~ msgid "New annotation type"
+#~ msgstr "Krei komentajxojn de DVD cxapitroj"
+
+#, fuzzy
+#~ msgid "New relation type"
+#~ msgstr "Defauxlta regularo"
+
+#, fuzzy
+#~ msgid "Choose a filename to export the schema as PDF"
+#~ msgstr "Arbvido"
 
 #, fuzzy
 #~ msgid "Adjust annotation bounds..."
@@ -9547,10 +9586,6 @@ msgstr "Defauxlta regularo"
 #~ msgstr "Importi transkribon"
 
 #, fuzzy
-#~ msgid "Export trace"
-#~ msgstr "Importi dosieron"
-
-#, fuzzy
 #~ msgid "No valid importer"
 #~ msgstr "Importi dosieron"
 
@@ -9571,10 +9606,6 @@ msgstr "Defauxlta regularo"
 #~ msgstr "Importi dosieron"
 
 #, fuzzy
-#~ msgid "Copying resources"
-#~ msgstr "Preferoj"
-
-#, fuzzy
 #~ msgid "Resource"
 #~ msgstr "Preferoj"
 
diff --git a/po/es.po b/po/es.po
index 8455359..6c93bd2 100644
--- a/po/es.po
+++ b/po/es.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.32\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-07-09 17:25+0200\n"
+"POT-Creation-Date: 2017-10-12 22:02+0200\n"
 "PO-Revision-Date: 2014-04-18 21:12-0700\n"
 "Last-Translator: Emmanuel Ayala Mexicano <emmanuelayalamexicano at gmail.com>\n"
 "Language-Team: advene at liris.cnrs.fr\n"
@@ -17,3333 +17,2845 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 1.6.4\n"
 
-#: ../lib/advene/model/zippackage.py:187 ../lib/advene/model/zippackage.py:189
-#: ../lib/advene/util/helper.py:538 ../lib/advene/util/helper.py:540
-#, python-format
-msgid "File %s is not an Advene zip package."
-msgstr "El archivo %s no es un paquete zip de Advene."
-
-#: ../lib/advene/model/zippackage.py:243
-#, python-format
-msgid "Directory %s is not an extracted Advene zip package."
-msgstr "El directorio %s no es una extracción de un paquete zip de Advene."
-
-#: ../lib/advene/model/bundle.py:296
+#: ../lib/advene/model/bundle.py:292
 #, python-format
 msgid "%s not in bundle"
 msgstr "%s no en bundle"
 
-#: ../lib/advene/model/bundle.py:362
+#: ../lib/advene/model/bundle.py:358
 msgid "List of non-typed elements"
 msgstr "Lista de elementos no tipificados"
 
-#: ../lib/advene/model/bundle.py:367
+#: ../lib/advene/model/bundle.py:363
 #, python-format
 msgid "List of %s elements"
 msgstr "Lista de %s elementos"
 
-#: ../lib/advene/core/controller.py:263 ../lib/advene/rules/actions.py:36
-#: ../lib/advene/gui/plugins/actions.py:40
-msgid "Display a message"
-msgstr "Muestra un mensaje"
+#: ../lib/advene/model/zippackage.py:161 ../lib/advene/model/zippackage.py:163
+#, python-format
+msgid "File %s is not an Advene zip package."
+msgstr "El archivo %s no es un paquete zip de Advene."
 
-#: ../lib/advene/core/controller.py:264
-#: ../lib/advene/gui/plugins/actions.py:41
-#: ../lib/advene/gui/plugins/actions.py:53
-#: ../lib/advene/gui/plugins/actions.py:71
-#: ../lib/advene/gui/plugins/actions.py:86
-#: ../lib/advene/gui/plugins/actions.py:102
-#: ../lib/advene/gui/plugins/actions.py:203
-msgid "String to display."
-msgstr "Cadena a mostrar"
+#: ../lib/advene/model/zippackage.py:219
+#, python-format
+msgid "Directory %s is not an extracted Advene zip package."
+msgstr "El directorio %s no es una extracción de un paquete zip de Advene."
 
-#: ../lib/advene/core/controller.py:362
-msgid "Exception (traceback in console):"
-msgstr "Excepción (registro en consola):"
+#: ../lib/advene/gui/widget.py:295
+#, python-format
+msgid "Set of %s annotations"
+msgstr "Conjunto de %s anotaciones"
 
-#: ../lib/advene/core/controller.py:393
-msgid "No available GUI"
-msgstr "No hay interfaz gráfica de usuario disponible"
+#: ../lib/advene/gui/widget.py:1006
+#: ../lib/advene/gui/views/transcription.py:459
+#: ../lib/advene/gui/edit/montage.py:60
+msgid "Play"
+msgstr "Reproducir"
 
-#: ../lib/advene/core/controller.py:412
-msgid "No available event handler"
-msgstr "No hay un control de evento disponible"
+#: ../lib/advene/gui/widget.py:1010 ../lib/advene/gui/edit/timeadjustment.py:77
+msgid "Refresh snapshot"
+msgstr "Refrescar captura"
 
-#: ../lib/advene/core/controller.py:420
-msgid "No available gui"
-msgstr "No hay una intefaz gráfica de usuario disponible"
+#: ../lib/advene/gui/widget.py:1014
+msgid "Save as..."
+msgstr "Guardar como..."
 
-#: ../lib/advene/core/controller.py:436
-#, python-format
-msgid "Warning: redefining an existing feature %s"
-msgstr "Advertencia: Definiendo de nuevo una característica existente %s"
+#: ../lib/advene/gui/widget.py:1019
+msgid "Use current player position"
+msgstr "Utiliza la posición actual del reproductor"
 
-#: ../lib/advene/core/controller.py:568
-msgid "All annotations"
-msgstr "Todas las anotaciones"
+#: ../lib/advene/gui/widget.py:1025
+msgid "Adjust timestamp"
+msgstr "Ajustar la marca de tiempo"
 
-#: ../lib/advene/core/controller.py:569 ../lib/advene/gui/edit/rules.py:358
-#, python-format
-msgid "Annotations of type %s"
-msgstr "Anotaciones de tipo %s"
+#: ../lib/advene/gui/main.py:200 ../lib/advene/gui/main.py:314
+msgid "_Select player"
+msgstr "_Selecciona reproductor"
 
-#: ../lib/advene/core/controller.py:570 ../lib/advene/gui/edit/imports.py:129
-#: ../lib/advene/gui/edit/imports.py:130
-msgid "Views"
-msgstr "Vistas"
+#: ../lib/advene/gui/main.py:202 ../lib/advene/gui/main.py:299
+msgid "_View"
+msgstr "_Vista"
 
-#: ../lib/advene/core/controller.py:570 ../lib/advene/gui/edit/elements.py:521
-msgid "Tags"
-msgstr "Etiquetas"
+#: ../lib/advene/gui/main.py:204 ../lib/advene/gui/main.py:316
+msgid "Packages"
+msgstr "Paquetes"
 
-#: ../lib/advene/core/controller.py:570
-msgid "Ids"
-msgstr "Ids"
+#: ../lib/advene/gui/main.py:207 ../lib/advene/gui/main.py:258
+msgid "Open recent"
+msgstr "Abrir recientes"
 
-#: ../lib/advene/core/controller.py:747
-#, python-format
-msgid ""
-"Cannot start the webserver\n"
-"The following processes seem to use the %(port)s port: %(processes)s"
-msgstr ""
-"No se puede iniciar el servidor web \n"
-"Los siguientes procesos parecen utilizar el %(port)s puerto: %(processes)s"
+#: ../lib/advene/gui/main.py:252
+msgid "Input from the keyboard (function keys)"
+msgstr "Ingresar del teclado (teclas de función)"
 
-#: ../lib/advene/core/controller.py:797 ../lib/advene/core/controller.py:808
-#, python-format
-msgid "Loaded %(uri)s as %(alias)s"
-msgstr "Cargados %(uri)s como %(alias)s"
+#: ../lib/advene/gui/main.py:255
+msgid "_File"
+msgstr "_Archivo"
 
-#: ../lib/advene/core/controller.py:799 ../lib/advene/core/controller.py:811
-#, python-format
-msgid "Cannot load package from file %(uri)s: %(error)s"
-msgstr "No se puede cargar el paquete del archivo %(uri)s: %(error)s"
+#: ../lib/advene/gui/main.py:256
+msgid "_New package"
+msgstr "_Nuevo paquete"
 
-#: ../lib/advene/core/controller.py:850
-msgid "Deactivating web server"
-msgstr "Desactivando el servidor web"
+#: ../lib/advene/gui/main.py:256
+msgid "Create a new package"
+msgstr "Crea un nuevo paquete"
 
-#: ../lib/advene/core/controller.py:970
-#, python-format
-msgid "Cannot get audio volume: %s"
-msgstr "No se puede obtener el volumen del audio: %s"
+#: ../lib/advene/gui/main.py:257
+msgid "_Open package"
+msgstr "_Abrir paquete"
 
-#: ../lib/advene/core/controller.py:1020
-#, python-format
-msgid "Cannot open Advene URL %s: the webserver is not running."
-msgstr ""
-"No se puede abrir el URL %s de Advene: el servidor web no está corriendo. "
+#: ../lib/advene/gui/main.py:257
+msgid "Open a package"
+msgstr "Abrir un paquete"
 
-#: ../lib/advene/core/controller.py:1128 ../lib/advene/gui/edit/merge.py:272
-msgid "None"
-msgstr "Ninguno"
+#: ../lib/advene/gui/main.py:258
+msgid "Show recently opened packages"
+msgstr "Mostrar paquetes recientemente abiertos"
 
-#: ../lib/advene/core/controller.py:1222
-#, python-format
-msgid "Found matching video file in moviepath: %s"
-msgstr "Encontre video concordante en la ruta: %s"
+#: ../lib/advene/gui/main.py:259
+msgid "_Save package"
+msgstr "_Guardar paquete"
 
-#: ../lib/advene/core/controller.py:1263 ../lib/advene/core/controller.py:1265
-msgid "Analysis of "
-msgstr "Análisis de"
+#: ../lib/advene/gui/main.py:259
+msgid "Save the package"
+msgstr "Guardar el paquete"
 
-#: ../lib/advene/core/controller.py:1465
-msgid "Cannot split the annotation: the given position is outside."
-msgstr ""
-"No se puede dividir la anotación: la posición especificada se encuentra "
-"fuera. "
+#: ../lib/advene/gui/main.py:260
+msgid "Save package as..."
+msgstr "Guardar paquete como..."
 
-#: ../lib/advene/core/controller.py:1630
-#, python-format
-msgid "Cannot find the template package %(filename)s: %(error)s"
-msgstr "No se encuentra el paquete de plantilla %(filename)s: %(error)s"
+#: ../lib/advene/gui/main.py:260
+msgid "Save the package as..."
+msgstr "Guardar el paquete como..."
 
-#: ../lib/advene/core/controller.py:1672
-#, python-format
-msgid "Cannot read the imported package %(uri)s: %(error)s"
-msgstr "No se puede leer el paquete importado %(uri)s: %(error)s"
+#: ../lib/advene/gui/main.py:261
+msgid "Close package"
+msgstr "Cerrar paquete"
 
-#: ../lib/advene/core/controller.py:1907
-msgid "Package URI has changed. Reloading package with new URI."
-msgstr "El paquete URI ha cambiado. Recargando el paquete con un nuevo URI"
+#: ../lib/advene/gui/main.py:261
+msgid "Close the package"
+msgstr "Cerrar el paquete"
 
-#: ../lib/advene/core/controller.py:1925
-msgid ""
-"Cannot load package: the following annotations do not have Millisecond "
-"fragments:"
-msgstr ""
-"No puedo cargar el paquete: las anotaciones siguientes no tienen fragmentos "
-"de milisegundos:"
+#: ../lib/advene/gui/main.py:263
+msgid "Save session"
+msgstr "Guardar sesión"
 
-#: ../lib/advene/core/controller.py:1952
-#, python-format
-msgid "Cannot handle master attribute, the package %s is not imported."
-msgstr ""
-"No se puede manejar el atributo maestro, el paquete %s no está importado. "
+#: ../lib/advene/gui/main.py:263
+msgid "Save the current session (list of opened packages)"
+msgstr "Guardar la sesión actual (lista de paquetes abiertos)"
 
-#: ../lib/advene/core/controller.py:1954
-#, python-format
-msgid "Checking master package %s for not yet imported elements."
-msgstr ""
-"Revisando el paquete maestro %s para los elementos que todavía no son "
-"importados. "
+#: ../lib/advene/gui/main.py:264
+msgid "Save workspace"
+msgstr "Guardar espacio de trabajo"
 
-#: ../lib/advene/core/controller.py:1994
-msgid "Standard summary"
-msgstr "Resumen estándar."
+#: ../lib/advene/gui/main.py:265
+msgid "...as package view"
+msgstr "...como paquete de vista"
 
-#: ../lib/advene/core/controller.py:1999
-msgid "Default view"
-msgstr "Vista por omision"
+#: ../lib/advene/gui/main.py:266
+msgid "...as standard workspace"
+msgstr "...como espacio de trabajo estándar"
 
-#: ../lib/advene/core/controller.py:2041
-#, python-format
-msgid ""
-"Infinite loop in STBV %(name)s: the %(imp)s view is invoked multiple times."
+#: ../lib/advene/gui/main.py:266
+msgid "Use the current layout as standard workspace in the future"
 msgstr ""
-"Ciclo infinito en STBV %(name)s: la vista %(imp)s es invocada muchas veces. "
+"Usa el despliegue actual como espacio de trabajo predeterminado en el futuro"
 
-#: ../lib/advene/core/controller.py:2131
-#, python-format
-msgid "Got exception %s when stopping player."
-msgstr "Hubo excepcion %s cuando se detuvo el reproductor."
+#: ../lib/advene/gui/main.py:268
+msgid "Associate a video _File"
+msgstr "Asociar un archivo de video _F"
 
-#: ../lib/advene/core/controller.py:2214
-#, python-format
-msgid "Raised exception in update_status: %s"
-msgstr "Excepcion levantada en update_status: %s"
+#: ../lib/advene/gui/main.py:268
+msgid "Associate a video file"
+msgstr "Asociar un archivo de video"
 
-#: ../lib/advene/core/controller.py:2241
-msgid "Unable to start the player."
-msgstr "Incapaz de inicializar el reproductor."
+#: ../lib/advene/gui/main.py:269
+msgid "Associate a _DVD"
+msgstr "Asociar un _DVD"
 
-#: ../lib/advene/core/controller.py:2448
-#, python-format
-msgid "Comment on set of %d annotations"
-msgstr "Comentarios sobre el conjunto de %d anotaciones"
+#: ../lib/advene/gui/main.py:269
+msgid "Associate a chapter from a DVD"
+msgstr "Asociar un capítulo de un DVD"
 
-#: ../lib/advene/core/controller.py:2450
-#, python-format
-msgid "Comment on %s"
-msgstr "Comentar en %s"
+#: ../lib/advene/gui/main.py:270
+msgid "Associate a _Video stream"
+msgstr "Asociar una corriente de _Video"
 
-#: ../lib/advene/core/controller.py:2454
-#, python-format
-msgid ""
-"<h1>Comment on %(title)s</h1>\n"
-"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
-"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
-"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
-"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
-"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
-"\"%(imgurl)s\" ></img></a></span>"
-msgstr ""
-"<h1>Comentar en %(title)s</h1>\n"
-"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
-"presentation=\"link:snapshot\"><a title=\"Clic para reproducir el video en "
-"Advene\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
-"\"%(href)s\"><img title=\"Clic aquí para reproducir\" width=\"160\" height="
-"\"100\" tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
-"\"%(imgurl)s\" ></img></a></span>"
+#: ../lib/advene/gui/main.py:270
+msgid "Enter a video stream address"
+msgstr "Ingresar una dirección de flujo de video"
 
-#: ../lib/advene/core/controller.py:2464
-#, python-format
-msgid "List of %s annotations"
-msgstr "Lista de %s anotaciones"
+#: ../lib/advene/gui/main.py:272
+msgid "_Import File"
+msgstr "_Importar Archivo"
 
-#: ../lib/advene/core/controller.py:2499
-#, python-format
-msgid "Cannot export to %(filename)s: %(e)s"
-msgstr "No se puede exportar a %(filename)s: %(e)s"
+#: ../lib/advene/gui/main.py:272
+msgid "Import data from an external source"
+msgstr "Importar datos de una fuente externa"
 
-#: ../lib/advene/core/controller.py:2514 ../lib/advene/core/controller.py:2523
-#, python-format
-msgid "Error when exporting: %s"
-msgstr "Error mientras se exportaba: %s"
+#: ../lib/advene/gui/main.py:273
+msgid "_Process video"
+msgstr "_Procesar video"
 
-#: ../lib/advene/core/controller.py:2525 ../lib/advene/gui/views/table.py:406
-#: ../lib/advene/gui/views/table.py:536
-#, python-format
-msgid "Data exported to %s"
-msgstr "Datos exportados a %s"
+#: ../lib/advene/gui/main.py:273
+msgid "Import data from video processing algorithms"
+msgstr "Importar datos de algoritmos de procesamiento de vídeo"
 
-#: ../lib/advene/core/webcherry.py:51
-msgid "The webserver requires version 3.0 of CherryPy at least."
-msgstr "El servidor web require como mínimo la versión 3.0 de CherryPy."
+#: ../lib/advene/gui/main.py:275
+msgid "Merge package"
+msgstr "Unir paquete"
 
-#: ../lib/advene/core/webcherry.py:167
-#, python-format
-msgid ""
-"\n"
-"            <p>\n"
-"            <a href=\"/admin\">Server administration</a> |\n"
-"            <a href=\"/media\">Media control</a> |\n"
-"            <a href=\"%(path)s?mode=raw\">Raw view</a>\n"
-"            </p>\n"
-"            Location: %(locationbar)s\n"
-"            <hr>\n"
-"            "
-msgstr ""
-"\n"
-"            <p>\n"
-"            <a href=\"/admin\">Administracion de servidor</a> |\n"
-"            <a href=\"/media\">Control media</a> |\n"
-"            <a href=\"%(path)s?mode=raw\">Vista inicial</a>\n"
-"            </p>\n"
-"            Locacion: %(locationbar)s\n"
-"            <hr>\n"
-"            "
+#: ../lib/advene/gui/main.py:275
+msgid "Merge elements from another package"
+msgstr "Editar elementos importados de otros paquetes"
 
-#: ../lib/advene/core/webcherry.py:227
-msgid "Unspecified Error"
-msgstr "Error no especificado"
+#: ../lib/advene/gui/main.py:276
+msgid "Import _DVD chapters"
+msgstr "Importar capitulos del DVD"
 
-#: ../lib/advene/core/webcherry.py:228
-#, python-format
-msgid ""
-"\n"
-"        <h1>Error</h1>\n"
-"        <p>An error occurred:</p>\n"
-"        %s\n"
-"        "
-msgstr ""
-"\n"
-"        <h1>Error</h1>\n"
-"        <p>Un error ocurrió:</p>\n"
-"        %s\n"
-"        "
+#: ../lib/advene/gui/main.py:276
+msgid "Create annotations based on DVD chapters"
+msgstr "Crear anotaciones basadas en los capitulos del DVD"
 
-#: ../lib/advene/core/webcherry.py:261
-msgid "<h1>No available mediaplayer</h1>"
-msgstr "<h1>No hay reproductor media disponible</h1>"
+#: ../lib/advene/gui/main.py:278
+msgid "_Export..."
+msgstr "_Exportar..."
 
-#: ../lib/advene/core/webcherry.py:265
-#, python-format
-msgid ""
-"\n"
-"            <h1>Current STBV: %(currentstbv)s</h1>\n"
-"\n"
-"            <h1>Player status</h1>\n"
-"            <table border=\"1\">\n"
-"            <tr>\n"
-"            <td>Current position</td><td>%(position)s</td>\n"
-"            <td>Duration</td><td>%(duration)s</td>\n"
-"            <td>Player status</td><td>%(status)s</td>\n"
-"            </tr>\n"
-"            </table>\n"
-"            "
-msgstr ""
-"\n"
-"            <h1>STBV Actual: %(currentstbv)s</h1>\n"
-"\n"
-"            <h1>Estado del reproductor</h1>\n"
-"            <table border=\"1\">\n"
-"            <tr>\n"
-"            <td>Posición actual</td><td>%(position)s</td>\n"
-"            <td>Tamaño de entrada</td><td>%(duration)s</td>\n"
-"            <td>Estado del reproductor</td><td>%(status)s</td>\n"
-"            </tr>\n"
-"            </table>\n"
-"            "
+#: ../lib/advene/gui/main.py:278
+msgid "Export data to another format"
+msgstr "Importar datos de una fuente externa"
 
-#: ../lib/advene/core/webcherry.py:284
-msgid "<h1>No playlist</h1>"
-msgstr "<h1>No hay lista de reproduccion</h1>"
+#: ../lib/advene/gui/main.py:279
+msgid "_Website export..."
+msgstr "_Exportar sitio web..."
 
-#: ../lib/advene/core/webcherry.py:286
-#, python-format
-msgid ""
-"<h1>Current playlist</h1>\n"
-"                <ul>%s</ul>"
-msgstr ""
-"<h1>Lista de reproduccion actual</h1>\n"
-"                <ul>%s</ul>"
+#: ../lib/advene/gui/main.py:279
+msgid "Export views to a website"
+msgstr "Exportar vistas a un sitio web"
 
-#: ../lib/advene/core/webcherry.py:288
-msgid ""
-"\n"
-"                <form action=\"/media/play\" method=\"GET\">\n"
-"                Starting pos: <input type=\"text\" name=\"position\" value="
-"\"0\">\n"
-"                <input type=\"submit\" value=\"Play\">\n"
-"                </form>\n"
-"                <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
-"\">Pause</a><br>\n"
-"                "
-msgstr ""
-"\n"
-"                <form action=\"/media/play\" method=\"GET\">\n"
-"                Posicion inicial: <input type=\"text\" name=\"position\" "
-"value=\"0\">\n"
-"                <input type=\"submit\" value=\"Play\">\n"
-"                </form>\n"
-"                <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
-"\">Pausa</a><br>\n"
-"                "
+#: ../lib/advene/gui/main.py:281
+msgid "_Quit"
+msgstr "Salir _Q"
 
-#: ../lib/advene/core/webcherry.py:295
-msgid ""
-"<hr />\n"
-"            <form action=\"/media/load\" method=\"GET\">\n"
-"            Add a new file (<em>dvd</em> to play a DVD):\n"
-"            <input type=\"text\" name=\"filename\">\n"
-"            <input type=\"submit\" value=\"Add\">\n"
-"            </form>"
-msgstr ""
-"<hr />\n"
-"            <form action=\"/media/load\" method=\"GET\">\n"
-"            Anadir un nuevo archivo(<em>dvd</em> to play a DVD):\n"
-"            <input type=\"text\" name=\"filename\">\n"
-"            <input type=\"submit\" value=\"Add\">\n"
-"            </form>"
+#: ../lib/advene/gui/main.py:283
+msgid "_Edit"
+msgstr "_Editar"
 
-#: ../lib/advene/core/webcherry.py:301
-msgid ""
-"<h3><a href=\"/media/snapshot\">Access to current packages snapshots</h3>"
-msgstr ""
-"<h3><a href=\"/media/snapshot\">Accesar a los paquetes de fotos actuales </"
-"h3>"
+#: ../lib/advene/gui/main.py:284
+msgid "_Undo"
+msgstr "_Deshacer"
 
-#: ../lib/advene/core/webcherry.py:310
-#, python-format
-msgid "Unknown STBV identifier: %s"
-msgstr "Identificador STBV desconocido: %s"
+#: ../lib/advene/gui/main.py:285
+msgid "_Find"
+msgstr "Encontrar _F"
 
-#: ../lib/advene/core/webcherry.py:385
-msgid "Media information"
-msgstr "Informacion Media"
+#: ../lib/advene/gui/main.py:286
+msgid "_Delete"
+msgstr "Eliminar _D"
 
-#: ../lib/advene/core/webcherry.py:398
-msgid "File added"
-msgstr "Archivo anadido"
+#: ../lib/advene/gui/main.py:287
+msgid "Create"
+msgstr "Crear"
 
-#: ../lib/advene/core/webcherry.py:399
-#, python-format
-msgid "<p><strong>%s has been added to the playlist</strong></p>"
-msgstr "<p><strong>%s ha sido anadida a la lista de reproduccion</strong></p>"
+#: ../lib/advene/gui/main.py:288 ../lib/advene/gui/main.py:3337
+#: ../lib/advene/util/helper.py:411
+msgid "Schema"
+msgstr "Esquema"
 
-#: ../lib/advene/core/webcherry.py:410 ../lib/advene/core/webcherry.py:472
-msgid "Access to packages snapshots"
-msgstr "Accesar a paquetes de fotografias"
+#: ../lib/advene/gui/main.py:289 ../lib/advene/gui/edit/rules.py:1086
+#: ../lib/advene/rules/actions.py:238 ../lib/advene/util/helper.py:414
+msgid "View"
+msgstr "Vista"
 
-#: ../lib/advene/core/webcherry.py:420 ../lib/advene/core/webcherry.py:482
-msgid "Unknown package alias"
-msgstr "Alias de paquete desconocido"
+#: ../lib/advene/gui/main.py:290 ../lib/advene/gui/popup.py:488
+#: ../lib/advene/util/helper.py:415
+msgid "Query"
+msgstr "Busqueda"
 
-#: ../lib/advene/core/webcherry.py:426
-#, python-format
-msgid "Available snapshots for %s"
-msgstr "Fotos disponibles para %s"
+#: ../lib/advene/gui/main.py:291 ../lib/advene/util/helper.py:412
+msgid "Annotation Type"
+msgstr "Tipo de anotacion"
 
-#: ../lib/advene/core/webcherry.py:432
-#, python-format
-msgid ""
-"<p><a href=\"/media/snapshot/%s?mode=inline\">Display with inline images</"
-"a></p>"
-msgstr ""
-"<p><a href=\"/media/snapshot/%s?mode=inline\">Mostrar con imagenes en linea</"
-"a></p>"
+#: ../lib/advene/gui/main.py:292 ../lib/advene/util/helper.py:413
+msgid "Relation Type"
+msgstr "Tipo de relacion"
 
-#: ../lib/advene/core/webcherry.py:439
-msgid "Done"
-msgstr "Hecho"
+#: ../lib/advene/gui/main.py:296
+msgid "P_ackage properties"
+msgstr "P_ropiedades del paquete"
 
-#: ../lib/advene/core/webcherry.py:441
-msgid "Pending"
-msgstr "Pendiente"
+#: ../lib/advene/gui/main.py:296
+msgid "Edit package properties"
+msgstr "Editar las propiedades del paquete"
 
-#: ../lib/advene/core/webcherry.py:487
-#, python-format
-msgid "Unknown annotation id: %s"
-msgstr "Id de anotación desconocido: %s"
+#: ../lib/advene/gui/main.py:297
+msgid "P_references"
+msgstr "P_referencias"
 
-#: ../lib/advene/core/webcherry.py:610 ../lib/advene/core/webcherry.py:728
-#, python-format
-msgid "Cannot activate stbvid %(stbvid)s: %(error)s"
-msgstr "No se puede activar stbvid %(stbvid)s: %(error)s"
+#: ../lib/advene/gui/main.py:297
+msgid "Interface preferences"
+msgstr "Preferencias de interfaz"
 
-#: ../lib/advene/core/webcherry.py:675
-msgid "<p>No GUI is available."
-msgstr "<p>No hay GUI disponible."
+#: ../lib/advene/gui/main.py:301
+msgid "_Start Web Browser"
+msgstr "_Inicia el explorador Web"
 
-#: ../lib/advene/core/webcherry.py:677
-#, python-format
-msgid "<p>Opened adhoc views: %s</p>"
-msgstr "<p>Vistas adhoc actuales: %s</p>"
+#: ../lib/advene/gui/main.py:301
+msgid "Start the web browser"
+msgstr "_Inicia el explorador Web"
 
-#: ../lib/advene/core/webcherry.py:678
-msgid "<p>Available adhoc views:</p><ul>"
-msgstr "<p>Vistas adhoc disponibles:</p><ul>"
+#: ../lib/advene/gui/main.py:303
+msgid "Simplify interface"
+msgstr "Simplificar interfaz"
 
-#: ../lib/advene/core/webcherry.py:699
-#, python-format
-msgid "<p>Current stbv: %s</p>"
-msgstr "<p>STBV actual: %s</p>"
+#: ../lib/advene/gui/main.py:303
+msgid "Simplify the application interface (toggle)"
+msgstr "Simplificar la interfaz de la aplicación (conmutar)"
 
-#: ../lib/advene/core/webcherry.py:700
-#, python-format
-msgid "<p>You can activate the following STBV:</p><ul>%s</ul>"
-msgstr "<p>Puedes activar el siguiente STBV:</p><ul>%s</ul>"
+#: ../lib/advene/gui/main.py:304
+msgid "Evaluator"
+msgstr "Evaluador"
 
-#: ../lib/advene/core/webcherry.py:702
-msgid "Activate and play"
-msgstr "Activa y reproduce"
+#: ../lib/advene/gui/main.py:304
+msgid "Open python evaluator window"
+msgstr "Abre la ventana del evaluador de Python"
 
-#: ../lib/advene/core/webcherry.py:708
-msgid "Application information"
-msgstr "Informacion de aplicacion"
+#: ../lib/advene/gui/main.py:305 ../lib/advene/gui/main.py:4096
+msgid "Webserver log"
+msgstr "Bitácora del servidor web"
 
-#: ../lib/advene/core/webcherry.py:778
-msgid "Missing element id parameter"
-msgstr "Hace falta el elemento parámetro id"
+#: ../lib/advene/gui/main.py:307
+msgid "_Player"
+msgstr "_Reproductor"
 
-#: ../lib/advene/core/webcherry.py:782
-#, python-format
-msgid "No existing element with id %s"
-msgstr "No existe el elemento con el id %s"
+#: ../lib/advene/gui/main.py:308
+msgid "Go to _Time"
+msgstr "Ir al _Tiempo"
 
-#: ../lib/advene/core/webcherry.py:791
-#, python-format
-msgid "<p>The GUI view %s does not exist.</p>"
-msgstr "<p>La vista GUI %s no existe.</p>"
+#: ../lib/advene/gui/main.py:308
+msgid "Goto a specified time code"
+msgstr "Ir a un código de tiempo especificado"
 
-#: ../lib/advene/core/webcherry.py:798
-msgid "Invalid request"
-msgstr "Petición no válida"
+#: ../lib/advene/gui/main.py:309
+msgid "Save _ImageCache"
+msgstr "Guarda _ImagenCache"
 
-#: ../lib/advene/core/webcherry.py:803
-msgid "Invalid configuration variable name"
-msgstr "Nombre de variable de configuración no válido"
+#: ../lib/advene/gui/main.py:309
+msgid "Save the contents of the ImageCache to disk"
+msgstr "Guarda los contenidos de la ImagenCache a disco"
 
-#: ../lib/advene/core/webcherry.py:815
-msgid "Invalid value"
-msgstr "Valor no válido"
+#: ../lib/advene/gui/main.py:310
+msgid "Reset ImageCache"
+msgstr "Restablecer ImageCache"
 
-#: ../lib/advene/core/webcherry.py:819
-#, python-format
-msgid "Unsupported method %s"
-msgstr "Método no soportado %s"
+#: ../lib/advene/gui/main.py:310
+msgid "Reset the ImageCache"
+msgstr "Restablecer la ImageCache"
 
-#: ../lib/advene/core/webcherry.py:845
-#, python-format
-msgid ""
-"\n"
-"        <h1>Authorized hosts</h1>\n"
-"        <table border=\"1\">\n"
-"        <tr><th>Host</th><th>IP Addr</th><th>Action</th></tr>\n"
-"        %s\n"
-"        </table>\n"
-"        <form method=\"GET\">\n"
-"        Add a new hostname to the list :<br>\n"
-"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
-"\"Add\">\n"
-"        </form>\n"
-"        "
-msgstr ""
-"\n"
-"        <h1>Hosts autorizados</h1>\n"
-"        <table border=\"1\">\n"
-"        <tr><th>Host</th><th>Dir. IP </th><th>Acción</th></tr>\n"
-"        %s\n"
-"        </table>\n"
-"        <form method=\"GET\">\n"
-"        Añade un nuevo nombre de host a la lista :<br>\n"
-"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
-"\"Add\">\n"
-"        </form>\n"
-"        "
+#: ../lib/advene/gui/main.py:311
+msgid "_Restart player"
+msgstr "_Reinicia reproductor"
 
-#: ../lib/advene/core/webcherry.py:859
-msgid "Access control"
-msgstr "Control de acceso"
+#: ../lib/advene/gui/main.py:311
+msgid "Restart the player"
+msgstr "Reiniciar el reproductor"
 
-#: ../lib/advene/core/webcherry.py:864
-msgid "Access control - add a hostname"
-msgstr "Control de acceso - Agrega un nombre de equipo"
+#: ../lib/advene/gui/main.py:312
+#, fuzzy
+msgid "Display _Media information"
+msgstr "Informacion Media"
 
-#: ../lib/advene/core/webcherry.py:872 ../lib/advene/core/webcherry.py:886
-#, python-format
-msgid "<strong>Error: %s is an invalid hostname.</strong>"
-msgstr "<strong>Error: %s es un hostname no valido.</strong>"
+#: ../lib/advene/gui/main.py:312
+#, fuzzy
+msgid "Display information about the current media"
+msgstr "Muestra información acerca de la media"
 
-#: ../lib/advene/core/webcherry.py:875
-#, python-format
-msgid "<p>Added %s to authorized hosts list.</p>"
-msgstr "<p>Añadido %s a la lista de hosts autorizados.</p>"
+#: ../lib/advene/gui/main.py:313
+msgid "Update annotation screenshots"
+msgstr "Actualizar las capturas de anotaciones"
 
-#: ../lib/advene/core/webcherry.py:881
-msgid "Access control - delete a hostname"
-msgstr "Control de acceso - Elimina un nombre de equipo"
+#: ../lib/advene/gui/main.py:313
+msgid "Update screenshots for annotation bounds"
+msgstr "Actualizar las capturas de los límites de anotación"
 
-#: ../lib/advene/core/webcherry.py:889
-msgid "<strong>Cannot remove the localhost access.</strong>"
-msgstr ""
-"<strong>No se puede remover el acceso al equipo local - localhost</strong>"
+#: ../lib/advene/gui/main.py:314
+msgid "Select the player plugin"
+msgstr "Selecciona el plugin del reproductor"
 
-#: ../lib/advene/core/webcherry.py:894
-#, python-format
-msgid "<p>Removed %s from authorized hosts list.</p>"
-msgstr "<p>Removido %s de la lista de hosts autorizados.</p>"
+#: ../lib/advene/gui/main.py:317
+msgid "No package"
+msgstr "No paquete"
 
-#: ../lib/advene/core/webcherry.py:896
-#, python-format
-msgid "<p>%s is not in authorized hosts list.</p>"
-msgstr "<p>%s no se encuentra en la lista de equipos autorizados.</p>"
+#: ../lib/advene/gui/main.py:319
+msgid "_Help"
+msgstr "_Ayuda"
 
-#: ../lib/advene/core/webcherry.py:945
-msgid "Server Administration"
-msgstr "Administracion del Servidor"
+#: ../lib/advene/gui/main.py:320
+msgid "Help"
+msgstr "Ayuda"
 
-#: ../lib/advene/core/webcherry.py:953
-#, python-format
-msgid ""
-"\n"
-"        <p><a href=\"/admin/access\">Update the access list</a></p>\n"
-"        <p><a href=\"/admin/methods\">List available TALES methods</a></p>\n"
-"        <p><a href=\"/action\">List available actions</a></p>\n"
-"        <p><a href=\"/admin/reset\">Reset the server</a></p>\n"
-"        <p><a href=\"/media\">Media control</a></p>\n"
-"        <p><a href=\"/application\">Display GUI status</a></p>\n"
-"        <p><a href=\"/admin/list\">List available files</a></p>\n"
-"        <p><a href=\"/packages\">List loaded packages</a> (%(packagelist)s)</"
-"p>\n"
-"        <p>Display mode : %(displaymode)s</p>\n"
-"        <hr>\n"
-"        <p>Load a package :\n"
-"        <form action=\"/admin/load\" method=\"GET\">\n"
-"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
-"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
-"        <input type=\"submit\" value=\"Load\" />\n"
-"        </form>\n"
-"        </body></html>\n"
-"        "
-msgstr ""
-"\n"
-"        <p><a href=\"/admin/access\">Actualizar la lista de acceso</a></p>\n"
-"        <p><a href=\"/admin/methods\">Lista de los métodos TALES "
-"disponibles</a></p>\n"
-"        <p><a href=\"/action\">Lista de acciones disponibles</a></p>\n"
-"        <p><a href=\"/admin/reset\">Restablecer el servidor</a></p>\n"
-"        <p><a href=\"/media\">Control de Medios</a></p>\n"
-"        <p><a href=\"/application\">Mostrar el estado de la interfaz gráfica "
-"de usuario</a></p>\n"
-"        <p><a href=\"/admin/list\">Lista los archivos disponibles</a></p>\n"
-"        <p><a href=\"/packages\">Lista los paquetes cargados</a> "
-"(%(packagelist)s)</p>\n"
-"        <p>Modo de visualización : %(displaymode)s</p>\n"
-"        <hr>\n"
-"        <p>Cargar un paquete :\n"
-"        <form action=\"/admin/load\" method=\"GET\">\n"
-"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
-"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
-"        <input type=\"submit\" value=\"Cargar\" />\n"
-"        </form>\n"
-"        </body></html>\n"
-"        "
+#: ../lib/advene/gui/main.py:321
+msgid "Get support"
+msgstr "Obtener soporte"
 
-#: ../lib/advene/core/webcherry.py:983
-msgid "Available files"
-msgstr "Archivos disponibles"
+#: ../lib/advene/gui/main.py:322
+msgid "Check for updates"
+msgstr "Revisar actualizaciones"
 
-#: ../lib/advene/core/webcherry.py:1009
-msgid "You should specify an alias"
-msgstr "Debes de especificar un alias"
+#: ../lib/advene/gui/main.py:323
+msgid "Display shortcuts"
+msgstr "Mostrar tomas"
 
-#: ../lib/advene/core/webcherry.py:1014
-msgid "You should specify an uri"
-msgstr "Debes de especificar una uri"
+#: ../lib/advene/gui/main.py:324
+msgid "Display logfile"
+msgstr "Mostrar bitácora (logfile)"
 
-#: ../lib/advene/core/webcherry.py:1020
-#, python-format
-msgid "Package %s loaded"
-msgstr "Paquete %s cargado"
+#: ../lib/advene/gui/main.py:324
+#, fuzzy
+msgid "Display log messages"
+msgstr "Muestra un mensaje"
 
-#: ../lib/advene/core/webcherry.py:1021 ../lib/advene/core/webcherry.py:1057
-#, python-format
+#: ../lib/advene/gui/main.py:325
+msgid "Open logfile folder"
+msgstr "Abrir archivo de bitácoras (logfile)"
+
+#: ../lib/advene/gui/main.py:325
 msgid ""
-"<p>Go to the <a href=\"/packages/%(alias)s\">%(alias)s</a> package, or to "
-"the <a href=\"/packages\">package list</a>."
+"Display logfile folder. It can help when sending the advene.log file by e-"
+"mail."
 msgstr ""
-"<p>Ir al <a href=\"/packages/%(alias)s\">%(alias)s</a> paquete o a la <a "
-"href=\"/packages\">lista de paquetes</a>."
+"Mostrar el folder de las bitácoras. Puede ser de ayuda cuando se mande el "
+"archivo advene.log por e-mail."
 
-#: ../lib/advene/core/webcherry.py:1024
-#, python-format
-msgid "<p>Cannot load package %(alias)s : %(error)s</p>"
-msgstr "<p>No se puede cargar el paquete %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:326
+msgid "_About"
+msgstr "_Acerca"
 
-#: ../lib/advene/core/webcherry.py:1035
-#, python-format
-msgid "Package %s deleted"
-msgstr "Paquete %s borrado"
+#: ../lib/advene/gui/main.py:352
+msgid "Open a package file"
+msgstr "Abre un archivo de paquete"
 
-#: ../lib/advene/core/webcherry.py:1036
-msgid "<p>Go to the <a href=\"/packages\">package list</a>."
-msgstr "<p>Ir a la<a href=\"/packages\">lista de paquetes</a>."
+#: ../lib/advene/gui/main.py:353
+msgid "Save the current package"
+msgstr "Guarda el paquete actual"
 
-#: ../lib/advene/core/webcherry.py:1039
-#, python-format
-msgid "<p>Cannot delete package %(alias)s : %(error)s</p>"
-msgstr "<p>No se puede borrar el paquete %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:354
+msgid "Save the package with a new name"
+msgstr "Guarda el paquete actual con un nuevo nombre"
 
-#: ../lib/advene/core/webcherry.py:1056
-#, python-format
-msgid "Package %s saved"
-msgstr "Paquete %s guardado"
+#: ../lib/advene/gui/main.py:355
+msgid "Select movie file..."
+msgstr "Seleccionar archivo de pelicula"
+
+#: ../lib/advene/gui/main.py:356
+msgid "Select DVD"
+msgstr "Selecciona DVD"
+
+#: ../lib/advene/gui/main.py:358
+#: ../lib/advene/gui/plugins/shotvalidation.py:260
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:810
+#: ../lib/advene/gui/edit/transcribe.py:1178
+msgid "Undo"
+msgstr "Deshacer"
+
+#: ../lib/advene/gui/main.py:360
+msgid "Create a text annotation"
+msgstr "Crear una anotación de texto"
+
+#: ../lib/advene/gui/main.py:361
+msgid "Create a graphical annotation"
+msgstr "Crear una anotación gráfica"
+
+#: ../lib/advene/gui/main.py:367
+msgid "List recently opened packages"
+msgstr "Listar los paquetes abiertos recientemente"
+
+#: ../lib/advene/gui/main.py:397
+msgid "Snapshotter activity"
+msgstr "Actividad de Snapshotter"
 
-#: ../lib/advene/core/webcherry.py:1060
+#: ../lib/advene/gui/main.py:399
 #, python-format
-msgid "<p>Cannot save package %(alias)s : %(error)s</p>"
-msgstr "<p>No se puede guardar el paquete %(alias)s : %(error)s</p>"
+msgid "%d queued requests"
+msgstr "%d peticiones en fila"
 
-#: ../lib/advene/core/webcherry.py:1070
-msgid "Server reset"
-msgstr "Reajuste del servidor (Reset)"
+#: ../lib/advene/gui/main.py:400
+msgid "Cancel all requests"
+msgstr "Cancelar todas las peticiones"
 
-#: ../lib/advene/core/webcherry.py:1076
-msgid "Available TALES methods"
-msgstr "Métodos TALES disponibles"
+#: ../lib/advene/gui/main.py:405
+msgid "No snapshotter"
+msgstr "No hay snapshotter"
 
-#: ../lib/advene/core/webcherry.py:1117
-msgid "Loaded package(s)"
-msgstr "Paquete(s) cargados"
+#: ../lib/advene/gui/main.py:427
+msgid "No snapshotting activity"
+msgstr "No hay actividad snapshotter"
+
+#: ../lib/advene/gui/main.py:431
+msgid "Snapshotting"
+msgstr "Snapshotteando"
+
+#: ../lib/advene/gui/main.py:447
+msgid "Display application log messages"
+msgstr "Mostrar los archivos de bitácora de la aplicación"
+
+#: ../lib/advene/gui/main.py:488
+msgid "Quicksearch lists"
+msgstr "Buscar rápidamente en listas"
+
+#: ../lib/advene/gui/main.py:494
+msgid "Please specify the lists of elements to be searched."
+msgstr "Por favor especifica las listas de elementos donde se va a buscar."
 
-#: ../lib/advene/core/webcherry.py:1119
+#: ../lib/advene/gui/main.py:513
+#, python-format
 msgid ""
-"\n"
-"        <h1>Loaded package(s)</h1>\n"
-"        <table border=\"1\" width=\"50%\">\n"
-"        <tr>\n"
-"        <th>Alias</th>\n"
-"        <th>Action</th>\n"
-"        <th>URI</th>\n"
-"        <th>Annotations</th>\n"
-"        </tr>\n"
-"        "
+"Searching on %s.\n"
+"Left click to launch the search, right-click to set the quicksearch options"
 msgstr ""
-"\n"
-"        <h1>Paquete(s) cargado(s)</h1>\n"
-"        <table border=\"1\" width=\"50%\">\n"
-"        <tr>\n"
-"        <th>Alias</th>\n"
-"        <th>Acción</th>\n"
-"        <th>URI</th>\n"
-"        <th>Anotaciones</th>\n"
-"        </tr>\n"
-"        "
+"Buscando en %s.\n"
+"Clic-izquierdo para lanzar la búsqueda, clic-derecho para establecer las "
+"opciones de búsqueda rápida"
 
-#: ../lib/advene/core/webcherry.py:1131
+#: ../lib/advene/gui/main.py:514
 #, python-format
-msgid ""
-"<tr>\n"
-"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
-"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
-"%(uri)s\">Reload</a>|<a href=\"/admin/delete?alias=%(alias)s\">Drop</a>|<a "
-"href=\"/admin/save?alias=%(alias)s\">Save</a></td>\n"
-"            <td>%(uri)s</td>\n"
-"            <td>%(size)d</td>\n"
-"            </tr>\n"
-"            "
-msgstr ""
-"<tr>\n"
-"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
-"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
-"%(uri)s\">Volver a cargar</a>|<a href=\"/admin/delete?alias=%(alias)s"
-"\">Tirar</a>|<a href=\"/admin/save?alias=%(alias)s\">Guardar</a></td>\n"
-"            <td>%(uri)s</td>\n"
-"            <td>%(size)d</td>\n"
-"            </tr>\n"
-"            "
+msgid "String to search in %s"
+msgstr "Cadena a buscar en %s"
 
-#: ../lib/advene/core/webcherry.py:1204 ../lib/advene/core/webcherry.py:1279
-#: ../lib/advene/core/webcherry.py:1288 ../lib/advene/core/webcherry.py:1296
-#: ../lib/advene/core/webcherry.py:1454 ../lib/advene/core/webcherry.py:1462
-#: ../lib/advene/core/webcherry.py:1470 ../lib/advene/core/webcherry.py:2032
-#: ../lib/advene/core/webcherry.py:2039
-msgid "Error"
-msgstr "Error"
+#: ../lib/advene/gui/main.py:527 ../lib/advene/gui/main.py:531
+msgid "Tracing : "
+msgstr "Rastreando :"
 
-#: ../lib/advene/core/webcherry.py:1205
-#, python-format
-msgid "The TALES expression %s is not valid."
-msgstr "La expresion TALES %s no es válida."
+#: ../lib/advene/gui/main.py:527
+msgid "off"
+msgstr "apagado"
 
-#: ../lib/advene/core/webcherry.py:1256
-msgid "Content mode not available on non-content data"
-msgstr "El modo de contenido no esta disponible en data sin contenido "
+#: ../lib/advene/gui/main.py:531
+msgid "on"
+msgstr "en"
 
-#: ../lib/advene/core/webcherry.py:1280 ../lib/advene/core/webcherry.py:1289
-#: ../lib/advene/core/webcherry.py:1297 ../lib/advene/core/webcherry.py:1317
-#: ../lib/advene/core/webcherry.py:1321 ../lib/advene/core/webcherry.py:1455
-#: ../lib/advene/core/webcherry.py:1463 ../lib/advene/core/webcherry.py:1471
-#: ../lib/advene/core/webcherry.py:1530 ../lib/advene/core/webcherry.py:1607
-#: ../lib/advene/core/webcherry.py:1727 ../lib/advene/core/webcherry.py:1777
-msgid "<h1>Error</h1>"
-msgstr "<h1>Error</h1>"
+#: ../lib/advene/gui/main.py:543
+#: ../lib/advene/gui/views/interactivequery.py:410
+msgid "String to search"
+msgstr "Texto a buscar"
 
-#: ../lib/advene/core/webcherry.py:1281 ../lib/advene/core/webcherry.py:1322
-#, python-format
-msgid ""
-"<p>There was an error in the template code.</p>\n"
-"                <p>Tag name: <strong>%(tagname)s</strong></p>\n"
-"                <p>Error message: <em>%(message)s</em></p>"
-msgstr ""
-"<p>Hubo un error en el código de la plantilla.</p>\n"
-"                <p>Nombre de la etiqueta: <strong>%(tagname)s</strong></p>\n"
-"                <p>Mensaje de error: <em>%(message)s</em></p>"
+#: ../lib/advene/gui/main.py:551
+msgid "Launch search"
+msgstr "Lanzar búsqueda"
 
-#: ../lib/advene/core/webcherry.py:1290
-#, python-format
-msgid ""
-"<p>An invalid character is in the Context:</p>\n"
-"                <p>Error message: <em>%(error)s</em></p><pre>%(message)s</"
-"pre>"
-msgstr ""
-"<p>Un carácter no válido está en el Contexto:</p>\n"
-"                <p>Mensaje de error: <em>%(error)s</em></p><pre>%(message)s</"
-"pre>"
+#: ../lib/advene/gui/main.py:556
+msgid "Ignore case"
+msgstr "Ignorar mayúsculas / minúsculas"
 
-#: ../lib/advene/core/webcherry.py:1298
-#, python-format
-msgid ""
-"<p>There was an error in the TALES expression.</p>\n"
-"                <pre>%s</pre>"
-msgstr ""
-"<p>Hubo un error en la expresion de TALES.</p>\n"
-"                <pre>%s</pre>"
+#: ../lib/advene/gui/main.py:561
+msgid "Searched elements"
+msgstr "Elementos buscados"
+
+#: ../lib/advene/gui/main.py:645
+msgid "Playing"
+msgstr "Reproduciendo"
+
+#: ../lib/advene/gui/main.py:646
+msgid "Pause"
+msgstr "Pausar"
+
+#: ../lib/advene/gui/main.py:647
+msgid "Init"
+msgstr "Inicio"
 
-#: ../lib/advene/core/webcherry.py:1318
+#: ../lib/advene/gui/main.py:648 ../lib/advene/gui/views/table.py:314
+#: ../lib/advene/gui/edit/elements.py:1809
+msgid "End"
+msgstr "Final"
+
+#: ../lib/advene/gui/main.py:649
+msgid "Undefined"
+msgstr "Sin definir"
+
+#: ../lib/advene/gui/main.py:660
 #, python-format
 msgid ""
-"<p>There was an error.</p>\n"
-"                <pre>%s</pre>"
+"Wrong player shortcut modifier %s in configuration. Fallback on Control."
 msgstr ""
-"<p>Hubo un error.</p>\n"
-"                <pre>%s</pre>"
 
-#: ../lib/advene/core/webcherry.py:1342
+#: ../lib/advene/gui/main.py:679
+#, fuzzy
+msgid "Exception in update_annotation"
+msgstr "Excepcion levantada en update_status: %s"
+
+#: ../lib/advene/gui/main.py:707
+#, fuzzy
+msgid "Exception in update_relation"
+msgstr "Excepción en la consulta: %s"
+
+#: ../lib/advene/gui/main.py:729
+#, fuzzy
+msgid "Exception in update_view"
+msgstr "Excepción en la consulta: %s"
+
+#: ../lib/advene/gui/main.py:758
+#, fuzzy
+msgid "Exception in update_query"
+msgstr "Excepción en la consulta: %s"
+
+#: ../lib/advene/gui/main.py:778
+#, fuzzy
+msgid "Exception in update_resource"
+msgstr "Excepción en la consulta: %s"
+
+#: ../lib/advene/gui/main.py:798
+#, fuzzy
+msgid "Exception in update_schema"
+msgstr "Excepcion levantada en update_status: %s"
+
+#: ../lib/advene/gui/main.py:818
+#, fuzzy
+msgid "Exception in update_annotationtype"
+msgstr "Exportar tipos de anotaciones %s"
+
+#: ../lib/advene/gui/main.py:845
+#, fuzzy
+msgid "Exception in update_relationtype"
+msgstr "Excepción en la consulta: %s"
+
+#: ../lib/advene/gui/main.py:951
+msgid "Enter the new time value"
+msgstr "Ingresa un nuevo valor de tiempo"
+
+#: ../lib/advene/gui/main.py:975
 #, python-format
-msgid ""
-"\n"
-"            <hr>\n"
-"            <p>\n"
-"            Location: %(location)s<br>\n"
-"            <form name=\"navigation\" method=\"GET\">\n"
-"            <a href=\"%(levelup)s\">Up one level</a> |\n"
-"            Next level :\n"
-"            <select name=\"path\" onchange=\"submit()\">\n"
-"            "
-msgstr ""
-"\n"
-"            <hr>\n"
-"            <p>\n"
-"            Ubicación: %(location)s<br>\n"
-"            <form name=\"navigation\" method=\"GET\">\n"
-"            <a href=\"%(levelup)s\">Un nivel arriba</a> |\n"
-"            Siguiente nivel :\n"
-"            <select name=\"path\" onchange=\"submit()\">\n"
-"            "
+msgid "Replace content in %d elements"
+msgstr "Reemplazar contenido en %d elementos"
 
-#: ../lib/advene/core/webcherry.py:1360
-msgid ""
-"\n"
-"            </select> View: <select name=\"view\" onchange=\"submit()\">\n"
-"            <option selected></option>\n"
-"            "
-msgstr ""
-"\n"
-"            </select> Vista: <select name=\"view\" onchange=\"submit()\">\n"
-"            <option selected></option>\n"
-"            "
+#: ../lib/advene/gui/main.py:988
+msgid "Find word"
+msgstr "Encontrar palabra"
+
+#: ../lib/advene/gui/main.py:995
+msgid "Replace by"
+msgstr "Reemplazar por"
 
-#: ../lib/advene/core/webcherry.py:1378
+#: ../lib/advene/gui/main.py:1023
 #, python-format
-msgid ""
-"<hr>\n"
-"            <p>Evaluating expression \"<strong>%(expression)s</strong>\" on "
-"package %(uri)s returns %(value)s</p>\n"
-"            "
+msgid "%(search)s has been replaced by %(replace)s in %(count)d element(s)."
 msgstr ""
-"<hr>\n"
-"            <p>Evaluando expresión \"<strong>%(expression)s</strong>\" en el "
-"paquete %(uri)s regresa %(value)s</p>\n"
-"            "
+"%(search)s ha sido reemplazado por %(replace)s en %(count)d elemento(s)."
 
-#: ../lib/advene/core/webcherry.py:1414
-#, python-format
-msgid "<p>Package <strong>%s</strong> not loaded</p>"
-msgstr "<p>Paquete <strong>%s</strong> no cargado</p>"
+#: ../lib/advene/gui/main.py:1032
+msgid "The video extracting feature is not available."
+msgstr "La característica de extracción de video no está disponible"
+
+#: ../lib/advene/gui/main.py:1035
+msgid "Video export"
+msgstr "Exportar video"
 
-#: ../lib/advene/core/webcherry.py:1456
+#: ../lib/advene/gui/main.py:1037
 #, python-format
+msgid "Exporting video montage/fragment to %%(filename)s"
+msgstr "Exportando el montaje de video  / fragmento a %%(filename)s"
+
+#: ../lib/advene/gui/main.py:1039
+msgid "Please choose a destination filename"
+msgstr "Por favor elige un nombre de archivo para el destino"
+
+#: ../lib/advene/gui/main.py:1117
 msgid ""
-"<p>There was an error in the template code.</p>\n"
-"            <p>Tag name: <strong>%(tagname)s</strong></p>\n"
-"            <p>Error message: <em>%(message)s</em></p>"
+"No media association is defined in the package. Please use the 'File/"
+"Associate a video file' menu item to associate a media file."
 msgstr ""
-"<p>Hubo un error en el código de la plantilla.</p>\n"
-"            <p>Nombre de la etiqueta: <strong>%(tagname)s</strong></p>\n"
-"            <p>Mensaje de error: <em>%(message)s</em></p>"
+"No se encontró una asociación medios definida en el paquete. Utiliza el "
+"elemento de menú 'Archivo / asociar un archivo de vídeo' para asociar un "
+"archivo multimedia."
 
-#: ../lib/advene/core/webcherry.py:1464
+#: ../lib/advene/gui/main.py:1119
 #, python-format
 msgid ""
-"<p>There was an error in the expression.</p>\n"
-"            <pre>%s</pre>"
+"The associated media %s could not be found. Please use the 'File/Associate a "
+"video file' menu item to associate a media file."
 msgstr ""
-"<p>Hubo un error en la expresion.</p>\n"
-"            <pre>%s</pre>"
+"Los medios asociados %s no se pudieron encontrar. Utiliza el elemento de "
+"menú 'Archivo / asociar un archivo de vídeo' para asociar un archivo "
+"multimedia."
 
-#: ../lib/advene/core/webcherry.py:1472
+#: ../lib/advene/gui/main.py:1121
 #, python-format
 msgid ""
-"<p>Cannot resolve TALES expression %(expr)s on package %(package)s<p><pre>\n"
-"            %(type)s\n"
-"            %(value)s\n"
-"            %(traceback)s</pre>"
+"You are now working with the following video:\n"
+"%s"
 msgstr ""
-"<p>No se puede resolver la expresión TALES %(expr)s en el paquete "
-"%(package)s<p><pre>\n"
-"            %(type)s\n"
-"            %(value)s\n"
-"            %(traceback)s</pre>"
+"Ahora estás trabajando con el siguiente video:\n"
+"%s"
 
-#: ../lib/advene/core/webcherry.py:1531 ../lib/advene/core/webcherry.py:1728
-msgid "<p>Cannot set the value : invalid path</p>"
-msgstr "<p>No puedo asignar el valor : ruta no valida</p>"
+#: ../lib/advene/gui/main.py:1217
+msgid "Open this view..."
+msgstr "Abrir esta vista..."
 
-#: ../lib/advene/core/webcherry.py:1593 ../lib/advene/core/webcherry.py:1846
-#, python-format
-msgid ""
-"<h1>Error</h1><p>When creating resource %(path)s, the resource folder "
-"%(folder)s could not be created.</p>"
-msgstr ""
-"<h1>Error</h1><p>Cuando se crea un recurso %(path)s, la carpeta del recurso "
-"%(folder)s no pudo ser creada.</p>"
+#: ../lib/advene/gui/main.py:1218 ../lib/advene/gui/plugins/actions.py:286
+#: ../lib/advene/gui/views/viewbook.py:130
+msgid "...in its own window"
+msgstr "...está en su ventana"
 
-#: ../lib/advene/core/webcherry.py:1602 ../lib/advene/core/webcherry.py:1856
-msgid "Resource successfuly created/updated"
-msgstr "Recurso se creó/actualizó satisfactoriamente"
+#: ../lib/advene/gui/main.py:1219 ../lib/advene/gui/plugins/actions.py:287
+#: ../lib/advene/gui/views/viewbook.py:131
+#: ../lib/advene/gui/views/__init__.py:398
+msgid "...embedded east of the video"
+msgstr "...embebido en el este del video"
 
-#: ../lib/advene/core/webcherry.py:1611
-msgid "Value successfuly updated"
-msgstr "Valor actualizado satisfactoriamente"
+#: ../lib/advene/gui/main.py:1220 ../lib/advene/gui/plugins/actions.py:288
+#: ../lib/advene/gui/views/viewbook.py:132
+#: ../lib/advene/gui/views/__init__.py:399
+msgid "...embedded west of the video"
+msgstr "...embebido en el oeste del video"
 
-#: ../lib/advene/core/webcherry.py:1613
-#, python-format
-msgid ""
-"Unable to update the attribute %(attribute)s for element %(element)s: "
-"%(error)s."
-msgstr ""
-"Incapaz de actualizar el atributo %(attribute)s para el elemento "
-"%(element)s: %(error)s."
+#: ../lib/advene/gui/main.py:1221 ../lib/advene/gui/plugins/actions.py:289
+#: ../lib/advene/gui/views/viewbook.py:133
+#: ../lib/advene/gui/views/__init__.py:400
+msgid "...embedded south of the video"
+msgstr "...embebido al sur del video"
 
-#: ../lib/advene/core/webcherry.py:1724
-msgid "<p>Invalid request</p>."
-msgstr "<p>Peticion no valida</p>."
+#: ../lib/advene/gui/main.py:1222 ../lib/advene/gui/plugins/actions.py:290
+#: ../lib/advene/gui/views/viewbook.py:134
+#: ../lib/advene/gui/views/__init__.py:401
+msgid "...embedded at the right of the window"
+msgstr "...embebido a la derecha de la ventana"
 
-#: ../lib/advene/core/webcherry.py:1788 ../lib/advene/core/webcherry.py:1805
-msgid "Value updated"
-msgstr "Valor actualizado"
+#: ../lib/advene/gui/main.py:1234
+msgid "_All available views"
+msgstr "Todas las vistas disponibles _A"
 
-#: ../lib/advene/core/webcherry.py:1789
-#, python-format
-msgid ""
-"\n"
-"                <h1>Value updated</h1>\n"
-"                The value of %(path)s has been updated to\n"
-"                <pre>\n"
-"                %(value)s\n"
-"                </pre>\n"
-"                "
-msgstr ""
-"\n"
-"                <h1>Valor actualizado</h1>\n"
-"                El valor de f %(path)s ha sido actualizado a\n"
-"                <pre>\n"
-"                %(value)s\n"
-"                </pre>\n"
-"                "
+#: ../lib/advene/gui/main.py:1250 ../lib/advene/gui/views/timeline.py:126
+msgid "Timeline"
+msgstr "Linea de tiempo"
 
-#: ../lib/advene/core/webcherry.py:1806
-#, python-format
-msgid ""
-"\n"
-"                    <h1>Value updated</h1>\n"
-"                    The value of %(path)s has been updated to\n"
-"                    <pre>\n"
-"                    %(value)s\n"
-"                    </pre>\n"
-"                    "
-msgstr ""
-"\n"
-"                    <h1>Valor actualizado</h1>\n"
-"                    El valor de %(path)s ha sido actualizado a\n"
-"                    <pre>\n"
-"                    %(value)s\n"
-"                    </pre>\n"
-"                    "
+#: ../lib/advene/gui/main.py:1251 ../lib/advene/gui/views/finder.py:808
+msgid "Package finder"
+msgstr "Buscador de paquetes"
 
-#: ../lib/advene/core/webcherry.py:1817
-#, python-format
-msgid ""
-"Malformed request: cannot update the value of %(attribute)s in %(tales)s."
-msgstr ""
-"Petición mal formada: no se puede actualizar el valor de %(attribute)s en "
-"%(tales)s."
+#: ../lib/advene/gui/main.py:1252
+msgid "Transcription of annotations"
+msgstr "Transcripción de las anotaciones"
 
-#: ../lib/advene/core/webcherry.py:1860
-msgid "Cannot create an element in something else than a package."
-msgstr "No se puede crear un elemento en algo distinto a un paquete."
+#: ../lib/advene/gui/main.py:1253
+#, fuzzy
+msgid "Annotation table"
+msgstr "Vista de tabla de las anotaciones"
 
-#: ../lib/advene/core/webcherry.py:1877
-#, python-format
-msgid "The identifier %s already exists."
-msgstr "El identificador %s ya existe."
+#: ../lib/advene/gui/main.py:1256
+msgid "Note-taking editor"
+msgstr "Editor para tomar notas"
 
-#: ../lib/advene/core/webcherry.py:1889
-#, python-format
-msgid "<p>Error while creating view %(id)s</p><pre>%(error)s</pre>"
-msgstr "<p>Error mientras se creaba la vista %(id)s</p><pre>%(error)s</pre>"
+#: ../lib/advene/gui/main.py:1257
+msgid "Active bookmarks"
+msgstr "Separadores activos"
 
-#: ../lib/advene/core/webcherry.py:1895
-msgid "View created"
-msgstr "Vista creada"
+#: ../lib/advene/gui/main.py:1260 ../lib/advene/gui/views/tagbag.py:57
+msgid "Bag of tags"
+msgstr "Bolsa de etiquetas"
 
-#: ../lib/advene/core/webcherry.py:1896
-#, python-format
-msgid ""
-"\n"
-"                 <h1>View <em>%(id)s</em> created</h1>\n"
-"                 <p>The view <a href=\"%(url)s\">%(id)s</a> was successfully "
-"created.</p>\n"
-"                 "
-msgstr ""
-"\n"
-"                 <h1>Vista <em>%(id)s</em> creada</h1>\n"
-"                 <p>La vista <a href=\"%(url)s\">%(id)s</a> se creó "
-"satisfactoriamente.</p>\n"
-"                 "
+#: ../lib/advene/gui/main.py:1261
+msgid "TALES explorer"
+msgstr "Explorador TALES"
 
-#: ../lib/advene/core/webcherry.py:1912
-#, python-format
-msgid "Missing %s parameter"
-msgstr "Parámetro %s faltante"
+#: ../lib/advene/gui/main.py:1262
+msgid "Dynamic montage"
+msgstr "Montaje dinámico"
 
-#: ../lib/advene/core/webcherry.py:1915
-#, python-format
-msgid "Relation type %s does not exist"
-msgstr "La relación del tipo %s no existe"
+#: ../lib/advene/gui/main.py:1263 ../lib/advene/gui/plugins/videoplayer.py:37
+msgid "Video player"
+msgstr "Reproductor de video"
 
-#: ../lib/advene/core/webcherry.py:1922 ../lib/advene/core/webcherry.py:1925
-#, python-format
-msgid "Annotation %s does not exist"
-msgstr "La anotación del tipo %s no existe"
+#: ../lib/advene/gui/main.py:1266
+msgid "Open a comment view in the web browser"
+msgstr "Abrir una vista de comentario en un navegador web"
 
-#: ../lib/advene/core/webcherry.py:1928
-#, python-format
-msgid ""
-"<p>Cannot create relation between %(member1)s and %(member2)s: invalid type</"
-"p>"
-msgstr ""
-"<p>No se puede crear una relación entre %(member1)s y %(member2)s: tipo no "
-"válido</p>"
+#: ../lib/advene/gui/main.py:1267
+msgid "Create or open a comment view"
+msgstr "Crear o abrir una vista de comentario"
 
-#: ../lib/advene/core/webcherry.py:1940
-#, python-format
+#: ../lib/advene/gui/main.py:1270
 msgid ""
-"<p>Error while creating relation between %(member1)s and %(member2)s :</"
-"p><pre>%(error)s</pre>"
+"Edit window placeholder (annotation and relation edit windows will be put "
+"here)"
 msgstr ""
-"<p>Error mientras se creaba una relación entre %(member1)s y %(member2)s :</"
-"p><pre>%(error)s</pre>"
-
-#: ../lib/advene/core/webcherry.py:1943
-msgid "Relation created"
-msgstr "Relación creada"
+"Editar ventana de marcador de posición (anotación y relaciones ventanas de "
+"edición se pondrán aquí)"
 
-#: ../lib/advene/core/webcherry.py:1944
-#, python-format
-msgid "<h1>Relation <em>%s</em> created</h1>"
-msgstr "<h1>La relación <em>%s</em> fue creada</h1>"
+#: ../lib/advene/gui/main.py:1271
+msgid "Display edition history"
+msgstr "Muestra el historial de edición"
 
-#: ../lib/advene/core/webcherry.py:1954
-#, python-format
-msgid "Annotation type %s does not exist"
-msgstr "La anotación del tipo %s no existe"
+#: ../lib/advene/gui/main.py:1300
+msgid "The webserver could not be started. Static views cannot be accessed."
+msgstr ""
+"El servidor web no pudo ser iniciarse. No se pueden acceder las vistas "
+"estáticas."
 
-#: ../lib/advene/core/webcherry.py:1971
-#, python-format
+#: ../lib/advene/gui/main.py:1381
+#, fuzzy, python-format
 msgid ""
-"<p>Error while creating annotation of type %(type)s :<pre>\n"
-"                    %(errortype)s\n"
-"                    %(value)s\n"
-"                    %(traceback)s</pre>"
+"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s has been "
+"released</b> on %(date)s, but you are running version %(current)s.\n"
+"You can download the latest version from the Advene website: http://advene."
+"org/</span>"
 msgstr ""
-"<p>Error mientras se creaba una anotación del tipo %(type)s :<pre>\n"
-"                    %(errortype)s\n"
-"                    %(value)s\n"
-"                    %(traceback)s</pre>"
+"<span background=\"#ff8888\" size=\"large\"><b>La versión %(version)s de "
+"Advene ha sido liberada</b> en %(date)s, pero estás utilizando la versión "
+"%(current)s.\n"
+"Puedes descargar la última versión del sitio web de Advene: http://liris."
+"cnrs.fr/advene/</span>"
 
-#: ../lib/advene/core/webcherry.py:1983
-#, python-format
-msgid "Annotation %s created"
-msgstr "Anotación %s creada"
+#: ../lib/advene/gui/main.py:1386
+msgid "Go to the website"
+msgstr "Ir al sitio web"
 
-#: ../lib/advene/core/webcherry.py:1985
-#, python-format
-msgid "Error: Cannot create an object of type %s."
-msgstr "Error: No se puede crear un objeto del tipo %s."
+#: ../lib/advene/gui/main.py:1392
+msgid "Advene release"
+msgstr "Liberación de Advene"
 
-#: ../lib/advene/core/webcherry.py:1988
+#: ../lib/advene/gui/main.py:1398
 #, python-format
-msgid ""
-"Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</"
-"code></p>"
+msgid "You are using a up-to-date version of Advene (%(current)s)."
 msgstr ""
-"Error: No se puede realizar la acción <em>%(action)s</em> en <code>"
-"%(object)s</code></p>"
+"Estás utilizando una versión actualizada de advene Advene (%(current)s)."
 
-#: ../lib/advene/core/webcherry.py:2001
-msgid "Available actions"
-msgstr "Acciones disponibles"
+#: ../lib/advene/gui/main.py:1398
+msgid "Advene is up-to-date"
+msgstr "Advene está actualizado"
 
-#: ../lib/advene/core/webcherry.py:2010
-#, python-format
-msgid "<li>%(name)s: %(value)s"
-msgstr "<li>%(name)s: %(value)s"
+#: ../lib/advene/gui/main.py:1412
+msgid "Choose a color"
+msgstr "Elige un color"
+
+#: ../lib/advene/gui/main.py:1444
+msgid "Select an annotation to loop on it"
+msgstr "Selecciona una anotación para hacer un ciclo en ella."
 
-#: ../lib/advene/core/webcherry.py:2033
+#: ../lib/advene/gui/main.py:1446
 #, python-format
-msgid "<p>Unknown action</p><pre>Action: %s</pre>"
-msgstr "<p>Acción desconocida</p><pre>Acción: %s</pre>"
+msgid "Looping on %s"
+msgstr "Ciclo en %s"
 
-#: ../lib/advene/core/webcherry.py:2040
-msgid "Missing parameter(s) :<ul>"
-msgstr "Parámetro(s) faltante(s):<ul>"
+#: ../lib/advene/gui/main.py:1516 ../lib/advene/gui/main.py:2443
+msgid "No active dynamic view"
+msgstr "No hay una vista dinámica activa"
 
-#: ../lib/advene/core/webcherry.py:2076
-msgid "Advene web resources"
-msgstr "Recursos web de Advene"
+#: ../lib/advene/gui/main.py:1527
+msgid "Create a new dynamic view."
+msgstr "Crear una nueva vista dinámica"
 
-#: ../lib/advene/core/webcherry.py:2082
-msgid "Advene webserver"
-msgstr "Servidor web de advene"
+#: ../lib/advene/gui/main.py:1546
+msgid "Edit the current dynamic view."
+msgstr "Editar la vista dinámica actual."
 
-#: ../lib/advene/core/webcherry.py:2083
-#, python-format
-msgid ""
-"<p>Welcome on the <a href=\"http://liris.cnrs.fr/advene/\">Advene</a> "
-"webserver run by %(userid)s on %(serveraddress)s.</p>"
-msgstr ""
-"<p>Bienvenido al servidor web <a href=\"http://liris.cnrs.fr/advene/"
-"\">Advene</a> ejecutado por %(userid)s en %(serveraddress)s.</p>"
+#: ../lib/advene/gui/main.py:1558
+msgid "No dynamic view"
+msgstr "No vista dinamica"
 
-#: ../lib/advene/core/webcherry.py:2090
-msgid ""
-" <p>No package is loaded. You can access the <a href=\"/admin\">server "
-"administration page</a>.<p>"
-msgstr ""
-" <p>No hay paquete cargado. Puedes accesar a la<a href=\"/admin\">pagina de "
-"administrador del servidor</a>.<p>"
+#: ../lib/advene/gui/main.py:1589
+msgid "Playing rate"
+msgstr "Tasa de reproducción"
 
-#: ../lib/advene/core/webcherry.py:2100
-#, python-format
+#: ../lib/advene/gui/main.py:1737
+msgid "History"
+msgstr "Historia"
+
+#: ../lib/advene/gui/main.py:1744
+msgid "Popups"
+msgstr "Popups"
+
+#: ../lib/advene/gui/main.py:1748
 msgid ""
-"the <a href=\"/packages/%(alias)s/view/%(view)s\">loaded package's default "
-"view</a>"
+"You can drag and drop view icons (timeline, treeview, transcription...) in "
+"notebooks to embed various views."
 msgstr ""
-"el <a href=\"/packages/%(alias)s/view/%(view)s\"> cargó la vista "
-"predeterminada del paquete</a>"
+"Puedes arrastrar y soltar iconos de vistas (línea de tiempo, vista de árbol, "
+"transcripción...) en los cuadernos de notas para embeber varias vistas."
 
-#: ../lib/advene/core/webcherry.py:2102
-#, python-format
-msgid "the <a href=\"/packages/%s\">loaded package's data</a>"
-msgstr "la <a href=\"/packages/%s\">informacion de los paquetes cargados</a>"
+#: ../lib/advene/gui/main.py:1748 ../lib/advene/gui/main.py:4123
+msgid "Information"
+msgstr "Información"
 
-#: ../lib/advene/core/webcherry.py:2104
-msgid "the <a href=\"/packages\">loaded packages' data</a>"
-msgstr "la <a href=\"/packages\">informacion de los paquetes cargados</a>"
+#: ../lib/advene/gui/main.py:2034
+msgid "Cannot create annotation. There is no schema to put it in."
+msgstr "No se puede crear la anotación. No hay esquema para ponerla dentro."
 
-#: ../lib/advene/core/webcherry.py:2105
-#, python-format
-msgid ""
-" <p>You can either access %s or the <a href=\"/admin\">server administration "
-"page</a>.<p>"
-msgstr ""
-" <p>Puedes accesar %s a a la <a href=\"/admin\">pagina del servidor de "
-"administracion</a>.<p>"
+#: ../lib/advene/gui/main.py:2043
+msgid "Default annotation type"
+msgstr "Tipo de anotación predeterminado"
 
-#: ../lib/advene/core/webcherry.py:2107
-#, python-format
-msgid ""
-"<hr><p align=\"right\"><em>Document generated by <a href=\"http://liris.cnrs."
-"fr/advene/\">Advene</a> v. %s.</em></p>"
-msgstr ""
-"<hr><p align=\"right\"><em>Documento generado por <a href=\"http://liris."
-"cnrs.fr/advene/\">Advene</a> v. %s.</em></p>"
+#: ../lib/advene/gui/main.py:2055
+msgid "Annotation created"
+msgstr "Anotación creada"
 
-#: ../lib/advene/core/webcherry.py:2189 ../lib/advene/core/webcherry.py:2198
-#, python-format
-msgid "Cannot start HTTP server: %s"
-msgstr "No se puede iniciar el servidor HTTP: %s"
+#: ../lib/advene/gui/main.py:2088
+msgid "Play/Pause [Control-Tab / Control-Space]"
+msgstr "Reproducir / Pausar [Control-Tab / Control-Espacio]"
 
-#: ../lib/advene/util/website_export.py:61
+#: ../lib/advene/gui/main.py:2092
 #, python-format
-msgid "%s exists but is not a directory. Cancelling website export"
-msgstr ""
-"%s existe pero no es un directorio. Cancelando la exportación a sitio web"
+msgid "Rewind (%.02f s) [Control-Left]"
+msgstr "Regresar (%.02f s) [Control-Left]"
 
-#: ../lib/advene/util/website_export.py:67
+#: ../lib/advene/gui/main.py:2096
 #, python-format
-msgid "%s does not exist"
-msgstr "%s no existe"
+msgid "Forward (%.02f s) [Control-Right]"
+msgstr "Adelantar (%.02f s) [Control-Right]"
 
-#: ../lib/advene/util/website_export.py:422
-msgid "Starting export"
-msgstr "Inicializando exportación"
+#: ../lib/advene/gui/main.py:2100
+msgid "Previous frame [Control-Down]"
+msgstr "Cuadro anterior [Control-Down]"
 
-#: ../lib/advene/util/website_export.py:451
-#, python-format
-msgid "Depth %d"
-msgstr "Profundidad %d"
+#: ../lib/advene/gui/main.py:2104
+msgid "Next frame [Control-Up]"
+msgstr "Cuadro siguiente [Control-Up]"
 
-#: ../lib/advene/util/website_export.py:455
-#, python-format
-msgid "Depth %(depth)d: processing %(url)s"
-msgstr "Profundidad %(depth)d: procesando %(url)s"
+#: ../lib/advene/gui/main.py:2108
+msgid "Fullscreen"
+msgstr "Pantalla completa"
 
-#: ../lib/advene/util/website_export.py:477
-msgid "Finalizing"
-msgstr "Finalizando"
+#: ../lib/advene/gui/main.py:2290
+#, python-format
+msgid "Screenshot saved to %s"
+msgstr "Captura guardada en %s"
 
-#: ../lib/advene/util/website_export.py:511
+#: ../lib/advene/gui/main.py:2292
 #, python-format
 msgid ""
-"<p><strong>You should probably begin at <a href=\"%(href)s\">%(title)s</a>.</"
-"strong></p>"
+"Screenshot saved in\n"
+" %s"
 msgstr ""
-"<p><strong>Deberías comenzar en<a href=\"%(href)s\">%(title)s</a>.</strong></"
-"p>"
-
-#: ../lib/advene/util/website_export.py:554
-msgid "Export complete"
-msgstr "Exportación completa"
-
-#: ../lib/advene/util/importer.py:134
-msgid "Generic importer"
-msgstr "Importador generico"
-
-#: ../lib/advene/util/importer.py:161
-msgid "Usage: %prog [options] source-file destination-file"
-msgstr "Uso: %prog [options] archivo-origen archivo-destino"
-
-#: ../lib/advene/util/importer.py:165
-msgid "Specify the offset in ms"
-msgstr "Especificar la compensacion en ms"
+"Captura de pantalla guardada en\n"
+" %s"
 
-#: ../lib/advene/util/importer.py:210
+#: ../lib/advene/gui/main.py:2294
+#, python-format
 msgid ""
-"Import filter error. The asynchronous API should be used, please report a "
-"bug."
+"Could not save screenshot:\n"
+" %s"
 msgstr ""
-"Error para importar filtro. El API asíncrono debería de ser utilizado, por "
-"favor reporta un bug."
+"No se pudo guardar la captura:\n"
+"%s"
 
-#: ../lib/advene/util/importer.py:212
-msgid ""
-"Import filter error. No conversion method is defined,  please report a bug."
-msgstr ""
-"Error para importar filtro. No está definido un método de conversión, por "
-"favor reporta un bug."
+#: ../lib/advene/gui/main.py:2302
+msgid "Save screenshot to..."
+msgstr "Guardar captura en..."
 
-#: ../lib/advene/util/importer.py:344
-#, python-format
-msgid "Converted from %s"
-msgstr "Convertido de %s"
+#: ../lib/advene/gui/main.py:2320
+msgid "Could not take snapshot with enough precision"
+msgstr "No se pudo realizar una captura de pantalla con demasiada precisión"
 
-#: ../lib/advene/util/importer.py:469
-msgid "ExternalApp importer"
-msgstr "Importador de ExternalApp"
+#: ../lib/advene/gui/main.py:2358
+msgid "Export package data"
+msgstr "Exportar los datos del paquete"
 
-#: ../lib/advene/util/importer.py:483
+#: ../lib/advene/gui/main.py:2360
 #, python-format
-msgid ""
-"The <b>%s</b> application does not seem to be installed. Please check that "
-"it is present and that its path is correctly specified in preferences."
-msgstr ""
-"La aplicación <b>%s</b> parece no estar instalada. Por favor revisa que esté "
-"presente y que su ruta (path) esté especificada de manera correcta en las "
-"preferencias."
+msgid "Export annotation type %s"
+msgstr "Exportar tipos de anotaciones %s"
 
-#: ../lib/advene/util/importer.py:485
+#: ../lib/advene/gui/main.py:2362
 #, python-format
-msgid "The file %s does not seem to exist."
-msgstr "El archivo %s parece no existir."
+msgid "Export element %s"
+msgstr "Exportar elemento %s"
 
-#: ../lib/advene/util/importer.py:507
-#, python-format
-msgid "Could not run %(appname)s: %(msg)s"
-msgstr "No se puede correr %(appname)s: %(msg)s"
+#: ../lib/advene/gui/main.py:2388
+msgid "Export format"
+msgstr "Exportar formato"
 
-#: ../lib/advene/util/importer.py:509
-#, python-format
-msgid "Processing %s"
-msgstr "Procesando  %s"
+#: ../lib/advene/gui/main.py:2425
+msgid " (modified)"
+msgstr "(modificado)"
 
-#: ../lib/advene/util/importer.py:513
-msgid "Cleaning up..."
-msgstr "Limpiando..."
+#: ../lib/advene/gui/main.py:2428
+#, python-format
+msgid "Activate %s"
+msgstr "Activar %s"
 
-#: ../lib/advene/util/importer.py:633
-msgid "Text importer"
-msgstr "Importador de texto"
+#: ../lib/advene/gui/main.py:2598
+msgid "Saved workspace"
+msgstr "Espacio de trabajo guardado"
 
-#: ../lib/advene/util/importer.py:646 ../lib/advene/util/importer.py:1176
-msgid "Specify the encoding of the input file (latin1, utf8...)"
-msgstr "Especifica la codificación del archivo de entrada (latin1, utf8...)"
+#: ../lib/advene/gui/main.py:2651
+msgid "Restoring workspace..."
+msgstr "Restableciendo espacio de trabajo..."
 
-#: ../lib/advene/util/importer.py:649
-msgid "Should the timestamps be encoded relative to the first timestamp?"
-msgstr ""
+#: ../lib/advene/gui/main.py:2657
+#, python-format
+msgid "Do you wish to restore the %s workspace ?"
+msgstr "¿Quieres restablecer el espacio de de trabajo %s?"
 
-#: ../lib/advene/util/importer.py:652
-msgid "Unit to consider for integers"
-msgstr ""
+#: ../lib/advene/gui/main.py:2662
+msgid "Clear the current workspace"
+msgstr "Limpiar el espacio de trabajo actual"
 
-#: ../lib/advene/util/importer.py:655
-msgid ""
-"What timestamps are present in a line (only begin, both begin and end, or "
-"automatic recognition)"
-msgstr ""
+#: ../lib/advene/gui/main.py:2683
+#, python-format
+msgid "View %s is not an adhoc view"
+msgstr "La vista %s no es una vista adhoc"
 
-#: ../lib/advene/util/importer.py:798
-msgid "lsdvd importer"
-msgstr "Importador lsdvd"
+#: ../lib/advene/gui/main.py:2694
+#, python-format
+msgid "Cannot identify the adhoc view %s"
+msgstr "No se puede identificar una vista adhoc %s"
 
-#: ../lib/advene/util/importer.py:825
-msgid "Processing data"
-msgstr "Procesando datos"
+#: ../lib/advene/gui/main.py:2708
+msgid "Choose the annotation type to display as transcription."
+msgstr "Elige el tipo de anotacion para mostrarlo como transcripcion."
 
-#: ../lib/advene/util/importer.py:843 ../lib/advene/util/importer.py:903
-msgid "DVD Chapter"
-msgstr "Capitulo de DVD"
+#: ../lib/advene/gui/main.py:2743
+#, fuzzy, python-format
+msgid "Error: unable to find an edit popup for %(element)s"
+msgstr "Error: incapaz de encontrar un edit popup para %s"
 
-#: ../lib/advene/util/importer.py:847
-msgid "Launching lsdvd..."
-msgstr "Lanzando lsdvd..."
+#: ../lib/advene/gui/main.py:2750
+#, python-format
+msgid "Editing %s"
+msgstr "Editando %s"
 
-#: ../lib/advene/util/importer.py:859
-msgid "chaplin importer"
-msgstr "Importador chaplin"
+#: ../lib/advene/gui/main.py:2762
+#, python-format
+msgid "Comment view (%s)"
+msgstr "Comentar vista (%s)"
 
-#: ../lib/advene/util/importer.py:917
-msgid "Xi importer"
-msgstr "Importador Xi"
+#: ../lib/advene/gui/main.py:2829
+#, python-format
+msgid "Package %(uri)s saved: %(annotations)s and %(relations)s."
+msgstr "Paquete %(uri)s guardado: %(annotations)s y %(relations)s."
 
-#: ../lib/advene/util/importer.py:986
-msgid "ELAN importer"
-msgstr "Importador ELAN"
+#: ../lib/advene/gui/main.py:2840
+#, python-format
+msgid "Activating package %s"
+msgstr "Activando paquete %s"
 
-#: ../lib/advene/util/importer.py:1039
+#: ../lib/advene/gui/main.py:2868
 #, python-format
-msgid "Converting tier %s"
-msgstr "Convirtiendo nivel %s"
+msgid "Package %(uri)s loaded: %(annotations)s and %(relations)s."
+msgstr "Paquete %(uri)s cargado: %(annotations)s y %(relations)s."
 
-#: ../lib/advene/util/importer.py:1140
-msgid "Processing time slots"
-msgstr "Procesando casillas de tiempo"
+#: ../lib/advene/gui/main.py:2900
+msgid "Do you want to restore the saved workspace ?"
+msgstr "¿Quieres restablecer el espacio de trabajo guardado?"
 
-#: ../lib/advene/util/importer.py:1155
-msgid "Fixing forward references"
-msgstr "Corrigiendo referencias siguientes"
+#: ../lib/advene/gui/main.py:2907
+msgid "Advene"
+msgstr "Advene"
 
-#: ../lib/advene/util/importer.py:1157
-msgid "Creating relations"
-msgstr "Creando relaciones"
+#: ../lib/advene/gui/main.py:2957
+#, fuzzy, python-format
+msgid "Video player error: %s"
+msgstr "Reproductor de video"
 
-#: ../lib/advene/util/importer.py:1169
-msgid "Subtitle (SRT) importer"
-msgstr "Importador de subtítulos (SRT)"
+#: ../lib/advene/gui/main.py:3137 ../lib/advene/gui/main.py:3158
+msgid "Unknown"
+msgstr "Desconocido"
 
-#: ../lib/advene/util/importer.py:1238
+#: ../lib/advene/gui/main.py:3228
 #, python-format
-msgid "Subtitles from %s"
-msgstr "Subtítulos de %s"
+msgid ""
+"The package(s) %s are modified.\n"
+"Save them now?"
+msgstr ""
+"Los paquete(s) %s están modificados.\n"
+"¿Guardar ahora?"
 
-#: ../lib/advene/util/importer.py:1251
-msgid "PRAAT importer"
-msgstr "Importador PRAAT"
+#: ../lib/advene/gui/main.py:3252
+#: ../lib/advene/gui/views/interactivequery.py:376
+msgid "Empty quicksearch string"
+msgstr "Limpiar cadena de texto de la búsqueda rápida"
 
-#: ../lib/advene/util/importer.py:1341
-msgid "CMML importer"
-msgstr "Importar CMML"
+#: ../lib/advene/gui/main.py:3255
+#: ../lib/advene/gui/views/interactivequery.py:281
+#, python-format
+msgid "'%s'"
+msgstr "'%s'"
 
-#: ../lib/advene/util/importer.py:1404
-msgid "Parsing clip information"
-msgstr "Analizando información de clip"
+#: ../lib/advene/gui/main.py:3270
+msgid "Choose an annotation type."
+msgstr "Elige un tipo de anotacion."
 
-#: ../lib/advene/util/importer.py:1501
-#: ../lib/advene/plugins/transcriber.py:254
-msgid "Creating package"
-msgstr "Creando paquete"
+#: ../lib/advene/gui/main.py:3289 ../lib/advene/gui/views/timeline.py:3035
+#: ../lib/advene/gui/edit/transcribe.py:994
+msgid "Create a new annotation type"
+msgstr "Crea un nuevo tipo de anotacion"
 
-#: ../lib/advene/util/importer.py:1504
-msgid "Creating CMML schema"
-msgstr "Creando esquema CMML"
+#: ../lib/advene/gui/main.py:3314
+msgid "No annotation type is defined."
+msgstr "No hay tipo de anotacion definido."
 
-#: ../lib/advene/util/importer.py:1508
-#: ../lib/advene/plugins/transcriber.py:260
-msgid "Creating annotation types"
-msgstr "Creando tipos de anotaciones"
+#: ../lib/advene/gui/main.py:3323
+msgid "Creating a new type."
+msgstr "Creando un nuevo tipo."
 
-#: ../lib/advene/util/importer.py:1514
-#: ../lib/advene/plugins/transcriber.py:265
-msgid "Parsing header information"
-msgstr "Analizando información del encabezado"
+#: ../lib/advene/gui/main.py:3327
+msgid "Title of the new type"
+msgstr "Título del nuevo tipo"
 
-#: ../lib/advene/util/importer.py:1528
-msgid "Parsing stream information"
-msgstr "Analizando flujo de información"
+#: ../lib/advene/gui/main.py:3328
+msgid ""
+"Id of the new type. It is generated from the title, but you may change it if "
+"necessary."
+msgstr ""
+"Id del nuevo tipo. Es generada del título,  pero la puedes cambiar si es "
+"necesario."
 
-#: ../lib/advene/util/importer.py:1562
-msgid "IRI importer"
-msgstr "Importar IRI"
+#: ../lib/advene/gui/main.py:3332
+msgid "Specify the content-type for the annotation type"
+msgstr "Especificar el tipo de contenido para el tipo de anotación"
 
-#: ../lib/advene/util/importer.py:1571
-msgid "Generate one type per view"
-msgstr "Genera un tipo por vista"
+#: ../lib/advene/gui/main.py:3334
+msgid "Content type"
+msgstr "Tipo de contenido"
 
-#: ../lib/advene/util/importer.py:1591
-#, python-format
-msgid "Parsing ensemble %s"
-msgstr "Analizando ensamble %s"
+#: ../lib/advene/gui/main.py:3341 ../lib/advene/gui/main.py:3450
+msgid "Create a new schema"
+msgstr "Crea un nuevo esquema."
 
-#: ../lib/advene/util/importer.py:1602
-#, python-format
-msgid "Parsing decoupage %s"
-msgstr "Analizando desacoplaje %s"
+#: ../lib/advene/gui/main.py:3354
+msgid "Choose an existing schema for the new type, or create a new one"
+msgstr "Elige un esquema existente para el nuevo tipo, o crea uno nuevo"
 
-#: ../lib/advene/util/importer.py:1638
-msgid "Parsing views"
-msgstr "Analizando vistas"
+#: ../lib/advene/gui/main.py:3357 ../lib/advene/gui/main.py:3465
+msgid "Specify the schema title"
+msgstr "Especifica el título del esquema"
 
-#: ../lib/advene/util/importer.py:1686 ../lib/advene/util/importer.py:1775
-msgid "Initializing package"
-msgstr "Inicializando paquete"
+#: ../lib/advene/gui/main.py:3361
+msgid "Title of the new schema"
+msgstr "Título del nuevo esquema"
 
-#: ../lib/advene/util/importer.py:1724
-msgid "IRIData importer"
-msgstr "Importador IRIData"
+#: ../lib/advene/gui/main.py:3362
+msgid ""
+"Id of the new schema. It is generated from the title, but you may change it "
+"if necessary."
+msgstr ""
+"Id del nuevo esquema. Es generado del título, pero lo puedes cambiar si es "
+"necesario."
 
-#: ../lib/advene/util/importer.py:1738
-msgid "Parsing sound values"
-msgstr "Analizando valores de sonido"
+#: ../lib/advene/gui/main.py:3385
+msgid ""
+"You specified a annotation-type identifier that already exists. Aborting."
+msgstr ""
+"Especificaste un identificador para el tipo de anotación que ya existe. "
+"Abortando"
 
-#: ../lib/advene/util/importer.py:1750
-msgid "Creating annotations"
-msgstr "Creando anotaciones"
-
-#: ../lib/advene/util/helper.py:402
-msgid "Package"
-msgstr "Paquete"
-
-#: ../lib/advene/util/helper.py:403
-msgid "Annotation"
-msgstr "Anotacion"
-
-#: ../lib/advene/util/helper.py:404
-msgid "Relation"
-msgstr "Relacion"
+#: ../lib/advene/gui/main.py:3403
+msgid "You specified a existing schema identifier. Using the existing schema."
+msgstr ""
+"Especificaste un identificador de esquema existente. Utilizando el esquema "
+"existente."
 
-#: ../lib/advene/util/helper.py:405 ../lib/advene/gui/edit/schemaeditor.py:111
-#: ../lib/advene/gui/main.py:276 ../lib/advene/gui/main.py:3270
-msgid "Schema"
-msgstr "Esquema"
+#: ../lib/advene/gui/main.py:3405
+msgid ""
+"You specified an existing identifier that does not reference a schema. "
+"Aborting."
+msgstr ""
+"Especificaste un identificador que no hace referencia a un esquema. "
+"Abortando."
 
-#: ../lib/advene/util/helper.py:406 ../lib/advene/gui/main.py:279
-msgid "Annotation Type"
-msgstr "Tipo de anotacion"
+#: ../lib/advene/gui/main.py:3432
+msgid "Choose a schema."
+msgstr "Elige un esquema."
 
-#: ../lib/advene/util/helper.py:407 ../lib/advene/gui/main.py:280
-msgid "Relation Type"
-msgstr "Tipo de relacion"
+#: ../lib/advene/gui/main.py:3492
+msgid "You specified an existing identifier. Aborting."
+msgstr "Especificaste un identificador existente. Abortando. "
 
-#: ../lib/advene/util/helper.py:408 ../lib/advene/rules/actions.py:236
-#: ../lib/advene/gui/edit/rules.py:1087 ../lib/advene/gui/main.py:277
-msgid "View"
-msgstr "Vista"
+#: ../lib/advene/gui/main.py:3512
+#, python-format
+msgid "Package %s modified"
+msgstr "Paquete %s modificado"
 
-#: ../lib/advene/util/helper.py:409 ../lib/advene/gui/main.py:278
-#: ../lib/advene/gui/popup.py:459
-msgid "Query"
-msgstr "Busqueda"
+#: ../lib/advene/gui/main.py:3513
+#, python-format
+msgid ""
+"The package %s has been modified but not saved.\n"
+"Save it now?"
+msgstr ""
+"El paquete %s ha sido modificado pero no guardado.\n"
+"¿Guardarlo ahora?"
 
-#: ../lib/advene/util/helper.py:410
-msgid "Resource Folder"
-msgstr "Folder de recursos"
+#: ../lib/advene/gui/main.py:3523
+#, python-format
+msgid "%s snapshots"
+msgstr "%s capturas de pantalla"
 
-#: ../lib/advene/util/helper.py:411 ../lib/advene/gui/edit/create.py:122
-msgid "Resource File"
-msgstr "Archivos de recursos"
+#: ../lib/advene/gui/main.py:3524
+#, python-format
+msgid "Do you want to save the snapshots for media %s?"
+msgstr "¿Quieres guardar las capturas de pantalla para los medios %s?"
 
-#: ../lib/advene/util/helper.py:446
-msgid "---- Elements ----"
-msgstr "---- Elementos ----"
+#: ../lib/advene/gui/main.py:3531 ../lib/advene/gui/main.py:3540
+#: ../lib/advene/gui/main.py:4541
+#, python-format
+msgid "Cannot save imagecache for %(media)s: %(e)s"
+msgstr "No se puede guardar imagecache para %(media)s: %(e)s"
 
-#: ../lib/advene/util/helper.py:452
-msgid "---- Attributes ----"
-msgstr "---- Atributos ----"
+#: ../lib/advene/gui/main.py:3554
+msgid "first frame"
+msgstr "Primer cuadro"
 
-#: ../lib/advene/util/helper.py:455
-msgid "---- Methods ----"
-msgstr "---- Metodos ----"
+#: ../lib/advene/gui/main.py:3555
+msgid "last frame"
+msgstr "último cuadro"
 
-#: ../lib/advene/util/helper.py:531
+#: ../lib/advene/gui/main.py:3563
 #, python-format
-msgid "Cannot read %(filename)s: %(error)s"
-msgstr "No se puede leer %(filename)s: %(error)s"
+msgid "Click on %(bound)s of %(annotation)s"
+msgstr "Clic en %(bound)s de %(annotation)s "
 
-#: ../lib/advene/util/helper.py:555
+#: ../lib/advene/gui/main.py:3566
 #, python-format
-msgid ""
-"Error:\n"
-"%s"
-msgstr ""
-"Error:\n"
-"%s"
+msgid "Update %(bound)s of %(annotation)s"
+msgstr "Actualizar %(bound)s de %(annotation)s"
 
-#: ../lib/advene/util/helper.py:565
-#, python-format
+#: ../lib/advene/gui/main.py:3585
+msgid "Click on the frame corresponding to the timestamp value"
+msgstr "Clic en el cuadro correspondiente al valor de la marca de tiempo"
+
+#: ../lib/advene/gui/main.py:3587
+msgid "Set new timestamp value"
+msgstr "Establece un nuevo valor para la estampa de tiempo"
+
+#: ../lib/advene/gui/main.py:3594
 msgid ""
-"Package %(title)s:\n"
-"%(schema)s\n"
-"%(annotation)s in %(annotation_type)s\n"
-"%(relation)s in %(relation_type)s\n"
-"%(query)s\n"
-"%(view)s\n"
+"<b>Annotation statistics</b>\n"
 "\n"
-"Description:\n"
-"%(description)s\n"
 msgstr ""
-"Paquete %(title)s:\n"
-"%(schema)s\n"
-"%(annotation)s in %(annotation_type)s\n"
-"%(relation)s in %(relation_type)s\n"
-"%(query)s\n"
-"%(view)s\n"
+"<b>Estadísticas de anotación</b>\n"
 "\n"
-"Descripción:\n"
-"%(description)s\n"
 
-#: ../lib/advene/util/helper.py:592
-#, fuzzy
-msgid "Min duration"
-msgstr "2s duración"
+#: ../lib/advene/gui/main.py:3666
+msgid "Text annotation"
+msgstr "Anotación de texto"
 
-#: ../lib/advene/util/helper.py:593
-#, fuzzy
-msgid "Max duration"
-msgstr "2s duración"
+#: ../lib/advene/gui/main.py:3674 ../lib/advene/gui/main.py:3699
+msgid "Cannot find an appropriate annotation type"
+msgstr "No se puede encontrar un tipo de anotación apropiado"
 
-#: ../lib/advene/util/helper.py:594
-#, fuzzy
-msgid "Mean duration"
-msgstr "2s duración"
+#: ../lib/advene/gui/main.py:3676 ../lib/advene/gui/views/bookmarks.py:293
+msgid "Comment here"
+msgstr "Comenta aquí"
 
-#: ../lib/advene/util/helper.py:595
-#, fuzzy
-msgid "Total duration"
-msgstr "Duración total"
+#: ../lib/advene/gui/main.py:3692
+msgid "Graphical annotation"
+msgstr "Anotación gráfica"
 
-#: ../lib/advene/util/helper.py:601
-msgid "schema"
-msgstr "esquema"
+#: ../lib/advene/gui/main.py:3744
+msgid ""
+"An unsaved template package exists\n"
+"Save it first."
+msgstr ""
+"Una plantilla de paquete sin guardar existe\n"
+"Guardala primero. "
 
-#: ../lib/advene/util/helper.py:601
-msgid "schemas"
-msgstr "esquemas"
+#: ../lib/advene/gui/main.py:3753
+msgid "Package modified"
+msgstr "Paquete modificado. "
 
-#: ../lib/advene/util/helper.py:602
-msgid "annotation"
-msgstr "anotacion"
+#: ../lib/advene/gui/main.py:3754
+msgid ""
+"The package that you want to close has been modified but not saved.\n"
+"Save it now?"
+msgstr ""
+"El paquete que quieres cerrar ha sido modificado pero no guardado.\n"
+"¿Guardarlo ahora?"
 
-#: ../lib/advene/util/helper.py:602
-msgid "annotations"
-msgstr "anotaciones"
+#: ../lib/advene/gui/main.py:3787
+msgid "Load a package"
+msgstr "Cargar un paquete."
 
-#: ../lib/advene/util/helper.py:603 ../lib/advene/util/helper.py:604
-msgid "annotation type"
-msgstr "tipo de anotacion"
+#: ../lib/advene/gui/main.py:3800
+msgid ""
+"A video file was selected. Pretend that the user selected 'Select a video "
+"file'..."
+msgstr ""
+"Un archivo de video fue seleccionado. Pretende que el usuario seleccionó "
+"'Selecciona un archivo de video...'"
 
-#: ../lib/advene/util/helper.py:603 ../lib/advene/util/helper.py:604
-msgid "annotation types"
-msgstr "tipos de anotaciones"
+#: ../lib/advene/gui/main.py:3805
+#, python-format
+msgid ""
+"The file %s does not look like a valid Advene package. It should have a .azp "
+"or .xml extension. Try to open anyway?"
+msgstr ""
+"El archivo %s no parece un paquete válido de Advene. Debería de tener una "
+"extensión .azp o .xml. ¿Intentar abrirlo de todas maneras?"
 
-#: ../lib/advene/util/helper.py:605
-msgid "relation"
-msgstr "relacion"
+#: ../lib/advene/gui/main.py:3814
+msgid ""
+"You are trying to load a session file, but there are unsaved packages. "
+"Proceed anyway?"
+msgstr ""
+"Estas intentando cargar un archivo de sesión, pero hay paquetes sin guardar. "
+"¿Proceder de cualquier manera?"
 
-#: ../lib/advene/util/helper.py:605
-msgid "relations"
-msgstr "relaciones"
+#: ../lib/advene/gui/main.py:3823
+#, python-format
+msgid ""
+"Cannot load package %(filename)s:\n"
+"%(error)s"
+msgstr ""
+"No se puede cargar el paquete %(filename)s:\n"
+"%(error)s"
 
-#: ../lib/advene/util/helper.py:606 ../lib/advene/util/helper.py:607
-msgid "relation type"
-msgstr "tipos de relacion"
+#: ../lib/advene/gui/main.py:3843 ../lib/advene/gui/main.py:3899
+msgid "Do you want to save the current workspace ?"
+msgstr "¿Quieres guardar el espacio de trabajo actual?"
 
-#: ../lib/advene/util/helper.py:606 ../lib/advene/util/helper.py:607
-msgid "relation types"
-msgstr "tipos de relaciones"
+#: ../lib/advene/gui/main.py:3858 ../lib/advene/gui/main.py:3914
+#, python-format
+msgid "Could not save the package: %s"
+msgstr "No se puede guardar el paquete: %s"
 
-#: ../lib/advene/util/helper.py:608
-msgid "query"
-msgstr "busqueda"
+#: ../lib/advene/gui/main.py:3871
+#, python-format
+msgid "Save the package %s"
+msgstr "Guardar el paquete %s"
 
-#: ../lib/advene/util/helper.py:608
-msgid "queries"
-msgstr "busquedas"
+#: ../lib/advene/gui/main.py:3884
+msgid "Invalid file extension"
+msgstr "Extensión de archivo no válida"
 
-#: ../lib/advene/util/helper.py:609
-msgid "view"
-msgstr "vista"
+#: ../lib/advene/gui/main.py:3885
+#, python-format
+msgid ""
+"Your package contains resources,\n"
+"the filename (%s) should have a .azp extension.\n"
+"Should I put the correct extension?"
+msgstr ""
+"Tu paquete contiene recursos,\n"
+"el nombre de archivo (%s) debe de tener una extensión .azp\n"
+"¿Debo incluir la extensión correcta?"
 
-#: ../lib/advene/util/helper.py:609
-msgid "views"
-msgstr "vistas"
+#: ../lib/advene/gui/main.py:3889
+msgid "OK, the resources will be lost."
+msgstr "Ok, los recursos se perderán."
 
-#: ../lib/advene/util/helper.py:610
-msgid "package"
-msgstr "paquete"
+#: ../lib/advene/gui/main.py:3891
+msgid "Aborting package saving"
+msgstr "Abortando el guardar paquete"
 
-#: ../lib/advene/util/helper.py:610
-msgid "packages"
-msgstr "paquetes"
+#: ../lib/advene/gui/main.py:3925
+msgid "Save the session in..."
+msgstr "Guardando la sesión en..."
 
-#: ../lib/advene/util/helper.py:622
+#: ../lib/advene/gui/main.py:3936
 #, python-format
-msgid "No %s"
-msgstr "No %s"
+msgid "Session saved in %s"
+msgstr "Sesión guardada en %s"
 
-#: ../lib/advene/util/helper.py:624
-#, python-format
-msgid "1 %s"
-msgstr "1 %s"
+#: ../lib/advene/gui/main.py:3945
+msgid "Do you confirm the creation of annotations matching the DVD chapters?"
+msgstr ""
+"¿Confirmas la creacion de anotaciones concordando con los capitulos del DVD?"
 
-#: ../lib/advene/util/helper.py:626
-#, python-format
-msgid "%(count)d %(plural)s"
-msgstr "%(count)d %(plural)s"
+#: ../lib/advene/gui/main.py:3951
+msgid "Cannot import DVD chapters. Did you install the lsdvd software?"
+msgstr ""
+"No se pueden importar los capítulos del DVD. ¿Instalaste el programa lsdvd?"
 
-#: ../lib/advene/plugins/cinelab.py:76
-msgid "Cinelab importer"
-msgstr "Importador Cinelab"
+#: ../lib/advene/gui/main.py:3959
+msgid "The associated media is not a DVD."
+msgstr "El medio asociado no es un DVD. "
 
-#: ../lib/advene/plugins/cinelab.py:119 ../lib/advene/plugins/cinelab.py:121
+#: ../lib/advene/gui/main.py:3970
 #, python-format
-msgid "File %s is not an Advene2 zip package."
-msgstr "El archivo %s no es un paquete Advene2 zip"
+msgid "Processing %s video"
+msgstr "Procesando %s video"
 
-#: ../lib/advene/plugins/cinelab.py:176
-msgid "Converting annotation types"
-msgstr "Convirtiendo tipos de anotación"
+#: ../lib/advene/gui/main.py:3973
+msgid "No associated video file"
+msgstr "No hay un archivo de video asociado"
 
-#: ../lib/advene/plugins/cinelab.py:217
-msgid "Converting views"
-msgstr "Convirtiendo vistas"
-
-#: ../lib/advene/plugins/cinelab.py:249
-#: ../lib/advene/plugins/youtubeannotations.py:72
-msgid "Importing annotations"
-msgstr "Importando anotaciones"
-
-#: ../lib/advene/plugins/shotdetectapp.py:41
-msgid "ShotdetectApp importer"
-msgstr "Importador de ShotdetectApp"
+#: ../lib/advene/gui/main.py:4000
+msgid "Standard RuleSet"
+msgstr "Conjunto de reglas estándar"
 
-#: ../lib/advene/plugins/shotdetectapp.py:52
+#: ../lib/advene/gui/main.py:4112
+#, python-format
 msgid ""
-"Sensitivity of the algorithm. It should typically be between 50 and 80. If "
-"too many shots are detected, try to increase its value."
+"Media information\n"
+"\n"
+"URI: %(uri)s\n"
+"Framerate: %(framerate_denom)d / %(framerate_num)d (%(framerate).02f )\n"
+"Duration: %(duration_formatted)s (%(duration)d ms) (cached: "
+"%(cached_duration_formatted)s)\n"
+"Current position: %(position_formatted)s (%(position)d ms)\n"
+"\n"
+"Original image size: %(width)d x %(height)d\n"
+"\n"
+"Image cache information: %(imagecache)s\n"
 msgstr ""
-"Sensibilidad del algoritmo. Generalmente debe de ser entre 50 y 80. Si se "
-"detectan muchas capturas, intenta incrementar su valor."
-
-#: ../lib/advene/plugins/shotdetectapp.py:80
-#: ../lib/advene/plugins/goodshotdetector.py:78
-msgid "Detected shots"
-msgstr "Capturas detectadas"
-
-#: ../lib/advene/plugins/shotdetectapp.py:140 ../lib/advene/gui/main.py:5130
-#, python-format
-msgid "Detected shot #%(num)d at %(pos)s "
-msgstr "Se detectó toma #%(num)d en %(pos)s "
-
-#: ../lib/advene/plugins/youtubeannotations.py:33
-#, fuzzy
-msgid "Youtube XML annotations importer"
-msgstr "Importador AnnotationGraph"
-
-#: ../lib/advene/plugins/brltty.py:62
-msgid "Input from the braille table."
-msgstr "Entrada de tabla de braille"
-
-#: ../lib/advene/plugins/brltty.py:66
-msgid "BrlTTY not installed. There will be no braille support."
-msgstr "BrlTTY no está instalado. No habrá soporte para braille."
 
-#: ../lib/advene/plugins/brltty.py:78
-msgid "Could not initialize BrlTTY. No braille support."
-msgstr "No se pudo inicializar BrlTTY. No hay soporte para braille. "
+#: ../lib/advene/gui/main.py:4137
+msgid "Visit the Advene web site for examples and documentation."
+msgstr "Visita el sitio web de Advene para ejemplos y documentación."
 
-#: ../lib/advene/plugins/brltty.py:84
-msgid "Display a message in Braille"
-msgstr "Muestra un mensaje en Braille"
+#: ../lib/advene/gui/main.py:4170 ../lib/advene/gui/main.py:4258
+msgid "Select a movie file"
+msgstr "Selecciona un archivo de pelicula"
 
-#: ../lib/advene/plugins/brltty.py:85
-msgid "Message to display."
-msgstr "Mensaje a mostrar"
+#: ../lib/advene/gui/main.py:4182
+msgid "Title/Chapter selection"
+msgstr "Selección de Titulo/Capitulo"
 
-#: ../lib/advene/plugins/brltty.py:88 ../lib/advene/plugins/tts.py:81
-#: ../lib/advene/rules/actions.py:40 ../lib/advene/rules/actions.py:107
-#: ../lib/advene/rules/actions.py:123 ../lib/advene/gui/plugins/actions.py:44
-#: ../lib/advene/gui/plugins/actions.py:58
-#: ../lib/advene/gui/plugins/actions.py:110
-#: ../lib/advene/gui/plugins/actions.py:399
-#: ../lib/advene/gui/plugins/actions.py:527
-#: ../lib/advene/gui/edit/rules.py:766
-msgid "The annotation content"
-msgstr "El contenido de la anotación "
+#: ../lib/advene/gui/main.py:4224
+msgid "Select a video stream"
+msgstr "Selecciona una corriente de video"
 
-#: ../lib/advene/plugins/brltty.py:240 ../lib/advene/plugins/tts.py:110
-#: ../lib/advene/gui/plugins/actions.py:234
-msgid "Unknown rule"
-msgstr "Regla desconocida"
+#: ../lib/advene/gui/main.py:4225
+msgid "Enter the address of a video stream"
+msgstr "Ingresa la dirección de una corriente de video"
 
-#: ../lib/advene/plugins/brltty.py:241 ../lib/advene/plugins/tts.py:111
-#: ../lib/advene/gui/plugins/actions.py:235
+#: ../lib/advene/gui/main.py:4229
 #, python-format
-msgid ""
-"Rule %(rulename)s: Error in the evaluation of the parameter "
-"%(parametername)s:"
+msgid "Successfully extracted the video stream address (%s) from the url.\n"
 msgstr ""
-"Regla %(rulename)s: Error en la evaluación del parámetro %(parametername)s:"
-
-#: ../lib/advene/plugins/brltty.py:256
-#, python-format
-msgid "BrlTTY connection error: %s"
-msgstr "Error de conexión BrlTTY: %s"
-
-#: ../lib/advene/plugins/brltty.py:273
-msgid "Braille display: "
-msgstr "Visualización braille: "
-
-#: ../lib/advene/plugins/brltty.py:279
-msgid "No message"
-msgstr "Sin mensaje"
+"Se extrajo la dirección de flujo de video satisfactoriamente (% s) a partir "
+"de la url.\n"
 
-#: ../lib/advene/plugins/goodshotdetector.py:45
-msgid "Shot detection (Delakis version)"
-msgstr "Detector de capturas (versión Delakis)"
+#: ../lib/advene/gui/main.py:4254
+msgid "Package properties"
+msgstr "Propiedades de paquete"
 
-#: ../lib/advene/plugins/goodshotdetector.py:60
-msgid "Cache histogram alongside video files."
-msgstr "Caché de histograma junto con archivos de vídeo."
+#: ../lib/advene/gui/main.py:4255 ../lib/advene/gui/edit/elements.py:516
+#: ../lib/advene/gui/edit/elements.py:565
+#: ../lib/advene/gui/edit/elements.py:652
+#: ../lib/advene/gui/edit/elements.py:732
+#: ../lib/advene/gui/edit/elements.py:789
+#: ../lib/advene/gui/edit/elements.py:881
+#: ../lib/advene/gui/edit/elements.py:950
+#: ../lib/advene/gui/edit/elements.py:1062
+#: ../lib/advene/gui/edit/elements.py:1124
+msgid "Author"
+msgstr "Autor"
 
-#: ../lib/advene/plugins/goodshotdetector.py:63
-msgid ""
-"Parameter profile: safe will detect less cuts, aggressive will detect more "
-"cuts (but more false ones too). default is a compromise."
-msgstr ""
-"Perfil de parámetro: seguro va a detectar menos cortes, agresivo va a "
-"detectar más cortes (pero más falsos positivos también). Predeterminado es "
-"un compromiso."
+#: ../lib/advene/gui/main.py:4255
+msgid "Author name"
+msgstr "Nombre de autor"
 
-#: ../lib/advene/plugins/goodshotdetector.py:77
-#, python-format
-msgid "Shot (%s profile)"
-msgstr "Captura (%s profile)"
+#: ../lib/advene/gui/main.py:4256 ../lib/advene/gui/edit/elements.py:517
+#: ../lib/advene/gui/edit/elements.py:566
+#: ../lib/advene/gui/edit/elements.py:653
+#: ../lib/advene/gui/edit/elements.py:733
+#: ../lib/advene/gui/edit/elements.py:790
+#: ../lib/advene/gui/edit/elements.py:882
+#: ../lib/advene/gui/edit/elements.py:951
+#: ../lib/advene/gui/edit/elements.py:1063
+#: ../lib/advene/gui/edit/elements.py:1125
+msgid "Date"
+msgstr "Fecha"
 
-#: ../lib/advene/plugins/goodshotdetector.py:83
-msgid "Loading histogram"
-msgstr "Cargando histograma"
+#: ../lib/advene/gui/main.py:4256
+msgid "Package creation date"
+msgstr "Fecha de creación del paquete"
 
-#: ../lib/advene/plugins/goodshotdetector.py:146
-msgid "Computing hdiff"
-msgstr "Calcular hdiff: %s"
+#: ../lib/advene/gui/main.py:4257 ../lib/advene/gui/views/table.py:681
+#: ../lib/advene/gui/util/dialog.py:391 ../lib/advene/gui/edit/imports.py:334
+#: ../lib/advene/gui/edit/dvdselect.py:75
+#: ../lib/advene/gui/edit/transcribe.py:1022
+msgid "Title"
+msgstr "Titulo"
 
-#: ../lib/advene/plugins/goodshotdetector.py:153
-msgid "Detecting cuts"
-msgstr "Detectando cortes"
+#: ../lib/advene/gui/main.py:4257
+msgid "Package title"
+msgstr "Título del paquete"
 
-#: ../lib/advene/plugins/goodshotdetector.py:180
-msgid "Detecting dissolves"
-msgstr "Detectando disoluciones"
+#: ../lib/advene/gui/main.py:4258
+msgid "Associated media"
+msgstr "Media asociada"
 
-#: ../lib/advene/plugins/goodshotdetector.py:265
-msgid "Extracting histogram"
-msgstr "Extrayendo histograma"
+#: ../lib/advene/gui/main.py:4259 ../lib/advene/gui/views/table.py:315
+msgid "Duration"
+msgstr "Duración"
 
-#: ../lib/advene/plugins/anvil.py:35
-msgid "Anvil importer"
-msgstr "Importador Anvil"
+#: ../lib/advene/gui/main.py:4259
+msgid "Media duration in ms"
+msgstr "Duración del medio en ms"
 
-#: ../lib/advene/plugins/annotationgraph.py:40
-msgid "AnnotationGraph importer"
-msgstr "Importador AnnotationGraph"
+#: ../lib/advene/gui/main.py:4259
+#: ../lib/advene/gui/plugins/eventaccumulator.py:143
+msgid "Reset"
+msgstr "Reestablecer"
 
-#: ../lib/advene/plugins/fcp.py:33
-msgid "Final Cut Pro XML importer"
-msgstr "Importar XML de Final Cut Pro"
+#: ../lib/advene/gui/main.py:4320 ../lib/advene/gui/views/timeline.py:3522
+#: ../lib/advene/gui/views/timeline.py:3677
+#: ../lib/advene/gui/views/tagbag.py:64
+#: ../lib/advene/gui/edit/properties.py:181
+#: ../lib/advene/gui/edit/transcribe.py:148
+#: ../lib/advene/gui/edit/transcribe.py:1162
+msgid "Preferences"
+msgstr "Preferencias"
 
-#: ../lib/advene/plugins/fcp.py:55
-msgid "FCP clipitem"
-msgstr "Item de clip de FCP"
+#: ../lib/advene/gui/main.py:4322
+msgid "Paths"
+msgstr "Rutas"
 
-#: ../lib/advene/plugins/fcp.py:75
-msgid "Importing subtitles"
-msgstr "Importando subtitulos"
+#: ../lib/advene/gui/main.py:4324
+msgid "Data"
+msgstr "Data"
 
-#: ../lib/advene/plugins/fcp.py:90
-msgid "Importing clips"
-msgstr "Importando clips"
+#: ../lib/advene/gui/main.py:4324
+msgid "Standard directory for data files"
+msgstr "Directorio estándar para archivos de datos"
 
-#: ../lib/advene/plugins/fcp.py:93
-msgid "No clip"
-msgstr "No hay clip"
+#: ../lib/advene/gui/main.py:4325
+msgid "Movie path"
+msgstr "Ruta de video"
 
-#: ../lib/advene/plugins/tracebuilder.py:219
+#: ../lib/advene/gui/main.py:4325
 #, python-format
-msgid "Cannot export to %(fname)s: %(e)s"
-msgstr "No se puede exportar a %(fname)s: %(e)s"
+msgid ""
+"List of directories (separated by %s) to search for movie files (_ means "
+"package directory)"
+msgstr ""
+"Lista de directorios (separados por %s) para buscar archivos de video (_ "
+"significa directorio de paquetes)"
 
-#: ../lib/advene/plugins/tracebuilder.py:1129
-#: ../lib/advene/plugins/tracebuilder.py:1168
-#, python-format
-msgid "Cannot export to %(host)s:%(port)s %(error)s"
-msgstr "No se puede exportar a %(host)s:%(port)s %(error)s"
+#: ../lib/advene/gui/main.py:4326
+msgid "Imagecache"
+msgstr "Caché de imagen"
 
-#: ../lib/advene/plugins/tracebuilder.py:1143
-#, python-format
-msgid "Cannot send data to %(host)s:%(port)s %(error)s"
-msgstr "No se pueden enviar los datos a %(host)s:%(port)s %(error)s"
+#: ../lib/advene/gui/main.py:4326
+msgid "Directory for storing the snapshot cache"
+msgstr "Directorio para almacenar la caché de la captura"
 
-#: ../lib/advene/plugins/tracebuilder.py:1191
-#, python-format
-msgid "Cannot send event %(nb)s to %(host)s:%(port)s %(error)s"
-msgstr "No se puede enviar evento %(nb)s a %(host)s:%(port)s %(error)s"
+#: ../lib/advene/gui/main.py:4327
+msgid "Player"
+msgstr "Reproductor"
 
-#: ../lib/advene/plugins/tracebuilder.py:1197
-#, python-format
-msgid "%(nb)s events sent to %(host)s:%(port)s during session."
-msgstr "%(nb)s eventos enviados a %(host)s:%(port)s durante la sesión."
+#: ../lib/advene/gui/main.py:4327
+msgid "Directory of the video player"
+msgstr "Directorio del reproductor de video"
 
-#: ../lib/advene/plugins/dcp.py:65
-msgid "DCP importer"
-msgstr "Importador DCP"
+#: ../lib/advene/gui/main.py:4328
+msgid "Shotdetect"
+msgstr "Shotdetect"
 
-#: ../lib/advene/plugins/dcp.py:120
-#, python-format
-msgid "Converting #%(num)d / %(count)d"
-msgstr "Convirtiendo #%(num)d / %(count)d"
+#: ../lib/advene/gui/main.py:4328
+msgid "Shotdetect application"
+msgstr "Aplicación shotdetect"
 
-#: ../lib/advene/plugins/ttl.py:41
-msgid "TurTLe (RDF) importer"
-msgstr "Importador TurTLe (RDF) "
+#: ../lib/advene/gui/main.py:4330
+msgid "GUI"
+msgstr "GUI"
 
-#: ../lib/advene/plugins/aeidon_import.py:48
-msgid "Aeidon (subtitles) importer"
-msgstr "Importador de subtítulos (Aeidon)"
+#: ../lib/advene/gui/main.py:4331
+msgid "Interface language (after restart)"
+msgstr "Idioma de la interfaz (después de reiniciar)"
 
-#: ../lib/advene/plugins/soundenveloppe.py:47
-#: ../lib/advene/plugins/soundenveloppe.py:143
-#: ../lib/advene/plugins/soundenveloppe.py:145
-msgid "Sound enveloppe"
-msgstr "Envolvente de sonido"
+#: ../lib/advene/gui/main.py:4331
+msgid ""
+"Language used for the interface (necessitates to restart the application)"
+msgstr "Idioma utilizado por la interfaz (necesita reiniciar la aplicación)"
 
-#: ../lib/advene/plugins/soundenveloppe.py:60
-msgid "Interval (in ms) at which to take samples."
-msgstr "Intervalo (en ms) de cuando tomar muestras."
+#: ../lib/advene/gui/main.py:4332 ../lib/advene/gui/util/initialconfig.py:88
+msgid "System default"
+msgstr "Predeterminado del sistema"
 
-#: ../lib/advene/plugins/soundenveloppe.py:63
-msgid "Maximum number of samples per annotation."
-msgstr "Número máximo de muestras por anotación"
+#: ../lib/advene/gui/main.py:4337
+msgid "Record activity trace"
+msgstr "Registrar la actividad de rastreo"
 
-#: ../lib/advene/plugins/soundenveloppe.py:66
-#: ../lib/advene/plugins/cutter.py:56
-msgid "Channel selection."
-msgstr "Selección de canal"
+#: ../lib/advene/gui/main.py:4338
+msgid "Expert mode"
+msgstr "Modo experto"
 
-#: ../lib/advene/plugins/soundenveloppe.py:90
-#: ../lib/advene/plugins/pocketsphinx.py:119
-#: ../lib/advene/plugins/barcode.py:58
-msgid "Generating annotations"
-msgstr "Generando anotaciones"
+#: ../lib/advene/gui/main.py:4338
+msgid "Offer advanced possibilities"
+msgstr "Ofrece posibilidades avanzadas"
 
-#: ../lib/advene/plugins/soundenveloppe.py:115
-#, python-format
-msgid "At %s"
-msgstr "En %s"
+#: ../lib/advene/gui/main.py:4339
+msgid "Prefer WYSIWYG"
+msgstr "Preferir WYSIWYG"
 
-#: ../lib/advene/plugins/soundenveloppe.py:162
-msgid "Extracting sound enveloppe"
-msgstr "Extrayendo envolvente sonido"
+#: ../lib/advene/gui/main.py:4339
+msgid "Use WYSIWYG editors when possible (HTML, SVG)"
+msgstr "Utilizar editores WYSIWYG cuando sea posible (HTML, SVG)"
 
-#: ../lib/advene/plugins/cutter.py:39
-msgid "Audio segmentation"
-msgstr "Segmentación de audio"
+#: ../lib/advene/gui/main.py:4340
+#, fuzzy
+msgid "Player control modifier"
+msgstr "Control del reproductor"
 
-#: ../lib/advene/plugins/cutter.py:53
-msgid "Volume threshold (in dB, can be negative) before trigger."
-msgstr "Umbral de volumen (en dB, puede ser negativa) antes de disparar."
+#: ../lib/advene/gui/main.py:4340
+msgid ""
+"Generic player control modifier: key used in combination with arrows/space/"
+"tab to control the player. Click the button and press key+space to choose "
+"the modifier."
+msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:101
-#, python-format
-msgid "Detected %(count)d segments until %(time)s"
-msgstr "Detectados %(count)d segmentos hasta %(time)s"
+#: ../lib/advene/gui/main.py:4341
+msgid "Player control in edit popups"
+msgstr "Control de reproductor en ventanas flotantes de edición"
 
-#: ../lib/advene/plugins/cutter.py:119
-msgid "Sound segment"
-msgstr "Segmentación de sonido "
-
-#: ../lib/advene/plugins/cutter.py:120
-#, python-format
+#: ../lib/advene/gui/main.py:4341
 msgid ""
-"Sound segmentation with a threshold of %(threshold)d dB - channel: "
-"%(channel)s"
+"Enable generic player controls in edit windows. This may be undesirable "
+"since it overloads some standard text-edition behaviours (esp. control-left/"
+"right)."
 msgstr ""
-"Segmentación con un umbral de %(threshold)d de sonido dB - canal: %(channel)s"
+"Habilitar controles de reproductor genéricos en las ventanas de edición. "
+"Esto puede ser indeseable, ya que sobrecarga algunos comportamientos de "
+"edición de texto estándar (esp. control-izquierda/derecha)."
 
-#: ../lib/advene/plugins/cutter.py:138
-msgid "Starting silence detection"
-msgstr "Iniciando detección de silencio"
+#: ../lib/advene/gui/main.py:4342
+msgid "Open popups"
+msgstr "Abrir ventanas flotantes"
 
-#: ../lib/advene/plugins/montagerenderer.py:43
-msgid "Cannot register montage renderer: Gnonlin plugins are not present."
-msgstr ""
-"No puede registrar representador (renderer) de montaje: Los plugins de "
-"Gnonlin no están presentes."
+#: ../lib/advene/gui/main.py:4343
+msgid "Where should we open adhoc views?"
+msgstr "¿Dónde debemos posicionar las vistas adhoc abiertas?"
 
-#: ../lib/advene/plugins/mpeg7.py:54
-msgid "MPEG7 importer"
-msgstr "Importador MPEG7"
+#: ../lib/advene/gui/main.py:4344
+msgid "as a popup window"
+msgstr "como una ventana flotante"
 
-#: ../lib/advene/plugins/transcriber.py:40
-msgid "Transcriber importer"
-msgstr "Importador de transcripciones"
+#: ../lib/advene/gui/main.py:4345
+msgid "embedded east of the video"
+msgstr "embeber este del video"
 
-#: ../lib/advene/plugins/transcriber.py:86
-msgid "Parsing section information"
-msgstr "Analizando sección de información"
+#: ../lib/advene/gui/main.py:4346
+msgid "embedded west of the video"
+msgstr "embeber oeste del video"
 
-#: ../lib/advene/plugins/transcriber.py:276
-msgid "Parsing topic and speaker tables information"
-msgstr "Analizando el tópico y la información de las tablas del presentador"
+#: ../lib/advene/gui/main.py:4347
+msgid "embedded south of the video"
+msgstr "embeber sur del video"
 
-#: ../lib/advene/plugins/featuredetect.py:42
-msgid "Feature detection (face...)"
-msgstr "Característica detección (rostro...)"
+#: ../lib/advene/gui/main.py:4348
+msgid "embedded at the right of the window"
+msgstr "embeber a la derecha de la ventana"
 
-#: ../lib/advene/plugins/featuredetect.py:57
-msgid "Sensitivity level."
-msgstr "Nivel de sensibilidad"
+#: ../lib/advene/gui/main.py:4351
+msgid "History size"
+msgstr "Tamaño del historial"
 
-#: ../lib/advene/plugins/featuredetect.py:60
-msgid ""
-"Scale. Original image size will be divided by this factor, in order to speed "
-"up detection."
-msgstr ""
-"Escala. La imagen original se va a dividir por este factor, para agilizar la "
-"detección. "
+#: ../lib/advene/gui/main.py:4351
+msgid "History filelist size limit"
+msgstr "Limite del tamaño de la lista de archivos del historial"
 
-#: ../lib/advene/plugins/featuredetect.py:63
-msgid "Classifier"
-msgstr "Clasificador"
+#: ../lib/advene/gui/main.py:4353
+msgid "Remember window size"
+msgstr "Recordar el tamaño de ventana"
 
-#: ../lib/advene/plugins/featuredetect.py:77
-#, python-format
-msgid "Feature %s"
-msgstr "Característica %s"
+#: ../lib/advene/gui/main.py:4353
+msgid "Remember the size of opened windows"
+msgstr "Recordar el tamaño de las ventanas abiertas"
 
-#: ../lib/advene/plugins/featuredetect.py:79
-#, python-format
-msgid "Detected %s"
-msgstr "Detectado %s"
+#: ../lib/advene/gui/main.py:4354
+msgid "Bookmark snapshot width"
+msgstr "Guardar en separador el ancho de la captura de pantalla"
 
-#: ../lib/advene/plugins/featuredetect.py:81
-msgid "Detection started"
-msgstr "Comenzó la detección"
+#: ../lib/advene/gui/main.py:4354
+msgid "Width of the snapshots representing bookmarks"
+msgstr "Ancho de las capturas que representan separadores"
 
-#: ../lib/advene/plugins/featuredetect.py:171
-#, python-format
-msgid "Detected %(count)d feature(s) until %(time)s"
-msgstr "Detectadas %(count)d característica(s) hasta %(time)s"
+#: ../lib/advene/gui/main.py:4355
+msgid "Bookmark snapshot precision"
+msgstr "Precisión de captura del separador"
 
-#: ../lib/advene/plugins/pocketsphinx.py:37
-msgid ""
-"Cannot register speech recognition: Pocketsphinx plugins not found. See "
-"http://cmusphinx.sourceforge.net/wiki/gstreamer for details."
+#: ../lib/advene/gui/main.py:4355
+msgid "Precision (in ms) of the displayed bookmark snapshots."
 msgstr ""
-"No se puede registrar el reconocimiento de voz: No se encontraron plugins de "
-"Pocketsphinx. Ver http://cmusphinx.sourceforge.net/wiki/gstreamer para "
-"obtener más detalles."
+"Precisión (en ms) de la visualización de las capturas de separadores "
+"mostrados"
 
-#: ../lib/advene/plugins/pocketsphinx.py:41
-msgid "Speech recognition (PocketSphinx)"
-msgstr "Reconocimiento de voz (PocketSphinx)"
+#: ../lib/advene/gui/main.py:4357
+msgid "Frame selector (shotvalidation...)"
+msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:61
-msgid "Filtering noise level [0..1]."
-msgstr "Nivel del filtro de ruido [0..1]."
+#: ../lib/advene/gui/main.py:4358
+#, fuzzy
+msgid "Frameselector snapshot width"
+msgstr "Guardar en separador el ancho de la captura de pantalla"
 
-#: ../lib/advene/plugins/pocketsphinx.py:65
-msgid ""
-"Minimum amount (in milliseconds) of silence required to terminate the "
-"current annotation and start a new one. Decreasing this length will result "
-"in a large amount of short annotations and increasing this length will "
-"result in a small amount of long annotations."
+#: ../lib/advene/gui/main.py:4358
+#, fuzzy
+msgid "Width of the snapshots in frameselector"
+msgstr "Ancho de las capturas que representan separadores"
+
+#: ../lib/advene/gui/main.py:4359
+msgid "Frameselector count"
 msgstr ""
-"Cantidad mínima (en milisegundos) de silencio requerido para terminar la "
-"anotación actual y comenzar una nueva. Disminuir esta longitud resultará en "
-"un gran cantidad de anotaciones cortas e incrementar esta longitud resultará "
-"en una menor cantidad de anotaciones largas."
 
-#: ../lib/advene/plugins/pocketsphinx.py:69
-msgid "Use default acoustic and language models."
-msgstr "Utiliza los modelos acústicos y de lenguaje predterminados. "
+#: ../lib/advene/gui/main.py:4359
+msgid "Number of frames displayed in frameselector."
+msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:73
-msgid "Acoustic model (directory)"
-msgstr "Modelo acústico (directorio). "
+#: ../lib/advene/gui/main.py:4361
+msgid "General"
+msgstr "General"
 
-#: ../lib/advene/plugins/pocketsphinx.py:77
-msgid "Phonetic dictionary (.dic file)"
-msgstr "Diccionario fonético (archivo .dic)"
+#: ../lib/advene/gui/main.py:4362
+msgid "Weekly update check"
+msgstr "Revisión semanal de actualización"
 
-#: ../lib/advene/plugins/pocketsphinx.py:81
-msgid "Language model (.DMP file)"
-msgstr "Modelo de lenguaje (archivo .DMP)"
+#: ../lib/advene/gui/main.py:4362 ../lib/advene/gui/util/initialconfig.py:90
+msgid "Weekly check for updates on the Advene website"
+msgstr "Revisión semanal de actualización en el sitio de Advene"
 
-#: ../lib/advene/plugins/pocketsphinx.py:144
-#: ../lib/advene/plugins/barcode.py:83
-#, python-format
-msgid "%(count)d utterances until %(time)s"
-msgstr "%(count)d declaraciones hasta %(time)s"
+#: ../lib/advene/gui/main.py:4363
+msgid "On exit,"
+msgstr "Al salir, "
 
-#: ../lib/advene/plugins/pocketsphinx.py:153
-msgid "Speech"
-msgstr "Voz"
+#: ../lib/advene/gui/main.py:4364
+msgid "How to handle screenshots on exit"
+msgstr "Como manejar capturas de pantalla al salir"
 
-#: ../lib/advene/plugins/pocketsphinx.py:155
-msgid "Recognized speech"
-msgstr "Reconocimiento de voz"
+#: ../lib/advene/gui/main.py:4365
+msgid "never save screenshots"
+msgstr "nunca guardar capturas de pantalla"
 
-#: ../lib/advene/plugins/pocketsphinx.py:191
-msgid "Recognizing speech"
-msgstr "Reconociendo voz"
+#: ../lib/advene/gui/main.py:4366
+msgid "always save screenshots"
+msgstr "siempre guardar capturas de pantalla"
 
-#: ../lib/advene/plugins/barcode.py:36
-#, fuzzy
-msgid "Cannot register barcode extraction: zbar plugin not found."
-msgstr ""
-"No puede registrar representador (renderer) de montaje: Los plugins de "
-"Gnonlin no están presentes."
+#: ../lib/advene/gui/main.py:4367
+msgid "ask before saving screenshots"
+msgstr "preguntar antes de guardar capturas de pantalla"
 
-#: ../lib/advene/plugins/barcode.py:40
-msgid "Barcode (qr-code) extraction"
-msgstr ""
+#: ../lib/advene/gui/main.py:4369
+msgid "Auto-save"
+msgstr "Guardado automático"
 
-#: ../lib/advene/plugins/barcode.py:95
-msgid "Barcode"
-msgstr ""
+#: ../lib/advene/gui/main.py:4370
+msgid "Data auto-save functionality"
+msgstr "Funcionalidad de guardado automático de datos"
 
-#: ../lib/advene/plugins/barcode.py:97
-#, fuzzy
-msgid "Extracted barcode information"
-msgstr "Informacion Media"
+#: ../lib/advene/gui/main.py:4371
+msgid "is desactivated"
+msgstr "es desactivado"
 
-#: ../lib/advene/plugins/barcode.py:115
-#, fuzzy
-msgid "Extraction barcodes"
-msgstr "Extrayendo %s"
+#: ../lib/advene/gui/main.py:4372
+msgid "is done automatically"
+msgstr "se realiza automáticamente"
 
-#: ../lib/advene/plugins/nerd_plugin.py:47
-msgid "NERD (Named Entity Recognition and Disambiguation)"
-msgstr ""
+#: ../lib/advene/gui/main.py:4373
+msgid "is done after confirmation"
+msgstr "se realiza después de la confirmación"
 
-#: ../lib/advene/plugins/nerd_plugin.py:68
-msgid "NERD API key"
-msgstr ""
+#: ../lib/advene/gui/main.py:4375
+msgid "Auto-save interval (in s)"
+msgstr "Intervalo del guardado automático (en s)"
 
-#: ../lib/advene/plugins/nerd_plugin.py:82
-msgid "NER service to use"
-msgstr ""
+#: ../lib/advene/gui/main.py:4375
+msgid "Interval (in seconds) between package auto-saves"
+msgstr "Intervalo (en segundos) entre cada guardado automático del paquete"
 
-#: ../lib/advene/plugins/nerd_plugin.py:88
-#, fuzzy
-msgid "Type of annotation to analyze"
-msgstr "El tipo de anotación"
+#: ../lib/advene/gui/main.py:4377
+msgid "Workspace"
+msgstr "Espacio de trabajo"
 
-#: ../lib/advene/plugins/nerd_plugin.py:93
-msgid "Language to analyze"
-msgstr ""
+#: ../lib/advene/gui/main.py:4379
+msgid "On package saving,"
+msgstr "Al guardar el paquete,"
 
-#: ../lib/advene/plugins/nerd_plugin.py:98
-msgid "Minimum confidence level (between 0.0 and 1.0)"
-msgstr ""
+#: ../lib/advene/gui/main.py:4380
+msgid "Do you wish to save the default workspace with the package?"
+msgstr "¿Deseas guardar el área de trabajo predeterminada con el paquete?"
 
-#: ../lib/advene/plugins/nerd_plugin.py:103
-#, fuzzy
-msgid "Interpolate position of annotations"
-msgstr "Transcripción de las anotaciones"
+#: ../lib/advene/gui/main.py:4381
+msgid "never save the current workspace"
+msgstr "nunca guardar el área de trabajo actual"
 
-#: ../lib/advene/plugins/nerd_plugin.py:108
-msgid "Split by entity type"
-msgstr ""
+#: ../lib/advene/gui/main.py:4382
+msgid "always save the current workspace"
+msgstr "siempre guardar el área de trabajo actual"
 
-#: ../lib/advene/plugins/nerd_plugin.py:113
-#, fuzzy
-msgid "Store results as markup in the annotation text"
-msgstr "Busca y reemplaza cadenas de texto en el contenido de las anotaciones"
+#: ../lib/advene/gui/main.py:4383
+msgid "ask before saving the current workspace"
+msgstr "preguntar antes de guardar el área de trabajo actual"
 
-#: ../lib/advene/plugins/nerd_plugin.py:118
+#: ../lib/advene/gui/main.py:4385
 #, fuzzy
-msgid "Create relations between the original annotations and the new ones"
-msgstr "Crea un tipo de relación entre este y..."
-
-#: ../lib/advene/plugins/nerd_plugin.py:150
-#, fuzzy, python-format
-msgid "NERD applied to %s"
-msgstr "Vista aplicada a %s\n"
+msgid "Auto-validation of edited elements"
+msgstr "Validación de la edición de un elemento"
 
-#: ../lib/advene/plugins/nerd_plugin.py:208
-#, python-format
-msgid "NERD %s"
+#: ../lib/advene/gui/main.py:4385
+msgid "Automatically validate modified elements when saving the package."
 msgstr ""
 
-#: ../lib/advene/plugins/ted.py:39
-msgid "TED importer"
-msgstr "Importador de TED"
+#: ../lib/advene/gui/main.py:4387
+msgid "On package load,"
+msgstr "En la carga del paquete,"
 
-#: ../lib/advene/plugins/shotdetect.py:35
-msgid "Shotdetect importer"
-msgstr "Importador de shotdetect"
+#: ../lib/advene/gui/main.py:4388
+msgid "Do you wish to load the workspace saved with the package?"
+msgstr "¿Deseas cargar el espacio de trabajo guardado con el paquete?"
 
-#: ../lib/advene/plugins/shotdetect.py:79
-msgid "No shots"
-msgstr "No hay capturas"
+#: ../lib/advene/gui/main.py:4389
+msgid "never load the saved workspace"
+msgstr "nunca cargar el espacio de trabajo guardado"
 
-#: ../lib/advene/plugins/tts.py:77
-msgid "Pronounce a text"
-msgstr "Pronuncia un texto"
+#: ../lib/advene/gui/main.py:4390
+msgid "always load the saved workspace"
+msgstr "siempre cargar el espacio de trabajo guardado"
 
-#: ../lib/advene/plugins/tts.py:78
-msgid "String to pronounce."
-msgstr "Texto a pronunciar"
+#: ../lib/advene/gui/main.py:4391
+msgid "ask before loading the saved workspace"
+msgstr "preguntar antes de cargar el espacio de trabajo guardado"
 
-#: ../lib/advene/plugins/tts.py:131 ../lib/advene/gui/plugins/actions.py:259
-#: ../lib/advene/gui/plugins/actions.py:340
-#: ../lib/advene/gui/plugins/actions.py:358
-msgid "No message..."
-msgstr "Sin mensaje..."
+#: ../lib/advene/gui/main.py:4394
+msgid "Video Player"
+msgstr "Configura reproductor"
 
-#: ../lib/advene/plugins/tts.py:156
-msgid "TTS disabled. Cannot find the application 'festival' in PATH"
-msgstr ""
-"TTS deshabilitado. No se puede encontrar la aplicación 'festival' en el PATH"
+#: ../lib/advene/gui/main.py:4395
+msgid "Autostart"
+msgstr "Autoinicio"
 
-#: ../lib/advene/plugins/tts.py:158
-msgid "TTS disabled. Cannot find the application 'aplay' in PATH"
+#: ../lib/advene/gui/main.py:4395
+msgid ""
+"Automatically start the player when loading a media file (either directly or "
+"through a package)"
 msgstr ""
-"TTS deshabilitado. No se puede encontrar la aplicación 'aplay' en el PATH"
+"Automáticamente iniciar el reproductor cuando se carga un archivo de media "
+"(ya sea directamente o utilizando un paquete)"
 
-#: ../lib/advene/player/gstreamer.py:434
-msgid "Cannot capture full-resolution snapshot, another capture is ongoing."
+#: ../lib/advene/gui/main.py:4396
+msgid "Fulscreen timestamp"
+msgstr "Marca de tiempo en pantalla completa"
+
+#: ../lib/advene/gui/main.py:4396
+msgid "Display the timestamp over the video when in fullscreen mode"
 msgstr ""
-"No se puede realizar una captura de pantalla de resolución completa, otra "
-"captura se está realizando. "
+"Mostrar la marca de tiempo sobre el video cuando está en modo pantalla "
+"completa"
 
-#: ../lib/advene/rules/importer.py:29
-msgid "Event history importer"
-msgstr "Importador de eventos históricos"
+#: ../lib/advene/gui/main.py:4397
+msgid "Enable captions"
+msgstr "Habilitar subtítulos"
 
-#: ../lib/advene/rules/actions.py:37 ../lib/advene/rules/actions.py:102
-#: ../lib/advene/rules/actions.py:120
-msgid "Message to display"
-msgstr "Mensaje a mostrar"
+#: ../lib/advene/gui/main.py:4397
+msgid "Enable captions over the video"
+msgstr "Habilitar subtítulos sobre el video"
 
-#: ../lib/advene/rules/actions.py:48
-msgid "Start the player"
-msgstr "Iniciar el reproductor"
+#: ../lib/advene/gui/main.py:4398
+msgid "Caption font"
+msgstr "Fuente de los subtítulos"
 
-#: ../lib/advene/rules/actions.py:49
-msgid "Start position (in ms)"
-msgstr "Posicion inicial (en ms)"
+#: ../lib/advene/gui/main.py:4398
+msgid "TrueType font for captions"
+msgstr "Fuente TrueType para etiquetas"
 
-#: ../lib/advene/rules/actions.py:52 ../lib/advene/rules/actions.py:384
-msgid "The movie start"
-msgstr "El inicio de la película"
+#: ../lib/advene/gui/main.py:4399
+msgid "Enable SVG"
+msgstr "Habilitar SVG"
 
-#: ../lib/advene/rules/actions.py:53 ../lib/advene/rules/actions.py:385
-msgid "The annotation begin"
-msgstr "El comienzo de la anotación"
+#: ../lib/advene/gui/main.py:4399
+msgid "Enable SVG captions over the video"
+msgstr "Habilitar etiquetas SVG sobre el video"
 
-#: ../lib/advene/rules/actions.py:54 ../lib/advene/rules/actions.py:386
-msgid "The annotation end"
-msgstr "El fin de la anotación"
+#: ../lib/advene/gui/main.py:4401
+msgid "Enable snapshots"
+msgstr "Habilitar captura de pantalla"
 
-#: ../lib/advene/rules/actions.py:63 ../lib/advene/gui/views/logwindow.py:129
-msgid "Go to the given position"
-msgstr "Ir a la posicion dada"
+#: ../lib/advene/gui/main.py:4402
+msgid "Snapshot width"
+msgstr "Ancho de captura de pantalla"
 
-#: ../lib/advene/rules/actions.py:64
-msgid "Goto position (in ms)"
-msgstr "Ir a la posicion (en ms)"
+#: ../lib/advene/gui/main.py:4402
+msgid "Snapshot width in pixels."
+msgstr "Ancho de captura de pantalla en pixeles."
 
-#: ../lib/advene/rules/actions.py:73
-msgid "Stop the player"
-msgstr "Detener el reproductor"
+#: ../lib/advene/gui/main.py:4403
+msgid "Verbosity"
+msgstr "Verbosidad"
 
-#: ../lib/advene/rules/actions.py:80
-msgid "Pause the player"
-msgstr "Pausar el reproductor"
+#: ../lib/advene/gui/main.py:4403
+msgid "Verbosity level. -1 for no messages."
+msgstr "Nivel de verbosidad: -1 para no mostrar mensajes."
 
-#: ../lib/advene/rules/actions.py:87
-msgid "Resume the player"
-msgstr "Continuar el reproductor"
+#: ../lib/advene/gui/main.py:4406
+msgid "Devices"
+msgstr "Dispositivos"
 
-#: ../lib/advene/rules/actions.py:94
-msgid "Take a snapshot"
-msgstr "Toma una fotografia"
+#: ../lib/advene/gui/main.py:4408
+msgid "Standard"
+msgstr "Estándar"
 
-#: ../lib/advene/rules/actions.py:101
-msgid "Display a caption"
-msgstr "Muestra un subtitulo"
+#: ../lib/advene/gui/main.py:4410
+msgid "DVD drive"
+msgstr "Lector DVD"
 
-#: ../lib/advene/rules/actions.py:103
-msgid "Duration of the caption"
-msgstr "Duracion del subtitulo"
+#: ../lib/advene/gui/main.py:4410
+msgid "Drive letter for the DVD"
+msgstr "Letra del lector para el DVD"
 
-#: ../lib/advene/rules/actions.py:110 ../lib/advene/rules/actions.py:172
-#: ../lib/advene/gui/plugins/actions.py:61
-#: ../lib/advene/gui/plugins/actions.py:121
-#: ../lib/advene/gui/plugins/actions.py:403
-#: ../lib/advene/gui/plugins/actions.py:538
-msgid "1 second"
-msgstr "1 segundo"
+#: ../lib/advene/gui/main.py:4411
+msgid "GDI"
+msgstr "GDI"
 
-#: ../lib/advene/rules/actions.py:111 ../lib/advene/rules/actions.py:173
-#: ../lib/advene/gui/plugins/actions.py:62
-#: ../lib/advene/gui/plugins/actions.py:122
-#: ../lib/advene/gui/plugins/actions.py:404
-#: ../lib/advene/gui/plugins/actions.py:539
-#: ../lib/advene/gui/edit/rules.py:773
-msgid "The annotation duration"
-msgstr "La duración de la anotación"
+#: ../lib/advene/gui/main.py:4412
+msgid "Direct X"
+msgstr "Direct X"
 
-#: ../lib/advene/rules/actions.py:119 ../lib/advene/gui/popup.py:718
-msgid "Caption the annotation"
-msgstr "Subtitular la anotación"
+#: ../lib/advene/gui/main.py:4414
+msgid "DVD device"
+msgstr "Dispositivo DVD"
 
-#: ../lib/advene/rules/actions.py:131
-msgid "Display a graphical shape"
-msgstr "Mostrar una forma gráfica"
+#: ../lib/advene/gui/main.py:4414
+msgid "Device for the DVD"
+msgstr "Dispositivo para el DVD"
 
-#: ../lib/advene/rules/actions.py:132
-msgid "Shape (square, circle, triangle)"
-msgstr "Forma (cuadro, círculo, triángulo)"
+#: ../lib/advene/gui/main.py:4415
+msgid "X11"
+msgstr "X11"
 
-#: ../lib/advene/rules/actions.py:133
-#: ../lib/advene/gui/edit/shapewidget.py:342
-#: ../lib/advene/gui/edit/elements.py:891
-#: ../lib/advene/gui/edit/elements.py:971
-#: ../lib/advene/gui/edit/elements.py:1085
-#: ../lib/advene/gui/views/tagbag.py:138
-msgid "Color"
-msgstr "Color"
+#: ../lib/advene/gui/main.py:4416
+msgid "XVideo"
+msgstr "XVideo"
 
-#: ../lib/advene/rules/actions.py:134
-msgid "x-position (percentage of screen)"
-msgstr "posicion-x (porcentaje de pantalla)"
+#: ../lib/advene/gui/main.py:4417
+msgid "GL"
+msgstr "GL"
 
-#: ../lib/advene/rules/actions.py:135
-msgid "y-position (percentage of screen)"
-msgstr "posicion-y (porcentaje de pantalla)"
+#: ../lib/advene/gui/main.py:4419
+msgid "Video output"
+msgstr "Salida de video"
 
-#: ../lib/advene/rules/actions.py:136
-msgid "Size (arbitrary units)"
-msgstr "Tamanio (unidades arbitrarias)"
+#: ../lib/advene/gui/main.py:4419
+msgid "Video output module"
+msgstr "Módulo de salida de video"
 
-#: ../lib/advene/rules/actions.py:137
-msgid "Duration of the display in ms"
-msgstr "Duración de la visualizacion en ms"
+#: ../lib/advene/gui/main.py:4421
+msgid "Recorder options"
+msgstr "Opciones de grabadora"
 
-#: ../lib/advene/rules/actions.py:145
-msgid "A square"
-msgstr "Un cuadrado"
+#: ../lib/advene/gui/main.py:4422
+msgid "Audio input"
+msgstr "Entrada de audio"
 
-#: ../lib/advene/rules/actions.py:146
-msgid "A circle"
-msgstr "Un círculo"
+#: ../lib/advene/gui/main.py:4422
+msgid "Device name for audio input (with gstrecorder plugin)"
+msgstr ""
+"Nombre del dispositivo para la entrada de audio (con el plugin gstrecorder)"
 
-#: ../lib/advene/rules/actions.py:147
-msgid "A triangle"
-msgstr "Un triángulo"
+#: ../lib/advene/gui/main.py:4423
+msgid "Record video"
+msgstr "Grabar video"
 
-#: ../lib/advene/rules/actions.py:150
-msgid "White"
-msgstr "Blanco"
+#: ../lib/advene/gui/main.py:4423
+msgid "Record both video and audio"
+msgstr "Grabar ambos video y audio"
 
-#: ../lib/advene/rules/actions.py:151
-msgid "Black"
-msgstr "Negro"
+#: ../lib/advene/gui/main.py:4426
+msgid "<i>Experimental</i>"
+msgstr "<i>Experimental</i>"
 
-#: ../lib/advene/rules/actions.py:152
-msgid "Red"
-msgstr "Rojo"
+#: ../lib/advene/gui/main.py:4427 ../lib/advene/gui/views/scroller.py:30
+msgid "Scroller"
+msgstr "Desplazador"
 
-#: ../lib/advene/rules/actions.py:153
-msgid "Green"
-msgstr "Verde"
+#: ../lib/advene/gui/main.py:4427
+msgid "Embed the caption scroller below the video"
+msgstr "Embeber el desplazamiento de subtítulos debajo del video"
 
-#: ../lib/advene/rules/actions.py:154
-msgid "Blue"
-msgstr "Azul"
+#: ../lib/advene/gui/main.py:4428 ../lib/advene/gui/views/caption.py:29
+msgid "Caption"
+msgstr "Subtítulos"
 
-#: ../lib/advene/rules/actions.py:155
-msgid "Yellow"
-msgstr "Amarillo"
+#: ../lib/advene/gui/main.py:4428
+msgid "Embed the caption view below the video"
+msgstr "Embeber la vista de subtítulos debajo del video"
 
-#: ../lib/advene/rules/actions.py:158
-msgid "At the top of the screen"
-msgstr "En la parte superior de la pantalla"
+#: ../lib/advene/gui/main.py:4430
+msgid "Time-related"
+msgstr "Relacionado con el tiempo"
 
-#: ../lib/advene/rules/actions.py:159 ../lib/advene/rules/actions.py:164
-msgid "In the middle of the screen"
-msgstr "A la mitad de la pantalla"
+#: ../lib/advene/gui/main.py:4431
+msgid "Time format"
+msgstr "Formato del tiempo"
 
-#: ../lib/advene/rules/actions.py:160
-msgid "At the bottom of the screen"
-msgstr "El fondo de la pantalla"
+#: ../lib/advene/gui/main.py:4431
+msgid "Format used to display timecodes"
+msgstr "Formato utilizado para mostrar códigos de tiempo"
 
-#: ../lib/advene/rules/actions.py:163
-msgid "At the left of the screen"
-msgstr "A la izquierda de la pantalla"
+#: ../lib/advene/gui/main.py:4445
+msgid "Default FPS"
+msgstr "FPS predeterminados"
 
-#: ../lib/advene/rules/actions.py:167
-#: ../lib/advene/gui/edit/transcribe.py:1164
-#: ../lib/advene/gui/views/activebookmarks.py:547
-msgid "Small"
-msgstr "Pequeño"
+#: ../lib/advene/gui/main.py:4446
+#, fuzzy
+msgid ""
+"Default FPS (frame-per-second) value, when the information cannot be read "
+"from the media."
+msgstr ""
+"Valor predeterminado FPS (cuadros por segundo), cuando se entra o se "
+"muestran las marcas de tiempo con números del marco."
 
-#: ../lib/advene/rules/actions.py:168
-#: ../lib/advene/gui/edit/transcribe.py:1165
-#: ../lib/advene/gui/views/activebookmarks.py:548
-msgid "Normal"
-msgstr "Normal"
+#: ../lib/advene/gui/main.py:4447
+msgid "Time increment"
+msgstr "Incremento del tiempo"
 
-#: ../lib/advene/rules/actions.py:169
-#: ../lib/advene/gui/edit/transcribe.py:1166
-#: ../lib/advene/gui/views/activebookmarks.py:549
-msgid "Large"
-msgstr "Grande"
+#: ../lib/advene/gui/main.py:4447
+msgid ""
+"Skip duration, when using control-left/right or forward/rewind buttons (in "
+"ms)."
+msgstr ""
+"Saltar duración, cuando se utiliza control-izquierda/derecha o avance / "
+"retroceso (en ms)."
 
-#: ../lib/advene/rules/actions.py:181
-msgid "Zero the volume during the annotation"
-msgstr "Volumen cero durante la anotacion"
+#: ../lib/advene/gui/main.py:4448
+msgid "Second time increment"
+msgstr "Incremento del segundo tiempo"
 
-#: ../lib/advene/rules/actions.py:188
-msgid "Zero the volume"
-msgstr "Volumen cero"
+#: ../lib/advene/gui/main.py:4448
+msgid "Skip duration, when using control-shift-left/right (in ms)."
+msgstr ""
+"Saltar duración, cuando se utiliza control-shift-izquierda/derecha (en ms)."
 
-#: ../lib/advene/rules/actions.py:195
-msgid "Restore the volume"
-msgstr "Restaurar el volumen"
+#: ../lib/advene/gui/main.py:4449
+msgid "Third time increment"
+msgstr "Incremento del tercer tiempo"
 
-#: ../lib/advene/rules/actions.py:203
-msgid "Activate a STBV"
-msgstr "Activar una STBV"
+#: ../lib/advene/gui/main.py:4449
+msgid "Skip duration, when using control-shift-up/down (in ms)."
+msgstr "Saltar duración, cuando se utiliza control-shift-arriba/abajo (en ms)."
 
-#: ../lib/advene/rules/actions.py:204
-msgid "STBV id"
-msgstr "STBV id"
+#: ../lib/advene/gui/main.py:4450
+msgid "Custom Up/Down"
+msgstr "Personalizar Arriba / Abajo"
 
-#: ../lib/advene/rules/actions.py:213
-msgid "Send a user event"
-msgstr "Mandar un evento de usuario"
+#: ../lib/advene/gui/main.py:4450
+msgid ""
+"Use third time increment for up/down navigation without having to hold shift."
+msgstr ""
+"Utilizar incremento de  tercer tiempo para la navegación hacia arriba / "
+"abajo sin tener que sostener shift."
 
-#: ../lib/advene/rules/actions.py:214
-msgid "Identifier"
-msgstr "Identificador"
+#: ../lib/advene/gui/main.py:4452
+msgid "Scroll increment"
+msgstr "Incremento del desplazamiento"
 
-#: ../lib/advene/rules/actions.py:215
-msgid "Delay in ms before sending the event."
-msgstr "Retraso en ms antes de enviar un evento."
+#: ../lib/advene/gui/main.py:4452
+msgid ""
+"On most annotations, control+scrollwheel will increment/decrement their "
+"bounds by this value (in ms)."
+msgstr ""
+"En la mayoría de las anotaciones, control + rueda de desplazamiento "
+"aumentará / disminuirá sus límites por este valor (en ms)."
 
-#: ../lib/advene/rules/actions.py:225
-msgid "Open a URL in the web browser"
-msgstr "Abrir un URL en un navegador web"
+#: ../lib/advene/gui/main.py:4453
+msgid "Second scroll increment"
+msgstr "Incremento del segundo desplazamiento"
 
-#: ../lib/advene/rules/actions.py:226 ../lib/advene/gui/plugins/actions.py:103
-#: ../lib/advene/gui/views/logwindow.py:159
-msgid "URL"
-msgstr "URL"
+#: ../lib/advene/gui/main.py:4453
+msgid ""
+"On most annotations, control+shift+scrollwheel will increment/decrement "
+"their bounds by this value (in ms)."
+msgstr ""
+"En la mayoría de las anotaciones, control + shift + scroll aumentará / "
+"disminuirá sus límites por este valor (en ms)."
 
-#: ../lib/advene/rules/actions.py:235
-msgid "Open a static view"
-msgstr "Abre una vista estática"
+#: ../lib/advene/gui/main.py:4455
+msgid "Player sync"
+msgstr "Sincronizar reproductor"
 
-#: ../lib/advene/rules/actions.py:246
-msgid "Set the audio volume"
-msgstr "Establece el volumen del audio"
+#: ../lib/advene/gui/main.py:4455
+msgid ""
+"Interval (in ms) with which we synchronize slave players. Setting a too-low "
+"value could render the application unusable. Use 0 to disable continuous "
+"synchronization."
+msgstr ""
+"Intervalo (en ms) por el cual vamos a sincronizar los reproductores "
+"esclavos. Establecer un valor demasiado bajo puede dejar la aplicación "
+"inutilizable. Utiliza 0 para deshabilitar la sincronización contínua."
 
-#: ../lib/advene/rules/actions.py:247
-msgid "Volume level (from 0 to 100)"
-msgstr "Nivel de volumen (de 0 a 100)"
+#: ../lib/advene/gui/main.py:4456
+msgid "Timeline parameters"
+msgstr "Parámetros de la línea del tiempo"
 
-#: ../lib/advene/rules/actions.py:256
-msgid "Set the playing rate"
-msgstr "Ajusta la velocidad de reproducción"
+#: ../lib/advene/gui/main.py:4457 ../lib/advene/gui/edit/transcribe.py:156
+msgid "Font size"
+msgstr "Tamaño de la fuente"
 
-#: ../lib/advene/rules/actions.py:257
-msgid "Rate (100: normal rate, 200: twice slower)"
-msgstr "Tarifa (100: tasa normal, 200: dos veces más lento)"
+#: ../lib/advene/gui/main.py:4457
+msgid "Font size for annotation widgets"
+msgstr "Tamaño de la fuente para los widgets de anotación"
 
-#: ../lib/advene/rules/actions.py:266
-msgid "Play a sound resource"
-msgstr "Reproducir un recurso de sonido"
+#: ../lib/advene/gui/main.py:4458
+msgid "Button height"
+msgstr "Altura de los botones"
 
-#: ../lib/advene/rules/actions.py:267
-msgid "Clip id"
-msgstr "Id del clip"
+#: ../lib/advene/gui/main.py:4458
+msgid "Height of annotation widgets"
+msgstr "Altura de los widgets de anotación"
 
-#: ../lib/advene/rules/actions.py:268 ../lib/advene/rules/actions.py:282
-msgid "Volume (0..100)"
-msgstr "Volumen (0..100)"
+#: ../lib/advene/gui/main.py:4459
+msgid "Interline height"
+msgstr "Algura del interlineado"
 
-#: ../lib/advene/rules/actions.py:269 ../lib/advene/rules/actions.py:283
-msgid "Left-right balance: -1 -> full left, 0 -> center, 1 -> full right"
-msgstr ""
-"Equilibrio izquierda-derecha: -1 -> totalmente a la izquierda, 0 -> centro, "
-"1 -> totalmente a la derecha"
+#: ../lib/advene/gui/main.py:4459
+msgid "Height of interlines"
+msgstr "Altura del interlineado"
 
-#: ../lib/advene/rules/actions.py:280
-msgid "Play a sound file"
-msgstr "Reproducir un archivo de sonido"
+#: ../lib/advene/gui/main.py:4461
+msgid "Text content"
+msgstr "Contenido de texto"
 
-#: ../lib/advene/rules/actions.py:281
-msgid "Sound filename"
-msgstr "Nombre del archivo de audio"
+#: ../lib/advene/gui/main.py:4462
+msgid "Completion mode"
+msgstr "Modo de terminación"
 
-#: ../lib/advene/rules/actions.py:293
-msgid "Set a state variable"
-msgstr "Establecer una variable de estado"
+#: ../lib/advene/gui/main.py:4462
+msgid "Enable dynamic completion mode"
+msgstr "Habilitar modo de terminación dinámico"
 
-#: ../lib/advene/rules/actions.py:294 ../lib/advene/rules/actions.py:306
-msgid "State variable name"
-msgstr "Nombre de variable de estado"
+#: ../lib/advene/gui/main.py:4463
+msgid "Predefined terms only"
+msgstr ""
 
-#: ../lib/advene/rules/actions.py:295
-msgid "State value"
-msgstr "Valor de estado"
+#: ../lib/advene/gui/main.py:4463
+msgid "If completion is enabled, complete only with predefined terms."
+msgstr ""
 
-#: ../lib/advene/rules/actions.py:305
-msgid "Increment a state variable"
-msgstr "Incrementar una variable de estado"
+#: ../lib/advene/gui/main.py:4464
+msgid "Abbreviation mode"
+msgstr "Modo de abreviación"
 
-#: ../lib/advene/rules/actions.py:315
-msgid "Clear all state variables"
-msgstr "Limpiar todas las variables de estado"
+#: ../lib/advene/gui/main.py:4464
+msgid "Enable abbreviation mode"
+msgstr "Habilitar modo de abreviación"
 
-#: ../lib/advene/rules/actions.py:330
-#, python-format
-msgid "Error in the evaluation of the parameter %s:"
-msgstr "Error en la evaluación del parametro %s:"
+#: ../lib/advene/gui/main.py:4465
+msgid "Abbreviations"
+msgstr "Abreviaciones"
 
-#: ../lib/advene/rules/actions.py:389 ../lib/advene/gui/plugins/actions.py:247
-#, python-format
-msgid "The %s-related outgoing annotation"
-msgstr "La relación saliente  %s-relacionada"
+#: ../lib/advene/gui/main.py:4465
+msgid ""
+"Text abbreviations. 1 entry per line. Each line consists of the abbreviation "
+"followed by its replacement."
+msgstr ""
+"Abreviaciones de texto. 1 entrada por línea. Cada línea consiste de la "
+"abreviación seguida de su reemplazo."
 
-#: ../lib/advene/rules/actions.py:391 ../lib/advene/gui/plugins/actions.py:249
-#, python-format
-msgid "The %s-related incoming annotation"
-msgstr "La relación entrante %s-relacionada"
+#: ../lib/advene/gui/main.py:4467
+msgid "Text-To-Speech"
+msgstr "Texto-a-voz"
 
-#: ../lib/advene/rules/actions.py:551
-#, python-format
-msgid "Cannot find the stbv %s"
-msgstr "No se puede encontrar el stbv %s"
+#: ../lib/advene/gui/main.py:4468
+msgid "TTS language"
+msgstr "Lenguaje TTS"
 
-#: ../lib/advene/rules/actions.py:615 ../lib/advene/gui/views/viewbook.py:263
-#, python-format
-msgid "Cannot find the view %s"
-msgstr "No se puede encontrar la vista %s"
+#: ../lib/advene/gui/main.py:4469
+msgid "What language settings should be used for text-to-speech"
+msgstr "Qué preferencias de lenguaje deben ser utilizadas para texto-a-voz"
 
-#: ../lib/advene/rules/actions.py:647
-msgid "The set_rate method is unavailable."
-msgstr "El método set_rate no está disponible"
+#: ../lib/advene/gui/main.py:4470
+msgid "English"
+msgstr "Inglés"
 
-#: ../lib/advene/rules/actions.py:657
-msgid "No 'soundclips' resource folder in the package"
-msgstr "No hay existe una carpeta de recursos de clips de audio en el paquete"
+#: ../lib/advene/gui/main.py:4471
+msgid "French"
+msgstr "Francés"
 
-#: ../lib/advene/rules/actions.py:683
-msgid "Full volume"
-msgstr "Volumen total "
+#: ../lib/advene/gui/main.py:4472
+msgid "Spanish"
+msgstr "Español"
 
-#: ../lib/advene/rules/actions.py:684
-msgid "Left"
-msgstr "Izquierda"
+#: ../lib/advene/gui/main.py:4474
+msgid "TTS Encoding"
+msgstr "Codificación TTS"
 
-#: ../lib/advene/rules/actions.py:685
-#: ../lib/advene/gui/edit/transcribe.py:1196
-msgid "Center"
-msgstr "Centrar"
+#: ../lib/advene/gui/main.py:4475
+msgid "What encoding should be used to communicate with the TTS engine"
+msgstr ""
+"Qué codificación debe ser utilizada para comunicarse con la máquina TTS"
 
-#: ../lib/advene/rules/actions.py:686
-msgid "Right"
-msgstr "Derecha"
+#: ../lib/advene/gui/main.py:4476
+msgid "TTS Engine"
+msgstr "Máquina TTS"
 
-#: ../lib/advene/rules/elements.py:141
-msgid "is equal to"
-msgstr "es igual a"
+#: ../lib/advene/gui/main.py:4477
+msgid ""
+"Which TTS engine should be used (modification requires restarting Advene to "
+"take into account)"
+msgstr ""
+"Cuál máquina TTS debe ser utilizada (la modificación requiere reiniciar "
+"Advene para tomarlo en cuenta)"
 
-#: ../lib/advene/rules/elements.py:142
-msgid "is different from"
-msgstr "es diferente de"
+#: ../lib/advene/gui/main.py:4478
+msgid "Automatic"
+msgstr "Automático"
 
-#: ../lib/advene/rules/elements.py:143
-msgid "contains"
-msgstr "contiene"
+#: ../lib/advene/gui/main.py:4479
+msgid "eSpeak"
+msgstr "eSpeak"
 
-#: ../lib/advene/rules/elements.py:144
-msgid "is greater than"
-msgstr "es mayor que"
+#: ../lib/advene/gui/main.py:4480
+msgid "Custom script with standard input"
+msgstr "Script personalizado con entrada estándar"
 
-#: ../lib/advene/rules/elements.py:145
-msgid "is lower than"
-msgstr "es menor que"
+#: ../lib/advene/gui/main.py:4481
+msgid "Custom script with arguments"
+msgstr "Script personalizado con argumentos"
 
-#: ../lib/advene/rules/elements.py:146
-msgid "matches the regexp"
-msgstr "concuerda la regexp"
+#: ../lib/advene/gui/main.py:4482
+msgid "SAPI"
+msgstr "SAPI"
 
-#: ../lib/advene/rules/elements.py:147
-msgid "is before"
-msgstr "esta antes"
+#: ../lib/advene/gui/main.py:4483
+msgid "MacOS X say"
+msgstr "MacOS X dice"
 
-#: ../lib/advene/rules/elements.py:148
-msgid "meets"
-msgstr "reune"
+#: ../lib/advene/gui/main.py:4484
+msgid "Generic (text output)"
+msgstr "Genérica (salida de texto)"
 
-#: ../lib/advene/rules/elements.py:149
-msgid "overlaps"
-msgstr "traslapa"
+#: ../lib/advene/gui/main.py:4530
+msgid "You should restart Advene to take some options into account."
+msgstr "Debes reiniciar Advene para tomar algunas opciones en cuenta. "
 
-#: ../lib/advene/rules/elements.py:150
-msgid "during"
-msgstr "dura"
+#: ../lib/advene/gui/main.py:4539
+#, python-format
+msgid "Imagecache saved to %s"
+msgstr "El cache de la imagen guardado en %s"
 
-#: ../lib/advene/rules/elements.py:151
-msgid "starts"
-msgstr "inicia"
+#: ../lib/advene/gui/main.py:4552
+msgid "Restarting player..."
+msgstr "Reiniciando el reproductor..."
 
-#: ../lib/advene/rules/elements.py:152
-msgid "finishes"
-msgstr "termina"
+#: ../lib/advene/gui/main.py:4647 ../lib/advene/gui/views/timeline.py:1121
+#: ../lib/advene/rules/elements.py:1010
+msgid "Creation of a new annotation type"
+msgstr "Creación de un nuevo tipo de anotacion"
 
-#: ../lib/advene/rules/elements.py:157
-msgid "is not true"
-msgstr "no es verdadero"
+#: ../lib/advene/gui/main.py:4655 ../lib/advene/gui/views/timeline.py:1150
+msgid ""
+"Select the schema where you want to\n"
+"create the new relation type."
+msgstr ""
+"Selecciona el esquema donde quieres\n"
+"crear un nuevo tipo de relación."
 
-#: ../lib/advene/rules/elements.py:158
-msgid "is true"
-msgstr "es verdadero"
+#: ../lib/advene/gui/main.py:4673
+msgid "Select the package to merge"
+msgstr "Selecciona el paquete a unir"
 
-#: ../lib/advene/rules/elements.py:162
-msgid "Basic conditions"
-msgstr "Condiciones basicas"
+#: ../lib/advene/gui/main.py:4694
+msgid "Saving workspace"
+msgstr "Guardando el espacio de trabajo"
 
-#: ../lib/advene/rules/elements.py:163
-msgid "Allen relations"
-msgstr "Relaciones Allen"
+#: ../lib/advene/gui/main.py:4697
+msgid "Enter a view name to save the workspace"
+msgstr "Ingresar el nombre de una vista para guardar el espacio de trabajo"
 
-#: ../lib/advene/rules/elements.py:226 ../lib/advene/rules/elements.py:232
-msgid "Unknown type for overlaps comparison"
-msgstr "Tipo desconocido traslapa la comparacion"
+#: ../lib/advene/gui/main.py:4698
+msgid "Default workspace"
+msgstr "Espacio de trabajo predeterminado"
 
-#: ../lib/advene/rules/elements.py:240 ../lib/advene/rules/elements.py:246
-msgid "Unknown type for during comparison"
-msgstr "Tipo desconocido durante la comparacion"
+#: ../lib/advene/gui/main.py:4699
+msgid "Open this workspace when opening the package"
+msgstr "Abrir este espacio de trabajo cuando se abra el paquete"
 
-#: ../lib/advene/rules/elements.py:515 ../lib/advene/rules/elements.py:521
+#: ../lib/advene/gui/main.py:4722 ../lib/advene/gui/views/__init__.py:305
 #, python-format
-msgid "Unknown action %s"
-msgstr "Acción desconocida %s"
+msgid "Error: the identifier %s contains invalid characters."
+msgstr "Error: el identificador %s contiene caracteres no válidos."
 
-#: ../lib/advene/rules/elements.py:522
+#: ../lib/advene/gui/main.py:4733
 #, python-format
-msgid "Unknown parameter %s"
-msgstr "Parámetro desconocido %s"
-
-#: ../lib/advene/rules/elements.py:527
-msgid "Unknown actions"
-msgstr "Acciones desconocidas"
+msgid "Error: the view %s exists and is not a workspace view."
+msgstr "Error: La vista %s existe y no es un espacio de trabajo. "
 
-#: ../lib/advene/rules/elements.py:972
-msgid "Start of the editing of an element"
-msgstr "Iniciar la edición de un elemento."
+#: ../lib/advene/gui/main.py:4764
+#, python-format
+msgid "Cannot save default workspace: %s"
+msgstr "No se puede guardar el espacio de trabajo predeterminado: %s"
 
-#: ../lib/advene/rules/elements.py:973
-msgid "Cancel of the editing of an element"
-msgstr "Cancelar la edición de un elemento"
+#: ../lib/advene/gui/main.py:4774
+msgid "Standard workspace has been saved"
+msgstr "El espacio de trabajo estándar ha sido guardado"
 
-#: ../lib/advene/rules/elements.py:974
-msgid "Destruction of the edit window of an element"
-msgstr "Destrucción de la ventana de edición de un elemento"
+#: ../lib/advene/gui/main.py:4781
+msgid "Website export"
+msgstr "Exportar a sitio web"
 
-#: ../lib/advene/rules/elements.py:975
-msgid "Validation of the editing of an element"
-msgstr "Validación de la edición de un elemento"
+#: ../lib/advene/gui/main.py:4782
+msgid "Exporting views to a website"
+msgstr "Exportar vistas a un sitio web"
 
-#: ../lib/advene/rules/elements.py:976
-msgid "Ending editing of a package"
-msgstr "Terminando la edicion de un paquete"
+#: ../lib/advene/gui/main.py:4785
+msgid "Output directory"
+msgstr "Directorio de salida"
 
-#: ../lib/advene/rules/elements.py:977
-msgid "Beginning of an annotation"
-msgstr "Principio de una anotacion"
+#: ../lib/advene/gui/main.py:4794
+msgid "Specify the output directory"
+msgstr "Especifica el directorio de salida"
 
-#: ../lib/advene/rules/elements.py:978
-msgid "End of an annotation"
-msgstr "Fin de una anotacion"
+#: ../lib/advene/gui/main.py:4803
+msgid "Maximum recursion depth"
+msgstr "Profundidad de recursión máxima"
 
-#: ../lib/advene/rules/elements.py:979
-msgid "Creation of a new annotation"
-msgstr "Creacion de una nueva anotacion"
+#: ../lib/advene/gui/main.py:4810
+msgid "Video URL"
+msgstr "URL del video"
 
-#: ../lib/advene/rules/elements.py:980
-msgid "Ending editing of an annotation"
-msgstr "Finalizando la edicion de una anotacion"
+#: ../lib/advene/gui/main.py:4812
+msgid ""
+"URL for the video, if it is available on a sharing website (Only Youtube for "
+"the moment).\n"
+" It can also be a h264/ogg file, which will in this case be handled by the "
+"HTML5 video player."
+msgstr ""
+"URL del video, si está disponible en un sitio web para compartir (únicamente "
+"Youtube por el momento).\n"
+"También puede ser un archivo h264/ogg, el cual en este caso será manejado "
+"por el reproductor de video de HTML5."
 
-#: ../lib/advene/rules/elements.py:981
-msgid "Suppression of an annotation"
-msgstr "Supresion de una anotacion"
+#: ../lib/advene/gui/main.py:4862
+msgid "Could not export data: "
+msgstr "No se pueden exportar los datos:"
 
-#: ../lib/advene/rules/elements.py:982
-msgid "Activation of an annotation"
-msgstr "Activacion de una anotacion"
+#: ../lib/advene/gui/main.py:4864
+#, python-format
+msgid "Website export to %s completed"
+msgstr "Exportar sitio web a %s completado"
 
-#: ../lib/advene/rules/elements.py:983
-msgid "Deactivation of an annotation"
-msgstr "Desactivacion de una anotacion"
+#: ../lib/advene/gui/main.py:4903
+msgid "This video player is not able to grab specific screenshots"
+msgstr ""
+"Este reproductor de video no es capaz de obtener capturas de pantalla "
+"específicas"
 
-#: ../lib/advene/rules/elements.py:984
-msgid "Merging of two annotations"
-msgstr "Uniendo dos anotaciones."
+#: ../lib/advene/gui/main.py:4909
+#, python-format
+msgid "Updating %d snapshots"
+msgstr "Actualiza %d capturas"
 
-#: ../lib/advene/rules/elements.py:985
-msgid "Moving an annotation"
-msgstr "Mover una anotación"
+#: ../lib/advene/gui/main.py:4914
+msgid "No snapshot to update"
+msgstr "No hay capturas para actualizar"
 
-#: ../lib/advene/rules/elements.py:986
-msgid "Activation of a relation"
-msgstr "Activacion de una relacion"
+#: ../lib/advene/gui/plugins/shotvalidation.py:37
+msgid "Shot validation view"
+msgstr "Vista de validación de capturas"
 
-#: ../lib/advene/rules/elements.py:987
-msgid "Deactivation of a relation"
-msgstr "Desactivacion de una relacion"
+#: ../lib/advene/gui/plugins/shotvalidation.py:39
+msgid "Display shot validation interface"
+msgstr "Muestra la interfaz de validación de capturas"
 
-#: ../lib/advene/rules/elements.py:988
-msgid "Creation of a new relation"
-msgstr "Creacion de una nueva relacion"
+#: ../lib/advene/gui/plugins/shotvalidation.py:115
+#, python-format
+msgid "Merged #%(first)d-#%(second)d into #%(first)d"
+msgstr "Unidos #%(first)d-#%(second)d en #%(first)d"
 
-#: ../lib/advene/rules/elements.py:989
-msgid "Ending editing of a relation"
-msgstr "Terminando de editar una relacion"
+#: ../lib/advene/gui/plugins/shotvalidation.py:145
+msgid "Last action undone"
+msgstr "Última acción deshecha"
 
-#: ../lib/advene/rules/elements.py:990
-msgid "Suppression of a relation"
-msgstr "Supresion de una relacion"
+#: ../lib/advene/gui/plugins/shotvalidation.py:163
+#, python-format
+msgid "Split annotation #%(current)d into #%(current)d and #%(next)d"
+msgstr "Dividir anotación #%(current)d en #%(current)d y #%(next)d"
 
-#: ../lib/advene/rules/elements.py:991
-msgid "Creation of a new view"
-msgstr "Creacion de una nueva vista"
+#: ../lib/advene/gui/plugins/shotvalidation.py:168
+#, python-format
+msgid "Cannot split annotation #%(current)d: out of bounds."
+msgstr "No se puede dividir la anotación #%(current)d: fuera de límite."
 
-#: ../lib/advene/rules/elements.py:992
-msgid "Ending editing of a view"
-msgstr "Terminando de editar una vista"
+#: ../lib/advene/gui/plugins/shotvalidation.py:188
+#, python-format
+msgid "Changed cut between #%(first)d and %(second)d"
+msgstr "Cambiar corte entre #%(first)d y %(second)d"
 
-#: ../lib/advene/rules/elements.py:993
-msgid "Suppression of a view"
-msgstr "Supresion de una vista"
+#: ../lib/advene/gui/plugins/shotvalidation.py:191
+msgid "Changed begin time for first annotation"
+msgstr "Tiempo de inicio cambiado para la primer anotación"
 
-#: ../lib/advene/rules/elements.py:994
-msgid "Creation of a new query"
-msgstr "Creación de una nueva busqueda"
+#: ../lib/advene/gui/plugins/shotvalidation.py:197
+msgid "No annotations to adjust"
+msgstr "No hay anotaciones para ajustar"
 
-#: ../lib/advene/rules/elements.py:995
-msgid "Ending editing of a query"
-msgstr "Terminando de editar una busqueda"
+#: ../lib/advene/gui/plugins/shotvalidation.py:204
+msgid ""
+"Click on the frame just after the cut to adjust the cut time.\n"
+"Control-click on a frame to indicate a missing cut."
+msgstr ""
+"Clic en el cuadro justo después del corte para ajustar el tiempo de corte.\n"
+"Control-clic en un cuadro para indicar un corte faltante."
 
-#: ../lib/advene/rules/elements.py:996
-msgid "Suppression of a query"
-msgstr "Supresion de una búsqueda"
+#: ../lib/advene/gui/plugins/shotvalidation.py:212
+#, python-format
+msgid "Begin of #%(index)d (title: %(content)s)"
+msgstr "Principio de #%(index)d (title: %(content)s)"
 
-#: ../lib/advene/rules/elements.py:997
-msgid "Creation of a new schema"
-msgstr "Creacion de un nuevo esquema"
+#: ../lib/advene/gui/plugins/shotvalidation.py:226
+msgid "< Previous cut"
+msgstr "< Corte anterior"
 
-#: ../lib/advene/rules/elements.py:998
-msgid "Ending editing of a schema"
-msgstr "Terminando de editar un esquema"
+#: ../lib/advene/gui/plugins/shotvalidation.py:227
+msgid "Display previous cut"
+msgstr "Muestra el corte anterior"
 
-#: ../lib/advene/rules/elements.py:999
-msgid "Suppression of a schema"
-msgstr "Supresion de un esquema"
+#: ../lib/advene/gui/plugins/shotvalidation.py:234
+msgid "Next cut >"
+msgstr "Corte siguiente >"
 
-#: ../lib/advene/rules/elements.py:1000
-#: ../lib/advene/gui/views/timeline.py:1029 ../lib/advene/gui/main.py:4555
-msgid "Creation of a new annotation type"
-msgstr "Creación de un nuevo tipo de anotacion"
+#: ../lib/advene/gui/plugins/shotvalidation.py:235
+msgid "Display next cut"
+msgstr "Muestra el corte siguiente"
 
-#: ../lib/advene/rules/elements.py:1001
-msgid "Ending editing an annotation type"
-msgstr "Terminando de editar un tipo de anotacion"
+#: ../lib/advene/gui/plugins/shotvalidation.py:250
+#: ../lib/advene/gui/views/annotationdisplay.py:92
+#: ../lib/advene/gui/views/timeline.py:86
+msgid "Current time"
+msgstr "Tiempo actual"
 
-#: ../lib/advene/rules/elements.py:1002
-msgid "Suppression of an annotation type"
-msgstr "Supresión de un tipo de anotacion"
+#: ../lib/advene/gui/plugins/shotvalidation.py:251
+msgid "Go to annotation containing current player time."
+msgstr "Ir a la anotación que contiene el tiempo actual del reproductor."
 
-#: ../lib/advene/rules/elements.py:1003
-msgid "Creation of a new relation type"
-msgstr "Creación de un nuevo tipo de relacion"
+#: ../lib/advene/gui/plugins/shotvalidation.py:255
+#: ../lib/advene/gui/edit/frameselector.py:200
+msgid "Refresh snapshots"
+msgstr "Refrescar capturas"
 
-#: ../lib/advene/rules/elements.py:1004
-msgid "Ending editing a relation type"
-msgstr "Terminando de editar un tipo de relacion"
+#: ../lib/advene/gui/plugins/shotvalidation.py:256
+#: ../lib/advene/gui/edit/frameselector.py:201
+msgid "Refresh missing snapshots"
+msgstr "Refrescar capturas faltantes"
 
-#: ../lib/advene/rules/elements.py:1005
-msgid "Suppression of a relation type"
-msgstr "Suprimiendo un tipo de relacion"
+#: ../lib/advene/gui/plugins/shotvalidation.py:261
+msgid "Undo last modification"
+msgstr "Deshacer la última modificación"
 
-#: ../lib/advene/rules/elements.py:1006
-msgid "Creation of a new resource"
-msgstr "Creación de un nuevo recurso"
+#: ../lib/advene/gui/plugins/shotvalidation.py:267
+msgid "Merge with previous"
+msgstr "Unir con anterior"
 
-#: ../lib/advene/rules/elements.py:1007
-msgid "Ending editing of a resource"
-msgstr "Finalizando la edición de un recurso"
+#: ../lib/advene/gui/plugins/shotvalidation.py:268
+msgid "Merge with previous annotation, i.e. remove this bound."
+msgstr "Unir con la anotación previa, i.e. remover este contenedor. "
 
-#: ../lib/advene/rules/elements.py:1008
-msgid "Suppression of a resource"
-msgstr "Supresión de un recurso"
+#: ../lib/advene/gui/plugins/shotvalidation.py:273
+msgid "Close view."
+msgstr "Cerrar vista."
 
-#: ../lib/advene/rules/elements.py:1009
-msgid "Modification of the tag"
-msgstr "Modificación de la etiqueta"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:44
+msgid "Activity trace"
+msgstr "Activar rastreo"
 
-#: ../lib/advene/rules/elements.py:1010
-msgid "Activating a link"
-msgstr "Activando un link"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:74
+#: ../lib/advene/gui/plugins/eventaccumulator.py:75
+#: ../lib/advene/gui/plugins/tracetimeline.py:65
+#: ../lib/advene/gui/plugins/tracetimeline.py:66
+#: ../lib/advene/gui/plugins/tracepreview.py:72
+#: ../lib/advene/gui/plugins/tracepreview.py:73
+msgid "Beginning edition"
+msgstr "Comenzando edición"
 
-#: ../lib/advene/rules/elements.py:1011
-msgid "Player start"
-msgstr "Reproductor inicia"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:76
+#: ../lib/advene/gui/plugins/eventaccumulator.py:77
+#: ../lib/advene/gui/plugins/eventaccumulator.py:78
+#: ../lib/advene/gui/plugins/tracetimeline.py:67
+#: ../lib/advene/gui/plugins/tracetimeline.py:68
+#: ../lib/advene/gui/plugins/tracetimeline.py:69
+#: ../lib/advene/gui/plugins/tracepreview.py:74
+#: ../lib/advene/gui/plugins/tracepreview.py:75
+#: ../lib/advene/gui/plugins/tracepreview.py:76
+msgid "Canceling edition"
+msgstr "Cancelando edición"
 
-#: ../lib/advene/rules/elements.py:1012
-msgid "Player stop"
-msgstr "Reproductor detiene"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:79
+#: ../lib/advene/gui/plugins/tracetimeline.py:70
+#: ../lib/advene/gui/plugins/tracepreview.py:77
+msgid "Ending edition"
+msgstr "Finalizando edición"
 
-#: ../lib/advene/rules/elements.py:1013
-msgid "Player pause"
-msgstr "Reproductor pausa"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:135
+msgid " Trace : "
+msgstr "Rastreo :"
 
-#: ../lib/advene/rules/elements.py:1014
-msgid "Player resume"
-msgstr "Reproductor continua"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:139
+msgid " Filters"
+msgstr "Filtros"
 
-#: ../lib/advene/rules/elements.py:1015
-msgid "Going to a given position"
-msgstr "Ir a una posición dada"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:168
+msgid " Time : "
+msgstr "Tiempo :"
 
-#: ../lib/advene/rules/elements.py:1016
-msgid "Loading a new package"
-msgstr "Cargando un nuevo paquete"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:178
+msgid " Max. : "
+msgstr "Max. :"
 
-#: ../lib/advene/rules/elements.py:1017
-msgid "Activating a package"
-msgstr "Activando un paquete"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:187
+msgid "Export"
+msgstr "Exportar"
 
-#: ../lib/advene/rules/elements.py:1018
-msgid "Saving the package"
-msgstr "Guardando el paquete"
-
-#: ../lib/advene/rules/elements.py:1019
-msgid "Start of the dynamic view"
-msgstr "Estado de la vista dinamica"
-
-#: ../lib/advene/rules/elements.py:1020
-msgid "End of the dynamic view"
-msgstr "Fin de la vista dinámica"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:203
+#: ../lib/advene/gui/plugins/tracetimeline.py:665
+msgid "Exporting traces"
+msgstr "Exportando rastreos"
 
-#: ../lib/advene/rules/elements.py:1021
-msgid "Start of the application"
-msgstr "Inicio de la aplicacion"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:208
+#: ../lib/advene/gui/plugins/tracetimeline.py:670
+#, python-format
+msgid ""
+"Export done to\n"
+"%s"
+msgstr ""
+"Exportación realizada a\n"
+"%s"
 
-#: ../lib/advene/rules/elements.py:1022
-msgid "End of the application"
-msgstr "Fin de la aplicacion"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:254
+msgid "Defining Filters"
+msgstr "Definiendo filtros"
 
-#: ../lib/advene/rules/elements.py:1023
-msgid "User-defined event"
-msgstr "Eventos definidos por el usuario"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:560
+#: ../lib/advene/gui/plugins/eventaccumulator.py:615
+#: ../lib/advene/gui/plugins/tracepreview.py:214
+#, python-format
+msgid "of an annotation (%s)"
+msgstr "de una anotación (%s)"
 
-#: ../lib/advene/rules/elements.py:1024
-msgid "Modification of the associated media"
-msgstr "Modificación del medio asociado"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:562
+#: ../lib/advene/gui/plugins/eventaccumulator.py:617
+#: ../lib/advene/gui/plugins/tracepreview.py:216
+#, python-format
+msgid "of a relation (%s)"
+msgstr "de una relación (%s)"
 
-#: ../lib/advene/rules/elements.py:1025
-msgid "Highlight a bookmark"
-msgstr "Resaltar separador"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:564
+#: ../lib/advene/gui/plugins/eventaccumulator.py:619
+#: ../lib/advene/gui/plugins/tracepreview.py:218
+#, python-format
+msgid "of an annotation type (%s)"
+msgstr "de un tipo de anotación (%s)"
 
-#: ../lib/advene/rules/elements.py:1026
-msgid "Unhighlight a bookmark"
-msgstr "Remover resaltado del separador"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:566
+#: ../lib/advene/gui/plugins/eventaccumulator.py:621
+#: ../lib/advene/gui/plugins/tracepreview.py:220
+#, python-format
+msgid "of a relation type (%s)"
+msgstr "de un tipo de relación (%s)"
 
-#: ../lib/advene/rules/elements.py:1027
-msgid "Updating duration of the movie"
-msgstr "Actualizando la duración de la película"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:568
+#: ../lib/advene/gui/plugins/eventaccumulator.py:623
+#: ../lib/advene/gui/plugins/tracepreview.py:222
+#, python-format
+msgid "of a schema (%s)"
+msgstr "de un esquema (%s)"
 
-#: ../lib/advene/rules/elements.py:1028
-msgid "Displaying a popup"
-msgstr "Muestra una ventana flotante"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:570
+#: ../lib/advene/gui/plugins/eventaccumulator.py:625
+#: ../lib/advene/gui/plugins/tracepreview.py:224
+#, python-format
+msgid "of a view (%s)"
+msgstr "de una vistas (%s)"
 
-#: ../lib/advene/rules/elements.py:1029
-msgid "Updating a snapshot"
-msgstr "Actualiza una captura"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:572
+#: ../lib/advene/gui/plugins/eventaccumulator.py:627
+#: ../lib/advene/gui/plugins/tracepreview.py:226
+#, python-format
+msgid "of a package (%s)"
+msgstr "de un paquete (%s) "
 
-#: ../lib/advene/rules/elements.py:1067
-msgid "Player control"
-msgstr "Control del reproductor"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:574
+#: ../lib/advene/gui/plugins/eventaccumulator.py:629
+#: ../lib/advene/gui/plugins/tracepreview.py:228
+#, python-format
+msgid "of an unknown item (%s)"
+msgstr "de un elemento desconocido (%s) "
 
-#: ../lib/advene/rules/elements.py:1068
-msgid "Audio enrichment"
-msgstr "Enriquecer audio"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:382
+#, python-format
+msgid "Rendering type %(type)s as %(presentation)s"
+msgstr "Representando (rendering) el tipo %(type)s como %(presentation)s"
 
-#: ../lib/advene/rules/elements.py:1069
-msgid "Image enrichment"
-msgstr "Enriquecer imagen"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:527
+msgid "Snapshot only"
+msgstr "Solo captura"
 
-#: ../lib/advene/rules/elements.py:1070
-msgid "External display control"
-msgstr "Control de la pantalla externa"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:528
+msgid "Overlayed snapshot only"
+msgstr "Solo capturas sobrepuesta"
 
-#: ../lib/advene/rules/elements.py:1071
-msgid "Popup"
-msgstr "Ventana flotante"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:529
+msgid "Timestamp only"
+msgstr "Solo marca de tiempo"
 
-#: ../lib/advene/rules/elements.py:1073
-msgid "State"
-msgstr "Estado"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:530
+msgid "Snapshot+timestamp"
+msgstr "Captura+Marca de tiempo"
 
-#: ../lib/advene/rules/elements.py:1074
-msgid "GUI actions"
-msgstr "Acciones GUI"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:531
+msgid "Annotation content"
+msgstr "Contenido de anotación"
 
-#: ../lib/advene/rules/elements.py:1075
-msgid "Expert"
-msgstr "Acciones genéricas"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:546
+msgid "as a list"
+msgstr "como lista"
 
-#: ../lib/advene/gui/util/initialconfig.py:82
-msgid "Initial Advene configuration"
-msgstr "Configuración inicial de advene"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:547
+#, fuzzy
+msgid "as a grid"
+msgstr "como lista"
 
-#: ../lib/advene/gui/util/initialconfig.py:83
-msgid ""
-"<span size='large'><b>Welcome in Advene</b>\n"
-"This is the first time that you run Advene. Please answer some basic "
-"configuration questions. You will be able to modify these choices from the "
-"Advene interface, in the Edit/Preferences menu.</span>"
-msgstr ""
-"<span size='large'><b>Bienvenido a Advene</b>\n"
-"Esta es la primera vez que se ejecuta Advene. Por favor, contesta algunas "
-"preguntas básicas de configuración. Vas a poder modificar estas opciones "
-"desde la interfaz Advene, en el menú Editar / Preferencias.</span>"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:548
+msgid "as a table"
+msgstr "como tabla"
 
-#: ../lib/advene/gui/util/initialconfig.py:84
-msgid "Interface language"
-msgstr "Idioma de la interfaz"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:549
+#: ../lib/advene/gui/views/viewbook.py:394
+msgid "as a transcription"
+msgstr "como transcripción"
 
-#: ../lib/advene/gui/util/initialconfig.py:84
-msgid "Language used for the interface"
-msgstr "Idioma utilizado para la interfaz"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:667
+#: ../lib/advene/gui/views/transcription.py:448
+#, python-format
+msgid "Annotation %s"
+msgstr "Anotación %s"
 
-#: ../lib/advene/gui/util/initialconfig.py:88 ../lib/advene/gui/main.py:4247
-msgid "System default"
-msgstr "Predeterminado del sistema"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:668
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:687
+msgid "Play video"
+msgstr "Reproducir video"
 
-#: ../lib/advene/gui/util/initialconfig.py:90
-msgid "Weekly check for Advene updates on the Advene website"
-msgstr ""
-"Revisar semanalmente por actualizaciones de Advene en el sitio de Advene"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:669
+msgid "Show timestamp only"
+msgstr "Solo muestra marca de tiempo"
 
-#: ../lib/advene/gui/util/initialconfig.py:90 ../lib/advene/gui/main.py:4273
-msgid "Weekly check for updates on the Advene website"
-msgstr "Revisión semanal de actualización en el sitio de Advene"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:670
+msgid "Show content only"
+msgstr "Solo muestra contenido"
 
-#: ../lib/advene/gui/util/initialconfig.py:92
-msgid "Preferred directory for data files"
-msgstr "Directorio preferido para archivos de datos"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:671
+msgid "Show snapshot only"
+msgstr "Solo muestra captura"
 
-#: ../lib/advene/gui/util/initialconfig.py:92
-msgid "Preferred directory for storing data files (Advene packages)"
-msgstr ""
-"Directorio preferido para almacenar archivos de datos (Paquetes de Advene)"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:673
+msgid "Show overlayed timestamp"
+msgstr "Muestra marca de tiempo superpuesta"
 
-#: ../lib/advene/gui/util/initialconfig.py:94
-msgid "Directories to search for movies"
-msgstr "Directorios para buscar archivos de video"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:674
+msgid "Show overlayed content"
+msgstr "Mostrar contenido superpuesto"
 
-#: ../lib/advene/gui/util/initialconfig.py:94
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:676
 #, python-format
-msgid ""
-"List of directories (separated by %(pathsep)s) to search for movie files."
-msgstr ""
-"Lista de directorios (separados por %(pathsep)s) para buscar archivos de "
-"video."
-
-#: ../lib/advene/gui/util/initialconfig.py:95
-msgid "First look for movie file in the same directory as the package"
-msgstr "Primero busca el archivo de video en el mismo directorio del paquete"
-
-#: ../lib/advene/gui/util/initialconfig.py:95
-msgid ""
-"If checked, the movie file will be searched for in the same directory as the "
-"referencing package."
-msgstr ""
-"Si está seleccionado, el archivo de video se buscará en el mismo directorio "
-"al paquete que hace referencia."
+msgid "Annotation type %s"
+msgstr "Tipos de anotación %s"
 
-#: ../lib/advene/gui/util/__init__.py:39
-#: ../lib/advene/gui/edit/schemaeditor.py:1081
-#: ../lib/advene/gui/edit/schemaeditor.py:1202
-#: ../lib/advene/gui/edit/create.py:106
-msgid "Plain text content"
-msgstr "Contenido de texto plano"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:677
+msgid "display as list"
+msgstr "mostrar como lista"
 
-#: ../lib/advene/gui/util/__init__.py:40
-msgid "HTML content"
-msgstr "Contenido HTML"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:678
+#, fuzzy
+msgid "display as grid"
+msgstr "mostrar como lista"
 
-#: ../lib/advene/gui/util/__init__.py:41
-#: ../lib/advene/gui/edit/schemaeditor.py:1082
-#: ../lib/advene/gui/edit/schemaeditor.py:1203
-#: ../lib/advene/gui/edit/create.py:107
-msgid "Simple-structured content"
-msgstr "Contenido de estructura simple"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:679
+msgid "display as table"
+msgstr "mostrar como tabla"
 
-#: ../lib/advene/gui/util/__init__.py:42
-msgid "List of numeric values"
-msgstr "Lista de valores numéricos"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:680
+msgid "display as transcription"
+msgstr "mostrar como transcripción"
 
-#: ../lib/advene/gui/util/__init__.py:43
-#: ../lib/advene/gui/edit/schemaeditor.py:1083
-#: ../lib/advene/gui/edit/schemaeditor.py:1204
-#: ../lib/advene/gui/edit/create.py:108
-msgid "SVG graphics content"
-msgstr "Contenido de gráficos SVG"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:689
+msgid "Open link"
+msgstr "Abrir vínculo"
 
-#: ../lib/advene/gui/util/__init__.py:459
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:745
 #, python-format
-msgid ""
-"Annotation Type %(title)s:\n"
-"%(count)s"
-msgstr ""
-"Tipo de anotación %(title)s:\n"
-"%(count)s"
+msgid "HTML editor: cannot parse content (%s)"
+msgstr "Editor HTML: no puede analizar el contenido (%s)"
 
-#: ../lib/advene/gui/util/__init__.py:465
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:776
 #, python-format
-msgid ""
-"Relation Type %(title)s:\n"
-"%(count)s"
-msgstr ""
-"Tipo de relación %(title)s:\n"
-"%(count)s"
+msgid "Heading %d"
+msgstr "Título %d"
 
-#: ../lib/advene/gui/util/dialog.py:376 ../lib/advene/gui/edit/dvdselect.py:95
-#: ../lib/advene/gui/edit/imports.py:331
-#: ../lib/advene/gui/edit/transcribe.py:1055
-#: ../lib/advene/gui/views/table.py:557 ../lib/advene/gui/main.py:4176
-msgid "Title"
-msgstr "Titulo"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:787
+msgid "Bold"
+msgstr "Negrita"
 
-#: ../lib/advene/gui/util/dialog.py:385 ../lib/advene/gui/edit/rules.py:1092
-#: ../lib/advene/gui/edit/imports.py:325
-#: ../lib/advene/gui/edit/elements.py:507
-#: ../lib/advene/gui/edit/elements.py:556
-#: ../lib/advene/gui/edit/elements.py:644
-#: ../lib/advene/gui/edit/elements.py:724
-#: ../lib/advene/gui/edit/elements.py:873
-#: ../lib/advene/gui/edit/elements.py:942
-#: ../lib/advene/gui/edit/elements.py:1054
-#: ../lib/advene/gui/edit/elements.py:1115
-#: ../lib/advene/gui/views/table.py:255 ../lib/advene/gui/views/table.py:559
-msgid "Id"
-msgstr "Id"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:788
+msgid "Italic"
+msgstr "Itálica"
 
-#: ../lib/advene/gui/util/dialog.py:404 ../lib/advene/gui/util/dialog.py:443
-msgid "Name the element"
-msgstr "Nombra el elemetno"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:789
+msgid "Header"
+msgstr "Encabezado"
 
-#: ../lib/advene/gui/util/dialog.py:407 ../lib/advene/gui/util/dialog.py:444
-msgid "Choose a name for the element"
-msgstr "Elige un nombre para el elemento"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:791
+msgid "Copy"
+msgstr "Copiar"
 
-#: ../lib/advene/gui/util/dialog.py:482
-msgid "Open a file"
-msgstr "Abre un archivo"
-
-#: ../lib/advene/gui/util/dialog.py:507 ../lib/advene/gui/util/dialog.py:543
-msgid "N/C"
-msgstr "N/C"
-
-#: ../lib/advene/gui/util/dialog.py:512
-msgid "Alias"
-msgstr "Alias"
-
-#: ../lib/advene/gui/util/dialog.py:532
-msgid ""
-"Press to\n"
-"display\n"
-"information"
-msgstr ""
-"Presiona para\n"
-"mostrar\n"
-"informacion"
-
-#: ../lib/advene/gui/util/dialog.py:551
-msgid "Wait..."
-msgstr "Espera..."
-
-#: ../lib/advene/gui/util/dialog.py:555
-#, python-format
-msgid "Error: %s"
-msgstr "Error: %s"
-
-#: ../lib/advene/gui/util/dialog.py:575
-msgid "Any type of file"
-msgstr "Cualquier tipo de archivo"
-
-#: ../lib/advene/gui/util/dialog.py:577
-msgid "Advene files (.xml, .azp, .apl)"
-msgstr "Archivos de Advene (.xml, .azp, .apl)"
-
-#: ../lib/advene/gui/util/dialog.py:579
-msgid "Advene session (.apl)"
-msgstr "Sesión de Advene (.apl)"
-
-#: ../lib/advene/gui/util/dialog.py:580
-msgid "Audio files"
-msgstr "Archivos de audio"
-
-#: ../lib/advene/gui/util/dialog.py:581
-msgid "Video files"
-msgstr "Archivos de video"
-
-#: ../lib/advene/gui/util/dialog.py:626
-#: ../lib/advene/gui/edit/properties.py:418
-msgid "Choose a directory"
-msgstr "Elige un directorio"
-
-#: ../lib/advene/gui/util/dialog.py:679
-msgid "Select an element"
-msgstr "Selecciona un elemento"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:32
-msgid "Shot validation view"
-msgstr "Vista de validación de capturas"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:34
-msgid "Display shot validation interface"
-msgstr "Muestra la interfaz de validación de capturas"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:111
-#, python-format
-msgid "Merged #%(first)d-#%(second)d into #%(first)d"
-msgstr "Unidos #%(first)d-#%(second)d en #%(first)d"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:136
-msgid "Last action undone"
-msgstr "Última acción deshecha"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:154
-#, python-format
-msgid "Split annotation #%(current)d into #%(current)d and #%(next)d"
-msgstr "Dividir anotación #%(current)d en #%(current)d y #%(next)d"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:159
-#, python-format
-msgid "Cannot split annotation #%(current)d: out of bounds."
-msgstr "No se puede dividir la anotación #%(current)d: fuera de límite."
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:179
-#, python-format
-msgid "Changed cut between #%(first)d and %(second)d"
-msgstr "Cambiar corte entre #%(first)d y %(second)d"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:182
-msgid "Changed begin time for first annotation"
-msgstr "Tiempo de inicio cambiado para la primer anotación"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:188
-msgid "No annotations to adjust"
-msgstr "No hay anotaciones para ajustar"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:195
-msgid ""
-"Click on the frame just after the cut to adjust the cut time.\n"
-"Control-click on a frame to indicate a missing cut."
-msgstr ""
-"Clic en el cuadro justo después del corte para ajustar el tiempo de corte.\n"
-"Control-clic en un cuadro para indicar un corte faltante."
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:203
-#, python-format
-msgid "Begin of #%(index)d (title: %(content)s)"
-msgstr "Principio de #%(index)d (title: %(content)s)"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:217
-msgid "< Previous cut"
-msgstr "< Corte anterior"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:218
-msgid "Display previous cut"
-msgstr "Muestra el corte anterior"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:225
-msgid "Next cut >"
-msgstr "Corte siguiente >"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:226
-msgid "Display next cut"
-msgstr "Muestra el corte siguiente"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:251
-#: ../lib/advene/gui/views/timeline.py:81
-#: ../lib/advene/gui/views/annotationdisplay.py:90
-msgid "Current time"
-msgstr "Tiempo actual"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:252
-msgid "Go to annotation containing current player time."
-msgstr "Ir a la anotación que contiene el tiempo actual del reproductor."
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:256
-#: ../lib/advene/gui/edit/frameselector.py:193
-msgid "Refresh snapshots"
-msgstr "Refrescar capturas"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:257
-#: ../lib/advene/gui/edit/frameselector.py:194
-msgid "Refresh missing snapshots"
-msgstr "Refrescar capturas faltantes"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:261
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:806
-#: ../lib/advene/gui/edit/transcribe.py:1211 ../lib/advene/gui/main.py:350
-msgid "Undo"
-msgstr "Deshacer"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:262
-msgid "Undo last modification"
-msgstr "Deshacer la última modificación"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:268
-msgid "Merge with previous"
-msgstr "Unir con anterior"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:269
-msgid "Merge with previous annotation, i.e. remove this bound."
-msgstr "Unir con la anotación previa, i.e. remover este contenedor. "
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:792
+msgid "Cut"
+msgstr "Cortar"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:274
-msgid "Close view."
-msgstr "Cerrar vista."
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:793
+msgid "Paste"
+msgstr "Pegar"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:60
-#: ../lib/advene/gui/plugins/tracetimeline.py:61
-#: ../lib/advene/gui/plugins/eventaccumulator.py:73
-#: ../lib/advene/gui/plugins/eventaccumulator.py:74
-#: ../lib/advene/gui/plugins/tracepreview.py:72
-#: ../lib/advene/gui/plugins/tracepreview.py:73
-msgid "Beginning edition"
-msgstr "Comenzando edición"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:795
+#: ../lib/advene/gui/views/timeline.py:139
+msgid "Refresh"
+msgstr "Refrescar"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:62
-#: ../lib/advene/gui/plugins/tracetimeline.py:63
-#: ../lib/advene/gui/plugins/tracetimeline.py:64
-#: ../lib/advene/gui/plugins/eventaccumulator.py:75
-#: ../lib/advene/gui/plugins/eventaccumulator.py:76
-#: ../lib/advene/gui/plugins/eventaccumulator.py:77
-#: ../lib/advene/gui/plugins/tracepreview.py:74
-#: ../lib/advene/gui/plugins/tracepreview.py:75
-#: ../lib/advene/gui/plugins/tracepreview.py:76
-msgid "Canceling edition"
-msgstr "Cancelando edición"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:851
+msgid "WYSIWYG editor"
+msgstr "Editor WYSIWYG"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:65
-#: ../lib/advene/gui/plugins/eventaccumulator.py:78
-#: ../lib/advene/gui/plugins/tracepreview.py:77
-msgid "Ending edition"
-msgstr "Finalizando edición"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:861
+msgid "Edit HTML source"
+msgstr "Editar el código fuente HTML"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:66
+#: ../lib/advene/gui/plugins/tracetimeline.py:71
 #: ../lib/advene/gui/plugins/tracepreview.py:78
 msgid "Moving to"
 msgstr "Moviendo hacia"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:82
+#: ../lib/advene/gui/plugins/tracetimeline.py:87
 msgid "Traces"
 msgstr "Rastreos"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:208
+#: ../lib/advene/gui/plugins/tracetimeline.py:213
 #, python-format
 msgid "%(name)s (%(index)d)"
 msgstr "%(name)s (%(index)d)"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:236
+#: ../lib/advene/gui/plugins/tracetimeline.py:241
 msgid "Search"
 msgstr "Buscar"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:249
-#: ../lib/advene/gui/plugins/tracetimeline.py:1224
+#: ../lib/advene/gui/plugins/tracetimeline.py:254
+#: ../lib/advene/gui/plugins/tracetimeline.py:1214
 #, python-format
 msgid "%(name)s (%(index)s)"
 msgstr "%(name)s (%(index)s)"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:421
-#: ../lib/advene/gui/edit/montage.py:439
-#: ../lib/advene/gui/views/timeline.py:3444
+#: ../lib/advene/gui/plugins/tracetimeline.py:426
+#: ../lib/advene/gui/views/timeline.py:3484
+#: ../lib/advene/gui/edit/montage.py:449
 msgid "Zoom out"
 msgstr "Alejar"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:426
-#: ../lib/advene/gui/edit/montage.py:444
-#: ../lib/advene/gui/views/timeline.py:3449
+#: ../lib/advene/gui/plugins/tracetimeline.py:431
+#: ../lib/advene/gui/views/timeline.py:3489
+#: ../lib/advene/gui/edit/montage.py:454
 msgid "Zoom in"
 msgstr "Acercar"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:431
+#: ../lib/advene/gui/plugins/tracetimeline.py:436
 msgid "Zoom 100%"
 msgstr "Zoom 100%"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:435
+#: ../lib/advene/gui/plugins/tracetimeline.py:440
 msgid "Toggle links lock"
 msgstr "Conmutar bloqueo de vínculos "
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:443
+#: ../lib/advene/gui/plugins/tracetimeline.py:448
 msgid "Toggle link mode"
 msgstr "Conmutar modo de vínculo"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:450
+#: ../lib/advene/gui/plugins/tracetimeline.py:455
 msgid "Open a trace file"
 msgstr "Abre un archivo de rastreo"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:465
+#: ../lib/advene/gui/plugins/tracetimeline.py:470
 msgid "Toggle auto refresh"
 msgstr "Conmutar auto refrescar"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:476
+#: ../lib/advene/gui/plugins/tracetimeline.py:481
 msgid "Open an existing trace"
 msgstr "Abrir un trazo existente"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:482
+#: ../lib/advene/gui/plugins/tracetimeline.py:487
 msgid "Save trace"
 msgstr "Guardar rastreo"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:487
+#: ../lib/advene/gui/plugins/tracetimeline.py:492
 msgid "Configuration"
 msgstr "Configuración"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:668
-#: ../lib/advene/gui/plugins/eventaccumulator.py:202
-msgid "Exporting traces"
-msgstr "Exportando rastreos"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:673
-#: ../lib/advene/gui/plugins/eventaccumulator.py:207
-#, python-format
-msgid ""
-"Export done to\n"
-"%s"
-msgstr ""
-"Exportación realizada a\n"
-"%s"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:951
+#: ../lib/advene/gui/plugins/tracetimeline.py:941
 msgid "Zoom and center on linked items"
 msgstr "Acercar y centrar en los elementos vinculados"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:960
+#: ../lib/advene/gui/plugins/tracetimeline.py:950
 msgid "Edit item"
 msgstr "Editar elemento"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:964
+#: ../lib/advene/gui/plugins/tracetimeline.py:954
 msgid "Recreate item"
 msgstr "Recrear elemento"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:980
-#: ../lib/advene/gui/plugins/tracetimeline.py:1001
-#: ../lib/advene/gui/edit/transcribe.py:502
-#: ../lib/advene/gui/views/timeline.py:2556 ../lib/advene/gui/popup.py:513
+#: ../lib/advene/gui/plugins/tracetimeline.py:970
+#: ../lib/advene/gui/plugins/tracetimeline.py:991
+#: ../lib/advene/gui/views/timeline.py:2595 ../lib/advene/gui/popup.py:542
+#: ../lib/advene/gui/edit/transcribe.py:495
 msgid "Go to..."
 msgstr "Ir a..."
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:984
+#: ../lib/advene/gui/plugins/tracetimeline.py:974
 msgid "Zoom on action"
 msgstr "Acercar en acción"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2030
-#: ../lib/advene/gui/edit/montage.py:535
-#: ../lib/advene/gui/views/timeline.py:3318
+#: ../lib/advene/gui/plugins/tracetimeline.py:2018
+#: ../lib/advene/gui/views/timeline.py:3362
+#: ../lib/advene/gui/edit/montage.py:544
 msgid "Inspector"
 msgstr "Inspector"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2035
+#: ../lib/advene/gui/plugins/tracetimeline.py:2023
 msgid "Item Id"
 msgstr "Elemento Id"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2038
+#: ../lib/advene/gui/plugins/tracetimeline.py:2026
 msgid "Item name or class"
 msgstr "Nombre de item o clase"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2042
+#: ../lib/advene/gui/plugins/tracetimeline.py:2030
 msgid "Type or schema"
 msgstr "Tipo o esquema"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2045
+#: ../lib/advene/gui/plugins/tracetimeline.py:2033
 msgid "Operations"
 msgstr "Operaciones"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2087
+#: ../lib/advene/gui/plugins/tracetimeline.py:2076
 msgid "Comment"
 msgstr "Comentar"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2119
+#: ../lib/advene/gui/plugins/tracetimeline.py:2108
 #: ../lib/advene/gui/edit/merge.py:191
 msgid "Action"
 msgstr "Acción"
 
-#: ../lib/advene/gui/plugins/kinect.py:41
-msgid "Kinect Controller"
-msgstr "Controlador Kinect"
+#: ../lib/advene/gui/plugins/logmessages.py:35
+msgid "Log Messages"
+msgstr "Registrar mensajes"
 
-#: ../lib/advene/gui/plugins/kinect.py:43
-msgid "Kinect control interface"
-msgstr "Interfaz de control Kinect"
+#: ../lib/advene/gui/plugins/actions.py:40 ../lib/advene/core/controller.py:307
+#: ../lib/advene/rules/actions.py:38
+msgid "Display a message"
+msgstr "Muestra un mensaje"
+
+#: ../lib/advene/gui/plugins/actions.py:41
+#: ../lib/advene/gui/plugins/actions.py:53
+#: ../lib/advene/gui/plugins/actions.py:71
+#: ../lib/advene/gui/plugins/actions.py:86
+#: ../lib/advene/gui/plugins/actions.py:102
+#: ../lib/advene/gui/plugins/actions.py:203
+#: ../lib/advene/core/controller.py:308
+msgid "String to display."
+msgstr "Cadena a mostrar"
+
+#: ../lib/advene/gui/plugins/actions.py:44
+#: ../lib/advene/gui/plugins/actions.py:58
+#: ../lib/advene/gui/plugins/actions.py:110
+#: ../lib/advene/gui/plugins/actions.py:399
+#: ../lib/advene/gui/plugins/actions.py:527 ../lib/advene/gui/edit/rules.py:766
+#: ../lib/advene/plugins/brltty.py:90 ../lib/advene/plugins/tts.py:84
+#: ../lib/advene/rules/actions.py:42 ../lib/advene/rules/actions.py:109
+#: ../lib/advene/rules/actions.py:125
+msgid "The annotation content"
+msgstr "El contenido de la anotación "
 
 #: ../lib/advene/gui/plugins/actions.py:52
 msgid "Display a popup"
@@ -3358,6 +2870,22 @@ msgstr "Muestra un popup"
 msgid "Display duration in ms. Ignored if empty."
 msgstr "Muestra la duración en ms. Ignorado si esta vacio."
 
+#: ../lib/advene/gui/plugins/actions.py:61
+#: ../lib/advene/gui/plugins/actions.py:121
+#: ../lib/advene/gui/plugins/actions.py:403
+#: ../lib/advene/gui/plugins/actions.py:538 ../lib/advene/rules/actions.py:112
+#: ../lib/advene/rules/actions.py:174
+msgid "1 second"
+msgstr "1 segundo"
+
+#: ../lib/advene/gui/plugins/actions.py:62
+#: ../lib/advene/gui/plugins/actions.py:122
+#: ../lib/advene/gui/plugins/actions.py:404
+#: ../lib/advene/gui/plugins/actions.py:539 ../lib/advene/gui/edit/rules.py:773
+#: ../lib/advene/rules/actions.py:113 ../lib/advene/rules/actions.py:175
+msgid "The annotation duration"
+msgstr "La duración de la anotación"
+
 #: ../lib/advene/gui/plugins/actions.py:70
 msgid "Popup an entry box"
 msgstr "Caja de entrada en ventana flotante"
@@ -3390,6 +2918,11 @@ msgstr "Ir a la anotación relacionada"
 msgid "Display a popup linking to an URL"
 msgstr "Mostrar una ventana flotante vinculando a un URL"
 
+#: ../lib/advene/gui/plugins/actions.py:103
+#: ../lib/advene/gui/views/logwindow.py:159 ../lib/advene/rules/actions.py:228
+msgid "URL"
+msgstr "URL"
+
 #: ../lib/advene/gui/plugins/actions.py:106
 msgid "string:Display annotation in web browser"
 msgstr "string:Muestra anotación en el navegador web"
@@ -3431,7 +2964,7 @@ msgid "Destination: popup, south, east"
 msgstr "Destino: popup, sur, este"
 
 #: ../lib/advene/gui/plugins/actions.py:144
-#: ../lib/advene/gui/views/viewbook.py:308
+#: ../lib/advene/gui/views/viewbook.py:313
 msgid "Open a saved view"
 msgstr "Abrir una vista almacenada"
 
@@ -3511,39 +3044,40 @@ msgstr "Contenido del separador."
 msgid "Bookmark"
 msgstr "Separador"
 
-#: ../lib/advene/gui/plugins/actions.py:276
-#, python-format
-msgid "Error: undefined GUI view %s"
-msgstr "Error: vista GUI indefinida %s"
+#: ../lib/advene/gui/plugins/actions.py:234 ../lib/advene/plugins/brltty.py:242
+#: ../lib/advene/plugins/tts.py:113
+msgid "Unknown rule"
+msgstr "Regla desconocida"
 
-#: ../lib/advene/gui/plugins/actions.py:286
-#: ../lib/advene/gui/views/viewbook.py:124 ../lib/advene/gui/main.py:1189
-msgid "...in its own window"
-msgstr "...está en su ventana"
+#: ../lib/advene/gui/plugins/actions.py:235 ../lib/advene/plugins/brltty.py:243
+#: ../lib/advene/plugins/tts.py:114
+#, python-format
+msgid ""
+"Rule %(rulename)s: Error in the evaluation of the parameter "
+"%(parametername)s:"
+msgstr ""
+"Regla %(rulename)s: Error en la evaluación del parámetro %(parametername)s:"
 
-#: ../lib/advene/gui/plugins/actions.py:287
-#: ../lib/advene/gui/views/viewbook.py:125
-#: ../lib/advene/gui/views/__init__.py:381 ../lib/advene/gui/main.py:1190
-msgid "...embedded east of the video"
-msgstr "...embebido en el este del video"
+#: ../lib/advene/gui/plugins/actions.py:247 ../lib/advene/rules/actions.py:385
+#, python-format
+msgid "The %s-related outgoing annotation"
+msgstr "La relación saliente  %s-relacionada"
 
-#: ../lib/advene/gui/plugins/actions.py:288
-#: ../lib/advene/gui/views/viewbook.py:126
-#: ../lib/advene/gui/views/__init__.py:382 ../lib/advene/gui/main.py:1191
-msgid "...embedded west of the video"
-msgstr "...embebido en el oeste del video"
+#: ../lib/advene/gui/plugins/actions.py:249 ../lib/advene/rules/actions.py:387
+#, python-format
+msgid "The %s-related incoming annotation"
+msgstr "La relación entrante %s-relacionada"
 
-#: ../lib/advene/gui/plugins/actions.py:289
-#: ../lib/advene/gui/views/viewbook.py:127
-#: ../lib/advene/gui/views/__init__.py:383 ../lib/advene/gui/main.py:1192
-msgid "...embedded south of the video"
-msgstr "...embebido al sur del video"
+#: ../lib/advene/gui/plugins/actions.py:259
+#: ../lib/advene/gui/plugins/actions.py:340
+#: ../lib/advene/gui/plugins/actions.py:358 ../lib/advene/plugins/tts.py:134
+msgid "No message..."
+msgstr "Sin mensaje..."
 
-#: ../lib/advene/gui/plugins/actions.py:290
-#: ../lib/advene/gui/views/viewbook.py:128
-#: ../lib/advene/gui/views/__init__.py:384 ../lib/advene/gui/main.py:1193
-msgid "...embedded at the right of the window"
-msgstr "...embebido a la derecha de la ventana"
+#: ../lib/advene/gui/plugins/actions.py:276
+#, python-format
+msgid "Error: undefined GUI view %s"
+msgstr "Error: vista GUI indefinida %s"
 
 #: ../lib/advene/gui/plugins/actions.py:322
 #, python-format
@@ -3633,100 +3167,19 @@ msgstr "Navegación de relaciones"
 msgid "New bookmark"
 msgstr "Nuevo separador"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:43
-msgid "Activity trace"
-msgstr "Activar rastreo"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:134
-msgid " Trace : "
-msgstr "Rastreo :"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:138
-msgid " Filters"
-msgstr "Filtros"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:142
-#: ../lib/advene/gui/main.py:4178
-msgid "Reset"
-msgstr "Reestablecer"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:167
-msgid " Time : "
-msgstr "Tiempo :"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:177
-msgid " Max. : "
-msgstr "Max. :"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:186
-msgid "Export"
-msgstr "Exportar"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:253
-msgid "Defining Filters"
-msgstr "Definiendo filtros"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:559
-#: ../lib/advene/gui/plugins/eventaccumulator.py:614
-#: ../lib/advene/gui/plugins/tracepreview.py:214
-#, python-format
-msgid "of an annotation (%s)"
-msgstr "de una anotación (%s)"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:561
-#: ../lib/advene/gui/plugins/eventaccumulator.py:616
-#: ../lib/advene/gui/plugins/tracepreview.py:216
-#, python-format
-msgid "of a relation (%s)"
-msgstr "de una relación (%s)"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:563
-#: ../lib/advene/gui/plugins/eventaccumulator.py:618
-#: ../lib/advene/gui/plugins/tracepreview.py:218
-#, python-format
-msgid "of an annotation type (%s)"
-msgstr "de un tipo de anotación (%s)"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:565
-#: ../lib/advene/gui/plugins/eventaccumulator.py:620
-#: ../lib/advene/gui/plugins/tracepreview.py:220
-#, python-format
-msgid "of a relation type (%s)"
-msgstr "de un tipo de relación (%s)"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:567
-#: ../lib/advene/gui/plugins/eventaccumulator.py:622
-#: ../lib/advene/gui/plugins/tracepreview.py:222
-#, python-format
-msgid "of a schema (%s)"
-msgstr "de un esquema (%s)"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:569
-#: ../lib/advene/gui/plugins/eventaccumulator.py:624
-#: ../lib/advene/gui/plugins/tracepreview.py:224
-#, python-format
-msgid "of a view (%s)"
-msgstr "de una vistas (%s)"
-
-#: ../lib/advene/gui/plugins/eventaccumulator.py:571
-#: ../lib/advene/gui/plugins/eventaccumulator.py:626
-#: ../lib/advene/gui/plugins/tracepreview.py:226
-#, python-format
-msgid "of a package (%s)"
-msgstr "de un paquete (%s) "
+#: ../lib/advene/gui/plugins/kinect.py:38
+msgid "Kinect Controller"
+msgstr "Controlador Kinect"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:573
-#: ../lib/advene/gui/plugins/eventaccumulator.py:628
-#: ../lib/advene/gui/plugins/tracepreview.py:228
-#, python-format
-msgid "of an unknown item (%s)"
-msgstr "de un elemento desconocido (%s) "
+#: ../lib/advene/gui/plugins/kinect.py:40
+msgid "Kinect control interface"
+msgstr "Interfaz de control Kinect"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:122
+#: ../lib/advene/gui/plugins/contenthandlers.py:127
 msgid "Label"
 msgstr "Etiqueta"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:172
+#: ../lib/advene/gui/plugins/contenthandlers.py:177
 #, python-format
 msgid ""
 "Error while parsing SVG content:\n"
@@ -3737,21 +3190,21 @@ msgstr ""
 "\n"
 "%s"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:247
+#: ../lib/advene/gui/plugins/contenthandlers.py:252
 msgid " created from "
 msgstr "creado de"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:315
+#: ../lib/advene/gui/plugins/contenthandlers.py:329
 msgid "Graphical editor"
 msgstr "Editor gráfico"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:326
+#: ../lib/advene/gui/plugins/contenthandlers.py:340
 msgid "Edit XML"
 msgstr "Editar XML"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:378
-#: ../lib/advene/gui/plugins/contenthandlers.py:434
-#: ../lib/advene/gui/edit/rules.py:186
+#: ../lib/advene/gui/plugins/contenthandlers.py:392
+#: ../lib/advene/gui/plugins/contenthandlers.py:448
+#: ../lib/advene/gui/edit/rules.py:188
 #, python-format
 msgid ""
 "The following items seem to be\n"
@@ -3764,37 +3217,43 @@ msgstr ""
 "\n"
 "%s"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:36 ../lib/advene/gui/main.py:1235
-msgid "Video player"
-msgstr "Reproductor de video"
+#: ../lib/advene/gui/plugins/tracepreview.py:61
+msgid "Trace preview"
+msgstr "Previsualización de rastreo"
+
+#: ../lib/advene/gui/plugins/tracepreview.py:99
+msgid "Full trace"
+msgstr "Rastreo completo"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:38
+#: ../lib/advene/gui/plugins/tracepreview.py:100
+msgid "Open the trace timeline view fareast"
+msgstr "Abre la vista de línea de tiempo de rastreo lejano oriente (fareast)"
+
+#: ../lib/advene/gui/plugins/videoplayer.py:39
 msgid "Complementary video player"
 msgstr "Reproductor de video complementario"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:44
-#: ../lib/advene/gui/edit/montage.py:54
-#: ../lib/advene/gui/edit/transcribe.py:85
-#: ../lib/advene/gui/views/transcription.py:56
-#: ../lib/advene/gui/views/bookmarks.py:245
-#: ../lib/advene/gui/views/timeline.py:135
+#: ../lib/advene/gui/plugins/videoplayer.py:45
+#: ../lib/advene/gui/views/bookmarks.py:246
+#: ../lib/advene/gui/views/transcription.py:59
+#: ../lib/advene/gui/views/timeline.py:140 ../lib/advene/gui/edit/montage.py:58
+#: ../lib/advene/gui/edit/transcribe.py:88
 msgid "Save view"
 msgstr "Guardar vista"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:45
-#: ../lib/advene/gui/edit/transcribe.py:86
-#: ../lib/advene/gui/views/tagbag.py:62
-#: ../lib/advene/gui/views/transcription.py:57
-#: ../lib/advene/gui/views/interactivequery.py:60
-#: ../lib/advene/gui/views/timeline.py:136
+#: ../lib/advene/gui/plugins/videoplayer.py:46
+#: ../lib/advene/gui/views/transcription.py:60
+#: ../lib/advene/gui/views/timeline.py:141 ../lib/advene/gui/views/tagbag.py:65
+#: ../lib/advene/gui/views/interactivequery.py:61
+#: ../lib/advene/gui/edit/transcribe.py:89
 msgid "Save default options"
 msgstr "Guardar opciones predeterminadas"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:46
+#: ../lib/advene/gui/plugins/videoplayer.py:47
 msgid "Select video file"
 msgstr "Selecciona un archivo de video"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:127
+#: ../lib/advene/gui/plugins/videoplayer.py:128
 msgid "Select a video file"
 msgstr "Selecciona un archivo de video"
 
@@ -3802,5700 +3261,6438 @@ msgstr "Selecciona un archivo de video"
 msgid "Synchronize"
 msgstr "Sincronizar"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:266
+#: ../lib/advene/gui/plugins/videoplayer.py:268
 msgid "Offset in ms"
 msgstr "Desplazamiento en ms"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:274
+#: ../lib/advene/gui/plugins/videoplayer.py:276
 msgid "Drag and drop to get player time"
 msgstr "Arrastra y suelta para obtener el tiempo del reproductor"
 
-#: ../lib/advene/gui/plugins/tracepreview.py:61
-msgid "Trace preview"
-msgstr "Previsualización de rastreo"
+#: ../lib/advene/gui/views/singletonpopup.py:32
+msgid "SingletonPopup"
+msgstr "Ventana flotante Singleton"
 
-#: ../lib/advene/gui/plugins/tracepreview.py:99
-msgid "Full trace"
-msgstr "Rastreo completo"
+#: ../lib/advene/gui/views/caption.py:31
+msgid "Display a text caption below the video output"
+msgstr "Muestra un subtítulo de texto debajo de la salida de video "
 
-#: ../lib/advene/gui/plugins/tracepreview.py:100
-msgid "Open the trace timeline view fareast"
-msgstr "Abre la vista de línea de tiempo de rastreo lejano oriente (fareast)"
+#: ../lib/advene/gui/views/html.py:90
+#, python-format
+msgid "%s%% loaded"
+msgstr "%s%% cargado"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:376
+#: ../lib/advene/gui/views/html.py:93
 #, python-format
-msgid "Rendering type %(type)s as %(presentation)s"
-msgstr "Representando (rendering) el tipo %(type)s como %(presentation)s"
+msgid "Title %s"
+msgstr "Título %s"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:521
-msgid "Snapshot only"
-msgstr "Solo captura"
+#: ../lib/advene/gui/views/html.py:157
+msgid "HTML Viewer"
+msgstr "Visor HTML"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:522
-msgid "Overlayed snapshot only"
-msgstr "Solo capturas sobrepuesta"
+#: ../lib/advene/gui/views/html.py:159
+msgid "Embedded HTML widget"
+msgstr "Widget HTML embebido"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:523
-msgid "Timestamp only"
-msgstr "Solo marca de tiempo"
+#: ../lib/advene/gui/views/html.py:187
+msgid "No available HTML rendering component"
+msgstr "No hay un componente de visualización HTML disponible"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:524
-msgid "Snapshot+timestamp"
-msgstr "Captura+Marca de tiempo"
+#: ../lib/advene/gui/views/annotationdisplay.py:43
+msgid "AnnotationDisplay"
+msgstr "VisualizarAnotaciones"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:525
-msgid "Annotation content"
-msgstr "Contenido de anotación"
+#: ../lib/advene/gui/views/annotationdisplay.py:45
+msgid "Display the contents of an annotation"
+msgstr "Visualizar el contenido de una anotación"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:540
-msgid "as a list"
-msgstr "como lista"
+#: ../lib/advene/gui/views/annotationdisplay.py:86
+#: ../lib/advene/util/helper.py:610
+msgid "No annotation"
+msgstr "No hay anotación"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:541
-#, fuzzy
-msgid "as a grid"
-msgstr "como lista"
+#: ../lib/advene/gui/views/annotationdisplay.py:112
+#, fuzzy, python-format
+msgid ""
+"Schema %(schema)s (id %(id)s)\n"
+"%(description)s\n"
+"%(stats)s"
+msgstr ""
+"Esquema %(schema)s\n"
+"%(description)s\n"
+"%(total)s\n"
+"Id: %(id)s"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:542
-msgid "as a table"
-msgstr "como tabla"
+#: ../lib/advene/gui/views/annotationdisplay.py:233
+msgid "Screenshot"
+msgstr "Captura de pantalla"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:543
-#: ../lib/advene/gui/views/viewbook.py:380
-msgid "as a transcription"
-msgstr "como transcripción"
+#: ../lib/advene/gui/views/annotationdisplay.py:255
+#: ../lib/advene/gui/views/relationdisplay.py:104
+msgid "Contents"
+msgstr "Contenido"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:661
-#: ../lib/advene/gui/views/transcription.py:461
-#, python-format
-msgid "Annotation %s"
-msgstr "Anotación %s"
+#: ../lib/advene/gui/views/annotationdisplay.py:258
+#: ../lib/advene/gui/views/editaccumulator.py:74
+msgid "Validate"
+msgstr "Validar"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:662
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:681
-msgid "Play video"
-msgstr "Reproducir video"
+#: ../lib/advene/gui/views/relationdisplay.py:34
+msgid "RelationDisplay"
+msgstr "Mostrar relación"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:663
-msgid "Show timestamp only"
-msgstr "Solo muestra marca de tiempo"
+#: ../lib/advene/gui/views/relationdisplay.py:36
+msgid "Display the contents of a relation"
+msgstr "Muestra los contenidos de una relación "
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:664
-msgid "Show content only"
-msgstr "Solo muestra contenido"
+#: ../lib/advene/gui/views/relationdisplay.py:79
+msgid "No relation"
+msgstr "No hay relación"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:665
-msgid "Show snapshot only"
-msgstr "Solo muestra captura"
+#: ../lib/advene/gui/views/relationdisplay.py:113
+#: ../lib/advene/gui/edit/elements.py:588
+#: ../lib/advene/gui/edit/elements.py:1071
+msgid "Members"
+msgstr "Miembros"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:667
-msgid "Show overlayed timestamp"
-msgstr "Muestra marca de tiempo superpuesta"
+#: ../lib/advene/gui/views/viewplugin.py:60
+msgid "Generic view plugin"
+msgstr "Plugin de vista generica"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:668
-msgid "Show overlayed content"
-msgstr "Mostrar contenido superpuesto"
+#: ../lib/advene/gui/views/viewplugin.py:62
+msgid "You should not ever see this tooltip..."
+msgstr "No deberías de ver este consejo de  herramienta..."
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:670
-#, python-format
-msgid "Annotation type %s"
-msgstr "Tipos de anotación %s"
+#: ../lib/advene/gui/views/checker.py:37
+msgid "Checker"
+msgstr "Revisador"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:671
-msgid "display as list"
-msgstr "mostrar como lista"
+#: ../lib/advene/gui/views/checker.py:39
+msgid "Check various package properties"
+msgstr "Revisar varias propiedades del paquete"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:672
-#, fuzzy
-msgid "display as grid"
-msgstr "mostrar como lista"
+#: ../lib/advene/gui/views/checker.py:89
+msgid "List of possible issues in the current package"
+msgstr "Lista de problemas posibles en el paquete actual"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:673
-msgid "display as table"
-msgstr "mostrar como tabla"
+#: ../lib/advene/gui/views/checker.py:107
+msgid "Overlapping"
+msgstr "Traslapar"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:674
-msgid "display as transcription"
-msgstr "mostrar como transcripción"
+#: ../lib/advene/gui/views/table.py:61
+msgid "Annotation table view"
+msgstr "Vista de tabla de las anotaciones"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:683
-msgid "Open link"
-msgstr "Abrir vínculo"
+#: ../lib/advene/gui/views/table.py:63
+msgid "Display annotations in a table"
+msgstr "Mostrar las anotaciones en una tabla"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:739
-#, python-format
-msgid "HTML editor: cannot parse content (%s)"
-msgstr "Editor HTML: no puede analizar el contenido (%s)"
+#: ../lib/advene/gui/views/table.py:74
+#, fuzzy
+msgid "Export as CSV"
+msgstr "Exporta una tabla"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:772
-#, python-format
-msgid "Heading %d"
-msgstr "Título %d"
+#: ../lib/advene/gui/views/table.py:268 ../lib/advene/gui/views/table.py:550
+msgid "Snapshot"
+msgstr "Capturas"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:783
-msgid "Bold"
-msgstr "Negrita"
+#: ../lib/advene/gui/views/table.py:281
+#: ../lib/advene/gui/views/timeline.py:1745
+msgid "Cannot update the annotation, its representation is too complex"
+msgstr "No se puede actualizar la anotación, su representación es muy compleja"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:784
-msgid "Italic"
-msgstr "Itálica"
+#: ../lib/advene/gui/views/table.py:311 ../lib/advene/gui/edit/elements.py:606
+#: ../lib/advene/gui/edit/elements.py:683
+#: ../lib/advene/gui/edit/elements.py:743
+#: ../lib/advene/gui/edit/elements.py:1134
+msgid "Content"
+msgstr "Contenido"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:785
-msgid "Header"
-msgstr "Encabezado"
+#: ../lib/advene/gui/views/table.py:312 ../lib/advene/gui/views/table.py:682
+#: ../lib/advene/gui/views/browser.py:368 ../lib/advene/gui/edit/create.py:94
+#: ../lib/advene/gui/edit/elements.py:514
+#: ../lib/advene/gui/edit/elements.py:563
+#: ../lib/advene/gui/edit/elements.py:665
+msgid "Type"
+msgstr "Tipo"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:787
-msgid "Copy"
-msgstr "Copiar"
+#: ../lib/advene/gui/views/table.py:313 ../lib/advene/gui/edit/elements.py:1800
+msgid "Begin"
+msgstr "Inicio"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:788
-msgid "Cut"
-msgstr "Cortar"
+#: ../lib/advene/gui/views/table.py:316 ../lib/advene/gui/views/table.py:683
+#: ../lib/advene/gui/util/dialog.py:400 ../lib/advene/gui/edit/rules.py:1091
+#: ../lib/advene/gui/edit/imports.py:328 ../lib/advene/gui/edit/elements.py:513
+#: ../lib/advene/gui/edit/elements.py:562
+#: ../lib/advene/gui/edit/elements.py:650
+#: ../lib/advene/gui/edit/elements.py:730
+#: ../lib/advene/gui/edit/elements.py:879
+#: ../lib/advene/gui/edit/elements.py:948
+#: ../lib/advene/gui/edit/elements.py:1060
+#: ../lib/advene/gui/edit/elements.py:1121
+msgid "Id"
+msgstr "Id"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:789
-msgid "Paste"
-msgstr "Pegar"
+#: ../lib/advene/gui/views/table.py:317 ../lib/advene/gui/views/finder.py:105
+#: ../lib/advene/util/helper.py:408
+msgid "Package"
+msgstr "Paquete"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:791
-#: ../lib/advene/gui/edit/schemaeditor.py:64
-#: ../lib/advene/gui/views/timeline.py:134 ../lib/advene/gui/views/tree.py:428
-msgid "Refresh"
-msgstr "Refrescar"
+#: ../lib/advene/gui/views/table.py:455 ../lib/advene/gui/views/table.py:633
+msgid "Export data to file..."
+msgstr "Exportar datos a un archivo..."
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:847
-msgid "WYSIWYG editor"
-msgstr "Editor WYSIWYG"
+#: ../lib/advene/gui/views/table.py:464 ../lib/advene/gui/views/table.py:642
+#, python-format
+msgid "Error while exporting data to %(filename)s: %(error)s"
+msgstr "Error mientras se exportaban los datos a %(filename)s: %(error)s"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:857
-msgid "Edit HTML source"
-msgstr "Editar el código fuente HTML"
+#: ../lib/advene/gui/views/table.py:475
+msgid "id"
+msgstr "id"
 
-#: ../lib/advene/gui/plugins/logmessages.py:35
-msgid "Log Messages"
-msgstr "Registrar mensajes"
+#: ../lib/advene/gui/views/table.py:475
+msgid "type"
+msgstr "tipo"
 
-#: ../lib/advene/gui/edit/dvdselect.py:73
-#: ../lib/advene/gui/edit/importer.py:143
-msgid "Stop"
-msgstr "Detener"
+#: ../lib/advene/gui/views/table.py:475
+msgid "begin"
+msgstr "inicio"
 
-#: ../lib/advene/gui/edit/dvdselect.py:82
-#: ../lib/advene/gui/edit/dvdselect.py:112
-msgid "Preview"
-msgstr "Vista previa"
+#: ../lib/advene/gui/views/table.py:475
+msgid "end"
+msgstr "fin"
 
-#: ../lib/advene/gui/edit/dvdselect.py:91
-msgid ""
-"Select the correct\n"
-"title and chapter\n"
-"of the DVD"
-msgstr ""
-"Seleccciona el\n"
-"titulo y capitulo \n"
-"correctos del DVD"
+#: ../lib/advene/gui/views/table.py:475
+msgid "content"
+msgstr "contenido"
 
-#: ../lib/advene/gui/edit/dvdselect.py:104
-msgid "Chapter"
-msgstr "Capitulo"
+#: ../lib/advene/gui/views/table.py:479 ../lib/advene/gui/views/table.py:658
+#: ../lib/advene/core/controller.py:2646
+#, python-format
+msgid "Data exported to %s"
+msgstr "Datos exportados a %s"
 
-#: ../lib/advene/gui/edit/merge.py:33
-msgid "Create element"
-msgstr "Crear elemento"
+#: ../lib/advene/gui/views/table.py:499
+#, python-format
+msgid "Set %(attr)s time to %(time)s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:34
-msgid "Create annotation (duplicate id)"
-msgstr "Crear anotación (id duplicada)"
+#: ../lib/advene/gui/views/table.py:558
+msgid "Generic table view"
+msgstr "Vista de tabla genérica"
 
-#: ../lib/advene/gui/edit/merge.py:35
-msgid "Create relation (duplicate id)"
-msgstr "Crear relación (id duplicada)"
+#: ../lib/advene/gui/views/table.py:560
+msgid "Display Advene elements in a table."
+msgstr "Mostrar los elementos de Advene en tabla"
 
-#: ../lib/advene/gui/edit/merge.py:36
-msgid "Update the color"
-msgstr "Actualizar el color"
+#: ../lib/advene/gui/views/table.py:583
+#, python-format
+msgid "Error in source evaluation %(source)s: %(error)s"
+msgstr "Error en la evaluación de la fuente %(source)s: %(error)s"
 
-#: ../lib/advene/gui/edit/merge.py:37
-msgid "Update the representation"
-msgstr "Actualizar la representación"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element title"
+msgstr "Título del elemento"
 
-#: ../lib/advene/gui/edit/merge.py:38
-msgid "Update the description"
-msgstr "Actualizar la descripción"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element type"
+msgstr "Tipo del elemento"
 
-#: ../lib/advene/gui/edit/merge.py:39
-msgid "Update the title"
-msgstr "Actualizar el título"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element id"
+msgstr "Id del elemento"
 
-#: ../lib/advene/gui/edit/merge.py:40
-msgid "Update the mimetype"
-msgstr "Actualizar el tipo mime"
+#: ../lib/advene/gui/views/accumulatorpopup.py:51
+msgid "PopupAccumulator"
+msgstr "AcumuladorPopup"
 
-#: ../lib/advene/gui/edit/merge.py:41
-msgid "Update the begin time"
-msgstr "Actualizar el tiempo inicial"
+#: ../lib/advene/gui/views/bookmarks.py:51
+msgid "Bookmarks importer"
+msgstr "Importador de separadores"
 
-#: ../lib/advene/gui/edit/merge.py:42
-msgid "Update the end time"
-msgstr "Actualizar el tiempo final"
+#: ../lib/advene/gui/views/bookmarks.py:72
+msgid "Bookmarks"
+msgstr "Separadores"
 
-#: ../lib/advene/gui/edit/merge.py:43
-msgid "Update the content"
-msgstr "Actualizar el contenido"
+#: ../lib/advene/gui/views/bookmarks.py:74
+msgid "Bookmark timecodes with their corresponding screenshots"
+msgstr ""
+"Separador de tiempos de código con sus capturas de pantalla correspondientes"
 
-#: ../lib/advene/gui/edit/merge.py:44
-msgid "Update the matchFilter"
-msgstr "Actualizar el filtro de concordancia"
+#: ../lib/advene/gui/views/bookmarks.py:80 ../lib/advene/gui/views/tagbag.py:63
+#: ../lib/advene/gui/views/activebookmarks.py:62
+#: ../lib/advene/gui/views/logwindow.py:50 ../lib/advene/gui/edit/montage.py:59
+msgid "Clear"
+msgstr "Limpiar"
 
-#: ../lib/advene/gui/edit/merge.py:45
-msgid "Update the member types"
-msgstr "Actualizar tipos de miembros"
+#: ../lib/advene/gui/views/bookmarks.py:145
+msgid "Select the annotation type to generate"
+msgstr "Selecciona el tipo de anotacion para generar"
 
-#: ../lib/advene/gui/edit/merge.py:46
-msgid "Update tags"
-msgstr "Actualizar etiquetas"
+#: ../lib/advene/gui/views/bookmarks.py:150
+msgid "Choose a duration"
+msgstr "Elige una duración"
 
-#: ../lib/advene/gui/edit/merge.py:90
-msgid "Difference between original and merged elements"
-msgstr "Diferencia entre el elemento original y el unido"
+#: ../lib/advene/gui/views/bookmarks.py:151
+msgid "Enter the standard duration (in ms) of created annotations."
+msgstr "Ingresa la duración estándar (en ms) de las anotaciones creadas."
 
-#: ../lib/advene/gui/edit/merge.py:136
-msgid "Current element"
-msgstr "Elemento actual"
+#: ../lib/advene/gui/views/bookmarks.py:168
+msgid "Converted from bookmarks"
+msgstr "Convertido de los separadores"
 
-#: ../lib/advene/gui/edit/merge.py:141
-msgid "Updated element"
-msgstr "Elemento actualizado"
+#: ../lib/advene/gui/views/bookmarks.py:172
+#: ../lib/advene/gui/edit/transcribe.py:1114
+#, python-format
+msgid ""
+"Conversion completed.\n"
+"%s annotations generated."
+msgstr ""
+"Conversion completa.\n"
+"%s anotaciones generadas."
 
-#: ../lib/advene/gui/edit/merge.py:147
-msgid "Show diff"
-msgstr "Mostrar diferencias"
+#: ../lib/advene/gui/views/bookmarks.py:226
+msgid "Drop a position here to remove it from the list"
+msgstr "Suelta una posición aquí para removerla de la lista"
 
-#: ../lib/advene/gui/edit/merge.py:180
-msgid "Merge?"
-msgstr "¿Unir?"
+#: ../lib/advene/gui/views/bookmarks.py:244
+#: ../lib/advene/gui/views/activebookmarks.py:496
+msgid "Insert a bookmark for the current video time"
+msgstr "Inserta un separador para el tiempo actual del video"
 
-#: ../lib/advene/gui/edit/merge.py:197
-msgid "Element"
-msgstr "Elemento"
+#: ../lib/advene/gui/views/bookmarks.py:245
+msgid "Convert bookmarks to annotations"
+msgstr "Convierte los separadores a anotaciones"
 
-#: ../lib/advene/gui/edit/merge.py:230 ../lib/advene/gui/edit/imports.py:406
-#, python-format
-msgid "Package %s"
-msgstr "Paquete %s"
+#: ../lib/advene/gui/views/viewbook.py:39
+msgid "ViewBook"
+msgstr "Libro de vistas"
 
-#: ../lib/advene/gui/edit/merge.py:230 ../lib/advene/gui/edit/imports.py:406
-msgid "No title"
-msgstr "Sin titulo"
+#: ../lib/advene/gui/views/viewbook.py:60
+#: ../lib/advene/gui/views/viewbook.py:67
+msgid "Cannot remove this widget, it is essential."
+msgstr "No se puede remover este widget, es esencial."
 
-#: ../lib/advene/gui/edit/merge.py:267
-msgid "All"
-msgstr "Todo"
+#: ../lib/advene/gui/views/viewbook.py:141
+msgid "Detach"
+msgstr "Desadjuntar"
 
-#: ../lib/advene/gui/edit/properties.py:32
-#: ../lib/advene/gui/edit/shapewidget.py:1588
-msgid "Properties"
-msgstr "Propiedades"
+#: ../lib/advene/gui/views/viewbook.py:145
+#: ../lib/advene/gui/views/editaccumulator.py:80
+msgid "Close"
+msgstr "Cerrar"
 
-#: ../lib/advene/gui/edit/properties.py:46
-#: ../lib/advene/gui/edit/transcribe.py:147
-#: ../lib/advene/gui/edit/transcribe.py:1195
-#: ../lib/advene/gui/views/tagbag.py:61
-#: ../lib/advene/gui/views/timeline.py:3483
-#: ../lib/advene/gui/views/timeline.py:3624 ../lib/advene/gui/main.py:4235
-msgid "Preferences"
-msgstr "Preferencias"
+#: ../lib/advene/gui/views/viewbook.py:162
+msgid "Rename the view"
+msgstr "Renombrar la vista"
 
-#: ../lib/advene/gui/edit/properties.py:371
-msgid "Choose a file"
-msgstr "Elegir un archivo"
+#: ../lib/advene/gui/views/viewbook.py:163
+msgid "Please enter the new name of the view"
+msgstr "Por favor ingresa el nuevo nombre de la vista"
 
-#: ../lib/advene/gui/edit/importer.py:45
-msgid "Importer"
-msgstr "Importador"
+#: ../lib/advene/gui/views/viewbook.py:202
+msgid "Detach view in its own window, or drag-and-drop to another zone"
+msgstr ""
+"Desadjuntar la vista en su propia ventana, o arrastra y suelta en otra zona"
 
-#: ../lib/advene/gui/edit/importer.py:101
-#: ../lib/advene/gui/edit/importer.py:111
-msgid "Advene package importer"
-msgstr "Importador de paquetes Advene"
+#: ../lib/advene/gui/views/viewbook.py:216
+msgid "Close view"
+msgstr "Cerrar vista"
 
-#: ../lib/advene/gui/edit/importer.py:115
-msgid "Not likely"
-msgstr "No es probable"
+#: ../lib/advene/gui/views/viewbook.py:239
+#: ../lib/advene/gui/views/viewbook.py:245
+#: ../lib/advene/gui/edit/elements.py:336
+#, python-format
+msgid "Edit %s"
+msgstr "Editar %s"
 
-#: ../lib/advene/gui/edit/importer.py:137
+#: ../lib/advene/gui/views/viewbook.py:268 ../lib/advene/rules/actions.py:601
 #, python-format
-msgid "Completed conversion: %(statistics)s"
-msgstr "Conversión completada: %(statistics)s"
+msgid "Cannot find the view %s"
+msgstr "No se puede encontrar la vista %s"
 
-#: ../lib/advene/gui/edit/importer.py:253
-msgid "Choose the file to import"
-msgstr "Elige el archivo a importar"
+#: ../lib/advene/gui/views/viewbook.py:291
+#, fuzzy, python-format
+msgid "Open a new %s for..."
+msgstr "Abrir una nueva transcripción para..."
 
-#: ../lib/advene/gui/edit/importer.py:272
-msgid "Filter"
-msgstr "Filtro"
+#: ../lib/advene/gui/views/viewbook.py:303
+msgid "Create a new comment view"
+msgstr "Crear una nueva vista de comentario"
 
-#: ../lib/advene/gui/edit/importer.py:276
-msgid "Options"
-msgstr "Opciones"
+#: ../lib/advene/gui/views/viewbook.py:305
+msgid "Open a new view"
+msgstr "Abrir una nueva vista"
 
-#: ../lib/advene/gui/edit/importer.py:287
-msgid "Start"
-msgstr "Inicio"
+#: ../lib/advene/gui/views/viewbook.py:388
+#, python-format
+msgid "Use annotation-type %s :"
+msgstr "Utilizar un tipo de anotación  %s:"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:57
-msgid "Schema Editor"
-msgstr "Editor de esquema"
+#: ../lib/advene/gui/views/viewbook.py:392
+#: ../lib/advene/gui/views/viewbook.py:418
+msgid "to edit it"
+msgstr "para editarlo"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:132
-msgid "Display"
-msgstr "Mostrar"
+#: ../lib/advene/gui/views/viewbook.py:393
+#: ../lib/advene/gui/views/viewbook.py:419
+#: ../lib/advene/gui/views/viewbook.py:451
+msgid "to create a new static view"
+msgstr "para crear una nueva vista estática"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:155
-#: ../lib/advene/gui/edit/shapewidget.py:1587 ../lib/advene/gui/popup.py:472
-#: ../lib/advene/gui/popup.py:476
-msgid "Delete"
-msgstr "Borrar"
+#: ../lib/advene/gui/views/viewbook.py:395
+msgid "in a timeline"
+msgstr "en una linea de tiempo"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:762
-msgid "Remove relation type"
-msgstr "Remover tipo de relación"
+#: ../lib/advene/gui/views/viewbook.py:396
+msgid "as a montage"
+msgstr "como montaje"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:765
-#: ../lib/advene/gui/edit/schemaeditor.py:997
-msgid "Create HTML view"
-msgstr "Crear una vista HTML"
+#: ../lib/advene/gui/views/viewbook.py:397
+#: ../lib/advene/gui/views/viewbook.py:450
+msgid "in a table"
+msgstr "en una tabla"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:831
-msgid "Remove annotation type"
-msgstr "Remover tipo de anotación"
+#: ../lib/advene/gui/views/viewbook.py:398
+#: ../lib/advene/gui/views/viewbook.py:420
+msgid "in a query"
+msgstr "en una consulta"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:834
-msgid "Create relation type between this one and..."
-msgstr "Crea un tipo de relación entre este y..."
+#: ../lib/advene/gui/views/viewbook.py:398
+#: ../lib/advene/gui/views/viewbook.py:420
+#, python-format
+msgid "Query %s"
+msgstr "Consulta %s"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:969
-msgid "New schema"
-msgstr "Nuevo esquema"
+#: ../lib/advene/gui/views/viewbook.py:399
+#: ../lib/advene/gui/views/viewbook.py:421
+msgid "in the TALES browser"
+msgstr "en el navegador TALES"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:985 ../lib/advene/gui/popup.py:690
-#: ../lib/advene/gui/popup.py:750 ../lib/advene/gui/popup.py:803
-msgid "Select a color"
-msgstr "Selecciona un color"
+#: ../lib/advene/gui/views/viewbook.py:399
+#, python-format
+msgid "Browsing %s"
+msgstr "Navegando %s"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:988
-msgid "New annotation type"
-msgstr "Nuevo tipo de anotación"
+#: ../lib/advene/gui/views/viewbook.py:415
+#, python-format
+msgid "Use annotation %s :"
+msgstr "Utilizar anotación %s:"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:991
-msgid "New relation type"
-msgstr "Nuevo tipos de relación"
+#: ../lib/advene/gui/views/viewbook.py:421
+#, python-format
+msgid "Browse %s"
+msgstr "Navegar %s"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:994
-msgid "Hide this schema"
-msgstr "Esconder este esquema"
+#: ../lib/advene/gui/views/viewbook.py:422
+msgid "to display its contents"
+msgstr "para mostrar sus contenidos"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:1000
-msgid "Export drawing to pdf"
-msgstr "Exportar dibujo a pdf"
+#: ../lib/advene/gui/views/viewbook.py:422
+#, python-format
+msgid "%s"
+msgstr "%s"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:1042
-msgid "Choose a filename to export the schema as PDF"
-msgstr "Elige un nombre de archivo para exportar el esquema como PDF"
+#: ../lib/advene/gui/views/viewbook.py:423
+msgid "as a bookmark"
+msgstr "como separador"
 
-#: ../lib/advene/gui/edit/rules.py:84 ../lib/advene/gui/edit/rules.py:86
-#: ../lib/advene/gui/edit/create.py:252
-msgid "Rule"
-msgstr "Regla"
+#: ../lib/advene/gui/views/viewbook.py:441
+msgid "as the context for the query..."
+msgstr "como contexto para la consulta..."
 
-#: ../lib/advene/gui/edit/rules.py:95 ../lib/advene/gui/edit/create.py:242
-msgid "Subviews"
-msgstr "Subvistas"
-
-#: ../lib/advene/gui/edit/rules.py:122
-msgid "Add a new rule"
-msgstr "Agregar una nueva regla"
-
-#: ../lib/advene/gui/edit/rules.py:126
-msgid "Subview"
-msgstr "Subvista"
-
-#: ../lib/advene/gui/edit/rules.py:129
-msgid "Add a subview list"
-msgstr "Agregar una lista  de subvista"
+#: ../lib/advene/gui/views/viewbook.py:445
+msgid "Set of annotations"
+msgstr "Conjunto de anotaciones"
 
-#: ../lib/advene/gui/edit/rules.py:135
-msgid "Remove the current rule"
-msgstr "Eliminar la regla actual"
+#: ../lib/advene/gui/views/viewbook.py:446
+msgid "Use annotations:"
+msgstr "Usa anotaciones:"
 
-#: ../lib/advene/gui/edit/rules.py:275
-msgid "Source expression"
-msgstr "Expresion fuente (original)"
+#: ../lib/advene/gui/views/viewbook.py:449
+msgid "to edit them"
+msgstr "para editarlas"
 
-#: ../lib/advene/gui/edit/rules.py:277
-msgid "Return expression"
-msgstr "Regresar expresion"
+#: ../lib/advene/gui/views/viewbook.py:452
+msgid "as bookmarks"
+msgstr "como separadores"
 
-#: ../lib/advene/gui/edit/rules.py:351
-msgid "For all elements in "
-msgstr "Por todos los elementos en"
+#: ../lib/advene/gui/views/transcription.py:51
+msgid "Transcription"
+msgstr "Transcripcion"
 
-#: ../lib/advene/gui/edit/rules.py:352
-msgid "All annotations of the package"
-msgstr "Todas las anotaciones del paquete"
+#: ../lib/advene/gui/views/transcription.py:53
+msgid "Display annotations as a text transcription"
+msgstr "Mostrar las anotaciones como transcripción"
 
-#: ../lib/advene/gui/edit/rules.py:353
-msgid "All views of the package"
-msgstr "Todas las vistas del paquete"
+#: ../lib/advene/gui/views/transcription.py:158
+msgid "Transcription options"
+msgstr "Opciones de transcripción"
 
-#: ../lib/advene/gui/edit/rules.py:354 ../lib/advene/gui/edit/rules.py:798
-msgid "The context annotations"
-msgstr "Las anotaciones del contexto"
+#: ../lib/advene/gui/views/transcription.py:159
+msgid "Default representation"
+msgstr "Representación predeterminada"
 
-#: ../lib/advene/gui/edit/rules.py:355 ../lib/advene/gui/edit/rules.py:799
-msgid "The annotations of the context type"
-msgstr "Las anotaciones del tipo de contexto"
+#: ../lib/advene/gui/views/transcription.py:159
+msgid "Use the default representation for annotations"
+msgstr "Usar la representación predeterminada para las anotaciones"
 
-#: ../lib/advene/gui/edit/rules.py:370
-msgid "Return "
-msgstr "Regresar"
+#: ../lib/advene/gui/views/transcription.py:160
+#: ../lib/advene/gui/edit/elements.py:988
+msgid "Representation"
+msgstr "Representacion"
 
-#: ../lib/advene/gui/edit/rules.py:372 ../lib/advene/gui/edit/rules.py:787
-msgid "The element"
-msgstr "El elemento"
+#: ../lib/advene/gui/views/transcription.py:160
+msgid ""
+"If default representation is unchecked,\n"
+"this TALES expression that will be used to format the annotations."
+msgstr ""
+"Si la representación predeterminada no está seleccionada,\n"
+"esta expresión TALES será utilizada para dar formato a las anotaciones."
 
-#: ../lib/advene/gui/edit/rules.py:373 ../lib/advene/gui/edit/rules.py:788
-msgid "The element's content"
-msgstr "El contenido del elemento"
+#: ../lib/advene/gui/views/transcription.py:161
+msgid "Separator"
+msgstr "Separador"
 
-#: ../lib/advene/gui/edit/rules.py:388
-msgid "If the element matches "
-msgstr "Si el elemento concuerda"
+#: ../lib/advene/gui/views/transcription.py:162
+msgid "This separator will be inserted between the annotations."
+msgstr "Este separador va a ser insertado entre las anotaciones"
 
-#: ../lib/advene/gui/edit/rules.py:390
-msgid "Return the element if it matches "
-msgstr "Regresar el elemento si concuerda"
+#: ../lib/advene/gui/views/transcription.py:163
+msgid "Whitespace"
+msgstr "Espacio en blanco"
 
-#: ../lib/advene/gui/edit/rules.py:408 ../lib/advene/gui/edit/rules.py:617
-msgid "All conditions must be met"
-msgstr "Todas las condiciones se deben cumplir"
+#: ../lib/advene/gui/views/transcription.py:164
+msgid "Newline"
+msgstr "Nueva línea"
 
-#: ../lib/advene/gui/edit/rules.py:409 ../lib/advene/gui/edit/rules.py:618
-msgid "Any condition can be met"
-msgstr "Cualquier condición se puede cumplir"
+#: ../lib/advene/gui/views/transcription.py:165
+msgid "Tabulation"
+msgstr "Tabulación "
 
-#: ../lib/advene/gui/edit/rules.py:493 ../lib/advene/gui/edit/rules.py:563
-#, python-format
-msgid "Rule <b>%s</b>"
-msgstr "Regla <b>%s</b>"
+#: ../lib/advene/gui/views/transcription.py:166
+msgid "Dash"
+msgstr "Guión"
 
-#: ../lib/advene/gui/edit/rules.py:574
-msgid "Rule name"
-msgstr "Nombre de regla"
+#: ../lib/advene/gui/views/transcription.py:167
+msgid "User defined"
+msgstr "Definido por el usuario"
 
-#: ../lib/advene/gui/edit/rules.py:591
-msgid "Event"
-msgstr "Evento"
+#: ../lib/advene/gui/views/transcription.py:169
+msgid "User-defined separator"
+msgstr "Separador definido por el usuario"
 
-#: ../lib/advene/gui/edit/rules.py:599
-msgid "If"
-msgstr "Si"
+#: ../lib/advene/gui/views/transcription.py:169
+msgid ""
+"Separator used if user-defined is selected.Use \\n for a newline and \\t for "
+"a tabulation."
+msgstr ""
+"Separador utilizado si la definición de usuario está seleccionado.Usar \\n "
+"para una nueva línea \\t para tabulación."
 
-#: ../lib/advene/gui/edit/rules.py:638
-msgid "Then"
-msgstr "Entonces"
+#: ../lib/advene/gui/views/transcription.py:170
+msgid "Display timestamps"
+msgstr "Muestra las marcas de tiempo"
 
-#: ../lib/advene/gui/edit/rules.py:683
-msgid "When the "
-msgstr "Cuando el "
+#: ../lib/advene/gui/views/transcription.py:170
+msgid "Insert timestsamp values"
+msgstr "Inserta los valores de la marca de tiempo"
 
-#: ../lib/advene/gui/edit/rules.py:696
-msgid " occurs,"
-msgstr "ocurra, "
+#: ../lib/advene/gui/views/transcription.py:171
+msgid "Display annotation bounds"
+msgstr "Muestra los limites de la anotacion"
 
-#: ../lib/advene/gui/edit/rules.py:723 ../lib/advene/gui/edit/rules.py:726
+#: ../lib/advene/gui/views/transcription.py:231
 #, python-format
-msgid "Condition expression: %s"
-msgstr "Expresión condicional: %s"
-
-#: ../lib/advene/gui/edit/rules.py:765
-msgid "The annotation type"
-msgstr "El tipo de anotación"
+msgid ""
+"Cannot convert the following annotations,\n"
+"the representation pattern is too complex.\n"
+"%s"
+msgstr ""
+"No se pueden convertir las anotaciones siguientes,\n"
+"el patrón de representación es muy complejo.\n"
+"%s"
 
-#: ../lib/advene/gui/edit/rules.py:768
-#, python-format
-msgid "The value of the %s attribute"
-msgstr "El valor del atributo %s"
+#: ../lib/advene/gui/views/transcription.py:242
+msgid ""
+"Cannot validate the update.\n"
+"The representation pattern is too complex."
+msgstr ""
+"No se puede validar la actualización. \n"
+"El patrón de representación es muy complejo."
 
-#: ../lib/advene/gui/edit/rules.py:770
-msgid "The annotation fragment"
-msgstr "El fragmento de la anotación"
+#: ../lib/advene/gui/views/transcription.py:268
+msgid "Save transcription to a text file"
+msgstr "Guarda la transcripción a un archivo de texto"
 
-#: ../lib/advene/gui/edit/rules.py:771
-msgid "The annotation begin time"
-msgstr "El tiempo inicial de la anotación"
+#: ../lib/advene/gui/views/transcription.py:269
+msgid "Apply the modifications"
+msgstr "Aplicar las modificaciones"
 
-#: ../lib/advene/gui/edit/rules.py:772
-msgid "The annotation end time"
-msgstr "El tiempo final de la anotación"
+#: ../lib/advene/gui/views/transcription.py:270
+msgid "Find text"
+msgstr "Encontrar texto"
 
-#: ../lib/advene/gui/edit/rules.py:774
-msgid "The annotation MIME-type"
-msgstr "El tipo MIME de la anotación"
+#: ../lib/advene/gui/views/transcription.py:271
+msgid "Quickly switch display options"
+msgstr "Cambia las opciones de visualización rápidamente"
 
-#: ../lib/advene/gui/edit/rules.py:775
-msgid "The annotation's incoming relations"
-msgstr "Las relaciones entrantes de la anotación"
+#: ../lib/advene/gui/views/transcription.py:272
+msgid "Refresh the transcription"
+msgstr "Refresca la transcripción"
 
-#: ../lib/advene/gui/edit/rules.py:776
-msgid "The annotation's outgoing relations"
-msgstr "Las relaciones salientes de la anotación"
+#: ../lib/advene/gui/views/transcription.py:273
+msgid "Edit preferences"
+msgstr "Preferencias de edición"
 
-#: ../lib/advene/gui/edit/rules.py:779
+#: ../lib/advene/gui/views/transcription.py:692
 #, python-format
-msgid "The %s-related incoming annotations"
-msgstr "Las %s-relacionadas anotaciones entrantes"
+msgid "Cannot write to %(filename)s: %(error)s:"
+msgstr "No se puede escribir a %(filename)s: %(error)s:"
 
-#: ../lib/advene/gui/edit/rules.py:783
+#: ../lib/advene/gui/views/transcription.py:698
+#: ../lib/advene/gui/edit/transcribe.py:859
 #, python-format
-msgid "The %s-related outgoing annotations"
-msgstr "Las %s-relacionadas anotaciones salientes "
+msgid "Transcription saved to %s"
+msgstr "Transcripción guardada a %s"
 
-#: ../lib/advene/gui/edit/rules.py:789
-msgid "The element fragment"
-msgstr "El fragmento del elemento"
+#: ../lib/advene/gui/views/browser.py:169
+#: ../lib/advene/gui/views/browser.py:171
+msgid "TALES browser"
+msgstr "Navegador TALES"
 
-#: ../lib/advene/gui/edit/rules.py:790
-msgid "The element begin time"
-msgstr "El tiempo inicial del elemento"
+#: ../lib/advene/gui/views/browser.py:176
+msgid "Display result in table"
+msgstr "Mostrar el resultado en tabla"
 
-#: ../lib/advene/gui/edit/rules.py:791
-msgid "The element end time"
-msgstr "El tiempo final del elemento"
+#: ../lib/advene/gui/views/browser.py:199
+msgid "Insert path"
+msgstr "Insertar ruta"
 
-#: ../lib/advene/gui/edit/rules.py:792
-msgid "The element duration"
-msgstr "La duración del elemento"
+#: ../lib/advene/gui/views/browser.py:200
+msgid "Insert value"
+msgstr "Insertar valor"
 
-#: ../lib/advene/gui/edit/rules.py:793
-msgid "The element type"
-msgstr "El tipo de elemento"
+#: ../lib/advene/gui/views/browser.py:255
+msgid "Expression returned None (there was an exception)"
+msgstr "La expresión regresó None (hubo una excepción)"
 
-#: ../lib/advene/gui/edit/rules.py:794
-msgid "The element's incoming relations"
-msgstr "Las relaciones entrantes del elemento"
+#: ../lib/advene/gui/views/browser.py:308
+msgid "Result is not a list"
+msgstr "El resultado no es una lista"
 
-#: ../lib/advene/gui/edit/rules.py:795
-msgid "The element's outgoing relations"
-msgstr "Las relaciones salientes del elemento"
+#: ../lib/advene/gui/views/browser.py:365
+#: ../lib/advene/gui/edit/shapewidget.py:944
+msgid "Path"
+msgstr "Ruta"
 
-#: ../lib/advene/gui/edit/rules.py:796
-msgid "The context"
-msgstr "El contexto"
+#: ../lib/advene/gui/views/browser.py:372
+#: ../lib/advene/gui/edit/elements.py:2163
+msgid "Value"
+msgstr "Valor"
 
-#: ../lib/advene/gui/edit/rules.py:797
-msgid "The context fragment"
-msgstr "El fragmento de contexto"
+#: ../lib/advene/gui/views/timeline.py:128
+msgid "Display annotations on a timeline"
+msgstr "Muestra las anotaciones en una linea de tiempo"
 
-#: ../lib/advene/gui/edit/rules.py:809
-#, python-format
-msgid "annotation-type %s"
-msgstr "tipo de anotación %s"
-
-#: ../lib/advene/gui/edit/rules.py:812
-#, python-format
-msgid "relation-type %s"
-msgstr "tipos de relación %s"
+#: ../lib/advene/gui/views/timeline.py:142
+msgid "Limit display to current area"
+msgstr "Limitar la visualización al área actual"
 
-#: ../lib/advene/gui/edit/rules.py:834
-msgid "Select a condition"
-msgstr "Selecciona una condicion"
+#: ../lib/advene/gui/views/timeline.py:143
+#: ../lib/advene/gui/views/timeline.py:3307
+msgid "Display whole movie"
+msgstr "Muestra la película completa"
 
-#: ../lib/advene/gui/edit/rules.py:878
+#: ../lib/advene/gui/views/timeline.py:173
 #, python-format
-msgid "Parameter %s"
-msgstr "Parámetro %s"
+msgid "Cannot find annotation type %s"
+msgstr "No se puede encontrar el tipo de anotación %s"
 
-#: ../lib/advene/gui/edit/rules.py:992
-msgid "Select an action"
-msgstr "Selecciona una acción"
+#: ../lib/advene/gui/views/timeline.py:234
+msgid "No scrolling"
+msgstr "No desplazar"
 
-#: ../lib/advene/gui/edit/rules.py:1083
-msgid "Activate?"
-msgstr "¿Activar?"
+#: ../lib/advene/gui/views/timeline.py:235
+msgid "Continuous scrolling"
+msgstr "Desplazar continuamente"
 
-#: ../lib/advene/gui/edit/shapewidget.py:83
-msgid "Generic shape"
-msgstr "Forma genérica"
+#: ../lib/advene/gui/views/timeline.py:236
+msgid "Discrete scrolling"
+msgstr "Desplazamiento discreto"
+
+#: ../lib/advene/gui/views/timeline.py:237
+msgid "Annotation scrolling"
+msgstr "Desplazamiento con anotaciones"
 
-#: ../lib/advene/gui/edit/shapewidget.py:234
-#: ../lib/advene/gui/edit/shapewidget.py:741
+#: ../lib/advene/gui/views/timeline.py:582
 #, python-format
-msgid "Link to %s"
-msgstr "Vínculo hacia %s"
+msgid "%d annotations"
+msgstr "%d anotaciones"
 
-#: ../lib/advene/gui/edit/shapewidget.py:321
-#: ../lib/advene/gui/views/tagbag.py:132
-msgid "Name"
-msgstr "Nombre"
+#: ../lib/advene/gui/views/timeline.py:585
+msgid "Display all types"
+msgstr "Muestra todos los tipos"
 
-#: ../lib/advene/gui/edit/shapewidget.py:326
-#: ../lib/advene/gui/edit/shapewidget.py:1299
-msgid "Link"
-msgstr "Vínculo"
+#: ../lib/advene/gui/views/timeline.py:587
+#, python-format
+msgid ""
+"There are %d annotations.\n"
+"The current timeline may take a long time to display them, so only the first "
+"two annotation types are displayed. Use the annotation type selector (second "
+"button in the timeline) to select other annotations types to display, or "
+"click on the 'Display all types' button below."
+msgstr ""
+"Hay %d anotaciones.\n"
+"La línea de tiempo actual puede tardar mucho tiempo en mostrarlas, así que "
+"solo los primeros dos tipos de anotaciones se muestran. Utiliza el selector "
+"de tipo de anotaciones (segundo botón en la línea de tiempo) para "
+"seleccionar otros tipos de anotación para mostrar, o da clic en el debajo "
+"botón 'Mostrar todos los tipos'."
 
-#: ../lib/advene/gui/edit/shapewidget.py:331
-msgid "Link label"
-msgstr "Etiqueta de vínculo"
+#: ../lib/advene/gui/views/timeline.py:1055
+msgid "Split at current player position"
+msgstr "Dividir en la posición actual del reproductor"
 
-#: ../lib/advene/gui/edit/shapewidget.py:349
-msgid "Linewidth"
-msgstr "Ancho de línea"
+#: ../lib/advene/gui/views/timeline.py:1059
+msgid "Center and zoom"
+msgstr "Centrar y acercar"
 
-#: ../lib/advene/gui/edit/shapewidget.py:354
-msgid "Filled"
-msgstr "Lleno"
+#: ../lib/advene/gui/views/timeline.py:1163
+msgid "Create a relation"
+msgstr "Crear una relacion"
 
-#: ../lib/advene/gui/edit/shapewidget.py:362
-msgid "Opacity"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:1173
+msgid "Create a new relation-type."
+msgstr "Crear un nuevo tipo de relación."
 
-#: ../lib/advene/gui/edit/shapewidget.py:404
-#, python-format
-msgid "Properties of %s"
-msgstr "Propiedades de %s"
+#: ../lib/advene/gui/views/timeline.py:1199
+msgid "Merge with this annotation"
+msgstr "Unir con esta anotación"
 
-#: ../lib/advene/gui/edit/shapewidget.py:451
-msgid "Rectangle"
-msgstr "Rectángulo"
+#: ../lib/advene/gui/views/timeline.py:1208
+msgid "Align both begin times"
+msgstr "Alinear ambos tiempos de inicio"
 
-#: ../lib/advene/gui/edit/shapewidget.py:532
-#: ../lib/advene/gui/edit/shapewidget.py:652
-msgid "Text"
-msgstr "Texto"
+#: ../lib/advene/gui/views/timeline.py:1209
+msgid "Align both end times"
+msgstr "Alinear ambos tiempos finales"
 
-#: ../lib/advene/gui/edit/shapewidget.py:663
-msgid "Textsize"
-msgstr "Tamaño del texto"
+#: ../lib/advene/gui/views/timeline.py:1210
+msgid "Align end time to selected begin time"
+msgstr "Alinear el tiempo final al tiempo inicial seleccionado "
 
-#: ../lib/advene/gui/edit/shapewidget.py:677
-msgid "Image"
-msgstr "Imagen"
+#: ../lib/advene/gui/views/timeline.py:1211
+msgid "Align begin time to selected end time"
+msgstr "Alinear el tiempo inicial al tiempo final seleccionado"
 
-#: ../lib/advene/gui/edit/shapewidget.py:761
-msgid "Href"
-msgstr "Href"
+#: ../lib/advene/gui/views/timeline.py:1212
+msgid "Align all times"
+msgstr "Alinear todos los tiempo"
 
-#: ../lib/advene/gui/edit/shapewidget.py:771
-msgid "Line"
-msgstr "Línea"
+#: ../lib/advene/gui/views/timeline.py:1250
+msgid "Cannot delete the annotation : it has relations."
+msgstr "No puedo borrar la anotación: tiene relaciones."
 
-#: ../lib/advene/gui/edit/shapewidget.py:872
-msgid "Draw an arrow"
-msgstr "Dibujar una flecha"
+#: ../lib/advene/gui/views/timeline.py:1325
+msgid "Select the appropriate relation type"
+msgstr "Selecciona el tipo apropiado de relación"
 
-#: ../lib/advene/gui/edit/shapewidget.py:883
-msgid "Arrow size"
-msgstr "Tamaño de la flecha"
+#: ../lib/advene/gui/views/timeline.py:1344
+#, python-format
+msgid "Duplicate selection to type %s"
+msgstr "Duplicar selección al tipo %s"
 
-#: ../lib/advene/gui/edit/shapewidget.py:935
-#: ../lib/advene/gui/views/browser.py:359
-msgid "Path"
-msgstr "Ruta"
+#: ../lib/advene/gui/views/timeline.py:1347
+#, python-format
+msgid "Move selection to type %s"
+msgstr "Mover selección al tipo %s"
 
-#: ../lib/advene/gui/edit/shapewidget.py:1102
-#, fuzzy
-msgid "Close path"
-msgstr "Ruta de video"
+#: ../lib/advene/gui/views/timeline.py:1356
+#, python-format
+msgid "Duplicate annotation to type %s"
+msgstr "Duplicar anotación al tipo %s"
 
-#: ../lib/advene/gui/edit/shapewidget.py:1181
-msgid "Circle"
-msgstr "Círculo"
+#: ../lib/advene/gui/views/timeline.py:1360
+#, python-format
+msgid "Move annotation to type %s"
+msgstr "Mover anotación al tipo %s"
 
-#: ../lib/advene/gui/edit/shapewidget.py:1239
-msgid "Ellipse"
-msgstr "Elipse"
+#: ../lib/advene/gui/views/timeline.py:1367
+#, python-format
+msgid "Duplicate to type %(type)s at %(position)s"
+msgstr "Duplicar al tipo %(type)s en %(position)s"
 
-#: ../lib/advene/gui/edit/shapewidget.py:1589
-msgid "SVG"
-msgstr "SVG"
+#: ../lib/advene/gui/views/timeline.py:1373
+#, python-format
+msgid "Move to type %(type)s at %(position)s"
+msgstr "Mover al tipo %(type)s en %(position)s"
 
-#: ../lib/advene/gui/edit/shapewidget.py:2172
-msgid "Load SVG"
-msgstr "Cargar SVG"
+#: ../lib/advene/gui/views/timeline.py:1383
+msgid "Duplicate and create a relation"
+msgstr "Duplicar y crear una relación"
 
-#: ../lib/advene/gui/edit/shapewidget.py:2178
-msgid "Save SVG"
-msgstr "Guardar SVG"
+#: ../lib/advene/gui/views/timeline.py:1394
+#, python-format
+msgid "Duplicate at %s and create a relation"
+msgstr "Duplicar al %s y crear una relación"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:74
-#: ../lib/advene/gui/widget.py:1063
-msgid "Refresh snapshot"
-msgstr "Refrescar captura"
+#: ../lib/advene/gui/views/timeline.py:1425
+msgid "Annotation filter"
+msgstr "Filtro de anotación"
+
+#: ../lib/advene/gui/views/timeline.py:1426
+msgid "Enter the searched string"
+msgstr "Ingresar la cadena de texto buscada"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:102
+#: ../lib/advene/gui/views/timeline.py:1534
 #, python-format
-msgid "Decrement value by %.2f s"
-msgstr "Disminuye el valor por %.2f s"
+msgid "Duplicate all annotations to type %s"
+msgstr "Duplicar todas las anotaciones del tipo %s"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:104
+#: ../lib/advene/gui/views/timeline.py:1536
 #, python-format
-msgid "Increment value by %.2f s"
-msgstr "Aumenta el valor por %.2f s"
+msgid "Move all annotations to type %s"
+msgstr "Mover todas las anotaciones al tipo %s"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:130
-#, fuzzy
-msgid ""
-"Click to play\n"
-"Control+click to set to current time\n"
-"Scroll to modify value (with control/shift)\n"
-"Right-click to invalidate screenshot"
+#: ../lib/advene/gui/views/timeline.py:1538
+#, python-format
+msgid "Duplicate all annotations matching a string to type %s"
 msgstr ""
-"Clic para reproducir\n"
-"Control+clic para establecer el tiempo actual\\Desplazar para modificar el "
-"valor (con control/shift)\n"
-"Clic-derecho para invalidar la captura"
+"Duplicar todas las anotaciones que concuerden con una cadena de texto al "
+"tipo %s"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:145
-msgid ""
-"Enter a timecode.\n"
-"An integer value will be considered as milliseconds.\n"
-"A float value (12.2) will be considered as seconds.\n"
-"HH:MM:SS.sss values are possible."
+#: ../lib/advene/gui/views/timeline.py:1540
+#, python-format
+msgid "Move all annotations matching a string to type %s"
 msgstr ""
-"Ingresa un código de tiempo.\n"
-"Un valor entero será considerado como milisegundos.\n"
-"Un valor flotante (12.2) será considerado como segundos.\n"
-"Valores como HH:MM:SS.sss son posibles."
-
-#: ../lib/advene/gui/edit/timeadjustment.py:159
-msgid "Set to current player position"
-msgstr "Establecer a la posición del reproductor actual"
+"Mover todas las anotaciones que conuerden con una cadena de texto al tipo %s"
 
-#: ../lib/advene/gui/edit/create.py:81
+#: ../lib/advene/gui/views/timeline.py:1542
 #, python-format
-msgid "%s creation"
-msgstr "%s creación"
+msgid "Align all annotation time codes using %s as reference."
+msgstr ""
+"Alinear todos los códigos de tiempo de las anotaciones que utilizan %s como "
+"referencia."
 
-#: ../lib/advene/gui/edit/create.py:82
+#: ../lib/advene/gui/views/timeline.py:1544
 #, python-format
-msgid ""
-"To create a new element of type %s,\n"
-"you must give the following information."
+msgid "Align all annotation contents using %s as reference"
 msgstr ""
-"Para crear un nuevo tipo de elemento %s,\n"
-"debes de dar la siguiente informacion."
+"Alinear todos los contenidos de las anotaciones que utilizan %s como "
+"referencia"
 
-#: ../lib/advene/gui/edit/create.py:92 ../lib/advene/gui/edit/elements.py:508
-#: ../lib/advene/gui/edit/elements.py:557
-#: ../lib/advene/gui/edit/elements.py:659
-#: ../lib/advene/gui/views/browser.py:362 ../lib/advene/gui/views/table.py:251
-#: ../lib/advene/gui/views/table.py:558
-msgid "Type"
-msgstr "Tipo"
+#: ../lib/advene/gui/views/timeline.py:2038
+#: ../lib/advene/gui/views/timeline.py:2060
+#, python-format
+msgid "Displaying %(count)d / %(total)d annotations..."
+msgstr "Mostrando %(count)d / %(total)d anotaciones..."
 
-#: ../lib/advene/gui/edit/create.py:111
-msgid "Dynamic view"
-msgstr "Vista dinamica"
+#: ../lib/advene/gui/views/timeline.py:2049
+msgid "Displaying done."
+msgstr "Mostrando terminado"
 
-#: ../lib/advene/gui/edit/create.py:112
-msgid "HTML template"
-msgstr "Plantilla HTML"
+#: ../lib/advene/gui/views/timeline.py:2478
+msgid "Create a new annotation"
+msgstr "Crear una nueva anotación"
 
-#: ../lib/advene/gui/edit/create.py:113
-msgid "Plain XML"
-msgstr "XML Plano"
+#: ../lib/advene/gui/views/timeline.py:2479
+msgid "Zoom on region"
+msgstr "Acercar en región"
 
-#: ../lib/advene/gui/edit/create.py:114
-msgid "SVG template"
-msgstr "Plantilla SVG"
+#: ../lib/advene/gui/views/timeline.py:2480
+msgid "Restrict display to region"
+msgstr "Restringir muestra en región"
 
-#: ../lib/advene/gui/edit/create.py:115
-msgid "Plain text template"
-msgstr "Plantilla de texto plano"
+#: ../lib/advene/gui/views/timeline.py:2589
+#: ../lib/advene/gui/edit/transcribe.py:489
+#, python-format
+msgid "Position %s"
+msgstr "Posicion %s"
 
-#: ../lib/advene/gui/edit/create.py:118
-msgid "Simple query"
-msgstr "Pregunta simple"
+#: ../lib/advene/gui/views/timeline.py:2599
+msgid "New annotation at player time"
+msgstr "Nueva anotación en el tiempo del reproductor"
 
-#: ../lib/advene/gui/edit/create.py:120
-msgid "Directory"
-msgstr "Directorio"
+#: ../lib/advene/gui/views/timeline.py:2603
+msgid "New annotation at mouse position"
+msgstr "Nueva anotación en la posición del cursor"
 
-#: ../lib/advene/gui/edit/create.py:128
-msgid "No available type."
-msgstr "No hay tipo disponible "
+#: ../lib/advene/gui/views/timeline.py:2607
+msgid "Selection"
+msgstr "Selección"
 
-#: ../lib/advene/gui/edit/create.py:172
+#: ../lib/advene/gui/views/timeline.py:2728
+#, fuzzy, python-format
+msgid "Cannot zoom more %f"
+msgstr "No se puede acercar más"
+
+#: ../lib/advene/gui/views/timeline.py:2940
 #, python-format
-msgid ""
-"The identifier %s is not valid.\n"
-"It must be composed of non-accentuated alphabetic characters\n"
-"Underscore is allowed."
-msgstr ""
-"El identificador %s no es valido.\n"
-"Debe de estar compuesto de caracteres sin acentuar\n"
-"Se permite utilizar guion bajo."
+msgid "From schema %s"
+msgstr "Del esquema %s"
 
-#: ../lib/advene/gui/edit/create.py:177
-#, python-format
-msgid "The identifier %s is already defined."
-msgstr "El identificador %s ya está definido. "
+#: ../lib/advene/gui/views/timeline.py:3003
+msgid "Restrict playing to this annotation-type"
+msgstr "Restringir la reproducción a este tipo de anotación"
 
-#: ../lib/advene/gui/edit/create.py:310
-msgid "New resource data"
-msgstr "Nuevos datos del recurso"
+#: ../lib/advene/gui/views/timeline.py:3010
+msgid "Goto previous annotation"
+msgstr "Ir a la anotación previa"
 
-#: ../lib/advene/gui/edit/imports.py:143 ../lib/advene/gui/edit/imports.py:144
-msgid "Schemas"
-msgstr "Schemas"
+#: ../lib/advene/gui/views/timeline.py:3021
+msgid "Goto next annotation"
+msgstr "Ir a la anotación siguiente"
 
-#: ../lib/advene/gui/edit/imports.py:181 ../lib/advene/gui/edit/imports.py:182
-#: ../lib/advene/gui/views/interactivequery.py:464
-msgid "Annotations"
-msgstr "Anotaciones"
+#: ../lib/advene/gui/views/timeline.py:3032
+msgid "+"
+msgstr "+"
 
-#: ../lib/advene/gui/edit/imports.py:195 ../lib/advene/gui/edit/imports.py:196
-#: ../lib/advene/gui/edit/elements.py:517
-msgid "Relations"
-msgstr "Relaciones"
+#: ../lib/advene/gui/views/timeline.py:3091
+msgid "Open an annotation display view"
+msgstr "Abrir una vista de muestra de anotaciones "
 
-#: ../lib/advene/gui/edit/imports.py:209 ../lib/advene/gui/edit/imports.py:210
-msgid "Queries"
-msgstr "Preguntas"
+#: ../lib/advene/gui/views/timeline.py:3098
+msgid "Open a slave montage view (coordinated zoom level)"
+msgstr "Abrir una vista de montaje esclava (coordinado nivel de zoom)"
 
-#: ../lib/advene/gui/edit/imports.py:320
-msgid "Imported?"
-msgstr "Importado?"
+#: ../lib/advene/gui/views/timeline.py:3133
+msgid ""
+"<b>Statistics about current selection</b>\n"
+"\n"
+msgstr ""
+"<b>Estadísticas acerca de la selección actual</b>\n"
+"\n"
 
-#: ../lib/advene/gui/edit/imports.py:337
-#: ../lib/advene/gui/edit/elements.py:509
-#: ../lib/advene/gui/edit/elements.py:558
-#: ../lib/advene/gui/edit/elements.py:645
-#: ../lib/advene/gui/edit/elements.py:725
-#: ../lib/advene/gui/edit/elements.py:782
-#: ../lib/advene/gui/edit/elements.py:874
-#: ../lib/advene/gui/edit/elements.py:943
-#: ../lib/advene/gui/edit/elements.py:1055
-#: ../lib/advene/gui/edit/elements.py:1117
-msgid "URI"
-msgstr "URI"
+#: ../lib/advene/gui/views/timeline.py:3156
+msgid "No selected annotation"
+msgstr "No hay anotación seleccionada"
 
-#: ../lib/advene/gui/edit/imports.py:359
-msgid "Choose the package to import, and its alias"
-msgstr "Elige el paquete a importar, y su alias"
+#: ../lib/advene/gui/views/timeline.py:3160
+#, python-format
+msgid "%d selected annotation(s)"
+msgstr "%d anotación(es) seleccionada(s)"
 
-#: ../lib/advene/gui/edit/montage.py:47
-msgid "Montage"
-msgstr "Montaje"
+#: ../lib/advene/gui/views/timeline.py:3167
+msgid "Unselect all annotations"
+msgstr "Quitar selección a todas las anotaciones"
 
-#: ../lib/advene/gui/edit/montage.py:49
-msgid "Dynamic montage of annotations"
-msgstr "Montaje dinámico de anotaciones"
+#: ../lib/advene/gui/views/timeline.py:3168
+msgid "Create a static view"
+msgstr "Crear una nueva vista estática"
 
-#: ../lib/advene/gui/edit/montage.py:55
-#: ../lib/advene/gui/views/logwindow.py:50
-#: ../lib/advene/gui/views/tagbag.py:60
-#: ../lib/advene/gui/views/activebookmarks.py:59
-#: ../lib/advene/gui/views/bookmarks.py:77
-msgid "Clear"
-msgstr "Limpiar"
+#: ../lib/advene/gui/views/timeline.py:3169
+msgid "Highlight selection in other views"
+msgstr "Resalta la selección en otras vistas"
 
-#: ../lib/advene/gui/edit/montage.py:56
-#: ../lib/advene/gui/views/transcription.py:472
-#: ../lib/advene/gui/widget.py:1059
-msgid "Play"
-msgstr "Reproducir"
+#: ../lib/advene/gui/views/timeline.py:3170
+#: ../lib/advene/gui/views/timeline.py:3766
+msgid "Tag selection"
+msgstr "Selección de etiquetas"
 
-#: ../lib/advene/gui/edit/montage.py:57
-msgid "Render"
-msgstr "Render"
+#: ../lib/advene/gui/views/timeline.py:3171
+msgid "Delete selected annotations"
+msgstr "Elimina las anotaciones seleccionadas"
 
-#: ../lib/advene/gui/edit/montage.py:171
-msgid "Remove from montage"
-msgstr "Eliminar del montaje"
+#: ../lib/advene/gui/views/timeline.py:3172
+msgid "Display selection in a table"
+msgstr "Muestra la selección en una tabla"
 
-#: ../lib/advene/gui/edit/montage.py:303 ../lib/advene/gui/popup.py:444
-#, python-format
-msgid "Extracting %s"
-msgstr "Extrayendo %s"
+#: ../lib/advene/gui/views/timeline.py:3173
+msgid "Center and zoom on selection"
+msgstr "Centrar y acercar en la selección"
 
-#: ../lib/advene/gui/edit/montage.py:304
-#, python-format
-msgid ""
-"Exporting montage %(title)s\n"
-"to %%(filename)s"
-msgstr ""
-"Exportando montaje %(title)s\n"
-"a %%(filename)s"
+#: ../lib/advene/gui/views/timeline.py:3174
+msgid "Edit selected annotations"
+msgstr "Edita las anotaciones seleccionadas"
 
-#: ../lib/advene/gui/edit/montage.py:396
-msgid "Drop an annotation here to remove it from the list"
-msgstr "Soltar una anotación aquí para eliminarla de la lista"
+#: ../lib/advene/gui/views/timeline.py:3175
+msgid "Merge annotations"
+msgstr "Unir anotaciones"
 
-#: ../lib/advene/gui/edit/montage.py:407
-msgid "Play the montage"
-msgstr "Reproducir el montaje"
+#: ../lib/advene/gui/views/timeline.py:3176
+msgid "Display statistics"
+msgstr "Muestra estadísticas"
 
-#: ../lib/advene/gui/edit/montage.py:412
-msgid "Save the view in the package"
-msgstr "Guardar la vista en el paquete"
+#: ../lib/advene/gui/views/timeline.py:3183
+#, fuzzy
+msgid "Select all annotations of the same type in this time range"
+msgstr "La siguiente anotación del mismo tipo"
 
-#: ../lib/advene/gui/edit/montage.py:460
-msgid "Set zoom level"
-msgstr "Establecer el nivel de zoom"
+#: ../lib/advene/gui/views/timeline.py:3186
+#, fuzzy
+msgid "Select all annotations in this time range"
+msgstr "Elimina las anotaciones existentes en este tipo"
 
-#: ../lib/advene/gui/edit/montage.py:465
-msgid "Set 100% zoom"
-msgstr "Establecer 100% zoom"
+#: ../lib/advene/gui/views/timeline.py:3300
+msgid "Goto previous page"
+msgstr "Ir a la página anterior"
 
-#: ../lib/advene/gui/edit/montage.py:471
-#: ../lib/advene/gui/views/interactivequery.py:439
-msgid "Unhighlight annotations"
-msgstr "Quitar resaltado de anotaciones"
+#: ../lib/advene/gui/views/timeline.py:3312
+msgid "Goto next page"
+msgstr "Ir a la página siguiente"
 
-#: ../lib/advene/gui/edit/montage.py:475 ../lib/advene/gui/edit/montage.py:484
-#: ../lib/advene/gui/views/interactivequery.py:443
-#: ../lib/advene/gui/views/interactivequery.py:480
-msgid "Highlight annotations"
-msgstr "Resalta las anotaciones"
+#: ../lib/advene/gui/views/timeline.py:3368
+msgid "Inspector locked. Click here or in the timeline background to unlock."
+msgstr ""
+"Inspector cerrado. Clic aquí o en el fondo de la linea de tiempo para abrir."
 
-#: ../lib/advene/gui/edit/montage.py:545
-msgid "Total duration:"
-msgstr "Duración total"
+#: ../lib/advene/gui/views/timeline.py:3395
+msgid ""
+"Delete the selected annotations or drop an annotation here to delete it."
+msgstr ""
+"Elimina las acciones seleccionadas o arrastra una anotación aquí para "
+"eliminarla."
 
-#: ../lib/advene/gui/edit/frameselector.py:43
-msgid "Click on a frame to select its time."
-msgstr "Clic en un cuadro para seleccionar su tiempo. "
+#: ../lib/advene/gui/views/timeline.py:3418
+msgid ""
+"Drag an annotation type here to remove it from display.\n"
+"Click to edit all displayed types"
+msgstr ""
+"Arrastra un tipo de anotación aquí para removerlo de la visualización.\n"
+"Clic para editar todos los tipos mostrados"
 
-#: ../lib/advene/gui/edit/frameselector.py:177
-msgid "Select the appropriate snapshot"
-msgstr "Selecciona la captura apropiada"
+#: ../lib/advene/gui/views/timeline.py:3430
+msgid "Selection actions"
+msgstr "Acciones de selección"
 
-#: ../lib/advene/gui/edit/frameselector.py:230
-#: ../lib/advene/gui/edit/frameselector.py:283
-msgid "Click to see more frames or scroll with the mouse wheel"
-msgstr "Click para ver más cuadros o desplaza con la rueda del ratón"
+#: ../lib/advene/gui/views/timeline.py:3441
+msgid "Display relations"
+msgstr "Muestra las relaciones"
 
-#: ../lib/advene/gui/edit/transcribe.py:67
-msgid "Transcription importer"
-msgstr "Importador de transcripciones"
+#: ../lib/advene/gui/views/timeline.py:3447
+msgid "Display all relations"
+msgstr "Muestra todas las relaciones"
 
-#: ../lib/advene/gui/edit/transcribe.py:78
-msgid "Note taking"
-msgstr "Tomar notas"
+#: ../lib/advene/gui/views/timeline.py:3523
+msgid "Center on current player position."
+msgstr "Centrar en la posición actual del reproductor"
 
-#: ../lib/advene/gui/edit/transcribe.py:80
-msgid "Take notes on the fly as a timestamped transcription"
-msgstr "Importar anotaciones de una transcripción timestamped"
+#: ../lib/advene/gui/views/timeline.py:3539
+msgid "Automatically activate loop when clicking on an annotation"
+msgstr "Activar ciclo automáticamente cuando de da clic en una anotación"
 
-#: ../lib/advene/gui/edit/transcribe.py:87
-#: ../lib/advene/gui/views/activebookmarks.py:60
-msgid "Export as static view"
-msgstr "Exportar como vista estática"
+#: ../lib/advene/gui/views/timeline.py:3563
+msgid "Displayed"
+msgstr "Mostrado"
 
-#: ../lib/advene/gui/edit/transcribe.py:148
-msgid "Timestamp"
-msgstr "Marca de tiempo"
+#: ../lib/advene/gui/views/timeline.py:3571
+msgid "Not displayed"
+msgstr "No mostrado"
 
-#: ../lib/advene/gui/edit/transcribe.py:148
-msgid "Click inserts timestamp marks"
-msgstr "Clic inserta marcas de tiempo"
+#: ../lib/advene/gui/views/timeline.py:3620
+msgid "< All <"
+msgstr "< Todo <"
 
-#: ../lib/advene/gui/edit/transcribe.py:149
-msgid "Insert on single-click"
-msgstr "Insertar con un solo clic"
+#: ../lib/advene/gui/views/timeline.py:3624
+msgid "> All >"
+msgstr "> Todo >"
 
-#: ../lib/advene/gui/edit/transcribe.py:149
-msgid "A single click will insert the mark (else a double click is needed)"
-msgstr "Un clic insertará la marca (si no se necesita un doble clic)"
+#: ../lib/advene/gui/views/timeline.py:3648
+msgid "Displayed annotation types"
+msgstr "Tipos de anotación mostrados"
 
-#: ../lib/advene/gui/edit/transcribe.py:150
-msgid "Play on scroll"
-msgstr "Reproducir en desplazamiento"
+#: ../lib/advene/gui/views/timeline.py:3678
+msgid "Relation type"
+msgstr "Tipo de relación"
 
-#: ../lib/advene/gui/edit/transcribe.py:150
-msgid "Play the new position upon timestamp modification"
-msgstr ""
-"Reproduce la nueva posición después de la modificación de la marca de tiempo"
+#: ../lib/advene/gui/views/timeline.py:3678
+msgid "Display relation types"
+msgstr "Mostrar tipos de relación"
 
-#: ../lib/advene/gui/edit/transcribe.py:151
-msgid "Generate empty annotations"
-msgstr "Genera anotaciones vacías"
+#: ../lib/advene/gui/views/timeline.py:3679
+msgid "Relation content"
+msgstr "Contenido de relación"
 
-#: ../lib/advene/gui/edit/transcribe.py:151
-msgid "If checked, generate annotations for empty text"
-msgstr "Si está seleccionado, genera anotaciones para texto vacío"
+#: ../lib/advene/gui/views/timeline.py:3679
+msgid "Display relation content"
+msgstr "Mostrar contenido de relación"
 
-#: ../lib/advene/gui/edit/transcribe.py:152
-msgid "Reaction time"
-msgstr "Tiempo de reacción"
+#: ../lib/advene/gui/views/timeline.py:3680 ../lib/advene/gui/popup.py:545
+msgid "Highlight"
+msgstr "Marcar"
 
-#: ../lib/advene/gui/edit/transcribe.py:152
-msgid ""
-"Reaction time (substracted from current player time, except when paused.)"
-msgstr ""
-"Tiempo de reacción (restado del tiempo de reproducción actual, excepto "
-"cuando está en pausa)."
+#: ../lib/advene/gui/views/timeline.py:3680
+msgid "Highlight active annotations"
+msgstr "Realzar las anotaciones activas"
 
-#: ../lib/advene/gui/edit/transcribe.py:153
-msgid "Auto-insert"
-msgstr "Auto-insertar"
+#: ../lib/advene/gui/views/timeline.py:3767
+msgid "Enter the tag for the selection"
+msgstr "Ingresar etiqueta para la selección"
 
-#: ../lib/advene/gui/edit/transcribe.py:153
-msgid "Automatic timestamp mark insertion"
-msgstr "Inserción de marca de tiempo automática"
+#: ../lib/advene/gui/views/timeline.py:3773
+#: ../lib/advene/gui/views/tagbag.py:165
+msgid "The tag contains invalid characters"
+msgstr "La etiqueta contiene caracteres no válidos"
 
-#: ../lib/advene/gui/edit/transcribe.py:154
-msgid "Automatic insertion delay"
-msgstr "Retardo automático de inserción"
+#: ../lib/advene/gui/views/relation.py:71
+msgid "Relations view"
+msgstr "Vista de relaciones"
 
-#: ../lib/advene/gui/edit/transcribe.py:154
-msgid ""
-"If autoinsert is active, timestamp marks will be automatically inserted when "
-"text is entered after no interaction since this delay (in ms).\n"
-"1000 is typically a good value."
-msgstr ""
-"Si autoinsertar está activo, la marca de tiempo se insertará automáticamente "
-"cuando se introduce texto y no hay interacción desde este retardo (en ms).\n"
-"1000 es generalmente un buen valor."
+#: ../lib/advene/gui/views/editionhistory.py:40
+msgid "Edition History"
+msgstr "Historial de navegación"
 
-#: ../lib/advene/gui/edit/transcribe.py:155 ../lib/advene/gui/main.py:4368
-msgid "Font size"
-msgstr "Tamaño de la fuente"
+#: ../lib/advene/gui/views/editionhistory.py:42
+msgid "Access last edited/created elements"
+msgstr "Acceder a los elementos editados / creados al final"
 
-#: ../lib/advene/gui/edit/transcribe.py:155
-msgid "Font size for text (0 for standard size)"
-msgstr "Tamaño de la fuente para el texto (0 para el tamaño estándar)"
+#: ../lib/advene/gui/views/editionhistory.py:102
+msgid "Created"
+msgstr "Creado"
 
-#: ../lib/advene/gui/edit/transcribe.py:215
-#: ../lib/advene/gui/edit/transcribe.py:219
-#: ../lib/advene/gui/edit/transcribe.py:379
-#: ../lib/advene/gui/edit/transcribe.py:383
-msgid "Invalid timestamp mark"
-msgstr "Marca no valida timestamp"
+#: ../lib/advene/gui/views/editionhistory.py:103
+msgid "Edited"
+msgstr "Editado"
 
-#: ../lib/advene/gui/edit/transcribe.py:496
-#: ../lib/advene/gui/views/timeline.py:2550
-#, python-format
-msgid "Position %s"
-msgstr "Posicion %s"
+#: ../lib/advene/gui/views/tagbag.py:55
+msgid "Tag Bag"
+msgstr "Bolsa de etiquetas"
 
-#: ../lib/advene/gui/edit/transcribe.py:506 ../lib/advene/gui/popup.py:456
-msgid "Edit"
-msgstr "Editar"
+#: ../lib/advene/gui/views/tagbag.py:62
+msgid "New tag"
+msgstr "Nueva etiqueta"
 
-#: ../lib/advene/gui/edit/transcribe.py:510
-msgid "Ignore the following text (toggle)"
-msgstr "Ignora el siguiente texto"
+#: ../lib/advene/gui/views/tagbag.py:125
+msgid "New tag name"
+msgstr "Nuevo nombre de etiqueta"
 
-#: ../lib/advene/gui/edit/transcribe.py:514
-msgid "Remove mark"
-msgstr "Eliminar marca. "
+#: ../lib/advene/gui/views/tagbag.py:131
+msgid "Enter a new tag name and select its color."
+msgstr "Ingresa un nuevo nombre de etiqueta y selecciona su color"
 
-#: ../lib/advene/gui/edit/transcribe.py:518
-msgid "Reaction-time offset"
-msgstr "Tiempo de reacción (compensación)"
+#: ../lib/advene/gui/views/tagbag.py:135
+#: ../lib/advene/gui/edit/shapewidget.py:343
+msgid "Name"
+msgstr "Nombre"
 
-#: ../lib/advene/gui/edit/transcribe.py:522
-msgid "-1 sec"
-msgstr "-1 sec"
+#: ../lib/advene/gui/views/tagbag.py:141
+#: ../lib/advene/gui/edit/shapewidget.py:364
+#: ../lib/advene/gui/edit/elements.py:897
+#: ../lib/advene/gui/edit/elements.py:977
+#: ../lib/advene/gui/edit/elements.py:1091 ../lib/advene/rules/actions.py:135
+msgid "Color"
+msgstr "Color"
 
-#: ../lib/advene/gui/edit/transcribe.py:525
-msgid "-0.5 sec"
-msgstr "-0.5 sec"
+#: ../lib/advene/gui/views/tagbag.py:178
+msgid "Tag bag options"
+msgstr "Opciones de  la bolsa de etiquetas"
 
-#: ../lib/advene/gui/edit/transcribe.py:528
-msgid "-0.1 sec"
-msgstr "-0.1 sec"
+#: ../lib/advene/gui/views/tagbag.py:179
+msgid "Update with new tags"
+msgstr "Actualizar con nuevas etiquetas"
 
-#: ../lib/advene/gui/edit/transcribe.py:532
-msgid "+1 sec"
-msgstr "+1 sec"
+#: ../lib/advene/gui/views/tagbag.py:179
+msgid "Automatically display new defined tags"
+msgstr "Muestra nuevas etiquetas definidas automáticamente"
 
-#: ../lib/advene/gui/edit/transcribe.py:535
-msgid "+0.5 sec"
-msgstr "+0.5 sec"
+#: ../lib/advene/gui/views/tagbag.py:228
+#, python-format
+msgid "Choose the color for tag %s"
+msgstr "Selecciona el color para la etiqueta %s"
 
-#: ../lib/advene/gui/edit/transcribe.py:538
-msgid "+0.1 sec"
-msgstr "+0.1 sec"
+#: ../lib/advene/gui/views/tagbag.py:252
+msgid "Set color"
+msgstr "Establece el color"
 
-#: ../lib/advene/gui/edit/transcribe.py:629
-msgid "Invalid timestamp"
-msgstr "Timestamp no valida"
+#: ../lib/advene/gui/views/tagbag.py:253
+msgid "Remove"
+msgstr "Remover"
 
-#: ../lib/advene/gui/edit/transcribe.py:762
-#, python-format
-msgid "Invalid timestamp mark in conversion: %s"
-msgstr "Marca del tiempo no válida en la conversión: %s"
+#: ../lib/advene/gui/views/tagbag.py:326
+msgid "Drop a tag here to remove it from the list"
+msgstr "Arrastra una etiqueta aquí para removerla de la lista"
 
-#: ../lib/advene/gui/edit/transcribe.py:879
-#, python-format
-msgid "Cannot save the file: %s"
-msgstr "No se puede guardar el archivo: %s"
+#: ../lib/advene/gui/views/tagbag.py:336
+msgid "Save as adhoc view"
+msgstr "Guardar como una vista adhoc"
 
-#: ../lib/advene/gui/edit/transcribe.py:884
-#: ../lib/advene/gui/views/transcription.py:703
-#, python-format
-msgid "Transcription saved to %s"
-msgstr "Transcripción guardada a %s"
+#: ../lib/advene/gui/views/tagbag.py:337
+msgid "Add a new tag"
+msgstr "Agrega una nueva etiqueta"
 
-#: ../lib/advene/gui/edit/transcribe.py:890
-#: ../lib/advene/gui/edit/transcribe.py:980
-msgid "This will overwrite the current textual content. Are you sure?"
-msgstr "Esto va a sobrescribir el contenido actual textual. ¿Estás seguro?"
+#: ../lib/advene/gui/views/tagbag.py:338
+msgid "Display all defined tags"
+msgstr "Muestra todas las etiquetas definidas"
 
-#: ../lib/advene/gui/edit/transcribe.py:893
-msgid "Select transcription file to load"
-msgstr "Selecciona un archivo de transcripción para cargar"
+#: ../lib/advene/gui/views/__init__.py:197
+msgid "Invalid view id"
+msgstr "id vista no válida"
 
-#: ../lib/advene/gui/edit/transcribe.py:910
+#: ../lib/advene/gui/views/__init__.py:243
 #, python-format
-msgid "Cannot open %(filename)s: %(error)s"
-msgstr "No se puede abrir %(filename)s: %(error)s"
+msgid "Cannot save default options: %s"
+msgstr "No se pueden guardar las opciones predeterminadas: %s"
 
-#: ../lib/advene/gui/edit/transcribe.py:965
-msgid "Cannot import annotations: no existing interface"
-msgstr "No se pueden importar las anotaciones: no existe interfaz"
+#: ../lib/advene/gui/views/__init__.py:254
+#, python-format
+msgid "Default options saved for view %s"
+msgstr "Opciones predeterminadas para vistas almacenadas %s"
 
-#: ../lib/advene/gui/edit/transcribe.py:967
-msgid "Select the annotation type to import"
-msgstr "Selecciona el tipo de anotación a importar"
+#: ../lib/advene/gui/views/__init__.py:282
+#, fuzzy, python-format
+msgid "Error in source evaluation %s"
+msgstr "Error en la evaluación de la fuente %(source)s: %(error)s"
 
-#: ../lib/advene/gui/edit/transcribe.py:976
+#: ../lib/advene/gui/views/__init__.py:299
 #, python-format
-msgid "There are no annotations of type %s"
-msgstr "No hay anotaciones del tipo %s"
+msgid "Saving %s"
+msgstr "Guardando %s"
 
-#: ../lib/advene/gui/edit/transcribe.py:1005
-msgid "Cannot convert the data: no associated package"
-msgstr "No se pueden convertir los datos: no hay un paquete asociado"
+#: ../lib/advene/gui/views/__init__.py:302
+msgid "Enter a view name to save this parametered view"
+msgstr "Ingresar un nombre de vista para almacenar esta vista con parámetros"
 
-#: ../lib/advene/gui/edit/transcribe.py:1008
-msgid "Converting transcription"
-msgstr "Transcripción de conversión"
+#: ../lib/advene/gui/views/__init__.py:320
+#, python-format
+msgid "Error: the view %s is not an adhoc view."
+msgstr "Error: la vista %s no es una vista adhoc."
 
-#: ../lib/advene/gui/edit/transcribe.py:1014
-msgid "Choose the annotation-type where to create annotations.\n"
-msgstr "Elige el tipo de anotación dónde crear anotaciones.\n"
+#: ../lib/advene/gui/views/__init__.py:345
+msgid "HTML export"
+msgstr "Exportar HTML"
 
-#: ../lib/advene/gui/edit/transcribe.py:1022
-msgid "Delete existing annotations in this type"
-msgstr "Elimina las anotaciones existentes en este tipo"
+#: ../lib/advene/gui/views/__init__.py:346
+msgid "Specify a name for the export view"
+msgstr "Especificar un nombre para la vista de exportar"
 
-#: ../lib/advene/gui/edit/transcribe.py:1027
-#: ../lib/advene/gui/views/timeline.py:3009 ../lib/advene/gui/main.py:3222
-msgid "Create a new annotation type"
-msgstr "Crea un nuevo tipo de anotacion"
+#: ../lib/advene/gui/views/__init__.py:365
+#, python-format
+msgid ""
+"View successfully exported as %s.\n"
+"Open it in the web browser ?"
+msgstr ""
+"La vista se exportó satisfactoriamente como %s.\n"
+"¿Abrirla en el navegador web?"
 
-#: ../lib/advene/gui/edit/transcribe.py:1045
-msgid "Select type"
-msgstr "Selecciona tipo"
+#: ../lib/advene/gui/views/__init__.py:444
+msgid "Actions"
+msgstr "Acciones"
 
-#: ../lib/advene/gui/edit/transcribe.py:1049
-msgid "You want to create a new type. Please specify its schema and title."
-msgstr ""
-"Quieres crear un nuevo tipo. Por favor especifica su esquema y título. "
+#: ../lib/advene/gui/views/__init__.py:469
+msgid "Click or drag-and-drop to reattach view"
+msgstr "Clic o arrastra-y-suelta para volver a adjuntar la vista"
 
-#: ../lib/advene/gui/edit/transcribe.py:1061
-msgid "Containing schema"
-msgstr "Esquema contenedor"
+#: ../lib/advene/gui/views/finder.py:106
+msgid "List of views"
+msgstr "Lista de vistas"
 
-#: ../lib/advene/gui/edit/transcribe.py:1074
-msgid "Export options"
-msgstr "Opciones para exportar"
+#: ../lib/advene/gui/views/finder.py:107
+msgid "Static views"
+msgstr "Vistas estáticas"
 
-#: ../lib/advene/gui/edit/transcribe.py:1079
-msgid "Generate annotations for empty contents"
-msgstr "Generar anotaciones para contenido vacío"
+#: ../lib/advene/gui/views/finder.py:108
+msgid "Dynamic views"
+msgstr "Vistas dinámicas"
 
-#: ../lib/advene/gui/edit/transcribe.py:1104
-#, python-format
-msgid "The %s identifier already exists. Choose another one."
-msgstr "El %s identificador ya existe. Elegir otro. "
+#: ../lib/advene/gui/views/finder.py:109
+msgid "Admin views"
+msgstr "Vistas e administración"
 
-#: ../lib/advene/gui/edit/transcribe.py:1143
-msgid "Notes converted"
-msgstr "Notas convertidas"
+#: ../lib/advene/gui/views/finder.py:110
+msgid "Adhoc views"
+msgstr "Vistas adhoc"
+
+#: ../lib/advene/gui/views/finder.py:174
+#, fuzzy
+msgid "No resources"
+msgstr "Editar recurso"
 
-#: ../lib/advene/gui/edit/transcribe.py:1147
-#: ../lib/advene/gui/views/bookmarks.py:169
+#: ../lib/advene/gui/views/finder.py:551
 #, python-format
 msgid ""
-"Conversion completed.\n"
-"%s annotations generated."
+"View <b>%(title)s</b>\n"
+"Id: %(id)s"
 msgstr ""
-"Conversion completa.\n"
-"%s anotaciones generadas."
-
-#: ../lib/advene/gui/edit/transcribe.py:1163
-#: ../lib/advene/gui/views/activebookmarks.py:546
-msgid "Smallish"
-msgstr "Más pequeño"
+"Vista <b>%(title)s</b>\n"
+"Id: %(id)s"
 
-#: ../lib/advene/gui/edit/transcribe.py:1167
-#: ../lib/advene/gui/views/activebookmarks.py:550
-msgid "Larger"
-msgstr "Más grande"
+#: ../lib/advene/gui/views/finder.py:558
+msgid "Open in webbrowser"
+msgstr "Abrir en el navegador web"
 
-#: ../lib/advene/gui/edit/transcribe.py:1168
-#: ../lib/advene/gui/views/activebookmarks.py:551
-msgid "Huge"
-msgstr "Inmenso"
+#: ../lib/advene/gui/views/finder.py:559
+#, python-format
+msgid "View applied to %s\n"
+msgstr "Vista aplicada a %s\n"
 
-#: ../lib/advene/gui/edit/transcribe.py:1190
-msgid "Open"
-msgstr "Abrir"
+#: ../lib/advene/gui/views/finder.py:564 ../lib/advene/gui/popup.py:525
+msgid "Activate"
+msgstr "Activar"
 
-#: ../lib/advene/gui/edit/transcribe.py:1191
-msgid "Save"
-msgstr "Guardar"
+#: ../lib/advene/gui/views/finder.py:567
+msgid "Open in GUI"
+msgstr "Abrir en la interfaz gráfica de usuario"
 
-#: ../lib/advene/gui/edit/transcribe.py:1192
-msgid "Save As"
-msgstr "Guardar como"
+#: ../lib/advene/gui/views/finder.py:569
+msgid "Unknown type of view??"
+msgstr "¿Tipo de vista desconocido?"
 
-#: ../lib/advene/gui/edit/transcribe.py:1193
-msgid "Import"
-msgstr "Importar"
+#: ../lib/advene/gui/views/finder.py:597
+msgid "Edit view"
+msgstr "Editar vista"
 
-#: ../lib/advene/gui/edit/transcribe.py:1193
-msgid "Import from annotations"
-msgstr "Importar de anotaciones"
+#: ../lib/advene/gui/views/finder.py:606
+msgid "Open view"
+msgstr "Abrir vista"
 
-#: ../lib/advene/gui/edit/transcribe.py:1194
-msgid "Convert"
-msgstr "Convertir "
+#: ../lib/advene/gui/views/finder.py:646 ../lib/advene/gui/views/finder.py:710
+#, python-format
+msgid ""
+"%(type)s <b>%(title)s</b>\n"
+"Id: %(id)s"
+msgstr ""
+"%(type)s <b>%(title)s</b>\n"
+"Id: %(id)s"
 
-#: ../lib/advene/gui/edit/transcribe.py:1194
-msgid "Convert to annotations"
-msgstr "Convertir a anotaciones"
+#: ../lib/advene/gui/views/finder.py:661
+#: ../lib/advene/gui/views/interactivequery.py:401
+msgid "Edit query"
+msgstr "Edita consulta"
 
-#: ../lib/advene/gui/edit/transcribe.py:1196
-msgid "Center on the current mark"
-msgstr "Centrar en la marca actual"
+#: ../lib/advene/gui/views/finder.py:669
+msgid "Try to apply the query on..."
+msgstr "Trata de aplicar la consulta en..."
 
-#: ../lib/advene/gui/edit/transcribe.py:1197
-msgid "Find"
-msgstr "Encontrar"
+#: ../lib/advene/gui/views/finder.py:687 ../lib/advene/gui/popup.py:860
+msgid "the package"
+msgstr "el paquete"
 
-#: ../lib/advene/gui/edit/transcribe.py:1197
-msgid "Search a string"
-msgstr "Buscar una cadena de texto"
+#: ../lib/advene/gui/views/finder.py:688 ../lib/advene/gui/popup.py:861
+msgid "all annotations of the package"
+msgstr "todas las anotaciones del paquete"
 
-#: ../lib/advene/gui/edit/transcribe.py:1198
-msgid "Scale"
-msgstr "Escala"
+#: ../lib/advene/gui/views/finder.py:689 ../lib/advene/gui/popup.py:862
+msgid "the first annotation of the package"
+msgstr "la primer anotación del paquete"
 
-#: ../lib/advene/gui/edit/transcribe.py:1198
-#: ../lib/advene/gui/views/activebookmarks.py:564
-msgid "Set the size of snaphots"
-msgstr "Establece el tamaño de las capturas de pantalla"
+#: ../lib/advene/gui/views/finder.py:734
+msgid "Edit resource"
+msgstr "Editar recurso"
 
-#: ../lib/advene/gui/edit/transcribe.py:1221
-msgid "Automatically scroll to the mark position when playing"
+#: ../lib/advene/gui/views/finder.py:769 ../lib/advene/util/helper.py:569
+#, python-format
+msgid ""
+"Package %(title)s:\n"
+"%(schema)s\n"
+"%(annotation)s in %(annotation_type)s\n"
+"%(relation)s in %(relation_type)s\n"
+"%(query)s\n"
+"%(view)s\n"
+"\n"
+"Description:\n"
+"%(description)s\n"
 msgstr ""
-"Desplaza automáticamente a la posición de la marca mientras se reproduce."
+"Paquete %(title)s:\n"
+"%(schema)s\n"
+"%(annotation)s in %(annotation_type)s\n"
+"%(relation)s in %(relation_type)s\n"
+"%(query)s\n"
+"%(view)s\n"
+"\n"
+"Descripción:\n"
+"%(description)s\n"
 
-#: ../lib/advene/gui/edit/transcribe.py:1223
-msgid "Autoscroll"
-msgstr "Auto desplazar"
+#: ../lib/advene/gui/views/finder.py:790
+#, fuzzy, python-format
+msgid "%(type)s %(title)s"
+msgstr ""
+"%(type)s <b>%(title)s</b>\n"
+"Id: %(id)s"
 
-#: ../lib/advene/gui/edit/transcribe.py:1230
-msgid "Autoinsert"
-msgstr "Auto insertar"
+#: ../lib/advene/gui/views/finder.py:793 ../lib/advene/gui/edit/elements.py:519
+#: ../lib/advene/gui/edit/elements.py:568
+#: ../lib/advene/gui/edit/elements.py:655
+#: ../lib/advene/gui/edit/elements.py:735
+#: ../lib/advene/gui/edit/elements.py:793
+#: ../lib/advene/gui/edit/elements.py:884
+#: ../lib/advene/gui/edit/elements.py:954
+#: ../lib/advene/gui/edit/elements.py:1066
+msgid "Metadata"
+msgstr "Meta datos"
 
-#: ../lib/advene/gui/edit/transcribe.py:1232
-msgid "Automatically insert marks"
-msgstr "Inserta marcas automáticamente"
+#: ../lib/advene/gui/views/finder.py:810
+msgid "Column-based package finder"
+msgstr "Buscador de paquete basado en columnas"
 
-#: ../lib/advene/gui/edit/elements.py:74
-#, python-format
-msgid "No edit popup available for element %s"
-msgstr "No edit popup disponible para el elemento %s"
+#: ../lib/advene/gui/views/editaccumulator.py:46
+msgid "EditAccumulator"
+msgstr "Editar acumulador"
 
-#: ../lib/advene/gui/edit/elements.py:95
-msgid "Edit Window"
-msgstr "Ventana de edición"
+#: ../lib/advene/gui/views/activebookmarks.py:55
+#: ../lib/advene/gui/views/activebookmarks.py:57
+msgid "ActiveBookmarks"
+msgstr "SeparadoresActivos"
 
-#: ../lib/advene/gui/edit/elements.py:134
-msgid "Apply changes and close the edit window"
-msgstr "Aplicar cambios y cerrar ventana de edición"
+#: ../lib/advene/gui/views/activebookmarks.py:63
+msgid "Export as static view"
+msgstr "Exportar como vista estática"
 
-#: ../lib/advene/gui/edit/elements.py:139
-msgid "Apply changes"
-msgstr "Aplicar cambios"
+#: ../lib/advene/gui/views/activebookmarks.py:434
+msgid "Bookmark duration"
+msgstr "Duración del separador"
 
-#: ../lib/advene/gui/edit/elements.py:273
-msgid "Content has been modified. Close anyway and lose data?"
+#: ../lib/advene/gui/views/activebookmarks.py:435
+msgid "Enter the duration (in ms) to convert bookmarks into annotations"
 msgstr ""
-"El contenido ha sido modificado. ¿Cerrar de cualquier manera y perder datos?"
-
-#: ../lib/advene/gui/edit/elements.py:331
-#: ../lib/advene/gui/views/viewbook.py:234
-#: ../lib/advene/gui/views/viewbook.py:240
-#, python-format
-msgid "Edit %s"
-msgstr "Editar %s"
-
-#: ../lib/advene/gui/edit/elements.py:333
-#, python-format
-msgid "View %s (read-only)"
-msgstr "Vista %s (solo-lectura)"
+"Ingresar la duración (en ms) para convertir los separadores en anotaciones"
 
-#: ../lib/advene/gui/edit/elements.py:369
-#, python-format
-msgid "Display %s"
-msgstr "Muestra %s"
+#: ../lib/advene/gui/views/activebookmarks.py:457
+msgid "User-specified duration"
+msgstr "Duración especificada por el usuario"
 
-#: ../lib/advene/gui/edit/elements.py:453
-msgid "Apply changes and edit previous annotation of same type"
-msgstr "Aplicar los cambios y editar la anotación anterior del mismo tipo"
+#: ../lib/advene/gui/views/activebookmarks.py:458
+msgid "2s duration"
+msgstr "2s duración"
 
-#: ../lib/advene/gui/edit/elements.py:457
-msgid "Apply changes and edit next annotation of same type"
-msgstr "Aplicar los cambios y editar la anotación siguiente del mismo tipo"
+#: ../lib/advene/gui/views/activebookmarks.py:459
+msgid "Complete coverage"
+msgstr "Cobertura completa"
 
-#: ../lib/advene/gui/edit/elements.py:463
-msgid "Unhighlight annotation"
-msgstr "Remover resaltado de anotación"
+#: ../lib/advene/gui/views/activebookmarks.py:477
+msgid "Drop a bookmark here to remove it from the list"
+msgstr "Arrastra un separador aquí para removerlo de la lista"
 
-#: ../lib/advene/gui/edit/elements.py:467
-msgid "Highlight annotation"
-msgstr "Resaltar anotación"
+#: ../lib/advene/gui/views/activebookmarks.py:504
+msgid "Type of the annotations that will be created"
+msgstr "Tipo de anotaciones que serán cradas"
 
-#: ../lib/advene/gui/edit/elements.py:498
-msgid "Fragment"
-msgstr "Fragmento"
+#: ../lib/advene/gui/views/activebookmarks.py:522
+#: ../lib/advene/gui/edit/transcribe.py:1130
+msgid "Smallish"
+msgstr "Más pequeño"
 
-#: ../lib/advene/gui/edit/elements.py:510
-#: ../lib/advene/gui/edit/elements.py:559
-#: ../lib/advene/gui/edit/elements.py:646
-#: ../lib/advene/gui/edit/elements.py:726
-#: ../lib/advene/gui/edit/elements.py:783
-#: ../lib/advene/gui/edit/elements.py:875
-#: ../lib/advene/gui/edit/elements.py:944
-#: ../lib/advene/gui/edit/elements.py:1056
-#: ../lib/advene/gui/edit/elements.py:1118 ../lib/advene/gui/main.py:4174
-msgid "Author"
-msgstr "Autor"
+#: ../lib/advene/gui/views/activebookmarks.py:523
+#: ../lib/advene/gui/edit/transcribe.py:1131 ../lib/advene/rules/actions.py:169
+msgid "Small"
+msgstr "Pequeño"
 
-#: ../lib/advene/gui/edit/elements.py:511
-#: ../lib/advene/gui/edit/elements.py:560
-#: ../lib/advene/gui/edit/elements.py:647
-#: ../lib/advene/gui/edit/elements.py:727
-#: ../lib/advene/gui/edit/elements.py:784
-#: ../lib/advene/gui/edit/elements.py:876
-#: ../lib/advene/gui/edit/elements.py:945
-#: ../lib/advene/gui/edit/elements.py:1057
-#: ../lib/advene/gui/edit/elements.py:1119 ../lib/advene/gui/main.py:4175
-msgid "Date"
-msgstr "Fecha"
+#: ../lib/advene/gui/views/activebookmarks.py:524
+#: ../lib/advene/gui/edit/transcribe.py:1132 ../lib/advene/rules/actions.py:170
+msgid "Normal"
+msgstr "Normal"
 
-#: ../lib/advene/gui/edit/elements.py:513
-#: ../lib/advene/gui/edit/elements.py:562
-#: ../lib/advene/gui/edit/elements.py:649
-#: ../lib/advene/gui/edit/elements.py:729
-#: ../lib/advene/gui/edit/elements.py:787
-#: ../lib/advene/gui/edit/elements.py:878
-#: ../lib/advene/gui/edit/elements.py:948
-#: ../lib/advene/gui/edit/elements.py:1060
-msgid "Metadata"
-msgstr "Meta datos"
+#: ../lib/advene/gui/views/activebookmarks.py:525
+#: ../lib/advene/gui/edit/transcribe.py:1133 ../lib/advene/rules/actions.py:171
+msgid "Large"
+msgstr "Grande"
 
-#: ../lib/advene/gui/edit/elements.py:582
-#: ../lib/advene/gui/edit/elements.py:1065
-#: ../lib/advene/gui/views/relationdisplay.py:113
-msgid "Members"
-msgstr "Miembros"
+#: ../lib/advene/gui/views/activebookmarks.py:526
+#: ../lib/advene/gui/edit/transcribe.py:1134
+msgid "Larger"
+msgstr "Más grande"
 
-#: ../lib/advene/gui/edit/elements.py:600
-#: ../lib/advene/gui/edit/elements.py:677
-#: ../lib/advene/gui/edit/elements.py:737
-#: ../lib/advene/gui/edit/elements.py:1128
-#: ../lib/advene/gui/views/table.py:250
-msgid "Content"
-msgstr "Contenido"
+#: ../lib/advene/gui/views/activebookmarks.py:527
+#: ../lib/advene/gui/edit/transcribe.py:1135
+msgid "Huge"
+msgstr "Inmenso"
 
-#: ../lib/advene/gui/edit/elements.py:617
-msgid "Apply changes and visualise in web browser"
-msgstr "Aplicar los cambios y visualizar en el navegador web"
+#: ../lib/advene/gui/views/activebookmarks.py:537
+msgid "Complete bookmarks into annotations"
+msgstr "Completar los separadores en anotaciones"
 
-#: ../lib/advene/gui/edit/elements.py:622
-msgid "Apply changes and activate the view"
-msgstr "Aplicar los cambios y activar la vista"
+#: ../lib/advene/gui/views/activebookmarks.py:538
+msgid "Save the current state"
+msgstr "Guardar el estado actual"
 
-#: ../lib/advene/gui/edit/elements.py:630
-#: ../lib/advene/gui/edit/elements.py:711
-#: ../lib/advene/gui/edit/elements.py:768
-#: ../lib/advene/gui/edit/elements.py:859
-#: ../lib/advene/gui/edit/elements.py:928
-#: ../lib/advene/gui/edit/elements.py:1030
-msgid "Title (name)"
-msgstr "Título (nombre)"
+#: ../lib/advene/gui/views/activebookmarks.py:539
+#: ../lib/advene/gui/edit/transcribe.py:1165
+msgid "Set the size of snaphots"
+msgstr "Establece el tamaño de las capturas de pantalla"
 
-#: ../lib/advene/gui/edit/elements.py:634
-msgid "Name of the view"
-msgstr "Nombre de la vista"
+#: ../lib/advene/gui/views/activebookmarks.py:806
+msgid "Remove end timestamp"
+msgstr "Remover la estampa de tiempo (timestamp) final"
 
-#: ../lib/advene/gui/edit/elements.py:658
-msgid "Class"
-msgstr "Clase"
+#: ../lib/advene/gui/views/activebookmarks.py:1014
+msgid ""
+"Error: cannot find an appropriate schema to create the Active-bookmark type."
+msgstr ""
+"Error: no se puede encontrar un esquema apropiado para crear el tipo de "
+"separador-activo. "
 
-#: ../lib/advene/gui/edit/elements.py:661
-msgid "Match Filter"
-msgstr "Concordar filtro"
+#: ../lib/advene/gui/views/activebookmarks.py:1019
+msgid "Active bookmark"
+msgstr "Separador activo"
 
-#: ../lib/advene/gui/edit/elements.py:699 ../lib/advene/gui/popup.py:821
-#, python-format
-msgid "Exception in query: %s"
-msgstr "Excepción en la consulta: %s"
+#: ../lib/advene/gui/views/activebookmarks.py:1057
+msgid "Validate the annotation"
+msgstr "Validar la anotación"
 
-#: ../lib/advene/gui/edit/elements.py:704
-#, fuzzy
-msgid "Validate and run query on package"
-msgstr "Crea un nuevo paquete"
+#: ../lib/advene/gui/views/activebookmarks.py:1201
+msgid "Duplicate bookmark"
+msgstr "Duplicar el separador"
 
-#: ../lib/advene/gui/edit/elements.py:715
-msgid "Name of the query"
-msgstr "Nombre de la consulta"
+#: ../lib/advene/gui/views/activebookmarks.py:1202
+msgid "Remove bookmark"
+msgstr "Remover el separador"
 
-#: ../lib/advene/gui/edit/elements.py:772
-msgid "Name of the package"
-msgstr "Nombre del paquete"
+#: ../lib/advene/gui/views/activebookmarks.py:1211
+msgid "Remove begin timestamp"
+msgstr "Remover la estampa de tiempo (timestamp) inicial"
 
-#: ../lib/advene/gui/edit/elements.py:790
-#: ../lib/advene/gui/edit/elements.py:881
-#: ../lib/advene/gui/edit/elements.py:960
-#: ../lib/advene/gui/edit/elements.py:1074
-msgid "Description"
-msgstr "Descripcion"
+#: ../lib/advene/gui/views/activebookmarks.py:1218
+msgid "Complete bookmark"
+msgstr "Completa el separador"
 
-#: ../lib/advene/gui/edit/elements.py:794
-#: ../lib/advene/gui/edit/elements.py:885
-#: ../lib/advene/gui/edit/elements.py:964
-#: ../lib/advene/gui/edit/elements.py:1078
-msgid "Textual description of the package"
-msgstr "Descripción textual del paquete"
+#: ../lib/advene/gui/views/activebookmarks.py:1222
+msgid "Change type to"
+msgstr "Cambiar el tipo a"
 
-#: ../lib/advene/gui/edit/elements.py:799
-msgid "Default dynamic view"
-msgstr "Vista dinamica predefinida"
+#: ../lib/advene/gui/views/logwindow.py:43
+msgid "Links"
+msgstr "Vínculos"
 
-#: ../lib/advene/gui/edit/elements.py:803
-msgid "Dynamic view to activate on package load"
-msgstr "Vista dinámica para activar en la carga del paquete"
+#: ../lib/advene/gui/views/logwindow.py:45
+msgid "URL stack"
+msgstr "Apilado URL"
 
-#: ../lib/advene/gui/edit/elements.py:808
-msgid "Default static view"
-msgstr "Vista estatica predefinida"
+#: ../lib/advene/gui/views/logwindow.py:123
+#, python-format
+msgid "Go to %s"
+msgstr "Ir a %s"
 
-#: ../lib/advene/gui/edit/elements.py:812
-msgid "Static view to open on package load"
-msgstr "Vista estática para abrir en la carga del paquete"
+#: ../lib/advene/gui/views/logwindow.py:129 ../lib/advene/rules/actions.py:65
+msgid "Go to the given position"
+msgstr "Ir a la posicion dada"
 
-#: ../lib/advene/gui/edit/elements.py:817
-msgid "Default adhoc view"
-msgstr "Vista adhoc predeterminada"
+#: ../lib/advene/gui/views/logwindow.py:157
+msgid "Push a URL on the stack"
+msgstr "Meter un URL al apilado"
 
-#: ../lib/advene/gui/edit/elements.py:821
-msgid "Adhoc view to open on package load"
-msgstr "Vista adhoc para abrir en la carga del paquete"
+#: ../lib/advene/gui/views/logwindow.py:158
+msgid "Description of the URL"
+msgstr "Descripción del URL"
 
-#: ../lib/advene/gui/edit/elements.py:826
-msgid "Cached duration"
-msgstr "Duración en caché"
+#: ../lib/advene/gui/views/interactivequery.py:52
+#: ../lib/advene/gui/views/interactivequery.py:100
+msgid "Interactive query"
+msgstr "Busqueda interactiva"
 
-#: ../lib/advene/gui/edit/elements.py:830
-msgid "Cached duration in ms"
-msgstr "Duración en caché en ms"
+#: ../lib/advene/gui/views/interactivequery.py:54
+msgid "Interactive query dialog"
+msgstr "Diálogo de consulta interactiva"
 
-#: ../lib/advene/gui/edit/elements.py:835
-msgid "Mediafile"
-msgstr "Archivo media"
+#: ../lib/advene/gui/views/interactivequery.py:60
+#: ../lib/advene/gui/views/interactivequery.py:257
+msgid "Save query"
+msgstr "Guardar consulta"
 
-#: ../lib/advene/gui/edit/elements.py:839
-msgid "Location of associated media file"
-msgstr "Ubicación del archivo media asociado"
+#: ../lib/advene/gui/views/interactivequery.py:123
+#: ../lib/advene/gui/views/interactivequery.py:173
+#, python-format
+msgid ""
+"Invalid query.\n"
+"The following fields have an invalid value:\n"
+"%s"
+msgstr ""
+"Busqueda invalida.\n"
+"Los campos siguientes tienen un valor no valido:\n"
+"%s"
 
-#: ../lib/advene/gui/edit/elements.py:863
-msgid "Name of the schema"
-msgstr "nombre del esquema"
+#: ../lib/advene/gui/views/interactivequery.py:137
+#: ../lib/advene/gui/views/interactivequery.py:297
+msgid "Saving the query..."
+msgstr "Guardando la consulta..."
 
-#: ../lib/advene/gui/edit/elements.py:895
-#: ../lib/advene/gui/edit/elements.py:975
-msgid "TALES expression returning a color for the element"
-msgstr "Expresión TALES regresando un color para el elemento"
+#: ../lib/advene/gui/views/interactivequery.py:138
+#: ../lib/advene/gui/views/interactivequery.py:298
+msgid "Give a title and identifier for saving the query"
+msgstr "Da un título e identificador para guardar la consulta"
 
-#: ../lib/advene/gui/edit/elements.py:902
-#: ../lib/advene/gui/edit/elements.py:993
-msgid "Item color"
-msgstr "Color del elemento"
+#: ../lib/advene/gui/views/interactivequery.py:181
+msgid "Expert search"
+msgstr "Búsqueda experta"
 
-#: ../lib/advene/gui/edit/elements.py:906
-#: ../lib/advene/gui/edit/elements.py:997
+#: ../lib/advene/gui/views/interactivequery.py:187
+#, python-format
 msgid ""
-"TALES expression returning a color for the items contained by the element"
+"TALES error in interactive expression:\n"
+"%s"
 msgstr ""
-"Expresión TALES regresando un color para los elementos contenidos por el "
-"elemento"
-
-#: ../lib/advene/gui/edit/elements.py:932
-#: ../lib/advene/gui/edit/elements.py:1034
-msgid "Name of the type"
-msgstr "Nombre del tipo"
+"TALES error en una expresión interactiva:\n"
+"%s"
 
-#: ../lib/advene/gui/edit/elements.py:950
-#: ../lib/advene/gui/edit/elements.py:1039
-#: ../lib/advene/gui/edit/elements.py:1308
-msgid "MIME Type"
-msgstr "Tipo MIME"
+#: ../lib/advene/gui/views/interactivequery.py:248
+msgid "Interactive result"
+msgstr "Resultado interactivo"
 
-#: ../lib/advene/gui/edit/elements.py:954
-#: ../lib/advene/gui/edit/elements.py:1043
-msgid "MIMEType of the content"
-msgstr "Tipo MIME del contenido"
+#: ../lib/advene/gui/views/interactivequery.py:250
+msgid "Interactive result display"
+msgstr "Visualización interactiva de resultado"
 
-#: ../lib/advene/gui/edit/elements.py:982
-#: ../lib/advene/gui/views/transcription.py:165
-msgid "Representation"
-msgstr "Representacion"
+#: ../lib/advene/gui/views/interactivequery.py:275
+msgid "Result of interactive query"
+msgstr "Resultado de una consulta interactiva"
 
-#: ../lib/advene/gui/edit/elements.py:986
-msgid ""
-"TALES expression used to get a compact representation of the annotations"
-msgstr ""
-"Expresión TALES utilizada para obtener una representación compacta de las "
-"anotaciones"
+#: ../lib/advene/gui/views/interactivequery.py:279
+msgid "Result of a query"
+msgstr "Resultado de una consulta"
 
-#: ../lib/advene/gui/edit/elements.py:987
+#: ../lib/advene/gui/views/interactivequery.py:334
 #, python-format
-msgid "Display %s key"
-msgstr "Muestra %s clave"
+msgid "Comment on annotations containing %s"
+msgstr "Comentar en anotaciones que contengan %s"
 
-#: ../lib/advene/gui/edit/elements.py:1003
-msgid "Completions"
-msgstr "Terminaciones"
+#: ../lib/advene/gui/views/interactivequery.py:353
+msgid "Choose the annotation type where annotations will be created."
+msgstr "Elige el tipo de anotación donde van a ser creadas las anotaciones"
 
-#: ../lib/advene/gui/edit/elements.py:1007
-msgid "Space-separated list of words used for content completion"
-msgstr ""
-"Lista de palabras separadas por espacio utilizadas para completar contenido"
+#: ../lib/advene/gui/views/interactivequery.py:357
+#, python-format
+msgid "Copied result of the '%s' query"
+msgstr "Resultado copiado de la '%s'  consulta"
 
-#: ../lib/advene/gui/edit/elements.py:1013
-msgid "Advanced"
-msgstr "Avanzado"
+#: ../lib/advene/gui/views/interactivequery.py:369
+#, python-format
+msgid "Search/replace content in %d elements"
+msgstr "Buscar / reemplazar contenido en %d elementos"
 
-#: ../lib/advene/gui/edit/elements.py:1063
-msgid "Any annotation type"
-msgstr "Cualquier tipo de anotación"
+#: ../lib/advene/gui/views/interactivequery.py:397
+msgid "Edit query again"
+msgstr "Edita la consulta de nuevo"
 
-#: ../lib/advene/gui/edit/elements.py:1089
-msgid "TALES expression specifying a color"
-msgstr "Expresión TALES especificando un color"
+#: ../lib/advene/gui/views/interactivequery.py:411
+msgid "Search again"
+msgstr "Busca de nuevo"
 
-#: ../lib/advene/gui/edit/elements.py:1116
-msgid "MIMEType"
-msgstr "Tipo MIME"
+#: ../lib/advene/gui/views/interactivequery.py:417
+msgid "Empty result"
+msgstr "Vacía el resultado"
 
-#: ../lib/advene/gui/edit/elements.py:1341
+#: ../lib/advene/gui/views/interactivequery.py:426
 #, python-format
-msgid "Error: cannot find a content handler for %s"
-msgstr "Error: no se puede encontrar un control para %s"
+msgid "Result is a list of %d annotations."
+msgstr "El resultado es una lista de %d anotaciones."
+
+#: ../lib/advene/gui/views/interactivequery.py:428
+#, python-format
+msgid "Result is a list of  %(number)d elements with %(elements)s."
+msgstr "El resultado es una lista de %(number)d elementos con %(elements)s."
+
+#: ../lib/advene/gui/views/interactivequery.py:440
+#: ../lib/advene/gui/edit/montage.py:481
+msgid "Unhighlight annotations"
+msgstr "Quitar resaltado de anotaciones"
+
+#: ../lib/advene/gui/views/interactivequery.py:444
+#: ../lib/advene/gui/views/interactivequery.py:481
+#: ../lib/advene/gui/edit/montage.py:485 ../lib/advene/gui/edit/montage.py:494
+msgid "Highlight annotations"
+msgstr "Resalta las anotaciones"
+
+#: ../lib/advene/gui/views/interactivequery.py:465
+#: ../lib/advene/gui/edit/imports.py:184 ../lib/advene/gui/edit/imports.py:185
+msgid "Annotations"
+msgstr "Anotaciones"
+
+#: ../lib/advene/gui/views/interactivequery.py:471
+msgid "Other elements"
+msgstr "Otros elementos"
+
+#: ../lib/advene/gui/views/interactivequery.py:475
+msgid "Display annotations in timeline"
+msgstr "Mostrar anotaciones en una línea de tiempo"
+
+#: ../lib/advene/gui/views/interactivequery.py:476
+msgid "Display annotations as transcription"
+msgstr "Mostrar anotaciones comp transcripción"
+
+#: ../lib/advene/gui/views/interactivequery.py:482
+#: ../lib/advene/gui/views/interactivequery.py:504
+msgid "Export table"
+msgstr "Exporta una tabla"
+
+#: ../lib/advene/gui/views/interactivequery.py:483
+msgid "Create annotations from the result"
+msgstr "Crear anotaciones del resultado"
+
+#: ../lib/advene/gui/views/interactivequery.py:484
+msgid "Define a montage with the result"
+msgstr "Definir un montaje con el resultado"
+
+#: ../lib/advene/gui/views/interactivequery.py:485
+msgid "Create a comment view with the result"
+msgstr "Crear una vista de comentario con el resultado"
+
+#: ../lib/advene/gui/views/interactivequery.py:486
+msgid "Search and replace strings in the annotations content"
+msgstr "Busca y reemplaza cadenas de texto en el contenido de las anotaciones"
+
+#: ../lib/advene/gui/views/interactivequery.py:511
+msgid "Edit elements"
+msgstr "Editar elementos"
+
+#: ../lib/advene/gui/views/interactivequery.py:517
+msgid "Open in python evaluator"
+msgstr "Abrir en el evaluador de python"
 
-#: ../lib/advene/gui/edit/elements.py:1457
-#: ../lib/advene/gui/edit/elements.py:1682
+#: ../lib/advene/gui/views/interactivequery.py:520
 #, python-format
 msgid ""
-"Cannot read the data:\n"
+"Result:\n"
 "%s"
 msgstr ""
-"No se pueden leer los datos:\n"
+"Resultado:\n"
 "%s"
 
-#: ../lib/advene/gui/edit/elements.py:1481
-#: ../lib/advene/gui/edit/elements.py:1707
-msgid "Save content to..."
-msgstr "Salvar el contenido a..."
+#: ../lib/advene/gui/views/interactivequery.py:562
+msgid "Results of _interactive query"
+msgstr "Resultados de_la búsqueda interactiva"
 
-#: ../lib/advene/gui/edit/elements.py:1492
-#: ../lib/advene/gui/edit/elements.py:1720
+#: ../lib/advene/gui/popup.py:135
+msgid "Choose the file to insert"
+msgstr "Elige un archivo a insertar"
+
+#: ../lib/advene/gui/popup.py:143
+msgid "Select a valid identifier"
+msgstr "Selecciona un identificador válido"
+
+#: ../lib/advene/gui/popup.py:144
 #, python-format
 msgid ""
-"Cannot save the data:\n"
-"%s"
+"The filename %s contains invalid characters\n"
+"that have been replaced.\n"
+"You can modify this identifier if necessary:"
 msgstr ""
-"No se pueden guardar los datos:\n"
-"%s"
-
-#: ../lib/advene/gui/edit/elements.py:1511
-#: ../lib/advene/gui/edit/elements.py:1734
-msgid "Open a file (C-o)"
-msgstr "Abrir un archivo (C-o)"
+"El nombre de archivo %s contiene caracteres no válidos\n"
+"que han sido reemplazados.\n"
+"Puedes modificar este identificador si es necesario:"
 
-#: ../lib/advene/gui/edit/elements.py:1516
-#: ../lib/advene/gui/edit/elements.py:1739
-msgid "Save to a file (C-s)"
-msgstr "Guardar a un archivo (C-s)"
+#: ../lib/advene/gui/popup.py:155
+msgid "Choose the soundclip to insert"
+msgstr "Elegir clip de audio para insertar"
 
-#: ../lib/advene/gui/edit/elements.py:1521
-#: ../lib/advene/gui/edit/elements.py:1744
-msgid "Reload the file (C-r)"
-msgstr "Volver a cargar el archivo (C-r)"
+#: ../lib/advene/gui/popup.py:159
+msgid "Choose the directory to insert"
+msgstr "Elige un directorio para insertar"
 
-#: ../lib/advene/gui/edit/elements.py:1527
-msgid "Insert a value from the browser (C-i)"
-msgstr "Inserta un valor del navegador (C-i)"
+#: ../lib/advene/gui/popup.py:171
+#, fuzzy, python-format
+msgid "Apply %s"
+msgstr "Aplicar cambios"
 
-#: ../lib/advene/gui/edit/elements.py:1773
-msgid "Begin time is greater than end time"
-msgstr "Tiempo de inicio es mayor que el tiempo final"
+#: ../lib/advene/gui/popup.py:175
+msgid ""
+"Give the offset to use\n"
+"on specified element.\n"
+"It is in ms and can be\n"
+"either positive or negative."
+msgstr ""
+"Da la compensacion para usar\n"
+"en el elemento especificado.\n"
+"Esta en ms y puede ser\n"
+"tanto positiva como negativa."
 
-#: ../lib/advene/gui/edit/elements.py:1803
-#: ../lib/advene/gui/views/table.py:252
-msgid "Begin"
-msgstr "Inicio"
+#: ../lib/advene/gui/popup.py:219
+#, python-format
+msgid "Replace content in %s"
+msgstr "Reemplazar contenido en %s"
 
-#: ../lib/advene/gui/edit/elements.py:1812
-#: ../lib/advene/gui/views/table.py:253 ../lib/advene/gui/main.py:628
-msgid "End"
-msgstr "Final"
+#: ../lib/advene/gui/popup.py:222
+#, python-format
+msgid "Replace content in annotations of type %s"
+msgstr "Reemplazar el contenido en las anotaciones de tipo %s"
 
-#: ../lib/advene/gui/edit/elements.py:2044
-msgid "Expecting an integer."
-msgstr "Esperando entero"
+#: ../lib/advene/gui/popup.py:225
+msgid "Replace content in all annotations"
+msgstr "Reemplazar contenido en todas las anotaciones"
 
-#: ../lib/advene/gui/edit/elements.py:2076
+#: ../lib/advene/gui/popup.py:318
 #, python-format
-msgid ""
-"The %(attribute)s attribute could not be updated:\n"
-"\n"
-"%(error)s\n"
-"\n"
-"Resetting to the original value."
-msgstr ""
-"El atributo %(attribute)s no pudo ser actualizado:\n"
-"\n"
-"%(error)s\n"
-"\n"
-"Restableciendo el valor original."
+msgid "Copy id %s"
+msgstr "Copiar id %s"
 
-#: ../lib/advene/gui/edit/elements.py:2103
+#: ../lib/advene/gui/popup.py:352
 #, python-format
 msgid ""
-"The following attributes cannot be updated:\n"
+"<b>Statistics about %s</b>\n"
 "\n"
-"%s"
 msgstr ""
-"Los siguientes atributos no pudieron ser actualizados:\n"
+"<b>Estadísticas acerca %s</b>\n"
 "\n"
-"%s"
 
-#: ../lib/advene/gui/edit/elements.py:2143
+#: ../lib/advene/gui/popup.py:358
 #, python-format
+msgid "Renumbering annotations of type %s"
+msgstr "Renumerando las anotaciones del tipo %s"
+
+#: ../lib/advene/gui/popup.py:365
 msgid ""
-"The following attributes could not be updated:\n"
+"<b>Renumber all annotations according to their order.</b>\n"
 "\n"
-"%s"
+"<i>Note that this action cannot be undone.</i>\n"
+"Replace the first numeric value of the annotation content with the new "
+"annotation number.\n"
+"If no numeric value is found and the annotation is structured, it will "
+"insert the number.\n"
+"If no numeric value is found and the annotation is of type text/plain, it "
+"will overwrite the annotation content.\n"
+"The offset parameter allows you to renumber from a given annotation."
 msgstr ""
-"Los siguientes atributos no pudieron ser actualizados:\n"
+"<b>Cambiar la numeración de todas las anotaciones de acuerdo a su orden.</"
+"b>\n"
 "\n"
-"%s"
+"<i>Esta acción no se puede deshacer.</i>\n"
+"Coloca el primer valor numérico del contenido de anotación con el nuevo "
+"número de anotación.\n"
+"Si no se encuentra ningún valor numérico y la anotación es estructurada, se "
+"insertará el número.\n"
+" Si no se encuentra ningún valor numérico y la anotación es de tipo text/"
+"plain, sobrescribirá el contenido de la anotación.\n"
+"El parámetro de desplazamiento le permite volver a numerar a partir de una "
+"anotación dada."
 
-#: ../lib/advene/gui/edit/elements.py:2160
-msgid "Attribute"
-msgstr "Atributo"
+#: ../lib/advene/gui/popup.py:371 ../lib/advene/gui/popup.py:513
+msgid "Offset"
+msgstr "Compensar"
 
-#: ../lib/advene/gui/edit/elements.py:2168
-#: ../lib/advene/gui/views/browser.py:366
-msgid "Value"
-msgstr "Valor"
+#: ../lib/advene/gui/popup.py:393
+#, python-format
+msgid "Renumbering %d annotations"
+msgstr "Volviendo a numerar %d anotaciones"
 
-#: ../lib/advene/gui/edit/elements.py:2259
-msgid "Insert an element"
-msgstr "Insertar un elemento"
+#: ../lib/advene/gui/popup.py:402
+#, python-format
+msgid "Annotation #%d"
+msgstr "Anotación #%d"
 
-#: ../lib/advene/gui/edit/elements.py:2260
-msgid "Choose the element to insert."
-msgstr "Elegir elemento a insertar"
+#: ../lib/advene/gui/popup.py:433
+#, fuzzy, python-format
+msgid "Splitting package according to %s"
+msgstr "Abortando el guardar paquete"
 
-#: ../lib/advene/gui/edit/elements.py:2330
-#: ../lib/advene/gui/edit/elements.py:2373
+#: ../lib/advene/gui/popup.py:436
 #, python-format
-msgid "Some tags contain invalid characters: %s"
-msgstr "Algunas etiquetas contienen caracteres no válidos: %s"
+msgid ""
+"For each of the %(count)d annotations in %(atype)s, create a package named "
+"after the source package and the annotation content, copying only "
+"annotations contained in the reference annotation."
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2353
-msgid "Tags:"
-msgstr "Etiquetas:"
+#: ../lib/advene/gui/popup.py:456
+#, fuzzy
+msgid "Created %(name)s - %(n) annotations"
+msgstr "Crear una nueva anotación"
 
-#: ../lib/advene/gui/views/browser.py:163
-#: ../lib/advene/gui/views/browser.py:165
-msgid "TALES browser"
-msgstr "Navegador TALES"
+#: ../lib/advene/gui/popup.py:473 ../lib/advene/gui/edit/montage.py:309
+#, python-format
+msgid "Extracting %s"
+msgstr "Extrayendo %s"
 
-#: ../lib/advene/gui/views/browser.py:170
-msgid "Display result in table"
-msgstr "Mostrar el resultado en tabla"
+#: ../lib/advene/gui/popup.py:474
+#, python-format
+msgid ""
+"Exporting annotation %(title)s\n"
+"from %(begin)s to %(end)s\n"
+"to %%(filename)s"
+msgstr ""
+"Exportando anotación %(title)s\n"
+"de %(begin)s a %(end)s\n"
+"a %%(filename)s"
 
-#: ../lib/advene/gui/views/browser.py:193
-msgid "Insert path"
-msgstr "Insertar ruta"
+#: ../lib/advene/gui/popup.py:485 ../lib/advene/gui/edit/transcribe.py:499
+msgid "Edit"
+msgstr "Editar"
 
-#: ../lib/advene/gui/views/browser.py:194
-msgid "Insert value"
-msgstr "Insertar valor"
+#: ../lib/advene/gui/popup.py:487
+msgid "Browse"
+msgstr "Navegar"
 
-#: ../lib/advene/gui/views/browser.py:249
-msgid "Expression returned None (there was an exception)"
-msgstr "La expresión regresó None (hubo una excepción)"
+#: ../lib/advene/gui/popup.py:495 ../lib/advene/gui/popup.py:884
+msgid "Open in web browser"
+msgstr "Abrir en un navegador web"
 
-#: ../lib/advene/gui/views/browser.py:302
-msgid "Result is not a list"
-msgstr "El resultado no es una lista"
+#: ../lib/advene/gui/popup.py:501 ../lib/advene/gui/popup.py:505
+#: ../lib/advene/gui/edit/shapewidget.py:1601
+msgid "Delete"
+msgstr "Borrar"
 
-#: ../lib/advene/gui/views/accumulatorpopup.py:49
-msgid "PopupAccumulator"
-msgstr "AcumuladorPopup"
+#: ../lib/advene/gui/popup.py:508
+msgid "Search/replace content"
+msgstr "Buscar / reemplazar contenido "
 
-#: ../lib/advene/gui/views/editionhistory.py:40
-msgid "Edition History"
-msgstr "Historial de navegación"
+#: ../lib/advene/gui/popup.py:526
+msgid "Desactivate"
+msgstr "Desactivar"
 
-#: ../lib/advene/gui/views/editionhistory.py:42
-msgid "Access last edited/created elements"
-msgstr "Acceder a los elementos editados / creados al final"
+#: ../lib/advene/gui/popup.py:543
+msgid "Loop"
+msgstr "Ciclo"
 
-#: ../lib/advene/gui/views/editionhistory.py:102
-msgid "Created"
-msgstr "Creado"
+#: ../lib/advene/gui/popup.py:544
+msgid "Duplicate"
+msgstr "Duplicar"
 
-#: ../lib/advene/gui/views/editionhistory.py:103
-msgid "Edited"
-msgstr "Editado"
+#: ../lib/advene/gui/popup.py:548
+msgid "Save snapshot..."
+msgstr "Guardar captura..."
 
-#: ../lib/advene/gui/views/logwindow.py:43
-msgid "Links"
-msgstr "Vínculos"
+#: ../lib/advene/gui/popup.py:550
+msgid "Extract video fragment"
+msgstr "Extraer fragmento de video"
 
-#: ../lib/advene/gui/views/logwindow.py:45
-msgid "URL stack"
-msgstr "Apilado URL"
+#: ../lib/advene/gui/popup.py:580
+msgid "Incoming"
+msgstr "Entrando "
 
-#: ../lib/advene/gui/views/logwindow.py:123
-#, python-format
-msgid "Go to %s"
-msgstr "Ir a %s"
+#: ../lib/advene/gui/popup.py:596
+msgid "Outgoing"
+msgstr "Saliendo "
 
-#: ../lib/advene/gui/views/logwindow.py:157
-msgid "Push a URL on the stack"
-msgstr "Meter un URL al apilado"
+#: ../lib/advene/gui/popup.py:611
+msgid "Related annotations"
+msgstr "Anotaciones relacionadas"
 
-#: ../lib/advene/gui/views/logwindow.py:158
-msgid "Description of the URL"
-msgstr "Descripción del URL"
+#: ../lib/advene/gui/popup.py:618
+msgid "Incoming relations"
+msgstr "Relaciones entrantes"
 
-#: ../lib/advene/gui/views/checker.py:37
-msgid "Checker"
-msgstr "Revisador"
+#: ../lib/advene/gui/popup.py:625
+msgid "Outgoing relations"
+msgstr "Relaciones salientes"
 
-#: ../lib/advene/gui/views/checker.py:39
-msgid "Check various package properties"
-msgstr "Revisar varias propiedades del paquete"
+#: ../lib/advene/gui/popup.py:642
+#, python-format
+msgid "Begin: %s"
+msgstr "Inicio: %s"
 
-#: ../lib/advene/gui/views/checker.py:90
-msgid "List of possible issues in the current package"
-msgstr "Lista de problemas posibles en el paquete actual"
+#: ../lib/advene/gui/popup.py:644
+#, python-format
+msgid "End: %s"
+msgstr "Final: %s"
 
-#: ../lib/advene/gui/views/checker.py:108
-msgid "Overlapping"
-msgstr "Traslapar"
+#: ../lib/advene/gui/popup.py:645
+#, python-format
+msgid "Duration: %s"
+msgstr "Duración: %s"
 
-#: ../lib/advene/gui/views/tagbag.py:52
-msgid "Tag Bag"
-msgstr "Bolsa de etiquetas"
+#: ../lib/advene/gui/popup.py:652
+msgid "Members:"
+msgstr "Miembros:"
 
-#: ../lib/advene/gui/views/tagbag.py:54 ../lib/advene/gui/main.py:1232
-msgid "Bag of tags"
-msgstr "Bolsa de etiquetas"
+#: ../lib/advene/gui/popup.py:665
+msgid "Edit package properties..."
+msgstr "Editar propiedades de los paquetes..."
 
-#: ../lib/advene/gui/views/tagbag.py:59
-msgid "New tag"
-msgstr "Nueva etiqueta"
+#: ../lib/advene/gui/popup.py:666 ../lib/advene/gui/popup.py:787
+#, python-format
+msgid "%d annotations(s) - statistics"
+msgstr "%d anotaciones - estadísticas"
 
-#: ../lib/advene/gui/views/tagbag.py:122
-msgid "New tag name"
-msgstr "Nuevo nombre de etiqueta"
+#: ../lib/advene/gui/popup.py:668 ../lib/advene/gui/popup.py:895
+msgid "Create a new static view..."
+msgstr "Crear una nueva vista..."
 
-#: ../lib/advene/gui/views/tagbag.py:128
-msgid "Enter a new tag name and select its color."
-msgstr "Ingresa un nuevo nombre de etiqueta y selecciona su color"
+#: ../lib/advene/gui/popup.py:669 ../lib/advene/gui/popup.py:896
+msgid "Create a new dynamic view..."
+msgstr "Crear una nueva vista dinámica..."
 
-#: ../lib/advene/gui/views/tagbag.py:162
-#: ../lib/advene/gui/views/timeline.py:3720
-msgid "The tag contains invalid characters"
-msgstr "La etiqueta contiene caracteres no válidos"
+#: ../lib/advene/gui/popup.py:670 ../lib/advene/gui/popup.py:782
+msgid "Create a new annotation..."
+msgstr "Crear una nueva anotacion"
 
-#: ../lib/advene/gui/views/tagbag.py:175
-msgid "Tag bag options"
-msgstr "Opciones de  la bolsa de etiquetas"
+#: ../lib/advene/gui/popup.py:672 ../lib/advene/gui/popup.py:898
+msgid "Create a new schema..."
+msgstr "Crear un nuevo esquema..."
 
-#: ../lib/advene/gui/views/tagbag.py:176
-msgid "Update with new tags"
-msgstr "Actualizar con nuevas etiquetas"
+#: ../lib/advene/gui/popup.py:673 ../lib/advene/gui/popup.py:893
+msgid "Create a new query..."
+msgstr "Crear una nueva busqueda..."
 
-#: ../lib/advene/gui/views/tagbag.py:176
-msgid "Automatically display new defined tags"
-msgstr "Muestra nuevas etiquetas definidas automáticamente"
+#: ../lib/advene/gui/popup.py:681
+msgid "Create a new folder..."
+msgstr "Crear una nueva carpeta..."
 
-#: ../lib/advene/gui/views/tagbag.py:225
-#, python-format
-msgid "Choose the color for tag %s"
-msgstr "Selecciona el color para la etiqueta %s"
+#: ../lib/advene/gui/popup.py:682
+msgid "Create a new resource file..."
+msgstr "Crear un nuevo archivo de recurso..."
 
-#: ../lib/advene/gui/views/tagbag.py:249
-msgid "Set color"
-msgstr "Establece el color"
+#: ../lib/advene/gui/popup.py:683
+msgid "Insert a new resource file..."
+msgstr "Insertar un nuevo archivo de recurso..."
 
-#: ../lib/advene/gui/views/tagbag.py:250
-msgid "Remove"
-msgstr "Remover"
+#: ../lib/advene/gui/popup.py:684
+msgid "Insert a new resource directory..."
+msgstr "Insertar un nuevo directorio de recursos..."
 
-#: ../lib/advene/gui/views/tagbag.py:324
-msgid "Drop a tag here to remove it from the list"
-msgstr "Arrastra una etiqueta aquí para removerla de la lista"
+#: ../lib/advene/gui/popup.py:693 ../lib/advene/gui/popup.py:695
+msgid "Insert a soundclip..."
+msgstr "Insertar un clip de sonido..."
 
-#: ../lib/advene/gui/views/tagbag.py:333
-msgid "Save as adhoc view"
-msgstr "Guardar como una vista adhoc"
+#: ../lib/advene/gui/popup.py:706
+msgid "Play sound"
+msgstr "Reproducir sonido"
 
-#: ../lib/advene/gui/views/tagbag.py:334
-msgid "Add a new tag"
-msgstr "Agrega una nueva etiqueta"
+#: ../lib/advene/gui/popup.py:716
+msgid "Create a new annotation type..."
+msgstr "Crear un nuevo tipo de anotacion..."
 
-#: ../lib/advene/gui/views/tagbag.py:335
-msgid "Display all defined tags"
-msgstr "Muestra todas las etiquetas definidas"
+#: ../lib/advene/gui/popup.py:718
+msgid "Create a new relation type..."
+msgstr "Crear un nuevo tipo de relacion..."
 
-#: ../lib/advene/gui/views/transcription.py:48
-msgid "Transcription"
-msgstr "Transcripcion"
+#: ../lib/advene/gui/popup.py:720 ../lib/advene/gui/popup.py:781
+#: ../lib/advene/gui/popup.py:834
+msgid "Select a color"
+msgstr "Selecciona un color"
 
-#: ../lib/advene/gui/views/transcription.py:50
-msgid "Display annotations as a text transcription"
-msgstr "Mostrar las anotaciones como transcripción"
+#: ../lib/advene/gui/popup.py:729
+#, python-format
+msgid "A caption dynamic view for %s already seems to exist."
+msgstr "Un subtítulo dinámico para la vista %s parece que ya existe."
 
-#: ../lib/advene/gui/views/transcription.py:146
+#: ../lib/advene/gui/popup.py:738
 #, python-format
-msgid "Error in source evaluation %(source)s: %(error)s"
-msgstr "Error en la evaluación de la fuente %(source)s: %(error)s"
+msgid "Caption %s annotations"
+msgstr "Subtítulo %s anotaciones"
 
-#: ../lib/advene/gui/views/transcription.py:163
-msgid "Transcription options"
-msgstr "Opciones de transcripción"
+#: ../lib/advene/gui/popup.py:748 ../lib/advene/rules/actions.py:121
+msgid "Caption the annotation"
+msgstr "Subtitular la anotación"
 
-#: ../lib/advene/gui/views/transcription.py:164
-msgid "Default representation"
-msgstr "Representación predeterminada"
+#: ../lib/advene/gui/popup.py:770
+msgid "Create a comment view"
+msgstr "Crear una vista de comentario"
 
-#: ../lib/advene/gui/views/transcription.py:164
-msgid "Use the default representation for annotations"
-msgstr "Usar la representación predeterminada para las anotaciones"
+#: ../lib/advene/gui/popup.py:771
+msgid "Generate a caption dynamic view..."
+msgstr "Genera una vista dinámica de subtítulos"
 
-#: ../lib/advene/gui/views/transcription.py:165
-msgid ""
-"If default representation is unchecked,\n"
-"this TALES expression that will be used to format the annotations."
-msgstr ""
-"Si la representación predeterminada no está seleccionada,\n"
-"esta expresión TALES será utilizada para dar formato a las anotaciones."
+#: ../lib/advene/gui/popup.py:772
+msgid "Display as transcription"
+msgstr "Muestra como transcripcion"
 
-#: ../lib/advene/gui/views/transcription.py:166
-msgid "Separator"
-msgstr "Separador"
+#: ../lib/advene/gui/popup.py:773
+msgid "Display annotations in table"
+msgstr "Muestra las anotaciones en una tabla"
 
-#: ../lib/advene/gui/views/transcription.py:167
-msgid "This separator will be inserted between the annotations."
-msgstr "Este separador va a ser insertado entre las anotaciones"
+#: ../lib/advene/gui/popup.py:774
+msgid "Export to another format..."
+msgstr "Exportar a otro formato"
 
-#: ../lib/advene/gui/views/transcription.py:168
-msgid "Whitespace"
-msgstr "Espacio en blanco"
+#: ../lib/advene/gui/popup.py:775
+#, fuzzy
+msgid "Split according to annotations"
+msgstr "Importando anotaciones"
 
-#: ../lib/advene/gui/views/transcription.py:169
-msgid "Newline"
-msgstr "Nueva línea"
+#: ../lib/advene/gui/popup.py:777
+#, fuzzy, python-format
+msgid "Apply %s..."
+msgstr "Aplica la consulta en..."
 
-#: ../lib/advene/gui/views/transcription.py:170
-msgid "Tabulation"
-msgstr "Tabulación "
+#: ../lib/advene/gui/popup.py:783
+msgid "Delete all annotations"
+msgstr "Borrar todas las anotaciones"
 
-#: ../lib/advene/gui/views/transcription.py:171
-msgid "Dash"
-msgstr "Guión"
+#: ../lib/advene/gui/popup.py:784
+msgid "Renumber annotations..."
+msgstr "Volviendo a numerar anotaciones"
 
-#: ../lib/advene/gui/views/transcription.py:172
-msgid "User defined"
-msgstr "Definido por el usuario"
+#: ../lib/advene/gui/popup.py:785
+#, fuzzy
+msgid "Shot validation view..."
+msgstr "Vista de validación de capturas"
 
-#: ../lib/advene/gui/views/transcription.py:174
-msgid "User-defined separator"
-msgstr "Separador definido por el usuario"
+#: ../lib/advene/gui/popup.py:797
+#, python-format
+msgid "A follow dynamic view for %s already seems to exist."
+msgstr "Una siguiente vista dinámica para %s parece que ya existe."
 
-#: ../lib/advene/gui/views/transcription.py:174
-msgid ""
-"Separator used if user-defined is selected.Use \\n for a newline and \\t for "
-"a tabulation."
-msgstr ""
-"Separador utilizado si la definición de usuario está seleccionado.Usar \\n "
-"para una nueva línea \\t para tabulación."
+#: ../lib/advene/gui/popup.py:806
+#, python-format
+msgid "Follow %s relation-type"
+msgstr "Seguir %s tipos de relación"
 
-#: ../lib/advene/gui/views/transcription.py:175
-msgid "Display timestamps"
-msgstr "Muestra las marcas de tiempo"
+#: ../lib/advene/gui/popup.py:815
+msgid "Follow the relation"
+msgstr "Seguir la relación"
 
-#: ../lib/advene/gui/views/transcription.py:175
-msgid "Insert timestsamp values"
-msgstr "Inserta los valores de la marca de tiempo"
+#: ../lib/advene/gui/popup.py:835
+msgid "Delete all relations..."
+msgstr "Borrar todas las relaciones..."
 
-#: ../lib/advene/gui/views/transcription.py:176
-msgid "Display annotation bounds"
-msgstr "Muestra los limites de la anotacion"
+#: ../lib/advene/gui/popup.py:836
+msgid "Create montage from related annotations"
+msgstr " Crear un montaje de las anotaciones relacionadas"
+
+#: ../lib/advene/gui/popup.py:837
+msgid "Create dynamic view following relations"
+msgstr "Crear una vista dinámica siguiendo relaciones"
 
-#: ../lib/advene/gui/views/transcription.py:236
+#: ../lib/advene/gui/popup.py:852 ../lib/advene/gui/edit/elements.py:705
 #, python-format
-msgid ""
-"Cannot convert the following annotations,\n"
-"the representation pattern is too complex.\n"
-"%s"
-msgstr ""
-"No se pueden convertir las anotaciones siguientes,\n"
-"el patrón de representación es muy complejo.\n"
-"%s"
+msgid "Exception in query: %s"
+msgstr "Excepción en la consulta: %s"
 
-#: ../lib/advene/gui/views/transcription.py:247
-msgid ""
-"Cannot validate the update.\n"
-"The representation pattern is too complex."
-msgstr ""
-"No se puede validar la actualización. \n"
-"El patrón de representación es muy complejo."
+#: ../lib/advene/gui/popup.py:855
+msgid "Apply query on..."
+msgstr "Aplica la consulta en..."
 
-#: ../lib/advene/gui/views/transcription.py:273
-msgid "Save transcription to a text file"
-msgstr "Guarda la transcripción a un archivo de texto"
+#: ../lib/advene/gui/popup.py:880
+msgid "Activate view"
+msgstr "Activar vista"
 
-#: ../lib/advene/gui/views/transcription.py:274
-msgid "Apply the modifications"
-msgstr "Aplicar las modificaciones"
+#: ../lib/advene/gui/popup.py:882
+msgid "Open adhoc view"
+msgstr "Abrir vista adhoc"
 
-#: ../lib/advene/gui/views/transcription.py:275
-msgid "Find text"
-msgstr "Encontrar texto"
+#: ../lib/advene/gui/util/initialconfig.py:82
+msgid "Initial Advene configuration"
+msgstr "Configuración inicial de advene"
 
-#: ../lib/advene/gui/views/transcription.py:276
-msgid "Quickly switch display options"
-msgstr "Cambia las opciones de visualización rápidamente"
+#: ../lib/advene/gui/util/initialconfig.py:83
+msgid ""
+"<span size='large'><b>Welcome in Advene</b>\n"
+"This is the first time that you run Advene. Please answer some basic "
+"configuration questions. You will be able to modify these choices from the "
+"Advene interface, in the Edit/Preferences menu.</span>"
+msgstr ""
+"<span size='large'><b>Bienvenido a Advene</b>\n"
+"Esta es la primera vez que se ejecuta Advene. Por favor, contesta algunas "
+"preguntas básicas de configuración. Vas a poder modificar estas opciones "
+"desde la interfaz Advene, en el menú Editar / Preferencias.</span>"
 
-#: ../lib/advene/gui/views/transcription.py:277
-msgid "Refresh the transcription"
-msgstr "Refresca la transcripción"
+#: ../lib/advene/gui/util/initialconfig.py:84
+msgid "Interface language"
+msgstr "Idioma de la interfaz"
 
-#: ../lib/advene/gui/views/transcription.py:278
-msgid "Edit preferences"
-msgstr "Preferencias de edición"
+#: ../lib/advene/gui/util/initialconfig.py:84
+msgid "Language used for the interface"
+msgstr "Idioma utilizado para la interfaz"
 
-#: ../lib/advene/gui/views/transcription.py:697
-#, python-format
-msgid "Cannot write to %(filename)s: %(error)s:"
-msgstr "No se puede escribir a %(filename)s: %(error)s:"
+#: ../lib/advene/gui/util/initialconfig.py:90
+msgid "Weekly check for Advene updates on the Advene website"
+msgstr ""
+"Revisar semanalmente por actualizaciones de Advene en el sitio de Advene"
 
-#: ../lib/advene/gui/views/activebookmarks.py:52
-#: ../lib/advene/gui/views/activebookmarks.py:54
-msgid "ActiveBookmarks"
-msgstr "SeparadoresActivos"
+#: ../lib/advene/gui/util/initialconfig.py:92
+msgid "Preferred directory for data files"
+msgstr "Directorio preferido para archivos de datos"
 
-#: ../lib/advene/gui/views/activebookmarks.py:441
-msgid "Chronological order"
-msgstr "Orden cronológico"
+#: ../lib/advene/gui/util/initialconfig.py:92
+msgid "Preferred directory for storing data files (Advene packages)"
+msgstr ""
+"Directorio preferido para almacenar archivos de datos (Paquetes de Advene)"
 
-#: ../lib/advene/gui/views/activebookmarks.py:442
-msgid "Completeness and chronological order"
-msgstr "Nivel de completado y orden cronológico"
+#: ../lib/advene/gui/util/initialconfig.py:94
+msgid "Directories to search for movies"
+msgstr "Directorios para buscar archivos de video"
 
-#: ../lib/advene/gui/views/activebookmarks.py:458
-msgid "Bookmark duration"
-msgstr "Duración del separador"
+#: ../lib/advene/gui/util/initialconfig.py:94
+#, python-format
+msgid ""
+"List of directories (separated by %(pathsep)s) to search for movie files."
+msgstr ""
+"Lista de directorios (separados por %(pathsep)s) para buscar archivos de "
+"video."
 
-#: ../lib/advene/gui/views/activebookmarks.py:459
-msgid "Enter the duration (in ms) to convert bookmarks into annotations"
+#: ../lib/advene/gui/util/initialconfig.py:95
+msgid "First look for movie file in the same directory as the package"
+msgstr "Primero busca el archivo de video en el mismo directorio del paquete"
+
+#: ../lib/advene/gui/util/initialconfig.py:95
+msgid ""
+"If checked, the movie file will be searched for in the same directory as the "
+"referencing package."
 msgstr ""
-"Ingresar la duración (en ms) para convertir los separadores en anotaciones"
+"Si está seleccionado, el archivo de video se buscará en el mismo directorio "
+"al paquete que hace referencia."
 
-#: ../lib/advene/gui/views/activebookmarks.py:481
-msgid "User-specified duration"
-msgstr "Duración especificada por el usuario"
+#: ../lib/advene/gui/util/__init__.py:44 ../lib/advene/gui/edit/create.py:108
+msgid "Plain text content"
+msgstr "Contenido de texto plano"
 
-#: ../lib/advene/gui/views/activebookmarks.py:482
-msgid "2s duration"
-msgstr "2s duración"
+#: ../lib/advene/gui/util/__init__.py:45
+msgid "HTML content"
+msgstr "Contenido HTML"
 
-#: ../lib/advene/gui/views/activebookmarks.py:483
-msgid "Complete coverage"
-msgstr "Cobertura completa"
+#: ../lib/advene/gui/util/__init__.py:46 ../lib/advene/gui/edit/create.py:109
+msgid "Simple-structured content"
+msgstr "Contenido de estructura simple"
 
-#: ../lib/advene/gui/views/activebookmarks.py:501
-msgid "Drop a bookmark here to remove it from the list"
-msgstr "Arrastra un separador aquí para removerlo de la lista"
+#: ../lib/advene/gui/util/__init__.py:47
+msgid "List of numeric values"
+msgstr "Lista de valores numéricos"
 
-#: ../lib/advene/gui/views/activebookmarks.py:520
-#: ../lib/advene/gui/views/bookmarks.py:243
-msgid "Insert a bookmark for the current video time"
-msgstr "Inserta un separador para el tiempo actual del video"
+#: ../lib/advene/gui/util/__init__.py:48 ../lib/advene/gui/edit/create.py:110
+msgid "SVG graphics content"
+msgstr "Contenido de gráficos SVG"
 
-#: ../lib/advene/gui/views/activebookmarks.py:528
-msgid "Type of the annotations that will be created"
-msgstr "Tipo de anotaciones que serán cradas"
+#: ../lib/advene/gui/util/__init__.py:387
+#, python-format
+msgid ""
+"Annotation Type %(title)s:\n"
+"%(count)s"
+msgstr ""
+"Tipo de anotación %(title)s:\n"
+"%(count)s"
+
+#: ../lib/advene/gui/util/__init__.py:393
+#, python-format
+msgid ""
+"Relation Type %(title)s:\n"
+"%(count)s"
+msgstr ""
+"Tipo de relación %(title)s:\n"
+"%(count)s"
 
-#: ../lib/advene/gui/views/activebookmarks.py:561
-msgid "Reorder active bookmarks"
-msgstr "Reorganizar los separadores activos"
+#: ../lib/advene/gui/util/dialog.py:419 ../lib/advene/gui/util/dialog.py:458
+msgid "Name the element"
+msgstr "Nombra el elemetno"
 
-#: ../lib/advene/gui/views/activebookmarks.py:562
-msgid "Complete bookmarks into annotations"
-msgstr "Completar los separadores en anotaciones"
+#: ../lib/advene/gui/util/dialog.py:422 ../lib/advene/gui/util/dialog.py:459
+msgid "Choose a name for the element"
+msgstr "Elige un nombre para el elemento"
 
-#: ../lib/advene/gui/views/activebookmarks.py:563
-msgid "Save the current state"
-msgstr "Guardar el estado actual"
+#: ../lib/advene/gui/util/dialog.py:497
+msgid "Open a file"
+msgstr "Abre un archivo"
 
-#: ../lib/advene/gui/views/activebookmarks.py:863
-msgid "Remove end timestamp"
-msgstr "Remover la estampa de tiempo (timestamp) final"
+#: ../lib/advene/gui/util/dialog.py:522 ../lib/advene/gui/util/dialog.py:560
+msgid "N/C"
+msgstr "N/C"
+
+#: ../lib/advene/gui/util/dialog.py:527
+msgid "Alias"
+msgstr "Alias"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1071
+#: ../lib/advene/gui/util/dialog.py:545
 msgid ""
-"Error: cannot find an appropriate schema to create the Active-bookmark type."
+"Press to\n"
+"display\n"
+"information"
 msgstr ""
-"Error: no se puede encontrar un esquema apropiado para crear el tipo de "
-"separador-activo. "
+"Presiona para\n"
+"mostrar\n"
+"informacion"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1076
-msgid "Active bookmark"
-msgstr "Separador activo"
+#: ../lib/advene/gui/util/dialog.py:568
+msgid "Wait..."
+msgstr "Espera..."
 
-#: ../lib/advene/gui/views/activebookmarks.py:1114
-msgid "Validate the annotation"
-msgstr "Validar la anotación"
+#: ../lib/advene/gui/util/dialog.py:572
+#, python-format
+msgid "Error: %s"
+msgstr "Error: %s"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1260
-msgid "Duplicate bookmark"
-msgstr "Duplicar el separador"
+#: ../lib/advene/gui/util/dialog.py:592
+msgid "Any type of file"
+msgstr "Cualquier tipo de archivo"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1261
-msgid "Remove bookmark"
-msgstr "Remover el separador"
+#: ../lib/advene/gui/util/dialog.py:594
+msgid "Advene files (.xml, .azp, .apl)"
+msgstr "Archivos de Advene (.xml, .azp, .apl)"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1270
-msgid "Remove begin timestamp"
-msgstr "Remover la estampa de tiempo (timestamp) inicial"
+#: ../lib/advene/gui/util/dialog.py:596
+msgid "Advene session (.apl)"
+msgstr "Sesión de Advene (.apl)"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1277
-msgid "Complete bookmark"
-msgstr "Completa el separador"
+#: ../lib/advene/gui/util/dialog.py:597
+msgid "Audio files"
+msgstr "Archivos de audio"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1281
-msgid "Change type to"
-msgstr "Cambiar el tipo a"
+#: ../lib/advene/gui/util/dialog.py:598
+msgid "Video files"
+msgstr "Archivos de video"
 
-#: ../lib/advene/gui/views/bookmarks.py:48
-msgid "Bookmarks importer"
-msgstr "Importador de separadores"
+#: ../lib/advene/gui/util/dialog.py:637
+#: ../lib/advene/gui/edit/properties.py:578
+msgid "Choose a directory"
+msgstr "Elige un directorio"
 
-#: ../lib/advene/gui/views/bookmarks.py:69
-msgid "Bookmarks"
-msgstr "Separadores"
+#: ../lib/advene/gui/util/dialog.py:690
+msgid "Select an element"
+msgstr "Selecciona un elemento"
 
-#: ../lib/advene/gui/views/bookmarks.py:71
-msgid "Bookmark timecodes with their corresponding screenshots"
-msgstr ""
-"Separador de tiempos de código con sus capturas de pantalla correspondientes"
+#: ../lib/advene/gui/edit/rules.py:88 ../lib/advene/gui/edit/rules.py:90
+#: ../lib/advene/gui/edit/create.py:254
+msgid "Rule"
+msgstr "Regla"
 
-#: ../lib/advene/gui/views/bookmarks.py:142
-msgid "Select the annotation type to generate"
-msgstr "Selecciona el tipo de anotacion para generar"
+#: ../lib/advene/gui/edit/rules.py:99 ../lib/advene/gui/edit/create.py:244
+msgid "Subviews"
+msgstr "Subvistas"
 
-#: ../lib/advene/gui/views/bookmarks.py:147
-msgid "Choose a duration"
-msgstr "Elige una duración"
+#: ../lib/advene/gui/edit/rules.py:126
+msgid "Add a new rule"
+msgstr "Agregar una nueva regla"
 
-#: ../lib/advene/gui/views/bookmarks.py:148
-msgid "Enter the standard duration (in ms) of created annotations."
-msgstr "Ingresa la duración estándar (en ms) de las anotaciones creadas."
+#: ../lib/advene/gui/edit/rules.py:130
+msgid "Subview"
+msgstr "Subvista"
 
-#: ../lib/advene/gui/views/bookmarks.py:165
-msgid "Converted from bookmarks"
-msgstr "Convertido de los separadores"
+#: ../lib/advene/gui/edit/rules.py:133
+msgid "Add a subview list"
+msgstr "Agregar una lista  de subvista"
 
-#: ../lib/advene/gui/views/bookmarks.py:223
-msgid "Drop a position here to remove it from the list"
-msgstr "Suelta una posición aquí para removerla de la lista"
+#: ../lib/advene/gui/edit/rules.py:139
+msgid "Remove the current rule"
+msgstr "Eliminar la regla actual"
 
-#: ../lib/advene/gui/views/bookmarks.py:244
-msgid "Convert bookmarks to annotations"
-msgstr "Convierte los separadores a anotaciones"
+#: ../lib/advene/gui/edit/rules.py:275
+msgid "Source expression"
+msgstr "Expresion fuente (original)"
 
-#: ../lib/advene/gui/views/bookmarks.py:292 ../lib/advene/gui/main.py:3609
-msgid "Comment here"
-msgstr "Comenta aquí"
+#: ../lib/advene/gui/edit/rules.py:277
+msgid "Return expression"
+msgstr "Regresar expresion"
 
-#: ../lib/advene/gui/views/viewplugin.py:60
-msgid "Generic view plugin"
-msgstr "Plugin de vista generica"
+#: ../lib/advene/gui/edit/rules.py:351
+msgid "For all elements in "
+msgstr "Por todos los elementos en"
 
-#: ../lib/advene/gui/views/viewplugin.py:62
-msgid "You should not ever see this tooltip..."
-msgstr "No deberías de ver este consejo de  herramienta..."
+#: ../lib/advene/gui/edit/rules.py:352
+msgid "All annotations of the package"
+msgstr "Todas las anotaciones del paquete"
 
-#: ../lib/advene/gui/views/interactivequery.py:51
-#: ../lib/advene/gui/views/interactivequery.py:99
-msgid "Interactive query"
-msgstr "Busqueda interactiva"
+#: ../lib/advene/gui/edit/rules.py:353
+msgid "All views of the package"
+msgstr "Todas las vistas del paquete"
 
-#: ../lib/advene/gui/views/interactivequery.py:53
-msgid "Interactive query dialog"
-msgstr "Diálogo de consulta interactiva"
+#: ../lib/advene/gui/edit/rules.py:354 ../lib/advene/gui/edit/rules.py:798
+msgid "The context annotations"
+msgstr "Las anotaciones del contexto"
 
-#: ../lib/advene/gui/views/interactivequery.py:59
-#: ../lib/advene/gui/views/interactivequery.py:256
-msgid "Save query"
-msgstr "Guardar consulta"
+#: ../lib/advene/gui/edit/rules.py:355 ../lib/advene/gui/edit/rules.py:799
+msgid "The annotations of the context type"
+msgstr "Las anotaciones del tipo de contexto"
 
-#: ../lib/advene/gui/views/interactivequery.py:122
-#: ../lib/advene/gui/views/interactivequery.py:172
+#: ../lib/advene/gui/edit/rules.py:358 ../lib/advene/core/controller.py:610
 #, python-format
-msgid ""
-"Invalid query.\n"
-"The following fields have an invalid value:\n"
-"%s"
-msgstr ""
-"Busqueda invalida.\n"
-"Los campos siguientes tienen un valor no valido:\n"
-"%s"
-
-#: ../lib/advene/gui/views/interactivequery.py:136
-#: ../lib/advene/gui/views/interactivequery.py:296
-msgid "Saving the query..."
-msgstr "Guardando la consulta..."
+msgid "Annotations of type %s"
+msgstr "Anotaciones de tipo %s"
 
-#: ../lib/advene/gui/views/interactivequery.py:137
-#: ../lib/advene/gui/views/interactivequery.py:297
-msgid "Give a title and identifier for saving the query"
-msgstr "Da un título e identificador para guardar la consulta"
-
-#: ../lib/advene/gui/views/interactivequery.py:180
-msgid "Expert search"
-msgstr "Búsqueda experta"
-
-#: ../lib/advene/gui/views/interactivequery.py:186
-#, python-format
-msgid ""
-"TALES error in interactive expression:\n"
-"%s"
-msgstr ""
-"TALES error en una expresión interactiva:\n"
-"%s"
-
-#: ../lib/advene/gui/views/interactivequery.py:247
-msgid "Interactive result"
-msgstr "Resultado interactivo"
-
-#: ../lib/advene/gui/views/interactivequery.py:249
-msgid "Interactive result display"
-msgstr "Visualización interactiva de resultado"
+#: ../lib/advene/gui/edit/rules.py:370
+msgid "Return "
+msgstr "Regresar"
 
-#: ../lib/advene/gui/views/interactivequery.py:274
-msgid "Result of interactive query"
-msgstr "Resultado de una consulta interactiva"
+#: ../lib/advene/gui/edit/rules.py:372 ../lib/advene/gui/edit/rules.py:787
+msgid "The element"
+msgstr "El elemento"
 
-#: ../lib/advene/gui/views/interactivequery.py:278
-msgid "Result of a query"
-msgstr "Resultado de una consulta"
+#: ../lib/advene/gui/edit/rules.py:373 ../lib/advene/gui/edit/rules.py:788
+msgid "The element's content"
+msgstr "El contenido del elemento"
 
-#: ../lib/advene/gui/views/interactivequery.py:280
-#: ../lib/advene/gui/main.py:3188
-#, python-format
-msgid "'%s'"
-msgstr "'%s'"
+#: ../lib/advene/gui/edit/rules.py:388
+msgid "If the element matches "
+msgstr "Si el elemento concuerda"
 
-#: ../lib/advene/gui/views/interactivequery.py:333
-#, python-format
-msgid "Comment on annotations containing %s"
-msgstr "Comentar en anotaciones que contengan %s"
+#: ../lib/advene/gui/edit/rules.py:390
+msgid "Return the element if it matches "
+msgstr "Regresar el elemento si concuerda"
 
-#: ../lib/advene/gui/views/interactivequery.py:352
-msgid "Choose the annotation type where annotations will be created."
-msgstr "Elige el tipo de anotación donde van a ser creadas las anotaciones"
+#: ../lib/advene/gui/edit/rules.py:408 ../lib/advene/gui/edit/rules.py:617
+msgid "All conditions must be met"
+msgstr "Todas las condiciones se deben cumplir"
 
-#: ../lib/advene/gui/views/interactivequery.py:356
-#, python-format
-msgid "Copied result of the '%s' query"
-msgstr "Resultado copiado de la '%s'  consulta"
+#: ../lib/advene/gui/edit/rules.py:409 ../lib/advene/gui/edit/rules.py:618
+msgid "Any condition can be met"
+msgstr "Cualquier condición se puede cumplir"
 
-#: ../lib/advene/gui/views/interactivequery.py:368
+#: ../lib/advene/gui/edit/rules.py:493 ../lib/advene/gui/edit/rules.py:563
 #, python-format
-msgid "Search/replace content in %d elements"
-msgstr "Buscar / reemplazar contenido en %d elementos"
+msgid "Rule <b>%s</b>"
+msgstr "Regla <b>%s</b>"
 
-#: ../lib/advene/gui/views/interactivequery.py:375
-#: ../lib/advene/gui/main.py:3185
-msgid "Empty quicksearch string"
-msgstr "Limpiar cadena de texto de la búsqueda rápida"
+#: ../lib/advene/gui/edit/rules.py:574
+msgid "Rule name"
+msgstr "Nombre de regla"
 
-#: ../lib/advene/gui/views/interactivequery.py:396
-msgid "Edit query again"
-msgstr "Edita la consulta de nuevo"
+#: ../lib/advene/gui/edit/rules.py:591
+msgid "Event"
+msgstr "Evento"
 
-#: ../lib/advene/gui/views/interactivequery.py:400
-#: ../lib/advene/gui/views/finder.py:436
-msgid "Edit query"
-msgstr "Edita consulta"
+#: ../lib/advene/gui/edit/rules.py:599
+msgid "If"
+msgstr "Si"
 
-#: ../lib/advene/gui/views/interactivequery.py:409
-#: ../lib/advene/gui/main.py:537
-msgid "String to search"
-msgstr "Texto a buscar"
+#: ../lib/advene/gui/edit/rules.py:638
+msgid "Then"
+msgstr "Entonces"
 
-#: ../lib/advene/gui/views/interactivequery.py:410
-msgid "Search again"
-msgstr "Busca de nuevo"
+#: ../lib/advene/gui/edit/rules.py:683
+msgid "When the "
+msgstr "Cuando el "
 
-#: ../lib/advene/gui/views/interactivequery.py:416
-msgid "Empty result"
-msgstr "Vacía el resultado"
+#: ../lib/advene/gui/edit/rules.py:696
+msgid " occurs,"
+msgstr "ocurra, "
 
-#: ../lib/advene/gui/views/interactivequery.py:425
+#: ../lib/advene/gui/edit/rules.py:723 ../lib/advene/gui/edit/rules.py:726
 #, python-format
-msgid "Result is a list of %d annotations."
-msgstr "El resultado es una lista de %d anotaciones."
+msgid "Condition expression: %s"
+msgstr "Expresión condicional: %s"
+
+#: ../lib/advene/gui/edit/rules.py:765
+msgid "The annotation type"
+msgstr "El tipo de anotación"
 
-#: ../lib/advene/gui/views/interactivequery.py:427
+#: ../lib/advene/gui/edit/rules.py:768
 #, python-format
-msgid "Result is a list of  %(number)d elements with %(elements)s."
-msgstr "El resultado es una lista de %(number)d elementos con %(elements)s."
+msgid "The value of the %s attribute"
+msgstr "El valor del atributo %s"
 
-#: ../lib/advene/gui/views/interactivequery.py:470
-msgid "Other elements"
-msgstr "Otros elementos"
+#: ../lib/advene/gui/edit/rules.py:770
+msgid "The annotation fragment"
+msgstr "El fragmento de la anotación"
 
-#: ../lib/advene/gui/views/interactivequery.py:474
-msgid "Display annotations in timeline"
-msgstr "Mostrar anotaciones en una línea de tiempo"
+#: ../lib/advene/gui/edit/rules.py:771
+msgid "The annotation begin time"
+msgstr "El tiempo inicial de la anotación"
 
-#: ../lib/advene/gui/views/interactivequery.py:475
-msgid "Display annotations as transcription"
-msgstr "Mostrar anotaciones comp transcripción"
+#: ../lib/advene/gui/edit/rules.py:772
+msgid "The annotation end time"
+msgstr "El tiempo final de la anotación"
 
-#: ../lib/advene/gui/views/interactivequery.py:481
-#: ../lib/advene/gui/views/interactivequery.py:503
-msgid "Export table"
-msgstr "Exporta una tabla"
+#: ../lib/advene/gui/edit/rules.py:774
+msgid "The annotation MIME-type"
+msgstr "El tipo MIME de la anotación"
 
-#: ../lib/advene/gui/views/interactivequery.py:482
-msgid "Create annotations from the result"
-msgstr "Crear anotaciones del resultado"
+#: ../lib/advene/gui/edit/rules.py:775
+msgid "The annotation's incoming relations"
+msgstr "Las relaciones entrantes de la anotación"
 
-#: ../lib/advene/gui/views/interactivequery.py:483
-msgid "Define a montage with the result"
-msgstr "Definir un montaje con el resultado"
+#: ../lib/advene/gui/edit/rules.py:776
+msgid "The annotation's outgoing relations"
+msgstr "Las relaciones salientes de la anotación"
 
-#: ../lib/advene/gui/views/interactivequery.py:484
-msgid "Create a comment view with the result"
-msgstr "Crear una vista de comentario con el resultado"
+#: ../lib/advene/gui/edit/rules.py:779
+#, python-format
+msgid "The %s-related incoming annotations"
+msgstr "Las %s-relacionadas anotaciones entrantes"
 
-#: ../lib/advene/gui/views/interactivequery.py:485
-msgid "Search and replace strings in the annotations content"
-msgstr "Busca y reemplaza cadenas de texto en el contenido de las anotaciones"
+#: ../lib/advene/gui/edit/rules.py:783
+#, python-format
+msgid "The %s-related outgoing annotations"
+msgstr "Las %s-relacionadas anotaciones salientes "
 
-#: ../lib/advene/gui/views/interactivequery.py:510
-msgid "Edit elements"
-msgstr "Editar elementos"
+#: ../lib/advene/gui/edit/rules.py:789
+msgid "The element fragment"
+msgstr "El fragmento del elemento"
 
-#: ../lib/advene/gui/views/interactivequery.py:516
-msgid "Open in python evaluator"
-msgstr "Abrir en el evaluador de python"
+#: ../lib/advene/gui/edit/rules.py:790
+msgid "The element begin time"
+msgstr "El tiempo inicial del elemento"
 
-#: ../lib/advene/gui/views/interactivequery.py:519
-#, python-format
-msgid ""
-"Result:\n"
-"%s"
-msgstr ""
-"Resultado:\n"
-"%s"
+#: ../lib/advene/gui/edit/rules.py:791
+msgid "The element end time"
+msgstr "El tiempo final del elemento"
 
-#: ../lib/advene/gui/views/interactivequery.py:561
-msgid "Results of _interactive query"
-msgstr "Resultados de_la búsqueda interactiva"
+#: ../lib/advene/gui/edit/rules.py:792
+msgid "The element duration"
+msgstr "La duración del elemento"
 
-#: ../lib/advene/gui/views/relationdisplay.py:34
-msgid "RelationDisplay"
-msgstr "Mostrar relación"
+#: ../lib/advene/gui/edit/rules.py:793
+msgid "The element type"
+msgstr "El tipo de elemento"
 
-#: ../lib/advene/gui/views/relationdisplay.py:36
-msgid "Display the contents of a relation"
-msgstr "Muestra los contenidos de una relación "
+#: ../lib/advene/gui/edit/rules.py:794
+msgid "The element's incoming relations"
+msgstr "Las relaciones entrantes del elemento"
 
-#: ../lib/advene/gui/views/relationdisplay.py:79
-msgid "No relation"
-msgstr "No hay relación"
+#: ../lib/advene/gui/edit/rules.py:795
+msgid "The element's outgoing relations"
+msgstr "Las relaciones salientes del elemento"
 
-#: ../lib/advene/gui/views/relationdisplay.py:104
-#: ../lib/advene/gui/views/annotationdisplay.py:253
-msgid "Contents"
-msgstr "Contenido"
+#: ../lib/advene/gui/edit/rules.py:796
+msgid "The context"
+msgstr "El contexto"
 
-#: ../lib/advene/gui/views/html.py:62
-msgid "Cannot go back: first item in history"
-msgstr "No se puede ir atrás: primer elemento en el historial"
+#: ../lib/advene/gui/edit/rules.py:797
+msgid "The context fragment"
+msgstr "El fragmento de contexto"
 
-#: ../lib/advene/gui/views/html.py:220
+#: ../lib/advene/gui/edit/rules.py:809
 #, python-format
-msgid "%s%% loaded"
-msgstr "%s%% cargado"
+msgid "annotation-type %s"
+msgstr "tipo de anotación %s"
 
-#: ../lib/advene/gui/views/html.py:223
+#: ../lib/advene/gui/edit/rules.py:812
 #, python-format
-msgid "Title %s"
-msgstr "Título %s"
-
-#: ../lib/advene/gui/views/html.py:287
-msgid "HTML Viewer"
-msgstr "Visor HTML"
-
-#: ../lib/advene/gui/views/html.py:289
-msgid "Embedded HTML widget"
-msgstr "Widget HTML embebido"
-
-#: ../lib/advene/gui/views/html.py:319
-msgid "No available HTML rendering component"
-msgstr "No hay un componente de visualización HTML disponible"
-
-#: ../lib/advene/gui/views/viewbook.py:36
-msgid "ViewBook"
-msgstr "Libro de vistas"
+msgid "relation-type %s"
+msgstr "tipos de relación %s"
 
-#: ../lib/advene/gui/views/viewbook.py:57
-#: ../lib/advene/gui/views/viewbook.py:64
-msgid "Cannot remove this widget, it is essential."
-msgstr "No se puede remover este widget, es esencial."
+#: ../lib/advene/gui/edit/rules.py:834
+msgid "Select a condition"
+msgstr "Selecciona una condicion"
 
-#: ../lib/advene/gui/views/viewbook.py:135
-msgid "Detach"
-msgstr "Desadjuntar"
+#: ../lib/advene/gui/edit/rules.py:878
+#, python-format
+msgid "Parameter %s"
+msgstr "Parámetro %s"
 
-#: ../lib/advene/gui/views/viewbook.py:139
-#: ../lib/advene/gui/views/editaccumulator.py:76
-msgid "Close"
-msgstr "Cerrar"
+#: ../lib/advene/gui/edit/rules.py:991
+msgid "Select an action"
+msgstr "Selecciona una acción"
 
-#: ../lib/advene/gui/views/viewbook.py:157
-msgid "Rename the view"
-msgstr "Renombrar la vista"
+#: ../lib/advene/gui/edit/rules.py:1082
+msgid "Activate?"
+msgstr "¿Activar?"
 
-#: ../lib/advene/gui/views/viewbook.py:158
-msgid "Please enter the new name of the view"
+#: ../lib/advene/gui/edit/properties.py:110
+#, fuzzy
+msgid "Please press the new key combination"
 msgstr "Por favor ingresa el nuevo nombre de la vista"
 
-#: ../lib/advene/gui/views/viewbook.py:197
-msgid "Detach view in its own window, or drag-and-drop to another zone"
+#: ../lib/advene/gui/edit/properties.py:161
+msgid "Disabled"
 msgstr ""
-"Desadjuntar la vista en su propia ventana, o arrastra y suelta en otra zona"
 
-#: ../lib/advene/gui/views/viewbook.py:211
-msgid "Close view"
-msgstr "Cerrar vista"
+#: ../lib/advene/gui/edit/properties.py:167
+#: ../lib/advene/gui/edit/shapewidget.py:1602
+msgid "Properties"
+msgstr "Propiedades"
 
-#: ../lib/advene/gui/views/viewbook.py:286
-msgid "Open a new transcription for..."
-msgstr "Abrir una nueva transcripción para..."
+#: ../lib/advene/gui/edit/properties.py:531
+msgid "Choose a file"
+msgstr "Elegir un archivo"
 
-#: ../lib/advene/gui/views/viewbook.py:298
-msgid "Create a new comment view"
-msgstr "Crear una nueva vista de comentario"
+#: ../lib/advene/gui/edit/frameselector.py:46
+msgid "Click on a frame to select its time."
+msgstr "Clic en un cuadro para seleccionar su tiempo. "
 
-#: ../lib/advene/gui/views/viewbook.py:300
-msgid "Open a new view"
-msgstr "Abrir una nueva vista"
+#: ../lib/advene/gui/edit/frameselector.py:184
+msgid "Select the appropriate snapshot"
+msgstr "Selecciona la captura apropiada"
+
+#: ../lib/advene/gui/edit/frameselector.py:237
+#: ../lib/advene/gui/edit/frameselector.py:268
+msgid "Click to see more frames or scroll with the mouse wheel"
+msgstr "Click para ver más cuadros o desplaza con la rueda del ratón"
 
-#: ../lib/advene/gui/views/viewbook.py:375
+#: ../lib/advene/gui/edit/create.py:83
 #, python-format
-msgid "Use annotation-type %s :"
-msgstr "Utilizar un tipo de anotación  %s:"
+msgid "%s creation"
+msgstr "%s creación"
 
-#: ../lib/advene/gui/views/viewbook.py:378
-#: ../lib/advene/gui/views/viewbook.py:404
-msgid "to edit it"
-msgstr "para editarlo"
+#: ../lib/advene/gui/edit/create.py:84
+#, python-format
+msgid ""
+"To create a new element of type %s,\n"
+"you must give the following information."
+msgstr ""
+"Para crear un nuevo tipo de elemento %s,\n"
+"debes de dar la siguiente informacion."
 
-#: ../lib/advene/gui/views/viewbook.py:379
-#: ../lib/advene/gui/views/viewbook.py:405
-#: ../lib/advene/gui/views/viewbook.py:437
-msgid "to create a new static view"
-msgstr "para crear una nueva vista estática"
+#: ../lib/advene/gui/edit/create.py:113
+msgid "Dynamic view"
+msgstr "Vista dinamica"
 
-#: ../lib/advene/gui/views/viewbook.py:381
-msgid "in a timeline"
-msgstr "en una linea de tiempo"
+#: ../lib/advene/gui/edit/create.py:114
+msgid "HTML template"
+msgstr "Plantilla HTML"
 
-#: ../lib/advene/gui/views/viewbook.py:382
-msgid "as a montage"
-msgstr "como montaje"
+#: ../lib/advene/gui/edit/create.py:115
+msgid "Plain XML"
+msgstr "XML Plano"
 
-#: ../lib/advene/gui/views/viewbook.py:383
-#: ../lib/advene/gui/views/viewbook.py:436
-msgid "in a table"
-msgstr "en una tabla"
+#: ../lib/advene/gui/edit/create.py:116
+msgid "SVG template"
+msgstr "Plantilla SVG"
 
-#: ../lib/advene/gui/views/viewbook.py:384
-#: ../lib/advene/gui/views/viewbook.py:406
-msgid "in a query"
-msgstr "en una consulta"
+#: ../lib/advene/gui/edit/create.py:117
+msgid "Plain text template"
+msgstr "Plantilla de texto plano"
 
-#: ../lib/advene/gui/views/viewbook.py:384
-#: ../lib/advene/gui/views/viewbook.py:406
-#, python-format
-msgid "Query %s"
-msgstr "Consulta %s"
+#: ../lib/advene/gui/edit/create.py:120
+msgid "Simple query"
+msgstr "Pregunta simple"
 
-#: ../lib/advene/gui/views/viewbook.py:385
-#: ../lib/advene/gui/views/viewbook.py:407
-msgid "in the TALES browser"
-msgstr "en el navegador TALES"
+#: ../lib/advene/gui/edit/create.py:122
+msgid "Directory"
+msgstr "Directorio"
 
-#: ../lib/advene/gui/views/viewbook.py:385
-#, python-format
-msgid "Browsing %s"
-msgstr "Navegando %s"
+#: ../lib/advene/gui/edit/create.py:124 ../lib/advene/util/helper.py:417
+msgid "Resource File"
+msgstr "Archivos de recursos"
 
-#: ../lib/advene/gui/views/viewbook.py:401
-#, python-format
-msgid "Use annotation %s :"
-msgstr "Utilizar anotación %s:"
+#: ../lib/advene/gui/edit/create.py:130
+msgid "No available type."
+msgstr "No hay tipo disponible "
 
-#: ../lib/advene/gui/views/viewbook.py:407
+#: ../lib/advene/gui/edit/create.py:174
 #, python-format
-msgid "Browse %s"
-msgstr "Navegar %s"
-
-#: ../lib/advene/gui/views/viewbook.py:408
-msgid "to display its contents"
-msgstr "para mostrar sus contenidos"
+msgid ""
+"The identifier %s is not valid.\n"
+"It must be composed of non-accentuated alphabetic characters\n"
+"Underscore is allowed."
+msgstr ""
+"El identificador %s no es valido.\n"
+"Debe de estar compuesto de caracteres sin acentuar\n"
+"Se permite utilizar guion bajo."
 
-#: ../lib/advene/gui/views/viewbook.py:408
+#: ../lib/advene/gui/edit/create.py:179
 #, python-format
-msgid "%s"
-msgstr "%s"
+msgid "The identifier %s is already defined."
+msgstr "El identificador %s ya está definido. "
 
-#: ../lib/advene/gui/views/viewbook.py:409
-msgid "as a bookmark"
-msgstr "como separador"
+#: ../lib/advene/gui/edit/create.py:312
+msgid "New resource data"
+msgstr "Nuevos datos del recurso"
 
-#: ../lib/advene/gui/views/viewbook.py:427
-msgid "as the context for the query..."
-msgstr "como contexto para la consulta..."
+#: ../lib/advene/gui/edit/imports.py:132 ../lib/advene/gui/edit/imports.py:133
+#: ../lib/advene/core/controller.py:611
+msgid "Views"
+msgstr "Vistas"
 
-#: ../lib/advene/gui/views/viewbook.py:431
-msgid "Set of annotations"
-msgstr "Conjunto de anotaciones"
+#: ../lib/advene/gui/edit/imports.py:146 ../lib/advene/gui/edit/imports.py:147
+msgid "Schemas"
+msgstr "Schemas"
 
-#: ../lib/advene/gui/views/viewbook.py:432
-msgid "Use annotations:"
-msgstr "Usa anotaciones:"
+#: ../lib/advene/gui/edit/imports.py:198 ../lib/advene/gui/edit/imports.py:199
+#: ../lib/advene/gui/edit/elements.py:523
+msgid "Relations"
+msgstr "Relaciones"
 
-#: ../lib/advene/gui/views/viewbook.py:435
-msgid "to edit them"
-msgstr "para editarlas"
+#: ../lib/advene/gui/edit/imports.py:212 ../lib/advene/gui/edit/imports.py:213
+msgid "Queries"
+msgstr "Preguntas"
 
-#: ../lib/advene/gui/views/viewbook.py:438
-msgid "as bookmarks"
-msgstr "como separadores"
+#: ../lib/advene/gui/edit/imports.py:323
+msgid "Imported?"
+msgstr "Importado?"
 
-#: ../lib/advene/gui/views/singletonpopup.py:32
-msgid "SingletonPopup"
-msgstr "Ventana flotante Singleton"
+#: ../lib/advene/gui/edit/imports.py:340 ../lib/advene/gui/edit/elements.py:515
+#: ../lib/advene/gui/edit/elements.py:564
+#: ../lib/advene/gui/edit/elements.py:651
+#: ../lib/advene/gui/edit/elements.py:731
+#: ../lib/advene/gui/edit/elements.py:788
+#: ../lib/advene/gui/edit/elements.py:880
+#: ../lib/advene/gui/edit/elements.py:949
+#: ../lib/advene/gui/edit/elements.py:1061
+#: ../lib/advene/gui/edit/elements.py:1123
+msgid "URI"
+msgstr "URI"
 
-#: ../lib/advene/gui/views/timeline.py:121 ../lib/advene/gui/main.py:1221
-msgid "Timeline"
-msgstr "Linea de tiempo"
+#: ../lib/advene/gui/edit/imports.py:362
+msgid "Choose the package to import, and its alias"
+msgstr "Elige el paquete a importar, y su alias"
 
-#: ../lib/advene/gui/views/timeline.py:123
-msgid "Display annotations on a timeline"
-msgstr "Muestra las anotaciones en una linea de tiempo"
+#: ../lib/advene/gui/edit/imports.py:408 ../lib/advene/gui/edit/merge.py:230
+#, python-format
+msgid "Package %s"
+msgstr "Paquete %s"
 
-#: ../lib/advene/gui/views/timeline.py:137
-msgid "Limit display to current area"
-msgstr "Limitar la visualización al área actual"
+#: ../lib/advene/gui/edit/imports.py:408 ../lib/advene/gui/edit/merge.py:230
+msgid "No title"
+msgstr "Sin titulo"
 
-#: ../lib/advene/gui/views/timeline.py:138
-#: ../lib/advene/gui/views/timeline.py:3265
-msgid "Display whole movie"
-msgstr "Muestra la película completa"
+#: ../lib/advene/gui/edit/shapewidget.py:91
+msgid "Generic shape"
+msgstr "Forma genérica"
 
-#: ../lib/advene/gui/views/timeline.py:168
+#: ../lib/advene/gui/edit/shapewidget.py:256
+#: ../lib/advene/gui/edit/shapewidget.py:755
 #, python-format
-msgid "Cannot find annotation type %s"
-msgstr "No se puede encontrar el tipo de anotación %s"
-
-#: ../lib/advene/gui/views/timeline.py:218
-msgid "No scrolling"
-msgstr "No desplazar"
+msgid "Link to %s"
+msgstr "Vínculo hacia %s"
 
-#: ../lib/advene/gui/views/timeline.py:219
-msgid "Continuous scrolling"
-msgstr "Desplazar continuamente"
+#: ../lib/advene/gui/edit/shapewidget.py:348
+#: ../lib/advene/gui/edit/shapewidget.py:1304
+msgid "Link"
+msgstr "Vínculo"
 
-#: ../lib/advene/gui/views/timeline.py:220
-msgid "Discrete scrolling"
-msgstr "Desplazamiento discreto"
+#: ../lib/advene/gui/edit/shapewidget.py:353
+msgid "Link label"
+msgstr "Etiqueta de vínculo"
 
-#: ../lib/advene/gui/views/timeline.py:221
-msgid "Annotation scrolling"
-msgstr "Desplazamiento con anotaciones"
+#: ../lib/advene/gui/edit/shapewidget.py:371
+msgid "Linewidth"
+msgstr "Ancho de línea"
 
-#: ../lib/advene/gui/views/timeline.py:483
-#, python-format
-msgid "%d annotations"
-msgstr "%d anotaciones"
+#: ../lib/advene/gui/edit/shapewidget.py:376
+msgid "Filled"
+msgstr "Lleno"
 
-#: ../lib/advene/gui/views/timeline.py:486
-msgid "Display all types"
-msgstr "Muestra todos los tipos"
+#: ../lib/advene/gui/edit/shapewidget.py:384
+msgid "Opacity"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:488
+#: ../lib/advene/gui/edit/shapewidget.py:426
 #, python-format
-msgid ""
-"There are %d annotations.\n"
-"The current timeline may take a long time to display them, so only the first "
-"two annotation types are displayed. Use the annotation type selector (second "
-"button in the timeline) to select other annotations types to display, or "
-"click on the 'Display all types' button below."
-msgstr ""
-"Hay %d anotaciones.\n"
-"La línea de tiempo actual puede tardar mucho tiempo en mostrarlas, así que "
-"solo los primeros dos tipos de anotaciones se muestran. Utiliza el selector "
-"de tipo de anotaciones (segundo botón en la línea de tiempo) para "
-"seleccionar otros tipos de anotación para mostrar, o da clic en el debajo "
-"botón 'Mostrar todos los tipos'."
+msgid "Properties of %s"
+msgstr "Propiedades de %s"
 
-#: ../lib/advene/gui/views/timeline.py:963
-msgid "Split at current player position"
-msgstr "Dividir en la posición actual del reproductor"
+#: ../lib/advene/gui/edit/shapewidget.py:473
+msgid "Rectangle"
+msgstr "Rectángulo"
 
-#: ../lib/advene/gui/views/timeline.py:967
-msgid "Center and zoom"
-msgstr "Centrar y acercar"
+#: ../lib/advene/gui/edit/shapewidget.py:553
+#: ../lib/advene/gui/edit/shapewidget.py:666
+msgid "Text"
+msgstr "Texto"
 
-#: ../lib/advene/gui/views/timeline.py:1058
-#: ../lib/advene/gui/views/tree.py:808 ../lib/advene/gui/main.py:4563
-msgid ""
-"Select the schema where you want to\n"
-"create the new relation type."
-msgstr ""
-"Selecciona el esquema donde quieres\n"
-"crear un nuevo tipo de relación."
+#: ../lib/advene/gui/edit/shapewidget.py:677
+msgid "Textsize"
+msgstr "Tamaño del texto"
 
-#: ../lib/advene/gui/views/timeline.py:1071
-#: ../lib/advene/gui/views/tree.py:821
-msgid "Create a relation"
-msgstr "Crear una relacion"
+#: ../lib/advene/gui/edit/shapewidget.py:691
+msgid "Image"
+msgstr "Imagen"
 
-#: ../lib/advene/gui/views/timeline.py:1081
-#: ../lib/advene/gui/views/tree.py:831
-msgid "Create a new relation-type."
-msgstr "Crear un nuevo tipo de relación."
+#: ../lib/advene/gui/edit/shapewidget.py:775
+msgid "Href"
+msgstr "Href"
 
-#: ../lib/advene/gui/views/timeline.py:1107
-msgid "Merge with this annotation"
-msgstr "Unir con esta anotación"
+#: ../lib/advene/gui/edit/shapewidget.py:785
+msgid "Line"
+msgstr "Línea"
 
-#: ../lib/advene/gui/views/timeline.py:1116
-msgid "Align both begin times"
-msgstr "Alinear ambos tiempos de inicio"
+#: ../lib/advene/gui/edit/shapewidget.py:881
+msgid "Draw an arrow"
+msgstr "Dibujar una flecha"
 
-#: ../lib/advene/gui/views/timeline.py:1117
-msgid "Align both end times"
-msgstr "Alinear ambos tiempos finales"
+#: ../lib/advene/gui/edit/shapewidget.py:892
+msgid "Arrow size"
+msgstr "Tamaño de la flecha"
 
-#: ../lib/advene/gui/views/timeline.py:1118
-msgid "Align end time to selected begin time"
-msgstr "Alinear el tiempo final al tiempo inicial seleccionado "
+#: ../lib/advene/gui/edit/shapewidget.py:1107
+#, fuzzy
+msgid "Close path"
+msgstr "Ruta de video"
 
-#: ../lib/advene/gui/views/timeline.py:1119
-msgid "Align begin time to selected end time"
-msgstr "Alinear el tiempo inicial al tiempo final seleccionado"
+#: ../lib/advene/gui/edit/shapewidget.py:1186
+msgid "Circle"
+msgstr "Círculo"
 
-#: ../lib/advene/gui/views/timeline.py:1120
-msgid "Align all times"
-msgstr "Alinear todos los tiempo"
+#: ../lib/advene/gui/edit/shapewidget.py:1241
+msgid "Ellipse"
+msgstr "Elipse"
 
-#: ../lib/advene/gui/views/timeline.py:1158
-#: ../lib/advene/gui/views/tree.py:700
-msgid "Cannot delete the annotation : it has relations."
-msgstr "No puedo borrar la anotación: tiene relaciones."
+#: ../lib/advene/gui/edit/shapewidget.py:1603
+msgid "SVG"
+msgstr "SVG"
 
-#: ../lib/advene/gui/views/timeline.py:1233
-msgid "Select the appropriate relation type"
-msgstr "Selecciona el tipo apropiado de relación"
+#: ../lib/advene/gui/edit/shapewidget.py:2162
+msgid "Load SVG"
+msgstr "Cargar SVG"
 
-#: ../lib/advene/gui/views/timeline.py:1252
-#: ../lib/advene/gui/views/tree.py:757
-#, python-format
-msgid "Duplicate selection to type %s"
-msgstr "Duplicar selección al tipo %s"
+#: ../lib/advene/gui/edit/shapewidget.py:2168
+msgid "Save SVG"
+msgstr "Guardar SVG"
 
-#: ../lib/advene/gui/views/timeline.py:1255
-#: ../lib/advene/gui/views/tree.py:760
-#, python-format
-msgid "Move selection to type %s"
-msgstr "Mover selección al tipo %s"
+#: ../lib/advene/gui/edit/importer.py:49
+msgid "Importer"
+msgstr "Importador"
 
-#: ../lib/advene/gui/views/timeline.py:1264
-#: ../lib/advene/gui/views/tree.py:769
-#, python-format
-msgid "Duplicate annotation to type %s"
-msgstr "Duplicar anotación al tipo %s"
+#: ../lib/advene/gui/edit/importer.py:108
+#: ../lib/advene/gui/edit/importer.py:118
+msgid "Advene package importer"
+msgstr "Importador de paquetes Advene"
 
-#: ../lib/advene/gui/views/timeline.py:1268
-#: ../lib/advene/gui/views/tree.py:773
-#, python-format
-msgid "Move annotation to type %s"
-msgstr "Mover anotación al tipo %s"
+#: ../lib/advene/gui/edit/importer.py:122
+msgid "Not likely"
+msgstr "No es probable"
 
-#: ../lib/advene/gui/views/timeline.py:1275
-#, python-format
-msgid "Duplicate to type %(type)s at %(position)s"
-msgstr "Duplicar al tipo %(type)s en %(position)s"
-
-#: ../lib/advene/gui/views/timeline.py:1281
-#, python-format
-msgid "Move to type %(type)s at %(position)s"
-msgstr "Mover al tipo %(type)s en %(position)s"
+#: ../lib/advene/gui/edit/importer.py:144
+#, fuzzy, python-format
+msgid ""
+"Completed conversion: %(message)s\n"
+"%(statistics)s"
+msgstr "Conversión completada: %(statistics)s"
 
-#: ../lib/advene/gui/views/timeline.py:1291
-#: ../lib/advene/gui/views/tree.py:784
-msgid "Duplicate and create a relation"
-msgstr "Duplicar y crear una relación"
+#: ../lib/advene/gui/edit/importer.py:151
+msgid "Stop"
+msgstr "Detener"
 
-#: ../lib/advene/gui/views/timeline.py:1302
+#: ../lib/advene/gui/edit/importer.py:190
 #, python-format
-msgid "Duplicate at %s and create a relation"
-msgstr "Duplicar al %s y crear una relación"
+msgid ""
+"The filter is not ready.\n"
+"%s"
+msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1333
-msgid "Annotation filter"
-msgstr "Filtro de anotación"
+#: ../lib/advene/gui/edit/importer.py:279
+msgid "Choose the file to import"
+msgstr "Elige el archivo a importar"
 
-#: ../lib/advene/gui/views/timeline.py:1334
-msgid "Enter the searched string"
-msgstr "Ingresar la cadena de texto buscada"
+#: ../lib/advene/gui/edit/importer.py:299
+msgid "Filter"
+msgstr "Filtro"
 
-#: ../lib/advene/gui/views/timeline.py:1442
-#, python-format
-msgid "Duplicate all annotations to type %s"
-msgstr "Duplicar todas las anotaciones del tipo %s"
+#: ../lib/advene/gui/edit/importer.py:308
+msgid "Options"
+msgstr "Opciones"
 
-#: ../lib/advene/gui/views/timeline.py:1444
-#, python-format
-msgid "Move all annotations to type %s"
-msgstr "Mover todas las anotaciones al tipo %s"
+#: ../lib/advene/gui/edit/importer.py:318
+msgid "Start"
+msgstr "Inicio"
 
-#: ../lib/advene/gui/views/timeline.py:1446
-#, python-format
-msgid "Duplicate all annotations matching a string to type %s"
+#: ../lib/advene/gui/edit/dvdselect.py:71
+msgid ""
+"Select the correct\n"
+"title and chapter\n"
+"of the DVD"
 msgstr ""
-"Duplicar todas las anotaciones que concuerden con una cadena de texto al "
-"tipo %s"
+"Seleccciona el\n"
+"titulo y capitulo \n"
+"correctos del DVD"
 
-#: ../lib/advene/gui/views/timeline.py:1448
-#, python-format
-msgid "Move all annotations matching a string to type %s"
-msgstr ""
-"Mover todas las anotaciones que conuerden con una cadena de texto al tipo %s"
+#: ../lib/advene/gui/edit/dvdselect.py:84
+msgid "Chapter"
+msgstr "Capitulo"
 
-#: ../lib/advene/gui/views/timeline.py:1450
-#, python-format
-msgid "Align all annotation time codes using %s as reference."
-msgstr ""
-"Alinear todos los códigos de tiempo de las anotaciones que utilizan %s como "
-"referencia."
+#: ../lib/advene/gui/edit/merge.py:33
+msgid "Create element"
+msgstr "Crear elemento"
 
-#: ../lib/advene/gui/views/timeline.py:1452
-#, python-format
-msgid "Align all annotation contents using %s as reference"
-msgstr ""
-"Alinear todos los contenidos de las anotaciones que utilizan %s como "
-"referencia"
+#: ../lib/advene/gui/edit/merge.py:34
+msgid "Create annotation (duplicate id)"
+msgstr "Crear anotación (id duplicada)"
 
-#: ../lib/advene/gui/views/timeline.py:1642
-#: ../lib/advene/gui/views/table.py:240
-msgid "Cannot update the annotation, its representation is too complex"
-msgstr "No se puede actualizar la anotación, su representación es muy compleja"
+#: ../lib/advene/gui/edit/merge.py:35
+msgid "Create relation (duplicate id)"
+msgstr "Crear relación (id duplicada)"
 
-#: ../lib/advene/gui/views/timeline.py:1936
-#: ../lib/advene/gui/views/timeline.py:1965
-#, python-format
-msgid "Displaying %(count)d / %(total)d annotations..."
-msgstr "Mostrando %(count)d / %(total)d anotaciones..."
+#: ../lib/advene/gui/edit/merge.py:36
+msgid "Update the color"
+msgstr "Actualizar el color"
 
-#: ../lib/advene/gui/views/timeline.py:1947
-msgid "Displaying done."
-msgstr "Mostrando terminado"
+#: ../lib/advene/gui/edit/merge.py:37
+msgid "Update the representation"
+msgstr "Actualizar la representación"
 
-#: ../lib/advene/gui/views/timeline.py:2439
-msgid "Create a new annotation"
-msgstr "Crear una nueva anotación"
+#: ../lib/advene/gui/edit/merge.py:38
+msgid "Update the description"
+msgstr "Actualizar la descripción"
 
-#: ../lib/advene/gui/views/timeline.py:2440
-msgid "Zoom on region"
-msgstr "Acercar en región"
+#: ../lib/advene/gui/edit/merge.py:39
+msgid "Update the title"
+msgstr "Actualizar el título"
 
-#: ../lib/advene/gui/views/timeline.py:2441
-msgid "Restrict display to region"
-msgstr "Restringir muestra en región"
+#: ../lib/advene/gui/edit/merge.py:40
+msgid "Update the mimetype"
+msgstr "Actualizar el tipo mime"
 
-#: ../lib/advene/gui/views/timeline.py:2560
-msgid "New annotation at player time"
-msgstr "Nueva anotación en el tiempo del reproductor"
+#: ../lib/advene/gui/edit/merge.py:41
+msgid "Update the begin time"
+msgstr "Actualizar el tiempo inicial"
 
-#: ../lib/advene/gui/views/timeline.py:2564
-msgid "New annotation at mouse position"
-msgstr "Nueva anotación en la posición del cursor"
+#: ../lib/advene/gui/edit/merge.py:42
+msgid "Update the end time"
+msgstr "Actualizar el tiempo final"
 
-#: ../lib/advene/gui/views/timeline.py:2568
-msgid "Selection"
-msgstr "Selección"
+#: ../lib/advene/gui/edit/merge.py:43
+msgid "Update the content"
+msgstr "Actualizar el contenido"
 
-#: ../lib/advene/gui/views/timeline.py:2694
-msgid "Cannot zoom more"
-msgstr "No se puede acercar más"
+#: ../lib/advene/gui/edit/merge.py:44
+msgid "Update the matchFilter"
+msgstr "Actualizar el filtro de concordancia"
 
-#: ../lib/advene/gui/views/timeline.py:2915
-#, python-format
-msgid "From schema %s"
-msgstr "Del esquema %s"
+#: ../lib/advene/gui/edit/merge.py:45
+msgid "Update the member types"
+msgstr "Actualizar tipos de miembros"
 
-#: ../lib/advene/gui/views/timeline.py:2977
-msgid "Restrict playing to this annotation-type"
-msgstr "Restringir la reproducción a este tipo de anotación"
+#: ../lib/advene/gui/edit/merge.py:46
+msgid "Update tags"
+msgstr "Actualizar etiquetas"
 
-#: ../lib/advene/gui/views/timeline.py:2984
-msgid "Goto previous annotation"
-msgstr "Ir a la anotación previa"
+#: ../lib/advene/gui/edit/merge.py:90
+msgid "Difference between original and merged elements"
+msgstr "Diferencia entre el elemento original y el unido"
 
-#: ../lib/advene/gui/views/timeline.py:2995
-msgid "Goto next annotation"
-msgstr "Ir a la anotación siguiente"
+#: ../lib/advene/gui/edit/merge.py:136
+msgid "Current element"
+msgstr "Elemento actual"
 
-#: ../lib/advene/gui/views/timeline.py:3006
-msgid "+"
-msgstr "+"
+#: ../lib/advene/gui/edit/merge.py:141
+msgid "Updated element"
+msgstr "Elemento actualizado"
 
-#: ../lib/advene/gui/views/timeline.py:3064
-msgid "Open an annotation display view"
-msgstr "Abrir una vista de muestra de anotaciones "
+#: ../lib/advene/gui/edit/merge.py:147
+msgid "Show diff"
+msgstr "Mostrar diferencias"
 
-#: ../lib/advene/gui/views/timeline.py:3071
-msgid "Open a slave montage view (coordinated zoom level)"
-msgstr "Abrir una vista de montaje esclava (coordinado nivel de zoom)"
+#: ../lib/advene/gui/edit/merge.py:180
+msgid "Merge?"
+msgstr "¿Unir?"
 
-#: ../lib/advene/gui/views/timeline.py:3106
-msgid ""
-"<b>Statistics about current selection</b>\n"
-"\n"
-msgstr ""
-"<b>Estadísticas acerca de la selección actual</b>\n"
-"\n"
+#: ../lib/advene/gui/edit/merge.py:197
+msgid "Element"
+msgstr "Elemento"
 
-#: ../lib/advene/gui/views/timeline.py:3113
-msgid "No selected annotation"
-msgstr "No hay anotación seleccionada"
+#: ../lib/advene/gui/edit/merge.py:215
+#, fuzzy, python-format
+msgid "Merge elements from %(source)s into %(dest)s"
+msgstr "Editar elementos importados de otros paquetes"
 
-#: ../lib/advene/gui/views/timeline.py:3117
-#, python-format
-msgid "%d selected annotation(s)"
-msgstr "%d anotación(es) seleccionada(s)"
+#: ../lib/advene/gui/edit/merge.py:266
+msgid "All"
+msgstr "Todo"
 
-#: ../lib/advene/gui/views/timeline.py:3124
-msgid "Unselect all annotations"
-msgstr "Quitar selección a todas las anotaciones"
+#: ../lib/advene/gui/edit/merge.py:271 ../lib/advene/core/controller.py:1097
+msgid "None"
+msgstr "Ninguno"
 
-#: ../lib/advene/gui/views/timeline.py:3125
-msgid "Create a static view"
-msgstr "Crear una nueva vista estática"
+#: ../lib/advene/gui/edit/montage.py:51
+msgid "Montage"
+msgstr "Montaje"
 
-#: ../lib/advene/gui/views/timeline.py:3126
-msgid "Highlight selection in other views"
-msgstr "Resalta la selección en otras vistas"
+#: ../lib/advene/gui/edit/montage.py:53
+msgid "Dynamic montage of annotations"
+msgstr "Montaje dinámico de anotaciones"
 
-#: ../lib/advene/gui/views/timeline.py:3127
-#: ../lib/advene/gui/views/timeline.py:3713
-msgid "Tag selection"
-msgstr "Selección de etiquetas"
+#: ../lib/advene/gui/edit/montage.py:61
+msgid "Render"
+msgstr "Render"
 
-#: ../lib/advene/gui/views/timeline.py:3128
-msgid "Delete selected annotations"
-msgstr "Elimina las anotaciones seleccionadas"
+#: ../lib/advene/gui/edit/montage.py:176
+msgid "Remove from montage"
+msgstr "Eliminar del montaje"
 
-#: ../lib/advene/gui/views/timeline.py:3129
-msgid "Display selection in a table"
-msgstr "Muestra la selección en una tabla"
+#: ../lib/advene/gui/edit/montage.py:310
+#, python-format
+msgid ""
+"Exporting montage %(title)s\n"
+"to %%(filename)s"
+msgstr ""
+"Exportando montaje %(title)s\n"
+"a %%(filename)s"
 
-#: ../lib/advene/gui/views/timeline.py:3130
-msgid "Center and zoom on selection"
-msgstr "Centrar y acercar en la selección"
+#: ../lib/advene/gui/edit/montage.py:405
+msgid "Drop an annotation here to remove it from the list"
+msgstr "Soltar una anotación aquí para eliminarla de la lista"
 
-#: ../lib/advene/gui/views/timeline.py:3131
-msgid "Edit selected annotations"
-msgstr "Edita las anotaciones seleccionadas"
+#: ../lib/advene/gui/edit/montage.py:417
+msgid "Play the montage"
+msgstr "Reproducir el montaje"
 
-#: ../lib/advene/gui/views/timeline.py:3132
-msgid "Merge annotations"
-msgstr "Unir anotaciones"
+#: ../lib/advene/gui/edit/montage.py:422
+msgid "Save the view in the package"
+msgstr "Guardar la vista en el paquete"
 
-#: ../lib/advene/gui/views/timeline.py:3133
-msgid "Display statistics"
-msgstr "Muestra estadísticas"
+#: ../lib/advene/gui/edit/montage.py:470
+msgid "Set zoom level"
+msgstr "Establecer el nivel de zoom"
 
-#: ../lib/advene/gui/views/timeline.py:3258
-msgid "Goto previous page"
-msgstr "Ir a la página anterior"
+#: ../lib/advene/gui/edit/montage.py:475
+msgid "Set 100% zoom"
+msgstr "Establecer 100% zoom"
 
-#: ../lib/advene/gui/views/timeline.py:3270
-msgid "Goto next page"
-msgstr "Ir a la página siguiente"
+#: ../lib/advene/gui/edit/montage.py:554
+msgid "Total duration:"
+msgstr "Duración total"
 
-#: ../lib/advene/gui/views/timeline.py:3324
-msgid "Inspector locked. Click here or in the timeline background to unlock."
-msgstr ""
-"Inspector cerrado. Clic aquí o en el fondo de la linea de tiempo para abrir."
+#: ../lib/advene/gui/edit/timeadjustment.py:97
+#, python-format
+msgid "Decrement value by %.2f s"
+msgstr "Disminuye el valor por %.2f s"
 
-#: ../lib/advene/gui/views/timeline.py:3352
+#: ../lib/advene/gui/edit/timeadjustment.py:99
+#, python-format
+msgid "Increment value by %.2f s"
+msgstr "Aumenta el valor por %.2f s"
+
+#: ../lib/advene/gui/edit/timeadjustment.py:128
+#, fuzzy
 msgid ""
-"Delete the selected annotations or drop an annotation here to delete it."
+"Click to play\n"
+"Control+click to set to current time\n"
+"Scroll to modify value (with control/shift)\n"
+"Right-click to invalidate screenshot"
 msgstr ""
-"Elimina las acciones seleccionadas o arrastra una anotación aquí para "
-"eliminarla."
+"Clic para reproducir\n"
+"Control+clic para establecer el tiempo actual\\Desplazar para modificar el "
+"valor (con control/shift)\n"
+"Clic-derecho para invalidar la captura"
 
-#: ../lib/advene/gui/views/timeline.py:3374
+#: ../lib/advene/gui/edit/timeadjustment.py:143
 msgid ""
-"Drag an annotation type here to remove it from display.\n"
-"Click to edit all displayed types"
+"Enter a timecode.\n"
+"An integer value will be considered as milliseconds.\n"
+"A float value (12.2) will be considered as seconds.\n"
+"HH:MM:SS.sss values are possible."
 msgstr ""
-"Arrastra un tipo de anotación aquí para removerlo de la visualización.\n"
-"Clic para editar todos los tipos mostrados"
-
-#: ../lib/advene/gui/views/timeline.py:3386
-msgid "Selection actions"
-msgstr "Acciones de selección"
-
-#: ../lib/advene/gui/views/timeline.py:3401
-msgid "Display relations"
-msgstr "Muestra las relaciones"
+"Ingresa un código de tiempo.\n"
+"Un valor entero será considerado como milisegundos.\n"
+"Un valor flotante (12.2) será considerado como segundos.\n"
+"Valores como HH:MM:SS.sss son posibles."
 
-#: ../lib/advene/gui/views/timeline.py:3407
-msgid "Display all relations"
-msgstr "Muestra todas las relaciones"
+#: ../lib/advene/gui/edit/timeadjustment.py:157
+msgid "Set to current player position"
+msgstr "Establecer a la posición del reproductor actual"
 
-#: ../lib/advene/gui/views/timeline.py:3484
-msgid "Center on current player position."
-msgstr "Centrar en la posición actual del reproductor"
+#: ../lib/advene/gui/edit/elements.py:80
+#, python-format
+msgid "No edit popup available for element %s"
+msgstr "No edit popup disponible para el elemento %s"
 
-#: ../lib/advene/gui/views/timeline.py:3500
-msgid "Automatically activate loop when clicking on an annotation"
-msgstr "Activar ciclo automáticamente cuando de da clic en una anotación"
+#: ../lib/advene/gui/edit/elements.py:100
+msgid "Edit Window"
+msgstr "Ventana de edición"
 
-#: ../lib/advene/gui/views/timeline.py:3524
-msgid "Displayed"
-msgstr "Mostrado"
+#: ../lib/advene/gui/edit/elements.py:139
+msgid "Apply changes and close the edit window"
+msgstr "Aplicar cambios y cerrar ventana de edición"
 
-#: ../lib/advene/gui/views/timeline.py:3532
-msgid "Not displayed"
-msgstr "No mostrado"
+#: ../lib/advene/gui/edit/elements.py:144
+msgid "Apply changes"
+msgstr "Aplicar cambios"
 
-#: ../lib/advene/gui/views/timeline.py:3580
-msgid "< All <"
-msgstr "< Todo <"
+#: ../lib/advene/gui/edit/elements.py:278
+msgid "Content has been modified. Close anyway and lose data?"
+msgstr ""
+"El contenido ha sido modificado. ¿Cerrar de cualquier manera y perder datos?"
 
-#: ../lib/advene/gui/views/timeline.py:3584
-msgid "> All >"
-msgstr "> Todo >"
+#: ../lib/advene/gui/edit/elements.py:338
+#, python-format
+msgid "View %s (read-only)"
+msgstr "Vista %s (solo-lectura)"
 
-#: ../lib/advene/gui/views/timeline.py:3600
-msgid "Displayed annotation types"
-msgstr "Tipos de anotación mostrados"
+#: ../lib/advene/gui/edit/elements.py:374
+#, python-format
+msgid "Display %s"
+msgstr "Muestra %s"
 
-#: ../lib/advene/gui/views/timeline.py:3625
-msgid "Relation type"
-msgstr "Tipo de relación"
+#: ../lib/advene/gui/edit/elements.py:459
+msgid "Apply changes and edit previous annotation of same type"
+msgstr "Aplicar los cambios y editar la anotación anterior del mismo tipo"
 
-#: ../lib/advene/gui/views/timeline.py:3625
-msgid "Display relation types"
-msgstr "Mostrar tipos de relación"
+#: ../lib/advene/gui/edit/elements.py:463
+msgid "Apply changes and edit next annotation of same type"
+msgstr "Aplicar los cambios y editar la anotación siguiente del mismo tipo"
 
-#: ../lib/advene/gui/views/timeline.py:3626
-msgid "Relation content"
-msgstr "Contenido de relación"
+#: ../lib/advene/gui/edit/elements.py:469
+msgid "Unhighlight annotation"
+msgstr "Remover resaltado de anotación"
 
-#: ../lib/advene/gui/views/timeline.py:3626
-msgid "Display relation content"
-msgstr "Mostrar contenido de relación"
+#: ../lib/advene/gui/edit/elements.py:473
+msgid "Highlight annotation"
+msgstr "Resaltar anotación"
 
-#: ../lib/advene/gui/views/timeline.py:3627 ../lib/advene/gui/popup.py:516
-msgid "Highlight"
-msgstr "Marcar"
+#: ../lib/advene/gui/edit/elements.py:504
+msgid "Fragment"
+msgstr "Fragmento"
 
-#: ../lib/advene/gui/views/timeline.py:3627
-msgid "Highlight active annotations"
-msgstr "Realzar las anotaciones activas"
+#: ../lib/advene/gui/edit/elements.py:527 ../lib/advene/core/controller.py:611
+msgid "Tags"
+msgstr "Etiquetas"
 
-#: ../lib/advene/gui/views/timeline.py:3714
-msgid "Enter the tag for the selection"
-msgstr "Ingresar etiqueta para la selección"
+#: ../lib/advene/gui/edit/elements.py:623
+msgid "Apply changes and visualise in web browser"
+msgstr "Aplicar los cambios y visualizar en el navegador web"
 
-#: ../lib/advene/gui/views/tree.py:248
-msgid "No children in on_iter_children()!"
-msgstr "No hay hijos en on_iter_children()!"
+#: ../lib/advene/gui/edit/elements.py:628
+msgid "Apply changes and activate the view"
+msgstr "Aplicar los cambios y activar la vista"
 
-#: ../lib/advene/gui/views/tree.py:263
-msgid "No children in on_iter_nth_child()"
-msgstr "No hay hijos en on_iter_nth_child()"
+#: ../lib/advene/gui/edit/elements.py:636
+#: ../lib/advene/gui/edit/elements.py:717
+#: ../lib/advene/gui/edit/elements.py:774
+#: ../lib/advene/gui/edit/elements.py:865
+#: ../lib/advene/gui/edit/elements.py:934
+#: ../lib/advene/gui/edit/elements.py:1036
+msgid "Title (name)"
+msgstr "Título (nombre)"
 
-#: ../lib/advene/gui/views/tree.py:317
-msgid "List of views"
-msgstr "Lista de vistas"
+#: ../lib/advene/gui/edit/elements.py:640
+msgid "Name of the view"
+msgstr "Nombre de la vista"
 
-#: ../lib/advene/gui/views/tree.py:318
-msgid "Static views"
-msgstr "Vistas estáticas"
+#: ../lib/advene/gui/edit/elements.py:664
+msgid "Class"
+msgstr "Clase"
 
-#: ../lib/advene/gui/views/tree.py:319
-msgid "Dynamic views"
-msgstr "Vistas dinámicas"
+#: ../lib/advene/gui/edit/elements.py:667
+msgid "Match Filter"
+msgstr "Concordar filtro"
 
-#: ../lib/advene/gui/views/tree.py:320
-msgid "Admin views"
-msgstr "Vistas e administración"
+#: ../lib/advene/gui/edit/elements.py:710
+#, fuzzy
+msgid "Validate and run query on package"
+msgstr "Crea un nuevo paquete"
 
-#: ../lib/advene/gui/views/tree.py:321
-msgid "Adhoc views"
-msgstr "Vistas adhoc"
+#: ../lib/advene/gui/edit/elements.py:721
+msgid "Name of the query"
+msgstr "Nombre de la consulta"
 
-#: ../lib/advene/gui/views/tree.py:421 ../lib/advene/gui/main.py:1222
-msgid "Tree view"
-msgstr "Vista de arbol"
+#: ../lib/advene/gui/edit/elements.py:778
+msgid "Name of the package"
+msgstr "Nombre del paquete"
 
-#: ../lib/advene/gui/views/tree.py:453
-msgid "Package View"
-msgstr "VIsta de paquete"
+#: ../lib/advene/gui/edit/elements.py:796
+#: ../lib/advene/gui/edit/elements.py:887
+#: ../lib/advene/gui/edit/elements.py:966
+#: ../lib/advene/gui/edit/elements.py:1080
+msgid "Description"
+msgstr "Descripcion"
 
-#: ../lib/advene/gui/views/editaccumulator.py:42
-msgid "EditAccumulator"
-msgstr "Editar acumulador"
+#: ../lib/advene/gui/edit/elements.py:800
+#: ../lib/advene/gui/edit/elements.py:891
+#: ../lib/advene/gui/edit/elements.py:970
+#: ../lib/advene/gui/edit/elements.py:1084
+msgid "Textual description of the package"
+msgstr "Descripción textual del paquete"
 
-#: ../lib/advene/gui/views/editaccumulator.py:70
-#: ../lib/advene/gui/views/annotationdisplay.py:256
-msgid "Validate"
-msgstr "Validar"
+#: ../lib/advene/gui/edit/elements.py:805
+msgid "Default dynamic view"
+msgstr "Vista dinamica predefinida"
 
-#: ../lib/advene/gui/views/relation.py:68
-msgid "Relations view"
-msgstr "Vista de relaciones"
+#: ../lib/advene/gui/edit/elements.py:809
+msgid "Dynamic view to activate on package load"
+msgstr "Vista dinámica para activar en la carga del paquete"
 
-#: ../lib/advene/gui/views/caption.py:30 ../lib/advene/gui/main.py:4339
-msgid "Caption"
-msgstr "Subtítulos"
+#: ../lib/advene/gui/edit/elements.py:814
+msgid "Default static view"
+msgstr "Vista estatica predefinida"
 
-#: ../lib/advene/gui/views/caption.py:32
-msgid "Display a text caption below the video output"
-msgstr "Muestra un subtítulo de texto debajo de la salida de video "
+#: ../lib/advene/gui/edit/elements.py:818
+msgid "Static view to open on package load"
+msgstr "Vista estática para abrir en la carga del paquete"
 
-#: ../lib/advene/gui/views/scroller.py:29 ../lib/advene/gui/main.py:4338
-msgid "Scroller"
-msgstr "Desplazador"
+#: ../lib/advene/gui/edit/elements.py:823
+msgid "Default adhoc view"
+msgstr "Vista adhoc predeterminada"
 
-#: ../lib/advene/gui/views/finder.py:329
-#, python-format
-msgid ""
-"View <b>%(title)s</b>\n"
-"Id: %(id)s"
-msgstr ""
-"Vista <b>%(title)s</b>\n"
-"Id: %(id)s"
+#: ../lib/advene/gui/edit/elements.py:827
+msgid "Adhoc view to open on package load"
+msgstr "Vista adhoc para abrir en la carga del paquete"
 
-#: ../lib/advene/gui/views/finder.py:336
-msgid "Open in webbrowser"
-msgstr "Abrir en el navegador web"
+#: ../lib/advene/gui/edit/elements.py:832
+msgid "Cached duration"
+msgstr "Duración en caché"
 
-#: ../lib/advene/gui/views/finder.py:337
-#, python-format
-msgid "View applied to %s\n"
-msgstr "Vista aplicada a %s\n"
+#: ../lib/advene/gui/edit/elements.py:836
+msgid "Cached duration in ms"
+msgstr "Duración en caché en ms"
 
-#: ../lib/advene/gui/views/finder.py:342 ../lib/advene/gui/popup.py:496
-msgid "Activate"
-msgstr "Activar"
+#: ../lib/advene/gui/edit/elements.py:841
+msgid "Mediafile"
+msgstr "Archivo media"
 
-#: ../lib/advene/gui/views/finder.py:345
-msgid "Open in GUI"
-msgstr "Abrir en la interfaz gráfica de usuario"
+#: ../lib/advene/gui/edit/elements.py:845
+msgid "Location of associated media file"
+msgstr "Ubicación del archivo media asociado"
 
-#: ../lib/advene/gui/views/finder.py:347
-msgid "Unknown type of view??"
-msgstr "¿Tipo de vista desconocido?"
+#: ../lib/advene/gui/edit/elements.py:869
+msgid "Name of the schema"
+msgstr "nombre del esquema"
 
-#: ../lib/advene/gui/views/finder.py:372
-msgid "Edit view"
-msgstr "Editar vista"
+#: ../lib/advene/gui/edit/elements.py:901
+#: ../lib/advene/gui/edit/elements.py:981
+msgid "TALES expression returning a color for the element"
+msgstr "Expresión TALES regresando un color para el elemento"
 
-#: ../lib/advene/gui/views/finder.py:381
-msgid "Open view"
-msgstr "Abrir vista"
+#: ../lib/advene/gui/edit/elements.py:908
+#: ../lib/advene/gui/edit/elements.py:999
+msgid "Item color"
+msgstr "Color del elemento"
 
-#: ../lib/advene/gui/views/finder.py:421 ../lib/advene/gui/views/finder.py:487
-#, python-format
+#: ../lib/advene/gui/edit/elements.py:912
+#: ../lib/advene/gui/edit/elements.py:1003
 msgid ""
-"%(type)s <b>%(title)s</b>\n"
-"Id: %(id)s"
+"TALES expression returning a color for the items contained by the element"
 msgstr ""
-"%(type)s <b>%(title)s</b>\n"
-"Id: %(id)s"
+"Expresión TALES regresando un color para los elementos contenidos por el "
+"elemento"
 
-#: ../lib/advene/gui/views/finder.py:444
-msgid "Try to apply the query on..."
-msgstr "Trata de aplicar la consulta en..."
+#: ../lib/advene/gui/edit/elements.py:938
+#: ../lib/advene/gui/edit/elements.py:1040
+msgid "Name of the type"
+msgstr "Nombre del tipo"
 
-#: ../lib/advene/gui/views/finder.py:464 ../lib/advene/gui/popup.py:829
-msgid "the package"
-msgstr "el paquete"
+#: ../lib/advene/gui/edit/elements.py:956
+#: ../lib/advene/gui/edit/elements.py:1045
+#: ../lib/advene/gui/edit/elements.py:1314
+msgid "MIME Type"
+msgstr "Tipo MIME"
 
-#: ../lib/advene/gui/views/finder.py:465 ../lib/advene/gui/popup.py:830
-msgid "all annotations of the package"
-msgstr "todas las anotaciones del paquete"
+#: ../lib/advene/gui/edit/elements.py:960
+#: ../lib/advene/gui/edit/elements.py:1049
+msgid "MIMEType of the content"
+msgstr "Tipo MIME del contenido"
 
-#: ../lib/advene/gui/views/finder.py:466 ../lib/advene/gui/popup.py:831
-msgid "the first annotation of the package"
-msgstr "la primer anotación del paquete"
+#: ../lib/advene/gui/edit/elements.py:992
+msgid ""
+"TALES expression used to get a compact representation of the annotations"
+msgstr ""
+"Expresión TALES utilizada para obtener una representación compacta de las "
+"anotaciones"
 
-#: ../lib/advene/gui/views/finder.py:509
-msgid "Edit resource"
-msgstr "Editar recurso"
+#: ../lib/advene/gui/edit/elements.py:993
+#, python-format
+msgid "Display %s key"
+msgstr "Muestra %s clave"
 
-#: ../lib/advene/gui/views/finder.py:523 ../lib/advene/gui/main.py:1223
-msgid "Package finder"
-msgstr "Buscador de paquetes"
+#: ../lib/advene/gui/edit/elements.py:1009
+msgid "Completions"
+msgstr "Terminaciones"
 
-#: ../lib/advene/gui/views/finder.py:525
-msgid "Column-based package finder"
-msgstr "Buscador de paquete basado en columnas"
+#: ../lib/advene/gui/edit/elements.py:1013
+msgid "Space-separated list of words used for content completion"
+msgstr ""
+"Lista de palabras separadas por espacio utilizadas para completar contenido"
 
-#: ../lib/advene/gui/views/annotationdisplay.py:41
-msgid "AnnotationDisplay"
-msgstr "VisualizarAnotaciones"
+#: ../lib/advene/gui/edit/elements.py:1019
+msgid "Advanced"
+msgstr "Avanzado"
 
-#: ../lib/advene/gui/views/annotationdisplay.py:43
-msgid "Display the contents of an annotation"
-msgstr "Visualizar el contenido de una anotación"
+#: ../lib/advene/gui/edit/elements.py:1069
+msgid "Any annotation type"
+msgstr "Cualquier tipo de anotación"
 
-#: ../lib/advene/gui/views/annotationdisplay.py:84
-msgid "No annotation"
-msgstr "No hay anotación"
+#: ../lib/advene/gui/edit/elements.py:1095
+msgid "TALES expression specifying a color"
+msgstr "Expresión TALES especificando un color"
 
-#: ../lib/advene/gui/views/annotationdisplay.py:110
-#, fuzzy, python-format
+#: ../lib/advene/gui/edit/elements.py:1122
+msgid "MIMEType"
+msgstr "Tipo MIME"
+
+#: ../lib/advene/gui/edit/elements.py:1347
+#, python-format
+msgid "Error: cannot find a content handler for %s"
+msgstr "Error: no se puede encontrar un control para %s"
+
+#: ../lib/advene/gui/edit/elements.py:1466
+#: ../lib/advene/gui/edit/elements.py:1679
+#, python-format
 msgid ""
-"Schema %(schema)s (id %(id)s)\n"
-"%(description)s\n"
-"%(stats)s"
+"Cannot read the data:\n"
+"%s"
 msgstr ""
-"Esquema %(schema)s\n"
-"%(description)s\n"
-"%(total)s\n"
-"Id: %(id)s"
-
-#: ../lib/advene/gui/views/annotationdisplay.py:231
-msgid "Screenshot"
-msgstr "Captura de pantalla"
+"No se pueden leer los datos:\n"
+"%s"
 
-#: ../lib/advene/gui/views/__init__.py:193
-msgid "Invalid view id"
-msgstr "id vista no válida"
+#: ../lib/advene/gui/edit/elements.py:1479
+#: ../lib/advene/gui/edit/elements.py:1704
+msgid "Save content to..."
+msgstr "Salvar el contenido a..."
 
-#: ../lib/advene/gui/views/__init__.py:239
+#: ../lib/advene/gui/edit/elements.py:1493
+#: ../lib/advene/gui/edit/elements.py:1717
 #, python-format
-msgid "Cannot save default options: %s"
-msgstr "No se pueden guardar las opciones predeterminadas: %s"
+msgid ""
+"Cannot save the data:\n"
+"%s"
+msgstr ""
+"No se pueden guardar los datos:\n"
+"%s"
 
-#: ../lib/advene/gui/views/__init__.py:250
-#, python-format
-msgid "Default options saved for view %s"
-msgstr "Opciones predeterminadas para vistas almacenadas %s"
+#: ../lib/advene/gui/edit/elements.py:1508
+#: ../lib/advene/gui/edit/elements.py:1731
+msgid "Open a file (C-o)"
+msgstr "Abrir un archivo (C-o)"
 
-#: ../lib/advene/gui/views/__init__.py:282
-#, python-format
-msgid "Saving %s"
-msgstr "Guardando %s"
+#: ../lib/advene/gui/edit/elements.py:1513
+#: ../lib/advene/gui/edit/elements.py:1736
+msgid "Save to a file (C-s)"
+msgstr "Guardar a un archivo (C-s)"
 
-#: ../lib/advene/gui/views/__init__.py:285
-msgid "Enter a view name to save this parametered view"
-msgstr "Ingresar un nombre de vista para almacenar esta vista con parámetros"
+#: ../lib/advene/gui/edit/elements.py:1518
+#: ../lib/advene/gui/edit/elements.py:1741
+msgid "Reload the file (C-r)"
+msgstr "Volver a cargar el archivo (C-r)"
 
-#: ../lib/advene/gui/views/__init__.py:288 ../lib/advene/gui/main.py:4630
-#, python-format
-msgid "Error: the identifier %s contains invalid characters."
-msgstr "Error: el identificador %s contiene caracteres no válidos."
+#: ../lib/advene/gui/edit/elements.py:1524
+msgid "Insert a value from the browser (C-i)"
+msgstr "Inserta un valor del navegador (C-i)"
 
-#: ../lib/advene/gui/views/__init__.py:303
-#, python-format
-msgid "Error: the view %s is not an adhoc view."
-msgstr "Error: la vista %s no es una vista adhoc."
+#: ../lib/advene/gui/edit/elements.py:1770
+msgid "Begin time is greater than end time"
+msgstr "Tiempo de inicio es mayor que el tiempo final"
 
-#: ../lib/advene/gui/views/__init__.py:328
-msgid "HTML export"
-msgstr "Exportar HTML"
+#: ../lib/advene/gui/edit/elements.py:2042
+msgid "Expecting an integer."
+msgstr "Esperando entero"
 
-#: ../lib/advene/gui/views/__init__.py:329
-msgid "Specify a name for the export view"
-msgstr "Especificar un nombre para la vista de exportar"
+#: ../lib/advene/gui/edit/elements.py:2074
+#, python-format
+msgid ""
+"The %(attribute)s attribute could not be updated:\n"
+"\n"
+"%(error)s\n"
+"\n"
+"Resetting to the original value."
+msgstr ""
+"El atributo %(attribute)s no pudo ser actualizado:\n"
+"\n"
+"%(error)s\n"
+"\n"
+"Restableciendo el valor original."
 
-#: ../lib/advene/gui/views/__init__.py:348
+#: ../lib/advene/gui/edit/elements.py:2100
 #, python-format
 msgid ""
-"View successfully exported as %s.\n"
-"Open it in the web browser ?"
+"The following attributes cannot be updated:\n"
+"\n"
+"%s"
 msgstr ""
-"La vista se exportó satisfactoriamente como %s.\n"
-"¿Abrirla en el navegador web?"
+"Los siguientes atributos no pudieron ser actualizados:\n"
+"\n"
+"%s"
 
-#: ../lib/advene/gui/views/__init__.py:427
-msgid "Actions"
-msgstr "Acciones"
+#: ../lib/advene/gui/edit/elements.py:2138
+#, python-format
+msgid ""
+"The following attributes could not be updated:\n"
+"\n"
+"%s"
+msgstr ""
+"Los siguientes atributos no pudieron ser actualizados:\n"
+"\n"
+"%s"
 
-#: ../lib/advene/gui/views/__init__.py:452
-msgid "Click or drag-and-drop to reattach view"
-msgstr "Clic o arrastra-y-suelta para volver a adjuntar la vista"
+#: ../lib/advene/gui/edit/elements.py:2155
+msgid "Attribute"
+msgstr "Atributo"
 
-#: ../lib/advene/gui/views/table.py:55
-msgid "Annotation table view"
-msgstr "Vista de tabla de las anotaciones"
+#: ../lib/advene/gui/edit/elements.py:2254
+msgid "Insert an element"
+msgstr "Insertar un elemento"
 
-#: ../lib/advene/gui/views/table.py:57
-msgid "Display annotations in a table"
-msgstr "Mostrar las anotaciones en una tabla"
+#: ../lib/advene/gui/edit/elements.py:2255
+msgid "Choose the element to insert."
+msgstr "Elegir elemento a insertar"
 
-#: ../lib/advene/gui/views/table.py:227 ../lib/advene/gui/views/table.py:452
-msgid "Snapshot"
-msgstr "Capturas"
+#: ../lib/advene/gui/edit/elements.py:2325
+#: ../lib/advene/gui/edit/elements.py:2368
+#, python-format
+msgid "Some tags contain invalid characters: %s"
+msgstr "Algunas etiquetas contienen caracteres no válidos: %s"
 
-#: ../lib/advene/gui/views/table.py:254 ../lib/advene/gui/main.py:4178
-msgid "Duration"
-msgstr "Duración"
+#: ../lib/advene/gui/edit/elements.py:2348
+msgid "Tags:"
+msgstr "Etiquetas:"
 
-#: ../lib/advene/gui/views/table.py:382 ../lib/advene/gui/views/table.py:511
-msgid "Export data to file..."
-msgstr "Exportar datos a un archivo..."
+#: ../lib/advene/gui/edit/transcribe.py:70
+msgid "Transcription importer"
+msgstr "Importador de transcripciones"
 
-#: ../lib/advene/gui/views/table.py:391 ../lib/advene/gui/views/table.py:520
-#, python-format
-msgid "Error while exporting data to %(filename)s: %(error)s"
-msgstr "Error mientras se exportaban los datos a %(filename)s: %(error)s"
+#: ../lib/advene/gui/edit/transcribe.py:81
+msgid "Note taking"
+msgstr "Tomar notas"
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "id"
-msgstr "id"
+#: ../lib/advene/gui/edit/transcribe.py:83
+msgid "Take notes on the fly as a timestamped transcription"
+msgstr "Importar anotaciones de una transcripción timestamped"
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "type"
-msgstr "tipo"
+#: ../lib/advene/gui/edit/transcribe.py:149
+msgid "Timestamp"
+msgstr "Marca de tiempo"
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "begin"
-msgstr "inicio"
+#: ../lib/advene/gui/edit/transcribe.py:149
+msgid "Click inserts timestamp marks"
+msgstr "Clic inserta marcas de tiempo"
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "end"
-msgstr "fin"
+#: ../lib/advene/gui/edit/transcribe.py:150
+msgid "Insert on single-click"
+msgstr "Insertar con un solo clic"
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "content"
-msgstr "contenido"
+#: ../lib/advene/gui/edit/transcribe.py:150
+msgid "A single click will insert the mark (else a double click is needed)"
+msgstr "Un clic insertará la marca (si no se necesita un doble clic)"
 
-#: ../lib/advene/gui/views/table.py:460
-msgid "Generic table view"
-msgstr "Vista de tabla genérica"
+#: ../lib/advene/gui/edit/transcribe.py:151
+msgid "Play on scroll"
+msgstr "Reproducir en desplazamiento"
 
-#: ../lib/advene/gui/views/table.py:462
-msgid "Display Advene elements in a table."
-msgstr "Mostrar los elementos de Advene en tabla"
+#: ../lib/advene/gui/edit/transcribe.py:151
+msgid "Play the new position upon timestamp modification"
+msgstr ""
+"Reproduce la nueva posición después de la modificación de la marca de tiempo"
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element title"
-msgstr "Título del elemento"
+#: ../lib/advene/gui/edit/transcribe.py:152
+msgid "Generate empty annotations"
+msgstr "Genera anotaciones vacías"
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element type"
-msgstr "Tipo del elemento"
+#: ../lib/advene/gui/edit/transcribe.py:152
+msgid "If checked, generate annotations for empty text"
+msgstr "Si está seleccionado, genera anotaciones para texto vacío"
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element id"
-msgstr "Id del elemento"
+#: ../lib/advene/gui/edit/transcribe.py:153
+msgid "Reaction time"
+msgstr "Tiempo de reacción"
 
-#: ../lib/advene/gui/widget.py:327
-#, python-format
-msgid "Set of %s annotations"
-msgstr "Conjunto de %s anotaciones"
+#: ../lib/advene/gui/edit/transcribe.py:153
+msgid ""
+"Reaction time (substracted from current player time, except when paused.)"
+msgstr ""
+"Tiempo de reacción (restado del tiempo de reproducción actual, excepto "
+"cuando está en pausa)."
 
-#: ../lib/advene/gui/widget.py:1067
-msgid "Save as..."
-msgstr "Guardar como..."
+#: ../lib/advene/gui/edit/transcribe.py:154
+msgid "Auto-insert"
+msgstr "Auto-insertar"
 
-#: ../lib/advene/gui/widget.py:1072
-msgid "Use current player position"
-msgstr "Utiliza la posición actual del reproductor"
+#: ../lib/advene/gui/edit/transcribe.py:154
+msgid "Automatic timestamp mark insertion"
+msgstr "Inserción de marca de tiempo automática"
 
-#: ../lib/advene/gui/widget.py:1078
-msgid "Adjust timestamp"
-msgstr "Ajustar la marca de tiempo"
+#: ../lib/advene/gui/edit/transcribe.py:155
+msgid "Automatic insertion delay"
+msgstr "Retardo automático de inserción"
 
-#: ../lib/advene/gui/main.py:193 ../lib/advene/gui/main.py:304
-msgid "_Select player"
-msgstr "_Selecciona reproductor"
+#: ../lib/advene/gui/edit/transcribe.py:155
+msgid ""
+"If autoinsert is active, timestamp marks will be automatically inserted when "
+"text is entered after no interaction since this delay (in ms).\n"
+"1000 is typically a good value."
+msgstr ""
+"Si autoinsertar está activo, la marca de tiempo se insertará automáticamente "
+"cuando se introduce texto y no hay interacción desde este retardo (en ms).\n"
+"1000 es generalmente un buen valor."
 
-#: ../lib/advene/gui/main.py:195 ../lib/advene/gui/main.py:287
-msgid "_View"
-msgstr "_Vista"
+#: ../lib/advene/gui/edit/transcribe.py:156
+msgid "Font size for text (0 for standard size)"
+msgstr "Tamaño de la fuente para el texto (0 para el tamaño estándar)"
 
-#: ../lib/advene/gui/main.py:197 ../lib/advene/gui/main.py:306
-msgid "Packages"
-msgstr "Paquetes"
+#: ../lib/advene/gui/edit/transcribe.py:216
+#: ../lib/advene/gui/edit/transcribe.py:220
+#: ../lib/advene/gui/edit/transcribe.py:378
+#: ../lib/advene/gui/edit/transcribe.py:382
+msgid "Invalid timestamp mark"
+msgstr "Marca no valida timestamp"
 
-#: ../lib/advene/gui/main.py:200 ../lib/advene/gui/main.py:246
-msgid "Open recent"
-msgstr "Abrir recientes"
+#: ../lib/advene/gui/edit/transcribe.py:503
+msgid "Ignore the following text (toggle)"
+msgstr "Ignora el siguiente texto"
 
-#: ../lib/advene/gui/main.py:239
-msgid "Input from the keyboard (function keys)"
-msgstr "Ingresar del teclado (teclas de función)"
+#: ../lib/advene/gui/edit/transcribe.py:507
+msgid "Remove mark"
+msgstr "Eliminar marca. "
 
-#: ../lib/advene/gui/main.py:243
-msgid "_File"
-msgstr "_Archivo"
+#: ../lib/advene/gui/edit/transcribe.py:511
+msgid "Reaction-time offset"
+msgstr "Tiempo de reacción (compensación)"
 
-#: ../lib/advene/gui/main.py:244
-msgid "_New package"
-msgstr "_Nuevo paquete"
+#: ../lib/advene/gui/edit/transcribe.py:515
+msgid "-1 sec"
+msgstr "-1 sec"
 
-#: ../lib/advene/gui/main.py:244
-msgid "Create a new package"
-msgstr "Crea un nuevo paquete"
+#: ../lib/advene/gui/edit/transcribe.py:518
+msgid "-0.5 sec"
+msgstr "-0.5 sec"
 
-#: ../lib/advene/gui/main.py:245
-msgid "_Open package"
-msgstr "_Abrir paquete"
+#: ../lib/advene/gui/edit/transcribe.py:521
+msgid "-0.1 sec"
+msgstr "-0.1 sec"
 
-#: ../lib/advene/gui/main.py:245
-msgid "Open a package"
-msgstr "Abrir un paquete"
+#: ../lib/advene/gui/edit/transcribe.py:525
+msgid "+1 sec"
+msgstr "+1 sec"
 
-#: ../lib/advene/gui/main.py:246
-msgid "Show recently opened packages"
-msgstr "Mostrar paquetes recientemente abiertos"
+#: ../lib/advene/gui/edit/transcribe.py:528
+msgid "+0.5 sec"
+msgstr "+0.5 sec"
 
-#: ../lib/advene/gui/main.py:247
-msgid "_Save package"
-msgstr "_Guardar paquete"
+#: ../lib/advene/gui/edit/transcribe.py:531
+msgid "+0.1 sec"
+msgstr "+0.1 sec"
 
-#: ../lib/advene/gui/main.py:247
-msgid "Save the package"
-msgstr "Guardar el paquete"
+#: ../lib/advene/gui/edit/transcribe.py:618
+msgid "Invalid timestamp"
+msgstr "Timestamp no valida"
 
-#: ../lib/advene/gui/main.py:248
-msgid "Save package as..."
-msgstr "Guardar paquete como..."
+#: ../lib/advene/gui/edit/transcribe.py:738
+#, python-format
+msgid "Invalid timestamp mark in conversion: %s"
+msgstr "Marca del tiempo no válida en la conversión: %s"
 
-#: ../lib/advene/gui/main.py:248
-msgid "Save the package as..."
-msgstr "Guardar el paquete como..."
+#: ../lib/advene/gui/edit/transcribe.py:856
+#, python-format
+msgid "Cannot save the file: %s"
+msgstr "No se puede guardar el archivo: %s"
 
-#: ../lib/advene/gui/main.py:249
-msgid "Close package"
-msgstr "Cerrar paquete"
+#: ../lib/advene/gui/edit/transcribe.py:865
+#: ../lib/advene/gui/edit/transcribe.py:947
+msgid "This will overwrite the current textual content. Are you sure?"
+msgstr "Esto va a sobrescribir el contenido actual textual. ¿Estás seguro?"
 
-#: ../lib/advene/gui/main.py:249
-msgid "Close the package"
-msgstr "Cerrar el paquete"
+#: ../lib/advene/gui/edit/transcribe.py:868
+msgid "Select transcription file to load"
+msgstr "Selecciona un archivo de transcripción para cargar"
 
-#: ../lib/advene/gui/main.py:251
-msgid "Save session"
-msgstr "Guardar sesión"
-
-#: ../lib/advene/gui/main.py:251
-msgid "Save the current session (list of opened packages)"
-msgstr "Guardar la sesión actual (lista de paquetes abiertos)"
-
-#: ../lib/advene/gui/main.py:252
-msgid "Save workspace"
-msgstr "Guardar espacio de trabajo"
-
-#: ../lib/advene/gui/main.py:253
-msgid "...as package view"
-msgstr "...como paquete de vista"
-
-#: ../lib/advene/gui/main.py:254
-msgid "...as standard workspace"
-msgstr "...como espacio de trabajo estándar"
+#: ../lib/advene/gui/edit/transcribe.py:885
+#, python-format
+msgid "Cannot open %(filename)s: %(error)s"
+msgstr "No se puede abrir %(filename)s: %(error)s"
 
-#: ../lib/advene/gui/main.py:254
-msgid "Use the current layout as standard workspace in the future"
-msgstr ""
-"Usa el despliegue actual como espacio de trabajo predeterminado en el futuro"
+#: ../lib/advene/gui/edit/transcribe.py:932
+msgid "Cannot import annotations: no existing interface"
+msgstr "No se pueden importar las anotaciones: no existe interfaz"
 
-#: ../lib/advene/gui/main.py:256
-msgid "Associate a video _File"
-msgstr "Asociar un archivo de video _F"
+#: ../lib/advene/gui/edit/transcribe.py:934
+msgid "Select the annotation type to import"
+msgstr "Selecciona el tipo de anotación a importar"
 
-#: ../lib/advene/gui/main.py:256
-msgid "Associate a video file"
-msgstr "Asociar un archivo de video"
+#: ../lib/advene/gui/edit/transcribe.py:943
+#, python-format
+msgid "There are no annotations of type %s"
+msgstr "No hay anotaciones del tipo %s"
 
-#: ../lib/advene/gui/main.py:257
-msgid "Associate a _DVD"
-msgstr "Asociar un _DVD"
+#: ../lib/advene/gui/edit/transcribe.py:972
+msgid "Cannot convert the data: no associated package"
+msgstr "No se pueden convertir los datos: no hay un paquete asociado"
 
-#: ../lib/advene/gui/main.py:257
-msgid "Associate a chapter from a DVD"
-msgstr "Asociar un capítulo de un DVD"
+#: ../lib/advene/gui/edit/transcribe.py:975
+msgid "Converting transcription"
+msgstr "Transcripción de conversión"
 
-#: ../lib/advene/gui/main.py:258
-msgid "Associate a _Video stream"
-msgstr "Asociar una corriente de _Video"
+#: ../lib/advene/gui/edit/transcribe.py:981
+msgid "Choose the annotation-type where to create annotations.\n"
+msgstr "Elige el tipo de anotación dónde crear anotaciones.\n"
 
-#: ../lib/advene/gui/main.py:258
-msgid "Enter a video stream address"
-msgstr "Ingresar una dirección de flujo de video"
+#: ../lib/advene/gui/edit/transcribe.py:989
+msgid "Delete existing annotations in this type"
+msgstr "Elimina las anotaciones existentes en este tipo"
 
-#: ../lib/advene/gui/main.py:260
-msgid "_Import File"
-msgstr "_Importar Archivo"
+#: ../lib/advene/gui/edit/transcribe.py:1012
+msgid "Select type"
+msgstr "Selecciona tipo"
 
-#: ../lib/advene/gui/main.py:260
-msgid "Import data from an external source"
-msgstr "Importar datos de una fuente externa"
+#: ../lib/advene/gui/edit/transcribe.py:1016
+msgid "You want to create a new type. Please specify its schema and title."
+msgstr ""
+"Quieres crear un nuevo tipo. Por favor especifica su esquema y título. "
 
-#: ../lib/advene/gui/main.py:261
-msgid "_Process video"
-msgstr "_Procesar video"
+#: ../lib/advene/gui/edit/transcribe.py:1028
+msgid "Containing schema"
+msgstr "Esquema contenedor"
 
-#: ../lib/advene/gui/main.py:261
-msgid "Import data from video processing algorithms"
-msgstr "Importar datos de algoritmos de procesamiento de vídeo"
+#: ../lib/advene/gui/edit/transcribe.py:1041
+msgid "Export options"
+msgstr "Opciones para exportar"
 
-#: ../lib/advene/gui/main.py:263
-msgid "Merge package"
-msgstr "Unir paquete"
+#: ../lib/advene/gui/edit/transcribe.py:1046
+msgid "Generate annotations for empty contents"
+msgstr "Generar anotaciones para contenido vacío"
 
-#: ../lib/advene/gui/main.py:263
-msgid "Merge elements from another package"
-msgstr "Editar elementos importados de otros paquetes"
+#: ../lib/advene/gui/edit/transcribe.py:1071
+#, python-format
+msgid "The %s identifier already exists. Choose another one."
+msgstr "El %s identificador ya existe. Elegir otro. "
 
-#: ../lib/advene/gui/main.py:264
-msgid "Import _DVD chapters"
-msgstr "Importar capitulos del DVD"
+#: ../lib/advene/gui/edit/transcribe.py:1110
+msgid "Notes converted"
+msgstr "Notas convertidas"
 
-#: ../lib/advene/gui/main.py:264
-msgid "Create annotations based on DVD chapters"
-msgstr "Crear anotaciones basadas en los capitulos del DVD"
+#: ../lib/advene/gui/edit/transcribe.py:1157
+msgid "Open"
+msgstr "Abrir"
 
-#: ../lib/advene/gui/main.py:266
-msgid "_Export..."
-msgstr "_Exportar..."
+#: ../lib/advene/gui/edit/transcribe.py:1158
+msgid "Save"
+msgstr "Guardar"
 
-#: ../lib/advene/gui/main.py:266
-msgid "Export data to another format"
-msgstr "Importar datos de una fuente externa"
+#: ../lib/advene/gui/edit/transcribe.py:1159
+msgid "Save As"
+msgstr "Guardar como"
 
-#: ../lib/advene/gui/main.py:267
-msgid "_Website export..."
-msgstr "_Exportar sitio web..."
+#: ../lib/advene/gui/edit/transcribe.py:1160
+msgid "Import"
+msgstr "Importar"
 
-#: ../lib/advene/gui/main.py:267
-msgid "Export views to a website"
-msgstr "Exportar vistas a un sitio web"
+#: ../lib/advene/gui/edit/transcribe.py:1160
+msgid "Import from annotations"
+msgstr "Importar de anotaciones"
 
-#: ../lib/advene/gui/main.py:269
-msgid "_Quit"
-msgstr "Salir _Q"
+#: ../lib/advene/gui/edit/transcribe.py:1161
+msgid "Convert"
+msgstr "Convertir "
 
-#: ../lib/advene/gui/main.py:271
-msgid "_Edit"
-msgstr "_Editar"
+#: ../lib/advene/gui/edit/transcribe.py:1161
+msgid "Convert to annotations"
+msgstr "Convertir a anotaciones"
 
-#: ../lib/advene/gui/main.py:272
-msgid "_Undo"
-msgstr "_Deshacer"
+#: ../lib/advene/gui/edit/transcribe.py:1163 ../lib/advene/rules/actions.py:670
+msgid "Center"
+msgstr "Centrar"
 
-#: ../lib/advene/gui/main.py:273
-msgid "_Find"
-msgstr "Encontrar _F"
+#: ../lib/advene/gui/edit/transcribe.py:1163
+msgid "Center on the current mark"
+msgstr "Centrar en la marca actual"
 
-#: ../lib/advene/gui/main.py:274
-msgid "_Delete"
-msgstr "Eliminar _D"
+#: ../lib/advene/gui/edit/transcribe.py:1164
+msgid "Find"
+msgstr "Encontrar"
 
-#: ../lib/advene/gui/main.py:275
-msgid "Create"
-msgstr "Crear"
+#: ../lib/advene/gui/edit/transcribe.py:1164
+msgid "Search a string"
+msgstr "Buscar una cadena de texto"
 
-#: ../lib/advene/gui/main.py:284
-msgid "P_ackage properties"
-msgstr "P_ropiedades del paquete"
+#: ../lib/advene/gui/edit/transcribe.py:1165
+msgid "Scale"
+msgstr "Escala"
 
-#: ../lib/advene/gui/main.py:284
-msgid "Edit package properties"
-msgstr "Editar las propiedades del paquete"
+#: ../lib/advene/gui/edit/transcribe.py:1188
+msgid "Automatically scroll to the mark position when playing"
+msgstr ""
+"Desplaza automáticamente a la posición de la marca mientras se reproduce."
 
-#: ../lib/advene/gui/main.py:285
-msgid "P_references"
-msgstr "P_referencias"
+#: ../lib/advene/gui/edit/transcribe.py:1190
+msgid "Autoscroll"
+msgstr "Auto desplazar"
 
-#: ../lib/advene/gui/main.py:285
-msgid "Interface preferences"
-msgstr "Preferencias de interfaz"
+#: ../lib/advene/gui/edit/transcribe.py:1197
+msgid "Autoinsert"
+msgstr "Auto insertar"
 
-#: ../lib/advene/gui/main.py:289
-msgid "_Start Web Browser"
-msgstr "_Inicia el explorador Web"
+#: ../lib/advene/gui/edit/transcribe.py:1199
+msgid "Automatically insert marks"
+msgstr "Inserta marcas automáticamente"
 
-#: ../lib/advene/gui/main.py:289
-msgid "Start the web browser"
-msgstr "_Inicia el explorador Web"
+#: ../lib/advene/core/webcherry.py:53
+msgid "The webserver requires version 3.0 of CherryPy at least."
+msgstr "El servidor web require como mínimo la versión 3.0 de CherryPy."
 
-#: ../lib/advene/gui/main.py:291
-msgid "Simplify interface"
-msgstr "Simplificar interfaz"
+#: ../lib/advene/core/webcherry.py:169
+#, python-format
+msgid ""
+"\n"
+"            <p>\n"
+"            <a href=\"/admin\">Server administration</a> |\n"
+"            <a href=\"/media\">Media control</a> |\n"
+"            <a href=\"%(path)s?mode=raw\">Raw view</a>\n"
+"            </p>\n"
+"            Location: %(locationbar)s\n"
+"            <hr>\n"
+"            "
+msgstr ""
+"\n"
+"            <p>\n"
+"            <a href=\"/admin\">Administracion de servidor</a> |\n"
+"            <a href=\"/media\">Control media</a> |\n"
+"            <a href=\"%(path)s?mode=raw\">Vista inicial</a>\n"
+"            </p>\n"
+"            Locacion: %(locationbar)s\n"
+"            <hr>\n"
+"            "
 
-#: ../lib/advene/gui/main.py:291
-msgid "Simplify the application interface (toggle)"
-msgstr "Simplificar la interfaz de la aplicación (conmutar)"
+#: ../lib/advene/core/webcherry.py:229
+msgid "Unspecified Error"
+msgstr "Error no especificado"
 
-#: ../lib/advene/gui/main.py:292
-msgid "Evaluator"
-msgstr "Evaluador"
+#: ../lib/advene/core/webcherry.py:230
+#, python-format
+msgid ""
+"\n"
+"        <h1>Error</h1>\n"
+"        <p>An error occurred:</p>\n"
+"        %s\n"
+"        "
+msgstr ""
+"\n"
+"        <h1>Error</h1>\n"
+"        <p>Un error ocurrió:</p>\n"
+"        %s\n"
+"        "
 
-#: ../lib/advene/gui/main.py:292
-msgid "Open python evaluator window"
-msgstr "Abre la ventana del evaluador de Python"
+#: ../lib/advene/core/webcherry.py:263
+msgid "<h1>No available mediaplayer</h1>"
+msgstr "<h1>No hay reproductor media disponible</h1>"
 
-#: ../lib/advene/gui/main.py:293 ../lib/advene/gui/main.py:4022
-msgid "Webserver log"
-msgstr "Bitácora del servidor web"
+#: ../lib/advene/core/webcherry.py:266
+#, fuzzy, python-format
+msgid ""
+"\n"
+"            <h1>Current STBV: %(currentstbv)s</h1>\n"
+"\n"
+"            <h1>Player status</h1>\n"
+"            <table border=\"1\">\n"
+"            <tr>\n"
+"            <td>Current media</td><td>%(uri)s</td>\n"
+"            <td>Current position</td><td>%(position)s</td>\n"
+"            <td>Duration</td><td>%(duration)s</td>\n"
+"            <td>Player status</td><td>%(status)s</td>\n"
+"            </tr>\n"
+"            </table>\n"
+"            "
+msgstr ""
+"\n"
+"            <h1>STBV Actual: %(currentstbv)s</h1>\n"
+"\n"
+"            <h1>Estado del reproductor</h1>\n"
+"            <table border=\"1\">\n"
+"            <tr>\n"
+"            <td>Posición actual</td><td>%(position)s</td>\n"
+"            <td>Tamaño de entrada</td><td>%(duration)s</td>\n"
+"            <td>Estado del reproductor</td><td>%(status)s</td>\n"
+"            </tr>\n"
+"            </table>\n"
+"            "
 
-#: ../lib/advene/gui/main.py:296
-msgid "_Player"
-msgstr "_Reproductor"
+#: ../lib/advene/core/webcherry.py:279
+#, fuzzy
+msgid "No media file"
+msgstr "Archivo media"
 
-#: ../lib/advene/gui/main.py:297
-msgid "Go to _Time"
-msgstr "Ir al _Tiempo"
+#: ../lib/advene/core/webcherry.py:286
+#, fuzzy
+msgid ""
+"\n"
+"            <form action=\"/media/play\" method=\"GET\">\n"
+"            Starting pos: <input type=\"text\" name=\"position\" value="
+"\"0\">\n"
+"            <input type=\"submit\" value=\"Play\">\n"
+"            </form>\n"
+"            <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
+"\">Pause</a><br>\n"
+"            "
+msgstr ""
+"\n"
+"                <form action=\"/media/play\" method=\"GET\">\n"
+"                Posicion inicial: <input type=\"text\" name=\"position\" "
+"value=\"0\">\n"
+"                <input type=\"submit\" value=\"Play\">\n"
+"                </form>\n"
+"                <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
+"\">Pausa</a><br>\n"
+"                "
+
+#: ../lib/advene/core/webcherry.py:293
+msgid ""
+"<hr />\n"
+"            <form action=\"/media/load\" method=\"GET\">\n"
+"            Add a new file (<em>dvd</em> to play a DVD):\n"
+"            <input type=\"text\" name=\"filename\">\n"
+"            <input type=\"submit\" value=\"Add\">\n"
+"            </form>"
+msgstr ""
+"<hr />\n"
+"            <form action=\"/media/load\" method=\"GET\">\n"
+"            Anadir un nuevo archivo(<em>dvd</em> to play a DVD):\n"
+"            <input type=\"text\" name=\"filename\">\n"
+"            <input type=\"submit\" value=\"Add\">\n"
+"            </form>"
+
+#: ../lib/advene/core/webcherry.py:299
+msgid ""
+"<h3><a href=\"/media/snapshot\">Access to current packages snapshots</h3>"
+msgstr ""
+"<h3><a href=\"/media/snapshot\">Accesar a los paquetes de fotos actuales </"
+"h3>"
+
+#: ../lib/advene/core/webcherry.py:308
+#, python-format
+msgid "Unknown STBV identifier: %s"
+msgstr "Identificador STBV desconocido: %s"
+
+#: ../lib/advene/core/webcherry.py:383
+msgid "Media information"
+msgstr "Informacion Media"
+
+#: ../lib/advene/core/webcherry.py:396
+msgid "File added"
+msgstr "Archivo anadido"
+
+#: ../lib/advene/core/webcherry.py:397
+#, fuzzy, python-format
+msgid "<p><strong>%s has been loaded.</strong></p>"
+msgstr "<p><strong>%s ha sido anadida a la lista de reproduccion</strong></p>"
+
+#: ../lib/advene/core/webcherry.py:408 ../lib/advene/core/webcherry.py:466
+msgid "Access to packages snapshots"
+msgstr "Accesar a paquetes de fotografias"
+
+#: ../lib/advene/core/webcherry.py:418 ../lib/advene/core/webcherry.py:476
+msgid "Unknown package alias"
+msgstr "Alias de paquete desconocido"
+
+#: ../lib/advene/core/webcherry.py:424
+#, python-format
+msgid "Available snapshots for %s"
+msgstr "Fotos disponibles para %s"
+
+#: ../lib/advene/core/webcherry.py:430
+#, python-format
+msgid ""
+"<p><a href=\"/media/snapshot/%s?mode=inline\">Display with inline images</"
+"a></p>"
+msgstr ""
+"<p><a href=\"/media/snapshot/%s?mode=inline\">Mostrar con imagenes en linea</"
+"a></p>"
+
+#: ../lib/advene/core/webcherry.py:437
+msgid "Done"
+msgstr "Hecho"
+
+#: ../lib/advene/core/webcherry.py:439
+msgid "Pending"
+msgstr "Pendiente"
+
+#: ../lib/advene/core/webcherry.py:481
+#, python-format
+msgid "Unknown annotation id: %s"
+msgstr "Id de anotación desconocido: %s"
+
+#: ../lib/advene/core/webcherry.py:597 ../lib/advene/core/webcherry.py:715
+#, python-format
+msgid "Cannot activate stbvid %(stbvid)s: %(error)s"
+msgstr "No se puede activar stbvid %(stbvid)s: %(error)s"
+
+#: ../lib/advene/core/webcherry.py:662
+msgid "<p>No GUI is available."
+msgstr "<p>No hay GUI disponible."
+
+#: ../lib/advene/core/webcherry.py:664
+#, python-format
+msgid "<p>Opened adhoc views: %s</p>"
+msgstr "<p>Vistas adhoc actuales: %s</p>"
+
+#: ../lib/advene/core/webcherry.py:665
+msgid "<p>Available adhoc views:</p><ul>"
+msgstr "<p>Vistas adhoc disponibles:</p><ul>"
+
+#: ../lib/advene/core/webcherry.py:686
+#, python-format
+msgid "<p>Current stbv: %s</p>"
+msgstr "<p>STBV actual: %s</p>"
+
+#: ../lib/advene/core/webcherry.py:687
+#, python-format
+msgid "<p>You can activate the following STBV:</p><ul>%s</ul>"
+msgstr "<p>Puedes activar el siguiente STBV:</p><ul>%s</ul>"
+
+#: ../lib/advene/core/webcherry.py:689
+msgid "Activate and play"
+msgstr "Activa y reproduce"
+
+#: ../lib/advene/core/webcherry.py:695
+msgid "Application information"
+msgstr "Informacion de aplicacion"
+
+#: ../lib/advene/core/webcherry.py:765
+msgid "Missing element id parameter"
+msgstr "Hace falta el elemento parámetro id"
+
+#: ../lib/advene/core/webcherry.py:769
+#, python-format
+msgid "No existing element with id %s"
+msgstr "No existe el elemento con el id %s"
+
+#: ../lib/advene/core/webcherry.py:778
+#, python-format
+msgid "<p>The GUI view %s does not exist.</p>"
+msgstr "<p>La vista GUI %s no existe.</p>"
+
+#: ../lib/advene/core/webcherry.py:785
+msgid "Invalid request"
+msgstr "Petición no válida"
+
+#: ../lib/advene/core/webcherry.py:790
+msgid "Invalid configuration variable name"
+msgstr "Nombre de variable de configuración no válido"
+
+#: ../lib/advene/core/webcherry.py:802
+msgid "Invalid value"
+msgstr "Valor no válido"
+
+#: ../lib/advene/core/webcherry.py:806
+#, python-format
+msgid "Unsupported method %s"
+msgstr "Método no soportado %s"
+
+#: ../lib/advene/core/webcherry.py:832
+#, python-format
+msgid ""
+"\n"
+"        <h1>Authorized hosts</h1>\n"
+"        <table border=\"1\">\n"
+"        <tr><th>Host</th><th>IP Addr</th><th>Action</th></tr>\n"
+"        %s\n"
+"        </table>\n"
+"        <form method=\"GET\">\n"
+"        Add a new hostname to the list :<br>\n"
+"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
+"\"Add\">\n"
+"        </form>\n"
+"        "
+msgstr ""
+"\n"
+"        <h1>Hosts autorizados</h1>\n"
+"        <table border=\"1\">\n"
+"        <tr><th>Host</th><th>Dir. IP </th><th>Acción</th></tr>\n"
+"        %s\n"
+"        </table>\n"
+"        <form method=\"GET\">\n"
+"        Añade un nuevo nombre de host a la lista :<br>\n"
+"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
+"\"Add\">\n"
+"        </form>\n"
+"        "
+
+#: ../lib/advene/core/webcherry.py:846
+msgid "Access control"
+msgstr "Control de acceso"
+
+#: ../lib/advene/core/webcherry.py:851
+msgid "Access control - add a hostname"
+msgstr "Control de acceso - Agrega un nombre de equipo"
+
+#: ../lib/advene/core/webcherry.py:859 ../lib/advene/core/webcherry.py:873
+#, python-format
+msgid "<strong>Error: %s is an invalid hostname.</strong>"
+msgstr "<strong>Error: %s es un hostname no valido.</strong>"
+
+#: ../lib/advene/core/webcherry.py:862
+#, python-format
+msgid "<p>Added %s to authorized hosts list.</p>"
+msgstr "<p>Añadido %s a la lista de hosts autorizados.</p>"
+
+#: ../lib/advene/core/webcherry.py:868
+msgid "Access control - delete a hostname"
+msgstr "Control de acceso - Elimina un nombre de equipo"
+
+#: ../lib/advene/core/webcherry.py:876
+msgid "<strong>Cannot remove the localhost access.</strong>"
+msgstr ""
+"<strong>No se puede remover el acceso al equipo local - localhost</strong>"
+
+#: ../lib/advene/core/webcherry.py:881
+#, python-format
+msgid "<p>Removed %s from authorized hosts list.</p>"
+msgstr "<p>Removido %s de la lista de hosts autorizados.</p>"
+
+#: ../lib/advene/core/webcherry.py:883
+#, python-format
+msgid "<p>%s is not in authorized hosts list.</p>"
+msgstr "<p>%s no se encuentra en la lista de equipos autorizados.</p>"
+
+#: ../lib/advene/core/webcherry.py:932
+msgid "Server Administration"
+msgstr "Administracion del Servidor"
+
+#: ../lib/advene/core/webcherry.py:940
+#, python-format
+msgid ""
+"\n"
+"        <p><a href=\"/admin/access\">Update the access list</a></p>\n"
+"        <p><a href=\"/admin/methods\">List available TALES methods</a></p>\n"
+"        <p><a href=\"/action\">List available actions</a></p>\n"
+"        <p><a href=\"/admin/reset\">Reset the server</a></p>\n"
+"        <p><a href=\"/media\">Media control</a></p>\n"
+"        <p><a href=\"/application\">Display GUI status</a></p>\n"
+"        <p><a href=\"/admin/list\">List available files</a></p>\n"
+"        <p><a href=\"/packages\">List loaded packages</a> (%(packagelist)s)</"
+"p>\n"
+"        <p>Display mode : %(displaymode)s</p>\n"
+"        <hr>\n"
+"        <p>Load a package :\n"
+"        <form action=\"/admin/load\" method=\"GET\">\n"
+"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
+"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
+"        <input type=\"submit\" value=\"Load\" />\n"
+"        </form>\n"
+"        </body></html>\n"
+"        "
+msgstr ""
+"\n"
+"        <p><a href=\"/admin/access\">Actualizar la lista de acceso</a></p>\n"
+"        <p><a href=\"/admin/methods\">Lista de los métodos TALES "
+"disponibles</a></p>\n"
+"        <p><a href=\"/action\">Lista de acciones disponibles</a></p>\n"
+"        <p><a href=\"/admin/reset\">Restablecer el servidor</a></p>\n"
+"        <p><a href=\"/media\">Control de Medios</a></p>\n"
+"        <p><a href=\"/application\">Mostrar el estado de la interfaz gráfica "
+"de usuario</a></p>\n"
+"        <p><a href=\"/admin/list\">Lista los archivos disponibles</a></p>\n"
+"        <p><a href=\"/packages\">Lista los paquetes cargados</a> "
+"(%(packagelist)s)</p>\n"
+"        <p>Modo de visualización : %(displaymode)s</p>\n"
+"        <hr>\n"
+"        <p>Cargar un paquete :\n"
+"        <form action=\"/admin/load\" method=\"GET\">\n"
+"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
+"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
+"        <input type=\"submit\" value=\"Cargar\" />\n"
+"        </form>\n"
+"        </body></html>\n"
+"        "
+
+#: ../lib/advene/core/webcherry.py:970
+msgid "Available files"
+msgstr "Archivos disponibles"
+
+#: ../lib/advene/core/webcherry.py:996
+msgid "You should specify an alias"
+msgstr "Debes de especificar un alias"
+
+#: ../lib/advene/core/webcherry.py:1001
+msgid "You should specify an uri"
+msgstr "Debes de especificar una uri"
+
+#: ../lib/advene/core/webcherry.py:1007
+#, python-format
+msgid "Package %s loaded"
+msgstr "Paquete %s cargado"
+
+#: ../lib/advene/core/webcherry.py:1008 ../lib/advene/core/webcherry.py:1044
+#, python-format
+msgid ""
+"<p>Go to the <a href=\"/packages/%(alias)s\">%(alias)s</a> package, or to "
+"the <a href=\"/packages\">package list</a>."
+msgstr ""
+"<p>Ir al <a href=\"/packages/%(alias)s\">%(alias)s</a> paquete o a la <a "
+"href=\"/packages\">lista de paquetes</a>."
+
+#: ../lib/advene/core/webcherry.py:1011
+#, python-format
+msgid "<p>Cannot load package %(alias)s : %(error)s</p>"
+msgstr "<p>No se puede cargar el paquete %(alias)s : %(error)s</p>"
+
+#: ../lib/advene/core/webcherry.py:1022
+#, python-format
+msgid "Package %s deleted"
+msgstr "Paquete %s borrado"
+
+#: ../lib/advene/core/webcherry.py:1023
+msgid "<p>Go to the <a href=\"/packages\">package list</a>."
+msgstr "<p>Ir a la<a href=\"/packages\">lista de paquetes</a>."
+
+#: ../lib/advene/core/webcherry.py:1026
+#, python-format
+msgid "<p>Cannot delete package %(alias)s : %(error)s</p>"
+msgstr "<p>No se puede borrar el paquete %(alias)s : %(error)s</p>"
+
+#: ../lib/advene/core/webcherry.py:1043
+#, python-format
+msgid "Package %s saved"
+msgstr "Paquete %s guardado"
+
+#: ../lib/advene/core/webcherry.py:1047
+#, python-format
+msgid "<p>Cannot save package %(alias)s : %(error)s</p>"
+msgstr "<p>No se puede guardar el paquete %(alias)s : %(error)s</p>"
+
+#: ../lib/advene/core/webcherry.py:1057
+msgid "Server reset"
+msgstr "Reajuste del servidor (Reset)"
+
+#: ../lib/advene/core/webcherry.py:1063
+msgid "Available TALES methods"
+msgstr "Métodos TALES disponibles"
+
+#: ../lib/advene/core/webcherry.py:1104
+msgid "Loaded package(s)"
+msgstr "Paquete(s) cargados"
+
+#: ../lib/advene/core/webcherry.py:1106
+msgid ""
+"\n"
+"        <h1>Loaded package(s)</h1>\n"
+"        <table border=\"1\" width=\"50%\">\n"
+"        <tr>\n"
+"        <th>Alias</th>\n"
+"        <th>Action</th>\n"
+"        <th>URI</th>\n"
+"        <th>Annotations</th>\n"
+"        </tr>\n"
+"        "
+msgstr ""
+"\n"
+"        <h1>Paquete(s) cargado(s)</h1>\n"
+"        <table border=\"1\" width=\"50%\">\n"
+"        <tr>\n"
+"        <th>Alias</th>\n"
+"        <th>Acción</th>\n"
+"        <th>URI</th>\n"
+"        <th>Anotaciones</th>\n"
+"        </tr>\n"
+"        "
 
-#: ../lib/advene/gui/main.py:297
-msgid "Goto a specified time code"
-msgstr "Ir a un código de tiempo especificado"
+#: ../lib/advene/core/webcherry.py:1118
+#, python-format
+msgid ""
+"<tr>\n"
+"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
+"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
+"%(uri)s\">Reload</a>|<a href=\"/admin/delete?alias=%(alias)s\">Drop</a>|<a "
+"href=\"/admin/save?alias=%(alias)s\">Save</a></td>\n"
+"            <td>%(uri)s</td>\n"
+"            <td>%(size)d</td>\n"
+"            </tr>\n"
+"            "
+msgstr ""
+"<tr>\n"
+"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
+"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
+"%(uri)s\">Volver a cargar</a>|<a href=\"/admin/delete?alias=%(alias)s"
+"\">Tirar</a>|<a href=\"/admin/save?alias=%(alias)s\">Guardar</a></td>\n"
+"            <td>%(uri)s</td>\n"
+"            <td>%(size)d</td>\n"
+"            </tr>\n"
+"            "
 
-#: ../lib/advene/gui/main.py:298
-msgid "Save _ImageCache"
-msgstr "Guarda _ImagenCache"
+#: ../lib/advene/core/webcherry.py:1191 ../lib/advene/core/webcherry.py:1267
+#: ../lib/advene/core/webcherry.py:1276 ../lib/advene/core/webcherry.py:1284
+#: ../lib/advene/core/webcherry.py:1444 ../lib/advene/core/webcherry.py:1452
+#: ../lib/advene/core/webcherry.py:1460 ../lib/advene/core/webcherry.py:2022
+#: ../lib/advene/core/webcherry.py:2029
+msgid "Error"
+msgstr "Error"
 
-#: ../lib/advene/gui/main.py:298
-msgid "Save the contents of the ImageCache to disk"
-msgstr "Guarda los contenidos de la ImagenCache a disco"
+#: ../lib/advene/core/webcherry.py:1192
+#, python-format
+msgid "The TALES expression %s is not valid."
+msgstr "La expresion TALES %s no es válida."
 
-#: ../lib/advene/gui/main.py:299
-msgid "Reset ImageCache"
-msgstr "Restablecer ImageCache"
+#: ../lib/advene/core/webcherry.py:1244
+msgid "Content mode not available on non-content data"
+msgstr "El modo de contenido no esta disponible en data sin contenido "
 
-#: ../lib/advene/gui/main.py:299
-msgid "Reset the ImageCache"
-msgstr "Restablecer la ImageCache"
+#: ../lib/advene/core/webcherry.py:1268 ../lib/advene/core/webcherry.py:1277
+#: ../lib/advene/core/webcherry.py:1285 ../lib/advene/core/webcherry.py:1306
+#: ../lib/advene/core/webcherry.py:1310 ../lib/advene/core/webcherry.py:1445
+#: ../lib/advene/core/webcherry.py:1453 ../lib/advene/core/webcherry.py:1461
+#: ../lib/advene/core/webcherry.py:1520 ../lib/advene/core/webcherry.py:1597
+#: ../lib/advene/core/webcherry.py:1717 ../lib/advene/core/webcherry.py:1767
+msgid "<h1>Error</h1>"
+msgstr "<h1>Error</h1>"
 
-#: ../lib/advene/gui/main.py:300
-msgid "_Restart player"
-msgstr "_Reinicia reproductor"
+#: ../lib/advene/core/webcherry.py:1269 ../lib/advene/core/webcherry.py:1311
+#, python-format
+msgid ""
+"<p>There was an error in the template code.</p>\n"
+"                <p>Tag name: <strong>%(tagname)s</strong></p>\n"
+"                <p>Error message: <em>%(message)s</em></p>"
+msgstr ""
+"<p>Hubo un error en el código de la plantilla.</p>\n"
+"                <p>Nombre de la etiqueta: <strong>%(tagname)s</strong></p>\n"
+"                <p>Mensaje de error: <em>%(message)s</em></p>"
 
-#: ../lib/advene/gui/main.py:300
-msgid "Restart the player"
-msgstr "Reiniciar el reproductor"
+#: ../lib/advene/core/webcherry.py:1278
+#, python-format
+msgid ""
+"<p>An invalid character is in the Context:</p>\n"
+"                <p>Error message: <em>%(error)s</em></p><pre>%(message)s</"
+"pre>"
+msgstr ""
+"<p>Un carácter no válido está en el Contexto:</p>\n"
+"                <p>Mensaje de error: <em>%(error)s</em></p><pre>%(message)s</"
+"pre>"
 
-#: ../lib/advene/gui/main.py:302
-msgid "Update annotation screenshots"
-msgstr "Actualizar las capturas de anotaciones"
+#: ../lib/advene/core/webcherry.py:1286
+#, python-format
+msgid ""
+"<p>There was an error in the TALES expression.</p>\n"
+"                <pre>%s</pre>"
+msgstr ""
+"<p>Hubo un error en la expresion de TALES.</p>\n"
+"                <pre>%s</pre>"
 
-#: ../lib/advene/gui/main.py:302
-msgid "Update screenshots for annotation bounds"
-msgstr "Actualizar las capturas de los límites de anotación"
+#: ../lib/advene/core/webcherry.py:1307
+#, python-format
+msgid ""
+"<p>There was an error.</p>\n"
+"                <pre>%s</pre>"
+msgstr ""
+"<p>Hubo un error.</p>\n"
+"                <pre>%s</pre>"
 
-#: ../lib/advene/gui/main.py:303
-msgid "Detect shots"
-msgstr "Detectar tomas"
+#: ../lib/advene/core/webcherry.py:1331
+#, python-format
+msgid ""
+"\n"
+"            <hr>\n"
+"            <p>\n"
+"            Location: %(location)s<br>\n"
+"            <form name=\"navigation\" method=\"GET\">\n"
+"            <a href=\"%(levelup)s\">Up one level</a> |\n"
+"            Next level :\n"
+"            <select name=\"path\" onchange=\"submit()\">\n"
+"            "
+msgstr ""
+"\n"
+"            <hr>\n"
+"            <p>\n"
+"            Ubicación: %(location)s<br>\n"
+"            <form name=\"navigation\" method=\"GET\">\n"
+"            <a href=\"%(levelup)s\">Un nivel arriba</a> |\n"
+"            Siguiente nivel :\n"
+"            <select name=\"path\" onchange=\"submit()\">\n"
+"            "
 
-#: ../lib/advene/gui/main.py:303
-msgid "Automatically detect shots"
-msgstr "Detectar tomas automáticamente"
+#: ../lib/advene/core/webcherry.py:1349
+msgid ""
+"\n"
+"            </select> View: <select name=\"view\" onchange=\"submit()\">\n"
+"            <option selected></option>\n"
+"            "
+msgstr ""
+"\n"
+"            </select> Vista: <select name=\"view\" onchange=\"submit()\">\n"
+"            <option selected></option>\n"
+"            "
 
-#: ../lib/advene/gui/main.py:304
-msgid "Select the player plugin"
-msgstr "Selecciona el plugin del reproductor"
+#: ../lib/advene/core/webcherry.py:1367
+#, python-format
+msgid ""
+"<hr>\n"
+"            <p>Evaluating expression \"<strong>%(expression)s</strong>\" on "
+"package %(uri)s returns %(value)s</p>\n"
+"            "
+msgstr ""
+"<hr>\n"
+"            <p>Evaluando expresión \"<strong>%(expression)s</strong>\" en el "
+"paquete %(uri)s regresa %(value)s</p>\n"
+"            "
 
-#: ../lib/advene/gui/main.py:307
-msgid "No package"
-msgstr "No paquete"
+#: ../lib/advene/core/webcherry.py:1403
+#, python-format
+msgid "<p>Package <strong>%s</strong> not loaded</p>"
+msgstr "<p>Paquete <strong>%s</strong> no cargado</p>"
 
-#: ../lib/advene/gui/main.py:309
-msgid "_Help"
-msgstr "_Ayuda"
+#: ../lib/advene/core/webcherry.py:1446
+#, python-format
+msgid ""
+"<p>There was an error in the template code.</p>\n"
+"            <p>Tag name: <strong>%(tagname)s</strong></p>\n"
+"            <p>Error message: <em>%(message)s</em></p>"
+msgstr ""
+"<p>Hubo un error en el código de la plantilla.</p>\n"
+"            <p>Nombre de la etiqueta: <strong>%(tagname)s</strong></p>\n"
+"            <p>Mensaje de error: <em>%(message)s</em></p>"
 
-#: ../lib/advene/gui/main.py:310
-msgid "Help"
-msgstr "Ayuda"
+#: ../lib/advene/core/webcherry.py:1454
+#, python-format
+msgid ""
+"<p>There was an error in the expression.</p>\n"
+"            <pre>%s</pre>"
+msgstr ""
+"<p>Hubo un error en la expresion.</p>\n"
+"            <pre>%s</pre>"
 
-#: ../lib/advene/gui/main.py:311
-msgid "Get support"
-msgstr "Obtener soporte"
+#: ../lib/advene/core/webcherry.py:1462
+#, python-format
+msgid ""
+"<p>Cannot resolve TALES expression %(expr)s on package %(package)s<p><pre>\n"
+"            %(type)s\n"
+"            %(value)s\n"
+"            %(traceback)s</pre>"
+msgstr ""
+"<p>No se puede resolver la expresión TALES %(expr)s en el paquete "
+"%(package)s<p><pre>\n"
+"            %(type)s\n"
+"            %(value)s\n"
+"            %(traceback)s</pre>"
 
-#: ../lib/advene/gui/main.py:312
-msgid "Check for updates"
-msgstr "Revisar actualizaciones"
+#: ../lib/advene/core/webcherry.py:1521 ../lib/advene/core/webcherry.py:1718
+msgid "<p>Cannot set the value : invalid path</p>"
+msgstr "<p>No puedo asignar el valor : ruta no valida</p>"
 
-#: ../lib/advene/gui/main.py:313
-msgid "Display shortcuts"
-msgstr "Mostrar tomas"
+#: ../lib/advene/core/webcherry.py:1583 ../lib/advene/core/webcherry.py:1836
+#, python-format
+msgid ""
+"<h1>Error</h1><p>When creating resource %(path)s, the resource folder "
+"%(folder)s could not be created.</p>"
+msgstr ""
+"<h1>Error</h1><p>Cuando se crea un recurso %(path)s, la carpeta del recurso "
+"%(folder)s no pudo ser creada.</p>"
+
+#: ../lib/advene/core/webcherry.py:1592 ../lib/advene/core/webcherry.py:1846
+msgid "Resource successfuly created/updated"
+msgstr "Recurso se creó/actualizó satisfactoriamente"
+
+#: ../lib/advene/core/webcherry.py:1601
+msgid "Value successfuly updated"
+msgstr "Valor actualizado satisfactoriamente"
+
+#: ../lib/advene/core/webcherry.py:1603
+#, python-format
+msgid ""
+"Unable to update the attribute %(attribute)s for element %(element)s: "
+"%(error)s."
+msgstr ""
+"Incapaz de actualizar el atributo %(attribute)s para el elemento "
+"%(element)s: %(error)s."
+
+#: ../lib/advene/core/webcherry.py:1714
+msgid "<p>Invalid request</p>."
+msgstr "<p>Peticion no valida</p>."
+
+#: ../lib/advene/core/webcherry.py:1778 ../lib/advene/core/webcherry.py:1795
+msgid "Value updated"
+msgstr "Valor actualizado"
+
+#: ../lib/advene/core/webcherry.py:1779
+#, python-format
+msgid ""
+"\n"
+"                <h1>Value updated</h1>\n"
+"                The value of %(path)s has been updated to\n"
+"                <pre>\n"
+"                %(value)s\n"
+"                </pre>\n"
+"                "
+msgstr ""
+"\n"
+"                <h1>Valor actualizado</h1>\n"
+"                El valor de f %(path)s ha sido actualizado a\n"
+"                <pre>\n"
+"                %(value)s\n"
+"                </pre>\n"
+"                "
+
+#: ../lib/advene/core/webcherry.py:1796
+#, python-format
+msgid ""
+"\n"
+"                    <h1>Value updated</h1>\n"
+"                    The value of %(path)s has been updated to\n"
+"                    <pre>\n"
+"                    %(value)s\n"
+"                    </pre>\n"
+"                    "
+msgstr ""
+"\n"
+"                    <h1>Valor actualizado</h1>\n"
+"                    El valor de %(path)s ha sido actualizado a\n"
+"                    <pre>\n"
+"                    %(value)s\n"
+"                    </pre>\n"
+"                    "
+
+#: ../lib/advene/core/webcherry.py:1807
+#, python-format
+msgid ""
+"Malformed request: cannot update the value of %(attribute)s in %(tales)s."
+msgstr ""
+"Petición mal formada: no se puede actualizar el valor de %(attribute)s en "
+"%(tales)s."
+
+#: ../lib/advene/core/webcherry.py:1850
+msgid "Cannot create an element in something else than a package."
+msgstr "No se puede crear un elemento en algo distinto a un paquete."
 
-#: ../lib/advene/gui/main.py:314
-msgid "Display logfile"
-msgstr "Mostrar bitácora (logfile)"
+#: ../lib/advene/core/webcherry.py:1867
+#, python-format
+msgid "The identifier %s already exists."
+msgstr "El identificador %s ya existe."
 
-#: ../lib/advene/gui/main.py:314
-msgid "Display log file"
-msgstr "Mostrar bitácora (log file)"
+#: ../lib/advene/core/webcherry.py:1879
+#, python-format
+msgid "<p>Error while creating view %(id)s</p><pre>%(error)s</pre>"
+msgstr "<p>Error mientras se creaba la vista %(id)s</p><pre>%(error)s</pre>"
 
-#: ../lib/advene/gui/main.py:315
-msgid "Open logfile folder"
-msgstr "Abrir archivo de bitácoras (logfile)"
+#: ../lib/advene/core/webcherry.py:1885
+msgid "View created"
+msgstr "Vista creada"
 
-#: ../lib/advene/gui/main.py:315
+#: ../lib/advene/core/webcherry.py:1886
+#, python-format
 msgid ""
-"Display logfile folder. It can help when sending the advene.log file by e-"
-"mail."
+"\n"
+"                 <h1>View <em>%(id)s</em> created</h1>\n"
+"                 <p>The view <a href=\"%(url)s\">%(id)s</a> was successfully "
+"created.</p>\n"
+"                 "
 msgstr ""
-"Mostrar el folder de las bitácoras. Puede ser de ayuda cuando se mande el "
-"archivo advene.log por e-mail."
+"\n"
+"                 <h1>Vista <em>%(id)s</em> creada</h1>\n"
+"                 <p>La vista <a href=\"%(url)s\">%(id)s</a> se creó "
+"satisfactoriamente.</p>\n"
+"                 "
 
-#: ../lib/advene/gui/main.py:316
-msgid "_About"
-msgstr "_Acerca"
+#: ../lib/advene/core/webcherry.py:1902
+#, python-format
+msgid "Missing %s parameter"
+msgstr "Parámetro %s faltante"
+
+#: ../lib/advene/core/webcherry.py:1905
+#, python-format
+msgid "Relation type %s does not exist"
+msgstr "La relación del tipo %s no existe"
+
+#: ../lib/advene/core/webcherry.py:1912 ../lib/advene/core/webcherry.py:1915
+#, python-format
+msgid "Annotation %s does not exist"
+msgstr "La anotación del tipo %s no existe"
 
-#: ../lib/advene/gui/main.py:336 ../lib/advene/gui/main.py:3750
+#: ../lib/advene/core/webcherry.py:1918
 #, python-format
 msgid ""
-"Cannot load package %(filename)s:\n"
-"%(error)s"
+"<p>Cannot create relation between %(member1)s and %(member2)s: invalid type</"
+"p>"
 msgstr ""
-"No se puede cargar el paquete %(filename)s:\n"
-"%(error)s"
+"<p>No se puede crear una relación entre %(member1)s y %(member2)s: tipo no "
+"válido</p>"
 
-#: ../lib/advene/gui/main.py:344
-msgid "Open a package file"
-msgstr "Abre un archivo de paquete"
+#: ../lib/advene/core/webcherry.py:1930
+#, python-format
+msgid ""
+"<p>Error while creating relation between %(member1)s and %(member2)s :</"
+"p><pre>%(error)s</pre>"
+msgstr ""
+"<p>Error mientras se creaba una relación entre %(member1)s y %(member2)s :</"
+"p><pre>%(error)s</pre>"
 
-#: ../lib/advene/gui/main.py:345
-msgid "Save the current package"
-msgstr "Guarda el paquete actual"
+#: ../lib/advene/core/webcherry.py:1933
+msgid "Relation created"
+msgstr "Relación creada"
 
-#: ../lib/advene/gui/main.py:346
-msgid "Save the package with a new name"
-msgstr "Guarda el paquete actual con un nuevo nombre"
+#: ../lib/advene/core/webcherry.py:1934
+#, python-format
+msgid "<h1>Relation <em>%s</em> created</h1>"
+msgstr "<h1>La relación <em>%s</em> fue creada</h1>"
 
-#: ../lib/advene/gui/main.py:347
-msgid "Select movie file..."
-msgstr "Seleccionar archivo de pelicula"
+#: ../lib/advene/core/webcherry.py:1944
+#, python-format
+msgid "Annotation type %s does not exist"
+msgstr "La anotación del tipo %s no existe"
 
-#: ../lib/advene/gui/main.py:348
-msgid "Select DVD"
-msgstr "Selecciona DVD"
+#: ../lib/advene/core/webcherry.py:1961
+#, python-format
+msgid ""
+"<p>Error while creating annotation of type %(type)s :<pre>\n"
+"                    %(errortype)s\n"
+"                    %(value)s\n"
+"                    %(traceback)s</pre>"
+msgstr ""
+"<p>Error mientras se creaba una anotación del tipo %(type)s :<pre>\n"
+"                    %(errortype)s\n"
+"                    %(value)s\n"
+"                    %(traceback)s</pre>"
 
-#: ../lib/advene/gui/main.py:352
-msgid "Create a text annotation"
-msgstr "Crear una anotación de texto"
+#: ../lib/advene/core/webcherry.py:1973
+#, python-format
+msgid "Annotation %s created"
+msgstr "Anotación %s creada"
 
-#: ../lib/advene/gui/main.py:353
-msgid "Create a graphical annotation"
-msgstr "Crear una anotación gráfica"
+#: ../lib/advene/core/webcherry.py:1975
+#, python-format
+msgid "Error: Cannot create an object of type %s."
+msgstr "Error: No se puede crear un objeto del tipo %s."
 
-#: ../lib/advene/gui/main.py:359
-msgid "List recently opened packages"
-msgstr "Listar los paquetes abiertos recientemente"
+#: ../lib/advene/core/webcherry.py:1978
+#, python-format
+msgid ""
+"Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</"
+"code></p>"
+msgstr ""
+"Error: No se puede realizar la acción <em>%(action)s</em> en <code>"
+"%(object)s</code></p>"
 
-#: ../lib/advene/gui/main.py:389
-msgid "Snapshotter activity"
-msgstr "Actividad de Snapshotter"
+#: ../lib/advene/core/webcherry.py:1991
+msgid "Available actions"
+msgstr "Acciones disponibles"
 
-#: ../lib/advene/gui/main.py:391
+#: ../lib/advene/core/webcherry.py:2000
 #, python-format
-msgid "%d queued requests"
-msgstr "%d peticiones en fila"
-
-#: ../lib/advene/gui/main.py:392
-msgid "Cancel all requests"
-msgstr "Cancelar todas las peticiones"
+msgid "<li>%(name)s: %(value)s"
+msgstr "<li>%(name)s: %(value)s"
 
-#: ../lib/advene/gui/main.py:397
-msgid "No snapshotter"
-msgstr "No hay snapshotter"
+#: ../lib/advene/core/webcherry.py:2023
+#, python-format
+msgid "<p>Unknown action</p><pre>Action: %s</pre>"
+msgstr "<p>Acción desconocida</p><pre>Acción: %s</pre>"
 
-#: ../lib/advene/gui/main.py:419
-msgid "No snapshotting activity"
-msgstr "No hay actividad snapshotter"
+#: ../lib/advene/core/webcherry.py:2030
+msgid "Missing parameter(s) :<ul>"
+msgstr "Parámetro(s) faltante(s):<ul>"
 
-#: ../lib/advene/gui/main.py:423
-msgid "Snapshotting"
-msgstr "Snapshotteando"
+#: ../lib/advene/core/webcherry.py:2066
+msgid "Advene web resources"
+msgstr "Recursos web de Advene"
 
-#: ../lib/advene/gui/main.py:440
-msgid "Display application log messages"
-msgstr "Mostrar los archivos de bitácora de la aplicación"
+#: ../lib/advene/core/webcherry.py:2072
+msgid "Advene webserver"
+msgstr "Servidor web de advene"
 
-#: ../lib/advene/gui/main.py:482
-msgid "Quicksearch lists"
-msgstr "Buscar rápidamente en listas"
+#: ../lib/advene/core/webcherry.py:2073
+#, fuzzy, python-format
+msgid ""
+"<p>Welcome on the <a href=\"http://advene.org/\">Advene</a> webserver run by "
+"%(userid)s on %(serveraddress)s.</p>"
+msgstr ""
+"<p>Bienvenido al servidor web <a href=\"http://liris.cnrs.fr/advene/"
+"\">Advene</a> ejecutado por %(userid)s en %(serveraddress)s.</p>"
 
-#: ../lib/advene/gui/main.py:488
-msgid "Please specify the lists of elements to be searched."
-msgstr "Por favor especifica las listas de elementos donde se va a buscar."
+#: ../lib/advene/core/webcherry.py:2080
+msgid ""
+" <p>No package is loaded. You can access the <a href=\"/admin\">server "
+"administration page</a>.<p>"
+msgstr ""
+" <p>No hay paquete cargado. Puedes accesar a la<a href=\"/admin\">pagina de "
+"administrador del servidor</a>.<p>"
 
-#: ../lib/advene/gui/main.py:507
+#: ../lib/advene/core/webcherry.py:2090
 #, python-format
 msgid ""
-"Searching on %s.\n"
-"Left click to launch the search, right-click to set the quicksearch options"
+"the <a href=\"/packages/%(alias)s/view/%(view)s\">loaded package's default "
+"view</a>"
 msgstr ""
-"Buscando en %s.\n"
-"Clic-izquierdo para lanzar la búsqueda, clic-derecho para establecer las "
-"opciones de búsqueda rápida"
+"el <a href=\"/packages/%(alias)s/view/%(view)s\"> cargó la vista "
+"predeterminada del paquete</a>"
 
-#: ../lib/advene/gui/main.py:508
+#: ../lib/advene/core/webcherry.py:2092
 #, python-format
-msgid "String to search in %s"
-msgstr "Cadena a buscar en %s"
+msgid "the <a href=\"/packages/%s\">loaded package's data</a>"
+msgstr "la <a href=\"/packages/%s\">informacion de los paquetes cargados</a>"
 
-#: ../lib/advene/gui/main.py:521 ../lib/advene/gui/main.py:525
-msgid "Tracing : "
-msgstr "Rastreando :"
+#: ../lib/advene/core/webcherry.py:2094
+msgid "the <a href=\"/packages\">loaded packages' data</a>"
+msgstr "la <a href=\"/packages\">informacion de los paquetes cargados</a>"
 
-#: ../lib/advene/gui/main.py:521
-msgid "off"
-msgstr "apagado"
+#: ../lib/advene/core/webcherry.py:2095
+#, python-format
+msgid ""
+" <p>You can either access %s or the <a href=\"/admin\">server administration "
+"page</a>.<p>"
+msgstr ""
+" <p>Puedes accesar %s a a la <a href=\"/admin\">pagina del servidor de "
+"administracion</a>.<p>"
 
-#: ../lib/advene/gui/main.py:525
-msgid "on"
-msgstr "en"
+#: ../lib/advene/core/webcherry.py:2097
+#, fuzzy, python-format
+msgid ""
+"<hr><p align=\"right\"><em>Document generated by <a href=\"http://advene.org/"
+"\">Advene</a> v. %s.</em></p>"
+msgstr ""
+"<hr><p align=\"right\"><em>Documento generado por <a href=\"http://liris."
+"cnrs.fr/advene/\">Advene</a> v. %s.</em></p>"
 
-#: ../lib/advene/gui/main.py:545
-msgid "Launch search"
-msgstr "Lanzar búsqueda"
+#: ../lib/advene/core/webcherry.py:2182 ../lib/advene/core/webcherry.py:2191
+#, python-format
+msgid "Cannot start HTTP server: %s"
+msgstr "No se puede iniciar el servidor HTTP: %s"
 
-#: ../lib/advene/gui/main.py:550
-msgid "Ignore case"
-msgstr "Ignorar mayúsculas / minúsculas"
+#: ../lib/advene/core/controller.py:433
+msgid "No available GUI"
+msgstr "No hay interfaz gráfica de usuario disponible"
 
-#: ../lib/advene/gui/main.py:555
-msgid "Searched elements"
-msgstr "Elementos buscados"
+#: ../lib/advene/core/controller.py:452
+msgid "No available event handler"
+msgstr "No hay un control de evento disponible"
 
-#: ../lib/advene/gui/main.py:625
-msgid "Playing"
-msgstr "Reproduciendo"
+#: ../lib/advene/core/controller.py:460
+msgid "No available gui"
+msgstr "No hay una intefaz gráfica de usuario disponible"
 
-#: ../lib/advene/gui/main.py:626
-msgid "Pause"
-msgstr "Pausar"
+#: ../lib/advene/core/controller.py:476
+#, python-format
+msgid "Warning: redefining an existing feature %s"
+msgstr "Advertencia: Definiendo de nuevo una característica existente %s"
 
-#: ../lib/advene/gui/main.py:627
-msgid "Init"
-msgstr "Inicio"
+#: ../lib/advene/core/controller.py:608
+#, fuzzy
+msgid "Annotations in current package"
+msgstr "Todas las anotaciones del paquete"
 
-#: ../lib/advene/gui/main.py:629
-msgid "Undefined"
-msgstr "Sin definir"
+#: ../lib/advene/core/controller.py:609
+#, fuzzy
+msgid "Annotations in all packages"
+msgstr "Todas las anotaciones del paquete"
 
-#: ../lib/advene/gui/main.py:901
-msgid "Enter the new time value"
-msgstr "Ingresa un nuevo valor de tiempo"
+#: ../lib/advene/core/controller.py:611
+msgid "Ids"
+msgstr "Ids"
 
-#: ../lib/advene/gui/main.py:925
+#: ../lib/advene/core/controller.py:803
 #, python-format
-msgid "Replace content in %d elements"
-msgstr "Reemplazar contenido en %d elementos"
+msgid ""
+"Cannot start the webserver\n"
+"The following processes seem to use the %(port)s port: %(processes)s"
+msgstr ""
+"No se puede iniciar el servidor web \n"
+"Los siguientes procesos parecen utilizar el %(port)s puerto: %(processes)s"
 
-#: ../lib/advene/gui/main.py:938
-msgid "Find word"
-msgstr "Encontrar palabra"
+#: ../lib/advene/core/controller.py:852 ../lib/advene/core/controller.py:863
+#, python-format
+msgid "Loaded %(uri)s as %(alias)s"
+msgstr "Cargados %(uri)s como %(alias)s"
 
-#: ../lib/advene/gui/main.py:945
-msgid "Replace by"
-msgstr "Reemplazar por"
+#: ../lib/advene/core/controller.py:854 ../lib/advene/core/controller.py:866
+#, python-format
+msgid "Cannot load package from file %(uri)s: %(error)s"
+msgstr "No se puede cargar el paquete del archivo %(uri)s: %(error)s"
 
-#: ../lib/advene/gui/main.py:973
+#: ../lib/advene/core/controller.py:905
+msgid "Deactivating web server"
+msgstr "Desactivando el servidor web"
+
+#: ../lib/advene/core/controller.py:1013
 #, python-format
-msgid "%(search)s has been replaced by %(replace)s in %(count)d element(s)."
+msgid "Cannot get audio volume: %s"
+msgstr "No se puede obtener el volumen del audio: %s"
+
+#: ../lib/advene/core/controller.py:1025
+#, python-format
+msgid "Cannot open Advene URL %s: the webserver is not running."
 msgstr ""
-"%(search)s ha sido reemplazado por %(replace)s en %(count)d elemento(s)."
+"No se puede abrir el URL %s de Advene: el servidor web no está corriendo. "
+
+#: ../lib/advene/core/controller.py:1284
+#, python-format
+msgid "Found matching video file in moviepath: %s"
+msgstr "Encontre video concordante en la ruta: %s"
+
+#: ../lib/advene/core/controller.py:1310 ../lib/advene/core/controller.py:1312
+msgid "Analysis of "
+msgstr "Análisis de"
 
-#: ../lib/advene/gui/main.py:982
-msgid "The video extracting feature is not available."
-msgstr "La característica de extracción de video no está disponible"
+#: ../lib/advene/core/controller.py:1536
+msgid "Cannot split the annotation: the given position is outside."
+msgstr ""
+"No se puede dividir la anotación: la posición especificada se encuentra "
+"fuera. "
 
-#: ../lib/advene/gui/main.py:985
-msgid "Video export"
-msgstr "Exportar video"
+#: ../lib/advene/core/controller.py:1785
+#, python-format
+msgid "Cannot find the template package %(filename)s: %(error)s"
+msgstr "No se encuentra el paquete de plantilla %(filename)s: %(error)s"
 
-#: ../lib/advene/gui/main.py:987
+#: ../lib/advene/core/controller.py:1832
 #, python-format
-msgid "Exporting video montage/fragment to %%(filename)s"
-msgstr "Exportando el montaje de video  / fragmento a %%(filename)s"
+msgid "Cannot read the imported package %(uri)s: %(error)s"
+msgstr "No se puede leer el paquete importado %(uri)s: %(error)s"
 
-#: ../lib/advene/gui/main.py:989
-msgid "Please choose a destination filename"
-msgstr "Por favor elige un nombre de archivo para el destino"
+#: ../lib/advene/core/controller.py:2064
+msgid "Package URI has changed. Reloading package with new URI."
+msgstr "El paquete URI ha cambiado. Recargando el paquete con un nuevo URI"
 
-#: ../lib/advene/gui/main.py:1067
+#: ../lib/advene/core/controller.py:2082
 msgid ""
-"No media association is defined in the package. Please use the 'File/"
-"Associate a video file' menu item to associate a media file."
+"Cannot load package: the following annotations do not have Millisecond "
+"fragments:"
 msgstr ""
-"No se encontró una asociación medios definida en el paquete. Utiliza el "
-"elemento de menú 'Archivo / asociar un archivo de vídeo' para asociar un "
-"archivo multimedia."
+"No puedo cargar el paquete: las anotaciones siguientes no tienen fragmentos "
+"de milisegundos:"
 
-#: ../lib/advene/gui/main.py:1069
+#: ../lib/advene/core/controller.py:2108
 #, python-format
-msgid ""
-"The associated media %s could not be found. Please use the 'File/Associate a "
-"video file' menu item to associate a media file."
+msgid "Cannot handle master attribute, the package %s is not imported."
 msgstr ""
-"Los medios asociados %s no se pudieron encontrar. Utiliza el elemento de "
-"menú 'Archivo / asociar un archivo de vídeo' para asociar un archivo "
-"multimedia."
+"No se puede manejar el atributo maestro, el paquete %s no está importado. "
 
-#: ../lib/advene/gui/main.py:1071
+#: ../lib/advene/core/controller.py:2110
 #, python-format
-msgid ""
-"You are now working with the following video:\n"
-"%s"
+msgid "Checking master package %s for not yet imported elements."
 msgstr ""
-"Ahora estás trabajando con el siguiente video:\n"
-"%s"
-
-#: ../lib/advene/gui/main.py:1188
-msgid "Open this view..."
-msgstr "Abrir esta vista..."
-
-#: ../lib/advene/gui/main.py:1205
-msgid "_All available views"
-msgstr "Todas las vistas disponibles _A"
+"Revisando el paquete maestro %s para los elementos que todavía no son "
+"importados. "
 
-#: ../lib/advene/gui/main.py:1224
-msgid "Transcription of annotations"
-msgstr "Transcripción de las anotaciones"
+#: ../lib/advene/core/controller.py:2150
+msgid "Standard summary"
+msgstr "Resumen estándar."
 
-#: ../lib/advene/gui/main.py:1227
-msgid "Note-taking editor"
-msgstr "Editor para tomar notas"
+#: ../lib/advene/core/controller.py:2155
+msgid "Default view"
+msgstr "Vista por omision"
 
-#: ../lib/advene/gui/main.py:1228
-msgid "Active bookmarks"
-msgstr "Separadores activos"
+#: ../lib/advene/core/controller.py:2197
+#, python-format
+msgid ""
+"Infinite loop in STBV %(name)s: the %(imp)s view is invoked multiple times."
+msgstr ""
+"Ciclo infinito en STBV %(name)s: la vista %(imp)s es invocada muchas veces. "
 
-#: ../lib/advene/gui/main.py:1229
-msgid "Schema editor"
-msgstr "Editor de esquema"
+#: ../lib/advene/core/controller.py:2283
+#, fuzzy
+msgid "Got exception when stopping player."
+msgstr "Hubo excepcion %s cuando se detuvo el reproductor."
 
-#: ../lib/advene/gui/main.py:1233
-msgid "TALES explorer"
-msgstr "Explorador TALES"
+#: ../lib/advene/core/controller.py:2335
+#, fuzzy
+msgid "Video player problem"
+msgstr "Reproductor de video"
 
-#: ../lib/advene/gui/main.py:1234
-msgid "Dynamic montage"
-msgstr "Montaje dinámico"
+#: ../lib/advene/core/controller.py:2362
+msgid "Unable to start the player."
+msgstr "Incapaz de inicializar el reproductor."
 
-#: ../lib/advene/gui/main.py:1238
-msgid "Open a comment view in the web browser"
-msgstr "Abrir una vista de comentario en un navegador web"
+#: ../lib/advene/core/controller.py:2569
+#, python-format
+msgid "Comment on set of %d annotations"
+msgstr "Comentarios sobre el conjunto de %d anotaciones"
 
-#: ../lib/advene/gui/main.py:1239
-msgid "Create or open a comment view"
-msgstr "Crear o abrir una vista de comentario"
+#: ../lib/advene/core/controller.py:2571
+#, python-format
+msgid "Comment on %s"
+msgstr "Comentar en %s"
 
-#: ../lib/advene/gui/main.py:1242
+#: ../lib/advene/core/controller.py:2575
+#, python-format
 msgid ""
-"Edit window placeholder (annotation and relation edit windows will be put "
-"here)"
+"<h1>Comment on %(title)s</h1>\n"
+"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
+"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
+"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
+"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
+"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
+"\"%(imgurl)s\" ></img></a></span>"
 msgstr ""
-"Editar ventana de marcador de posición (anotación y relaciones ventanas de "
-"edición se pondrán aquí)"
+"<h1>Comentar en %(title)s</h1>\n"
+"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
+"presentation=\"link:snapshot\"><a title=\"Clic para reproducir el video en "
+"Advene\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
+"\"%(href)s\"><img title=\"Clic aquí para reproducir\" width=\"160\" height="
+"\"100\" tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
+"\"%(imgurl)s\" ></img></a></span>"
 
-#: ../lib/advene/gui/main.py:1243
-msgid "Display edition history"
-msgstr "Muestra el historial de edición"
+#: ../lib/advene/core/controller.py:2585
+#, python-format
+msgid "List of %s annotations"
+msgstr "Lista de %s anotaciones"
 
-#: ../lib/advene/gui/main.py:1244
-msgid "Visualise the activity trace preview"
-msgstr "Visualizar la vista previa de la actividad de rastreo"
+#: ../lib/advene/core/controller.py:2620
+#, python-format
+msgid "Cannot export to %(filename)s: %(e)s"
+msgstr "No se puede exportar a %(filename)s: %(e)s"
 
-#: ../lib/advene/gui/main.py:1245
-msgid "Visualise the activity trace as a timeline"
-msgstr "Visualizar la actividad de rastreo como línea de tiempo"
+#: ../lib/advene/core/controller.py:2635
+#, fuzzy
+msgid "Error when exporting text template"
+msgstr "Error mientras se exportaba: %s"
 
-#: ../lib/advene/gui/main.py:1274
-msgid "The webserver could not be started. Static views cannot be accessed."
-msgstr ""
-"El servidor web no pudo ser iniciarse. No se pueden acceder las vistas "
-"estáticas."
+#: ../lib/advene/core/controller.py:2644
+#, fuzzy
+msgid "Error when exporting XML template"
+msgstr "Error mientras se exportaba: %s"
 
-#: ../lib/advene/gui/main.py:1352
-#, python-format
+#: ../lib/advene/plugins/featuredetect.py:45
+msgid "Feature detection (face...)"
+msgstr "Característica detección (rostro...)"
+
+#: ../lib/advene/plugins/featuredetect.py:60
+msgid "Sensitivity level."
+msgstr "Nivel de sensibilidad"
+
+#: ../lib/advene/plugins/featuredetect.py:63
 msgid ""
-"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s has been "
-"released</b> on %(date)s, but you are running version %(current)s.\n"
-"You can download the latest version from the Advene website: http://liris."
-"cnrs.fr/advene/</span>"
+"Scale. Original image size will be divided by this factor, in order to speed "
+"up detection."
 msgstr ""
-"<span background=\"#ff8888\" size=\"large\"><b>La versión %(version)s de "
-"Advene ha sido liberada</b> en %(date)s, pero estás utilizando la versión "
-"%(current)s.\n"
-"Puedes descargar la última versión del sitio web de Advene: http://liris."
-"cnrs.fr/advene/</span>"
-
-#: ../lib/advene/gui/main.py:1357
-msgid "Go to the website"
-msgstr "Ir al sitio web"
+"Escala. La imagen original se va a dividir por este factor, para agilizar la "
+"detección. "
 
-#: ../lib/advene/gui/main.py:1363
-msgid "Advene release"
-msgstr "Liberación de Advene"
+#: ../lib/advene/plugins/featuredetect.py:66
+msgid "Classifier"
+msgstr "Clasificador"
 
-#: ../lib/advene/gui/main.py:1369
+#: ../lib/advene/plugins/featuredetect.py:80
 #, python-format
-msgid "You are using a up-to-date version of Advene (%(current)s)."
-msgstr ""
-"Estás utilizando una versión actualizada de advene Advene (%(current)s)."
-
-#: ../lib/advene/gui/main.py:1369
-msgid "Advene is up-to-date"
-msgstr "Advene está actualizado"
+msgid "Feature %s"
+msgstr "Característica %s"
 
-#: ../lib/advene/gui/main.py:1383
-msgid "Choose a color"
-msgstr "Elige un color"
+#: ../lib/advene/plugins/featuredetect.py:82
+#, python-format
+msgid "Detected %s"
+msgstr "Detectado %s"
 
-#: ../lib/advene/gui/main.py:1415
-msgid "Select an annotation to loop on it"
-msgstr "Selecciona una anotación para hacer un ciclo en ella."
+#: ../lib/advene/plugins/featuredetect.py:84
+msgid "Detection started"
+msgstr "Comenzó la detección"
 
-#: ../lib/advene/gui/main.py:1417
+#: ../lib/advene/plugins/featuredetect.py:175
 #, python-format
-msgid "Looping on %s"
-msgstr "Ciclo en %s"
+msgid "Detected %(count)d feature(s) until %(time)s"
+msgstr "Detectadas %(count)d característica(s) hasta %(time)s"
 
-#: ../lib/advene/gui/main.py:1476 ../lib/advene/gui/main.py:2367
-msgid "No active dynamic view"
-msgstr "No hay una vista dinámica activa"
+#: ../lib/advene/plugins/ted.py:39
+msgid "TED importer"
+msgstr "Importador de TED"
 
-#: ../lib/advene/gui/main.py:1487
-msgid "Create a new dynamic view."
-msgstr "Crear una nueva vista dinámica"
+#: ../lib/advene/plugins/cutter.py:40
+msgid "Audio segmentation"
+msgstr "Segmentación de audio"
 
-#: ../lib/advene/gui/main.py:1506
-msgid "Edit the current dynamic view."
-msgstr "Editar la vista dinámica actual."
+#: ../lib/advene/plugins/cutter.py:55
+msgid "Volume threshold (in dB, can be negative) before trigger."
+msgstr "Umbral de volumen (en dB, puede ser negativa) antes de disparar."
 
-#: ../lib/advene/gui/main.py:1518
-msgid "No dynamic view"
-msgstr "No vista dinamica"
+#: ../lib/advene/plugins/cutter.py:58
+#: ../lib/advene/plugins/soundenveloppe.py:64
+msgid "Channel selection."
+msgstr "Selección de canal"
 
-#: ../lib/advene/gui/main.py:1550
-msgid "Playing rate"
-msgstr "Tasa de reproducción"
+#: ../lib/advene/plugins/cutter.py:61
+msgid "Length (in ms) of drop below threshold before silence is detected"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1698
-msgid "History"
-msgstr "Historia"
+#: ../lib/advene/plugins/cutter.py:104
+#, python-format
+msgid "Detected %(count)d segments until %(time)s"
+msgstr "Detectados %(count)d segmentos hasta %(time)s"
 
-#: ../lib/advene/gui/main.py:1705
-msgid "Popups"
-msgstr "Popups"
+#: ../lib/advene/plugins/cutter.py:122
+msgid "Sound segment"
+msgstr "Segmentación de sonido "
 
-#: ../lib/advene/gui/main.py:1709
+#: ../lib/advene/plugins/cutter.py:123
+#, python-format
 msgid ""
-"You can drag and drop view icons (timeline, treeview, transcription...) in "
-"notebooks to embed various views."
+"Sound segmentation with a threshold of %(threshold)d dB - channel: "
+"%(channel)s"
 msgstr ""
-"Puedes arrastrar y soltar iconos de vistas (línea de tiempo, vista de árbol, "
-"transcripción...) en los cuadernos de notas para embeber varias vistas."
-
-#: ../lib/advene/gui/main.py:1709
-msgid "Information"
-msgstr "Información"
-
-#: ../lib/advene/gui/main.py:2004
-msgid "Cannot create annotation. There is no schema to put it in."
-msgstr "No se puede crear la anotación. No hay esquema para ponerla dentro."
-
-#: ../lib/advene/gui/main.py:2013
-msgid "Default annotation type"
-msgstr "Tipo de anotación predeterminado"
-
-#: ../lib/advene/gui/main.py:2025
-msgid "Annotation created"
-msgstr "Anotación creada"
+"Segmentación con un umbral de %(threshold)d de sonido dB - canal: %(channel)s"
 
-#: ../lib/advene/gui/main.py:2057
-msgid "Play/Pause [Control-Tab / Control-Space]"
-msgstr "Reproducir / Pausar [Control-Tab / Control-Espacio]"
+#: ../lib/advene/plugins/cutter.py:141
+msgid "Starting silence detection"
+msgstr "Iniciando detección de silencio"
 
-#: ../lib/advene/gui/main.py:2058
-#, python-format
-msgid "Rewind (%.02f s) [Control-Left]"
-msgstr "Regresar (%.02f s) [Control-Left]"
+#: ../lib/advene/plugins/ttl.py:41
+msgid "TurTLe (RDF) importer"
+msgstr "Importador TurTLe (RDF) "
 
-#: ../lib/advene/gui/main.py:2059
-#, python-format
-msgid "Forward (%.02f s) [Control-Right]"
-msgstr "Adelantar (%.02f s) [Control-Right]"
+#: ../lib/advene/plugins/shotdetect.py:38
+#, fuzzy
+msgid "Shotdetect XML importer"
+msgstr "Importador de shotdetect"
 
-#: ../lib/advene/gui/main.py:2060
-msgid "Previous frame [Control-Down]"
-msgstr "Cuadro anterior [Control-Down]"
+#: ../lib/advene/plugins/shotdetect.py:82
+msgid "No shots"
+msgstr "No hay capturas"
 
-#: ../lib/advene/gui/main.py:2061
-msgid "Next frame [Control-Up]"
-msgstr "Cuadro siguiente [Control-Up]"
+#: ../lib/advene/plugins/pocketsphinx.py:44
+msgid ""
+"Cannot register speech recognition: Pocketsphinx plugins not found. See "
+"http://cmusphinx.sourceforge.net/wiki/gstreamer for details."
+msgstr ""
+"No se puede registrar el reconocimiento de voz: No se encontraron plugins de "
+"Pocketsphinx. Ver http://cmusphinx.sourceforge.net/wiki/gstreamer para "
+"obtener más detalles."
 
-#: ../lib/advene/gui/main.py:2062
-msgid "Fullscreen"
-msgstr "Pantalla completa"
+#: ../lib/advene/plugins/pocketsphinx.py:48
+msgid "Speech recognition (PocketSphinx)"
+msgstr "Reconocimiento de voz (PocketSphinx)"
 
-#: ../lib/advene/gui/main.py:2214
-#, python-format
-msgid "Screenshot saved to %s"
-msgstr "Captura guardada en %s"
+#: ../lib/advene/plugins/pocketsphinx.py:68
+msgid "Filtering noise level [0..1]."
+msgstr "Nivel del filtro de ruido [0..1]."
 
-#: ../lib/advene/gui/main.py:2216
-#, python-format
+#: ../lib/advene/plugins/pocketsphinx.py:72
 msgid ""
-"Screenshot saved in\n"
-" %s"
+"Minimum amount (in milliseconds) of silence required to terminate the "
+"current annotation and start a new one. Decreasing this length will result "
+"in a large amount of short annotations and increasing this length will "
+"result in a small amount of long annotations."
 msgstr ""
-"Captura de pantalla guardada en\n"
-" %s"
+"Cantidad mínima (en milisegundos) de silencio requerido para terminar la "
+"anotación actual y comenzar una nueva. Disminuir esta longitud resultará en "
+"un gran cantidad de anotaciones cortas e incrementar esta longitud resultará "
+"en una menor cantidad de anotaciones largas."
 
-#: ../lib/advene/gui/main.py:2218
-#, python-format
-msgid ""
-"Could not save screenshot:\n"
-" %s"
-msgstr ""
-"No se pudo guardar la captura:\n"
-"%s"
+#: ../lib/advene/plugins/pocketsphinx.py:76
+msgid "Use default acoustic and language models."
+msgstr "Utiliza los modelos acústicos y de lenguaje predterminados. "
 
-#: ../lib/advene/gui/main.py:2226
-msgid "Save screenshot to..."
-msgstr "Guardar captura en..."
+#: ../lib/advene/plugins/pocketsphinx.py:80
+msgid "Acoustic model (directory)"
+msgstr "Modelo acústico (directorio). "
 
-#: ../lib/advene/gui/main.py:2244
-msgid "Could not take snapshot with enough precision"
-msgstr "No se pudo realizar una captura de pantalla con demasiada precisión"
+#: ../lib/advene/plugins/pocketsphinx.py:84
+msgid "Phonetic dictionary (.dic file)"
+msgstr "Diccionario fonético (archivo .dic)"
 
-#: ../lib/advene/gui/main.py:2282
-msgid "Export package data"
-msgstr "Exportar los datos del paquete"
+#: ../lib/advene/plugins/pocketsphinx.py:88
+msgid "Language model (.DMP file)"
+msgstr "Modelo de lenguaje (archivo .DMP)"
 
-#: ../lib/advene/gui/main.py:2284
-#, python-format
-msgid "Export annotation type %s"
-msgstr "Exportar tipos de anotaciones %s"
+#: ../lib/advene/plugins/pocketsphinx.py:107
+#: ../lib/advene/plugins/soundenveloppe.py:88
+#: ../lib/advene/plugins/barcode.py:62
+msgid "Generating annotations"
+msgstr "Generando anotaciones"
 
-#: ../lib/advene/gui/main.py:2286
+#: ../lib/advene/plugins/pocketsphinx.py:146
+#: ../lib/advene/plugins/barcode.py:87
 #, python-format
-msgid "Export element %s"
-msgstr "Exportar elemento %s"
+msgid "%(count)d utterances until %(time)s"
+msgstr "%(count)d declaraciones hasta %(time)s"
 
-#: ../lib/advene/gui/main.py:2312
-msgid "Export format"
-msgstr "Exportar formato"
+#: ../lib/advene/plugins/pocketsphinx.py:155
+msgid "Speech"
+msgstr "Voz"
 
-#: ../lib/advene/gui/main.py:2349
-msgid " (modified)"
-msgstr "(modificado)"
+#: ../lib/advene/plugins/pocketsphinx.py:157
+msgid "Recognized speech"
+msgstr "Reconocimiento de voz"
 
-#: ../lib/advene/gui/main.py:2352
-#, python-format
-msgid "Activate %s"
-msgstr "Activar %s"
+#: ../lib/advene/plugins/pocketsphinx.py:186
+msgid "Recognizing speech"
+msgstr "Reconociendo voz"
 
-#: ../lib/advene/gui/main.py:2523
-msgid "Saved workspace"
-msgstr "Espacio de trabajo guardado"
+#: ../lib/advene/plugins/brltty.py:64
+msgid "Input from the braille table."
+msgstr "Entrada de tabla de braille"
 
-#: ../lib/advene/gui/main.py:2575
-msgid "Restoring workspace..."
-msgstr "Restableciendo espacio de trabajo..."
+#: ../lib/advene/plugins/brltty.py:68
+msgid "BrlTTY not installed. There will be no braille support."
+msgstr "BrlTTY no está instalado. No habrá soporte para braille."
 
-#: ../lib/advene/gui/main.py:2581
-#, python-format
-msgid "Do you wish to restore the %s workspace ?"
-msgstr "¿Quieres restablecer el espacio de de trabajo %s?"
+#: ../lib/advene/plugins/brltty.py:80
+msgid "Could not initialize BrlTTY. No braille support."
+msgstr "No se pudo inicializar BrlTTY. No hay soporte para braille. "
 
-#: ../lib/advene/gui/main.py:2586
-msgid "Clear the current workspace"
-msgstr "Limpiar el espacio de trabajo actual"
+#: ../lib/advene/plugins/brltty.py:86
+msgid "Display a message in Braille"
+msgstr "Muestra un mensaje en Braille"
 
-#: ../lib/advene/gui/main.py:2607
-#, python-format
-msgid "View %s is not an adhoc view"
-msgstr "La vista %s no es una vista adhoc"
+#: ../lib/advene/plugins/brltty.py:87
+msgid "Message to display."
+msgstr "Mensaje a mostrar"
 
-#: ../lib/advene/gui/main.py:2618
+#: ../lib/advene/plugins/brltty.py:258
 #, python-format
-msgid "Cannot identify the adhoc view %s"
-msgstr "No se puede identificar una vista adhoc %s"
+msgid "BrlTTY connection error: %s"
+msgstr "Error de conexión BrlTTY: %s"
 
-#: ../lib/advene/gui/main.py:2632
-msgid "Choose the annotation type to display as transcription."
-msgstr "Elige el tipo de anotacion para mostrarlo como transcripcion."
+#: ../lib/advene/plugins/brltty.py:275
+msgid "Braille display: "
+msgstr "Visualización braille: "
 
-#: ../lib/advene/gui/main.py:2667
-#, python-format
-msgid ""
-"Error: unable to find an edit popup for %(element)s:\n"
-"%(error)s"
-msgstr ""
-"Error: no es posible encontrar una ventana flotante de edición para "
-"%(element)s:\n"
-"%(error)s"
+#: ../lib/advene/plugins/brltty.py:281
+msgid "No message"
+msgstr "Sin mensaje"
 
-#: ../lib/advene/gui/main.py:2675
-#, python-format
-msgid "Editing %s"
-msgstr "Editando %s"
+#: ../lib/advene/plugins/transcript.py:34
+#, fuzzy
+msgid "Youtube XML importer"
+msgstr "Importador AnnotationGraph"
 
-#: ../lib/advene/gui/main.py:2687
-#, python-format
-msgid "Comment view (%s)"
-msgstr "Comentar vista (%s)"
+#: ../lib/advene/plugins/transcript.py:71
+#, fuzzy
+msgid "Importing transcript"
+msgstr "Importar_Transcripcion"
 
-#: ../lib/advene/gui/main.py:2754
-#, python-format
-msgid "Package %(uri)s saved: %(annotations)s and %(relations)s."
-msgstr "Paquete %(uri)s guardado: %(annotations)s y %(relations)s."
+#: ../lib/advene/plugins/aeidon_import.py:50
+msgid "Aeidon (subtitles) importer"
+msgstr "Importador de subtítulos (Aeidon)"
 
-#: ../lib/advene/gui/main.py:2765
-#, python-format
-msgid "Activating package %s"
-msgstr "Activando paquete %s"
+#: ../lib/advene/plugins/anvil.py:38
+msgid "Anvil importer"
+msgstr "Importador Anvil"
 
-#: ../lib/advene/gui/main.py:2793
-#, python-format
-msgid "Package %(uri)s loaded: %(annotations)s and %(relations)s."
-msgstr "Paquete %(uri)s cargado: %(annotations)s y %(relations)s."
+#: ../lib/advene/plugins/fcp.py:35
+msgid "Final Cut Pro XML importer"
+msgstr "Importar XML de Final Cut Pro"
 
-#: ../lib/advene/gui/main.py:2826
-msgid "Do you want to restore the saved workspace ?"
-msgstr "¿Quieres restablecer el espacio de trabajo guardado?"
+#: ../lib/advene/plugins/fcp.py:57
+msgid "FCP clipitem"
+msgstr "Item de clip de FCP"
 
-#: ../lib/advene/gui/main.py:2833
-msgid "Advene"
-msgstr "Advene"
+#: ../lib/advene/plugins/fcp.py:77
+msgid "Importing subtitles"
+msgstr "Importando subtitulos"
 
-#: ../lib/advene/gui/main.py:3038
-#, python-format
-msgid "Got exception %s. Trying to continue."
-msgstr "Hubo excepción %s. Tratando de continuar. "
+#: ../lib/advene/plugins/fcp.py:92
+msgid "Importing clips"
+msgstr "Importando clips"
 
-#: ../lib/advene/gui/main.py:3062 ../lib/advene/gui/main.py:3083
-#: ../lib/advene/gui/main.py:4033
-msgid "Unknown"
-msgstr "Desconocido"
+#: ../lib/advene/plugins/fcp.py:95
+msgid "No clip"
+msgstr "No hay clip"
 
-#: ../lib/advene/gui/main.py:3153
-#, python-format
-msgid ""
-"The package(s) %s are modified.\n"
-"Save them now?"
+#: ../lib/advene/plugins/hpi.py:43
+msgid "HPI concept extraction"
 msgstr ""
-"Los paquete(s) %s están modificados.\n"
-"¿Guardar ahora?"
 
-#: ../lib/advene/gui/main.py:3203
-msgid "Choose an annotation type."
-msgstr "Elige un tipo de anotacion."
+#: ../lib/advene/plugins/hpi.py:109
+#, fuzzy
+msgid "Type of annotation to analyze"
+msgstr "El tipo de anotación"
 
-#: ../lib/advene/gui/main.py:3247
-msgid "No annotation type is defined."
-msgstr "No hay tipo de anotacion definido."
+#: ../lib/advene/plugins/hpi.py:114
+#, fuzzy
+msgid "URL of the webservice"
+msgstr "Ir al sitio web"
 
-#: ../lib/advene/gui/main.py:3256
-msgid "Creating a new type."
-msgstr "Creando un nuevo tipo."
+#: ../lib/advene/plugins/hpi.py:119
+msgid "Minimum confidence level (between 0.0 and 1.0)"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3260
-msgid "Title of the new type"
-msgstr "Título del nuevo tipo"
+#: ../lib/advene/plugins/hpi.py:124
+#, fuzzy
+msgid "Use detected position for created annotations"
+msgstr "Transcripción de las anotaciones"
 
-#: ../lib/advene/gui/main.py:3261
-msgid ""
-"Id of the new type. It is generated from the title, but you may change it if "
-"necessary."
+#: ../lib/advene/plugins/hpi.py:129
+msgid "Split by entity type"
 msgstr ""
-"Id del nuevo tipo. Es generada del título,  pero la puedes cambiar si es "
-"necesario."
 
-#: ../lib/advene/gui/main.py:3265
-msgid "Specify the content-type for the annotation type"
-msgstr "Especificar el tipo de contenido para el tipo de anotación"
+#: ../lib/advene/plugins/hpi.py:134
+msgid "Model to be used for detection"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3267
-msgid "Content type"
-msgstr "Tipo de contenido"
+#: ../lib/advene/plugins/hpi.py:139
+#, fuzzy
+msgid "Create relations between the original annotations and the new ones"
+msgstr "Crea un tipo de relación entre este y..."
 
-#: ../lib/advene/gui/main.py:3274 ../lib/advene/gui/main.py:3383
-msgid "Create a new schema"
-msgstr "Crea un nuevo esquema."
+#: ../lib/advene/plugins/hpi.py:167
+msgid "Cannot connect to VCD server. Check that it is running and accessible."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3287
-msgid "Choose an existing schema for the new type, or create a new one"
-msgstr "Elige un esquema existente para el nuevo tipo, o crea uno nuevo"
+#: ../lib/advene/plugins/hpi.py:179
+#, python-format
+msgid "%d / %d screenshots are missing. Wait for extraction to complete."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3290 ../lib/advene/gui/main.py:3398
-msgid "Specify the schema title"
-msgstr "Especifica el título del esquema"
+#: ../lib/advene/plugins/hpi.py:196
+#, fuzzy, python-format
+msgid "Concepts for %s"
+msgstr "Convirtiendo nivel %s"
 
-#: ../lib/advene/gui/main.py:3294
-msgid "Title of the new schema"
-msgstr "Título del nuevo esquema"
+#: ../lib/advene/plugins/hpi.py:264
+#, fuzzy, python-format
+msgid "Server error: %s"
+msgstr "Reproductor de video"
 
-#: ../lib/advene/gui/main.py:3295
-msgid ""
-"Id of the new schema. It is generated from the title, but you may change it "
-"if necessary."
+#: ../lib/advene/plugins/hpi.py:264
+msgid "Server transmission error."
 msgstr ""
-"Id del nuevo esquema. Es generado del título, pero lo puedes cambiar si es "
-"necesario."
 
-#: ../lib/advene/gui/main.py:3318
-msgid ""
-"You specified a annotation-type identifier that already exists. Aborting."
-msgstr ""
-"Especificaste un identificador para el tipo de anotación que ya existe. "
-"Abortando"
+#: ../lib/advene/plugins/hpi.py:272
+#, fuzzy, python-format
+msgid "Parsing %d results"
+msgstr "Analizando ensamble %s"
 
-#: ../lib/advene/gui/main.py:3336
-msgid "You specified a existing schema identifier. Using the existing schema."
+#: ../lib/advene/plugins/hpi.py:289
+#, python-format
+msgid "%s concept"
 msgstr ""
-"Especificaste un identificador de esquema existente. Utilizando el esquema "
-"existente."
 
-#: ../lib/advene/gui/main.py:3338
+#: ../lib/advene/plugins/goodshotdetector.py:45
+msgid "Shot detection (Delakis version)"
+msgstr "Detector de capturas (versión Delakis)"
+
+#: ../lib/advene/plugins/goodshotdetector.py:60
+msgid "Cache histogram alongside video files."
+msgstr "Caché de histograma junto con archivos de vídeo."
+
+#: ../lib/advene/plugins/goodshotdetector.py:63
 msgid ""
-"You specified an existing identifier that does not reference a schema. "
-"Aborting."
+"Parameter profile: safe will detect less cuts, aggressive will detect more "
+"cuts (but more false ones too). default is a compromise."
 msgstr ""
-"Especificaste un identificador que no hace referencia a un esquema. "
-"Abortando."
+"Perfil de parámetro: seguro va a detectar menos cortes, agresivo va a "
+"detectar más cortes (pero más falsos positivos también). Predeterminado es "
+"un compromiso."
 
-#: ../lib/advene/gui/main.py:3365
-msgid "Choose a schema."
-msgstr "Elige un esquema."
+#: ../lib/advene/plugins/goodshotdetector.py:77
+#, python-format
+msgid "Shot (%s profile)"
+msgstr "Captura (%s profile)"
 
-#: ../lib/advene/gui/main.py:3425
-msgid "You specified an existing identifier. Aborting."
-msgstr "Especificaste un identificador existente. Abortando. "
+#: ../lib/advene/plugins/goodshotdetector.py:78
+#: ../lib/advene/plugins/shotdetectapp.py:84
+msgid "Detected shots"
+msgstr "Capturas detectadas"
 
-#: ../lib/advene/gui/main.py:3445
-#, python-format
-msgid "Package %s modified"
-msgstr "Paquete %s modificado"
+#: ../lib/advene/plugins/goodshotdetector.py:83
+msgid "Loading histogram"
+msgstr "Cargando histograma"
 
-#: ../lib/advene/gui/main.py:3446
-#, python-format
-msgid ""
-"The package %s has been modified but not saved.\n"
-"Save it now?"
+#: ../lib/advene/plugins/goodshotdetector.py:144
+msgid "Computing hdiff"
+msgstr "Calcular hdiff: %s"
+
+#: ../lib/advene/plugins/goodshotdetector.py:151
+msgid "Detecting cuts"
+msgstr "Detectando cortes"
+
+#: ../lib/advene/plugins/goodshotdetector.py:178
+msgid "Detecting dissolves"
+msgstr "Detectando disoluciones"
+
+#: ../lib/advene/plugins/goodshotdetector.py:263
+msgid "Extracting histogram"
+msgstr "Extrayendo histograma"
+
+#: ../lib/advene/plugins/montagerenderer.py:43
+msgid "Cannot register montage renderer: Gnonlin plugins are not present."
 msgstr ""
-"El paquete %s ha sido modificado pero no guardado.\n"
-"¿Guardarlo ahora?"
+"No puede registrar representador (renderer) de montaje: Los plugins de "
+"Gnonlin no están presentes."
 
-#: ../lib/advene/gui/main.py:3456
-#, python-format
-msgid "%s snapshots"
-msgstr "%s capturas de pantalla"
+#: ../lib/advene/plugins/transcriber.py:43
+msgid "Transcriber importer"
+msgstr "Importador de transcripciones"
 
-#: ../lib/advene/gui/main.py:3457
-#, python-format
-msgid "Do you want to save the snapshots for media %s?"
-msgstr "¿Quieres guardar las capturas de pantalla para los medios %s?"
+#: ../lib/advene/plugins/transcriber.py:89
+msgid "Parsing section information"
+msgstr "Analizando sección de información"
 
-#: ../lib/advene/gui/main.py:3464 ../lib/advene/gui/main.py:3473
-#: ../lib/advene/gui/main.py:4449
-#, python-format
-msgid "Cannot save imagecache for %(media)s: %(e)s"
-msgstr "No se puede guardar imagecache para %(media)s: %(e)s"
+#: ../lib/advene/plugins/transcriber.py:257 ../lib/advene/util/importer.py:1541
+msgid "Creating package"
+msgstr "Creando paquete"
 
-#: ../lib/advene/gui/main.py:3487
-msgid "first frame"
-msgstr "Primer cuadro"
+#: ../lib/advene/plugins/transcriber.py:263 ../lib/advene/util/importer.py:1548
+msgid "Creating annotation types"
+msgstr "Creando tipos de anotaciones"
 
-#: ../lib/advene/gui/main.py:3488
-msgid "last frame"
-msgstr "último cuadro"
+#: ../lib/advene/plugins/transcriber.py:268 ../lib/advene/util/importer.py:1554
+msgid "Parsing header information"
+msgstr "Analizando información del encabezado"
 
-#: ../lib/advene/gui/main.py:3496
-#, python-format
-msgid "Click on %(bound)s of %(annotation)s"
-msgstr "Clic en %(bound)s de %(annotation)s "
+#: ../lib/advene/plugins/transcriber.py:279
+msgid "Parsing topic and speaker tables information"
+msgstr "Analizando el tópico y la información de las tablas del presentador"
 
-#: ../lib/advene/gui/main.py:3499
-#, python-format
-msgid "Update %(bound)s of %(annotation)s"
-msgstr "Actualizar %(bound)s de %(annotation)s"
+#: ../lib/advene/plugins/tts.py:80
+msgid "Pronounce a text"
+msgstr "Pronuncia un texto"
 
-#: ../lib/advene/gui/main.py:3518
-msgid "Click on the frame corresponding to the timestamp value"
-msgstr "Clic en el cuadro correspondiente al valor de la marca de tiempo"
+#: ../lib/advene/plugins/tts.py:81
+msgid "String to pronounce."
+msgstr "Texto a pronunciar"
 
-#: ../lib/advene/gui/main.py:3520
-msgid "Set new timestamp value"
-msgstr "Establece un nuevo valor para la estampa de tiempo"
+#: ../lib/advene/plugins/tts.py:159
+msgid "TTS disabled. Cannot find the application 'festival' in PATH"
+msgstr ""
+"TTS deshabilitado. No se puede encontrar la aplicación 'festival' en el PATH"
 
-#: ../lib/advene/gui/main.py:3527
-msgid ""
-"<b>Annotation statistics</b>\n"
-"\n"
+#: ../lib/advene/plugins/tts.py:161
+msgid "TTS disabled. Cannot find the application 'aplay' in PATH"
 msgstr ""
-"<b>Estadísticas de anotación</b>\n"
-"\n"
+"TTS deshabilitado. No se puede encontrar la aplicación 'aplay' en el PATH"
 
-#: ../lib/advene/gui/main.py:3599
-msgid "Text annotation"
-msgstr "Anotación de texto"
+#: ../lib/advene/plugins/soundenveloppe.py:42
+#: ../lib/advene/plugins/soundenveloppe.py:149
+#: ../lib/advene/plugins/soundenveloppe.py:151
+msgid "Sound enveloppe"
+msgstr "Envolvente de sonido"
 
-#: ../lib/advene/gui/main.py:3607 ../lib/advene/gui/main.py:3632
-msgid "Cannot find an appropriate annotation type"
-msgstr "No se puede encontrar un tipo de anotación apropiado"
+#: ../lib/advene/plugins/soundenveloppe.py:58
+msgid "Interval (in ms) at which to take samples."
+msgstr "Intervalo (en ms) de cuando tomar muestras."
 
-#: ../lib/advene/gui/main.py:3625
-msgid "Graphical annotation"
-msgstr "Anotación gráfica"
+#: ../lib/advene/plugins/soundenveloppe.py:61
+msgid "Maximum number of samples per annotation."
+msgstr "Número máximo de muestras por anotación"
 
-#: ../lib/advene/gui/main.py:3677
-msgid ""
-"An unsaved template package exists\n"
-"Save it first."
-msgstr ""
-"Una plantilla de paquete sin guardar existe\n"
-"Guardala primero. "
+#: ../lib/advene/plugins/soundenveloppe.py:121
+#, python-format
+msgid "At %s"
+msgstr "En %s"
 
-#: ../lib/advene/gui/main.py:3686
-msgid "Package modified"
-msgstr "Paquete modificado. "
+#: ../lib/advene/plugins/soundenveloppe.py:168
+msgid "Extracting sound enveloppe"
+msgstr "Extrayendo envolvente sonido"
 
-#: ../lib/advene/gui/main.py:3687
-msgid ""
-"The package that you want to close has been modified but not saved.\n"
-"Save it now?"
+#: ../lib/advene/plugins/barcode.py:39
+#, fuzzy
+msgid "Cannot register barcode extraction: zbar plugin not found."
 msgstr ""
-"El paquete que quieres cerrar ha sido modificado pero no guardado.\n"
-"¿Guardarlo ahora?"
+"No puede registrar representador (renderer) de montaje: Los plugins de "
+"Gnonlin no están presentes."
 
-#: ../lib/advene/gui/main.py:3718
-msgid "Load a package"
-msgstr "Cargar un paquete."
+#: ../lib/advene/plugins/barcode.py:43
+msgid "Barcode (qr-code) extraction"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3727
-msgid ""
-"A video file was selected. Pretend that the user selected 'Select a video "
-"file'..."
+#: ../lib/advene/plugins/barcode.py:99
+msgid "Barcode"
 msgstr ""
-"Un archivo de video fue seleccionado. Pretende que el usuario seleccionó "
-"'Selecciona un archivo de video...'"
 
-#: ../lib/advene/gui/main.py:3732
+#: ../lib/advene/plugins/barcode.py:101
+#, fuzzy
+msgid "Extracted barcode information"
+msgstr "Informacion Media"
+
+#: ../lib/advene/plugins/barcode.py:119
+#, fuzzy
+msgid "Extraction barcodes"
+msgstr "Extrayendo %s"
+
+#: ../lib/advene/plugins/dcp.py:67
+msgid "DCP importer"
+msgstr "Importador DCP"
+
+#: ../lib/advene/plugins/dcp.py:122
 #, python-format
-msgid ""
-"The file %s does not look like a valid Advene package. It should have a .azp "
-"or .xml extension. Try to open anyway?"
-msgstr ""
-"El archivo %s no parece un paquete válido de Advene. Debería de tener una "
-"extensión .azp o .xml. ¿Intentar abrirlo de todas maneras?"
+msgid "Converting #%(num)d / %(count)d"
+msgstr "Convirtiendo #%(num)d / %(count)d"
+
+#: ../lib/advene/plugins/annotationgraph.py:43
+msgid "AnnotationGraph importer"
+msgstr "Importador AnnotationGraph"
 
-#: ../lib/advene/gui/main.py:3741
+#: ../lib/advene/plugins/shotdetectapp.py:45
+msgid "ShotdetectApp importer"
+msgstr "Importador de ShotdetectApp"
+
+#: ../lib/advene/plugins/shotdetectapp.py:56
 msgid ""
-"You are trying to load a session file, but there are unsaved packages. "
-"Proceed anyway?"
+"Sensitivity of the algorithm. It should typically be between 50 and 80. If "
+"too many shots are detected, try to increase its value."
 msgstr ""
-"Estas intentando cargar un archivo de sesión, pero hay paquetes sin guardar. "
-"¿Proceder de cualquier manera?"
-
-#: ../lib/advene/gui/main.py:3769 ../lib/advene/gui/main.py:3825
-msgid "Do you want to save the current workspace ?"
-msgstr "¿Quieres guardar el espacio de trabajo actual?"
+"Sensibilidad del algoritmo. Generalmente debe de ser entre 50 y 80. Si se "
+"detectan muchas capturas, intenta incrementar su valor."
 
-#: ../lib/advene/gui/main.py:3784 ../lib/advene/gui/main.py:3840
+#: ../lib/advene/plugins/shotdetectapp.py:139
 #, python-format
-msgid "Could not save the package: %s"
-msgstr "No se puede guardar el paquete: %s"
+msgid "Detected shot #%(num)d at %(pos)s "
+msgstr "Se detectó toma #%(num)d en %(pos)s "
 
-#: ../lib/advene/gui/main.py:3797
-#, python-format
-msgid "Save the package %s"
-msgstr "Guardar el paquete %s"
+#: ../lib/advene/plugins/mpeg7.py:57
+msgid "MPEG7 importer"
+msgstr "Importador MPEG7"
 
-#: ../lib/advene/gui/main.py:3810
-msgid "Invalid file extension"
-msgstr "Extensión de archivo no válida"
+#: ../lib/advene/plugins/cinelab.py:76
+msgid "Cinelab importer"
+msgstr "Importador Cinelab"
 
-#: ../lib/advene/gui/main.py:3811
+#: ../lib/advene/plugins/cinelab.py:114 ../lib/advene/plugins/cinelab.py:116
 #, python-format
-msgid ""
-"Your package contains resources,\n"
-"the filename (%s) should have a .azp extension.\n"
-"Should I put the correct extension?"
-msgstr ""
-"Tu paquete contiene recursos,\n"
-"el nombre de archivo (%s) debe de tener una extensión .azp\n"
-"¿Debo incluir la extensión correcta?"
+msgid "File %s is not an Advene2 zip package."
+msgstr "El archivo %s no es un paquete Advene2 zip"
 
-#: ../lib/advene/gui/main.py:3815
-msgid "OK, the resources will be lost."
-msgstr "Ok, los recursos se perderán."
+#: ../lib/advene/plugins/cinelab.py:171
+msgid "Converting annotation types"
+msgstr "Convirtiendo tipos de anotación"
 
-#: ../lib/advene/gui/main.py:3817
-msgid "Aborting package saving"
-msgstr "Abortando el guardar paquete"
+#: ../lib/advene/plugins/cinelab.py:212
+msgid "Converting views"
+msgstr "Convirtiendo vistas"
 
-#: ../lib/advene/gui/main.py:3851
-msgid "Save the session in..."
-msgstr "Guardando la sesión en..."
+#: ../lib/advene/plugins/cinelab.py:244
+msgid "Importing annotations"
+msgstr "Importando anotaciones"
+
+#: ../lib/advene/plugins/owl_import.py:43
+#, fuzzy
+msgid "OWL (schema) importer"
+msgstr "Importador chaplin"
 
-#: ../lib/advene/gui/main.py:3862
+#: ../lib/advene/plugins/owl_import.py:62 ../lib/advene/util/importer.py:398
 #, python-format
-msgid "Session saved in %s"
-msgstr "Sesión guardada en %s"
+msgid "Converted from %s"
+msgstr "Convertido de %s"
 
-#: ../lib/advene/gui/main.py:3871
-msgid "Do you confirm the creation of annotations matching the DVD chapters?"
+#: ../lib/advene/player/gstreamer.py:344
+msgid "Problem when seeking into media"
 msgstr ""
-"¿Confirmas la creacion de anotaciones concordando con los capitulos del DVD?"
 
-#: ../lib/advene/gui/main.py:3877
-msgid "Cannot import DVD chapters. Did you install the lsdvd software?"
+#: ../lib/advene/player/gstreamer.py:385
+msgid "Cannot capture full-resolution snapshot, another capture is ongoing."
 msgstr ""
-"No se pueden importar los capítulos del DVD. ¿Instalaste el programa lsdvd?"
+"No se puede realizar una captura de pantalla de resolución completa, otra "
+"captura se está realizando. "
 
-#: ../lib/advene/gui/main.py:3885
-msgid "The associated media is not a DVD."
-msgstr "El medio asociado no es un DVD. "
+#: ../lib/advene/rules/actions.py:39 ../lib/advene/rules/actions.py:104
+#: ../lib/advene/rules/actions.py:122
+msgid "Message to display"
+msgstr "Mensaje a mostrar"
 
-#: ../lib/advene/gui/main.py:3896
-#, python-format
-msgid "Processing %s video"
-msgstr "Procesando %s video"
+#: ../lib/advene/rules/actions.py:50
+msgid "Start the player"
+msgstr "Iniciar el reproductor"
 
-#: ../lib/advene/gui/main.py:3899
-msgid "No associated video file"
-msgstr "No hay un archivo de video asociado"
+#: ../lib/advene/rules/actions.py:51
+msgid "Start position (in ms)"
+msgstr "Posicion inicial (en ms)"
 
-#: ../lib/advene/gui/main.py:3926
-msgid "Standard RuleSet"
-msgstr "Conjunto de reglas estándar"
+#: ../lib/advene/rules/actions.py:54 ../lib/advene/rules/actions.py:380
+msgid "The movie start"
+msgstr "El inicio de la película"
 
-#: ../lib/advene/gui/main.py:4042
-#, python-format
-msgid ""
-"Player not active - cached duration   : %(duration)s (%(durationms)d ms)"
-msgstr ""
-"Reproductor no activo - duración en cache : %(duration)s (%(durationms)d ms) "
+#: ../lib/advene/rules/actions.py:55 ../lib/advene/rules/actions.py:381
+msgid "The annotation begin"
+msgstr "El comienzo de la anotación"
 
-#: ../lib/advene/gui/main.py:4054
-#, fuzzy
-msgid ""
-"GNU General Public License v. 2\n"
-"See http://www.gnu.org/copyleft/gpl.html for more details"
-msgstr ""
-"GNU General Public License\n"
-"Ver http://www.gnu.org/copyleft/gpl.html para más detalles"
+#: ../lib/advene/rules/actions.py:56 ../lib/advene/rules/actions.py:382
+msgid "The annotation end"
+msgstr "El fin de la anotación"
 
-#: ../lib/advene/gui/main.py:4056
-msgid "Visit the Advene web site for examples and documentation."
-msgstr "Visita el sitio web de Advene para ejemplos y documentación."
+#: ../lib/advene/rules/actions.py:66
+msgid "Goto position (in ms)"
+msgstr "Ir a la posicion (en ms)"
 
-#: ../lib/advene/gui/main.py:4089 ../lib/advene/gui/main.py:4177
-msgid "Select a movie file"
-msgstr "Selecciona un archivo de pelicula"
+#: ../lib/advene/rules/actions.py:75
+msgid "Stop the player"
+msgstr "Detener el reproductor"
 
-#: ../lib/advene/gui/main.py:4101
-msgid "Title/Chapter selection"
-msgstr "Selección de Titulo/Capitulo"
+#: ../lib/advene/rules/actions.py:82
+msgid "Pause the player"
+msgstr "Pausar el reproductor"
 
-#: ../lib/advene/gui/main.py:4143
-msgid "Select a video stream"
-msgstr "Selecciona una corriente de video"
+#: ../lib/advene/rules/actions.py:89
+msgid "Resume the player"
+msgstr "Continuar el reproductor"
 
-#: ../lib/advene/gui/main.py:4144
-msgid "Enter the address of a video stream"
-msgstr "Ingresa la dirección de una corriente de video"
+#: ../lib/advene/rules/actions.py:96
+msgid "Take a snapshot"
+msgstr "Toma una fotografia"
+
+#: ../lib/advene/rules/actions.py:103
+msgid "Display a caption"
+msgstr "Muestra un subtitulo"
+
+#: ../lib/advene/rules/actions.py:105
+msgid "Duration of the caption"
+msgstr "Duracion del subtitulo"
+
+#: ../lib/advene/rules/actions.py:133
+msgid "Display a graphical shape"
+msgstr "Mostrar una forma gráfica"
+
+#: ../lib/advene/rules/actions.py:134
+msgid "Shape (square, circle, triangle)"
+msgstr "Forma (cuadro, círculo, triángulo)"
+
+#: ../lib/advene/rules/actions.py:136
+msgid "x-position (percentage of screen)"
+msgstr "posicion-x (porcentaje de pantalla)"
+
+#: ../lib/advene/rules/actions.py:137
+msgid "y-position (percentage of screen)"
+msgstr "posicion-y (porcentaje de pantalla)"
 
-#: ../lib/advene/gui/main.py:4148
-#, python-format
-msgid "Successfully extracted the video stream address (%s) from the url.\n"
-msgstr ""
-"Se extrajo la dirección de flujo de video satisfactoriamente (% s) a partir "
-"de la url.\n"
+#: ../lib/advene/rules/actions.py:138
+msgid "Size (arbitrary units)"
+msgstr "Tamanio (unidades arbitrarias)"
 
-#: ../lib/advene/gui/main.py:4173
-msgid "Package properties"
-msgstr "Propiedades de paquete"
+#: ../lib/advene/rules/actions.py:139
+msgid "Duration of the display in ms"
+msgstr "Duración de la visualizacion en ms"
 
-#: ../lib/advene/gui/main.py:4174
-msgid "Author name"
-msgstr "Nombre de autor"
+#: ../lib/advene/rules/actions.py:147
+msgid "A square"
+msgstr "Un cuadrado"
 
-#: ../lib/advene/gui/main.py:4175
-msgid "Package creation date"
-msgstr "Fecha de creación del paquete"
+#: ../lib/advene/rules/actions.py:148
+msgid "A circle"
+msgstr "Un círculo"
 
-#: ../lib/advene/gui/main.py:4176
-msgid "Package title"
-msgstr "Título del paquete"
+#: ../lib/advene/rules/actions.py:149
+msgid "A triangle"
+msgstr "Un triángulo"
 
-#: ../lib/advene/gui/main.py:4177
-msgid "Associated media"
-msgstr "Media asociada"
+#: ../lib/advene/rules/actions.py:152
+msgid "White"
+msgstr "Blanco"
 
-#: ../lib/advene/gui/main.py:4178
-msgid "Media duration in ms"
-msgstr "Duración del medio en ms"
+#: ../lib/advene/rules/actions.py:153
+msgid "Black"
+msgstr "Negro"
 
-#: ../lib/advene/gui/main.py:4237
-msgid "Paths"
-msgstr "Rutas"
+#: ../lib/advene/rules/actions.py:154
+msgid "Red"
+msgstr "Rojo"
 
-#: ../lib/advene/gui/main.py:4239
-msgid "Data"
-msgstr "Data"
+#: ../lib/advene/rules/actions.py:155
+msgid "Green"
+msgstr "Verde"
 
-#: ../lib/advene/gui/main.py:4239
-msgid "Standard directory for data files"
-msgstr "Directorio estándar para archivos de datos"
+#: ../lib/advene/rules/actions.py:156
+msgid "Blue"
+msgstr "Azul"
 
-#: ../lib/advene/gui/main.py:4240
-msgid "Movie path"
-msgstr "Ruta de video"
+#: ../lib/advene/rules/actions.py:157
+msgid "Yellow"
+msgstr "Amarillo"
 
-#: ../lib/advene/gui/main.py:4240
-#, python-format
-msgid ""
-"List of directories (separated by %s) to search for movie files (_ means "
-"package directory)"
-msgstr ""
-"Lista de directorios (separados por %s) para buscar archivos de video (_ "
-"significa directorio de paquetes)"
+#: ../lib/advene/rules/actions.py:160
+msgid "At the top of the screen"
+msgstr "En la parte superior de la pantalla"
 
-#: ../lib/advene/gui/main.py:4241
-msgid "Imagecache"
-msgstr "Caché de imagen"
+#: ../lib/advene/rules/actions.py:161 ../lib/advene/rules/actions.py:166
+msgid "In the middle of the screen"
+msgstr "A la mitad de la pantalla"
 
-#: ../lib/advene/gui/main.py:4241
-msgid "Directory for storing the snapshot cache"
-msgstr "Directorio para almacenar la caché de la captura"
+#: ../lib/advene/rules/actions.py:162
+msgid "At the bottom of the screen"
+msgstr "El fondo de la pantalla"
 
-#: ../lib/advene/gui/main.py:4242
-msgid "Player"
-msgstr "Reproductor"
+#: ../lib/advene/rules/actions.py:165
+msgid "At the left of the screen"
+msgstr "A la izquierda de la pantalla"
 
-#: ../lib/advene/gui/main.py:4242
-msgid "Directory of the video player"
-msgstr "Directorio del reproductor de video"
+#: ../lib/advene/rules/actions.py:183
+msgid "Zero the volume during the annotation"
+msgstr "Volumen cero durante la anotacion"
 
-#: ../lib/advene/gui/main.py:4243
-msgid "Shotdetect"
-msgstr "Shotdetect"
+#: ../lib/advene/rules/actions.py:190
+msgid "Zero the volume"
+msgstr "Volumen cero"
 
-#: ../lib/advene/gui/main.py:4243
-msgid "Shotdetect application"
-msgstr "Aplicación shotdetect"
+#: ../lib/advene/rules/actions.py:197
+msgid "Restore the volume"
+msgstr "Restaurar el volumen"
 
-#: ../lib/advene/gui/main.py:4245
-msgid "GUI"
-msgstr "GUI"
+#: ../lib/advene/rules/actions.py:205
+msgid "Activate a STBV"
+msgstr "Activar una STBV"
 
-#: ../lib/advene/gui/main.py:4246
-msgid "Interface language (after restart)"
-msgstr "Idioma de la interfaz (después de reiniciar)"
+#: ../lib/advene/rules/actions.py:206
+msgid "STBV id"
+msgstr "STBV id"
 
-#: ../lib/advene/gui/main.py:4246
-msgid ""
-"Language used for the interface (necessitates to restart the application)"
-msgstr "Idioma utilizado por la interfaz (necesita reiniciar la aplicación)"
+#: ../lib/advene/rules/actions.py:215
+msgid "Send a user event"
+msgstr "Mandar un evento de usuario"
 
-#: ../lib/advene/gui/main.py:4252
-msgid "Record activity trace"
-msgstr "Registrar la actividad de rastreo"
+#: ../lib/advene/rules/actions.py:216
+msgid "Identifier"
+msgstr "Identificador"
 
-#: ../lib/advene/gui/main.py:4253
-msgid "Expert mode"
-msgstr "Modo experto"
+#: ../lib/advene/rules/actions.py:217
+msgid "Delay in ms before sending the event."
+msgstr "Retraso en ms antes de enviar un evento."
 
-#: ../lib/advene/gui/main.py:4253
-msgid "Offer advanced possibilities"
-msgstr "Ofrece posibilidades avanzadas"
+#: ../lib/advene/rules/actions.py:227
+msgid "Open a URL in the web browser"
+msgstr "Abrir un URL en un navegador web"
 
-#: ../lib/advene/gui/main.py:4254
-msgid "Prefer WYSIWYG"
-msgstr "Preferir WYSIWYG"
+#: ../lib/advene/rules/actions.py:237
+msgid "Open a static view"
+msgstr "Abre una vista estática"
 
-#: ../lib/advene/gui/main.py:4254
-msgid "Use WYSIWYG editors when possible (HTML, SVG)"
-msgstr "Utilizar editores WYSIWYG cuando sea posible (HTML, SVG)"
+#: ../lib/advene/rules/actions.py:248
+msgid "Set the audio volume"
+msgstr "Establece el volumen del audio"
 
-#: ../lib/advene/gui/main.py:4255
-msgid "Player control in edit popups"
-msgstr "Control de reproductor en ventanas flotantes de edición"
+#: ../lib/advene/rules/actions.py:249
+msgid "Volume level (from 0 to 100)"
+msgstr "Nivel de volumen (de 0 a 100)"
 
-#: ../lib/advene/gui/main.py:4255
-msgid ""
-"Enable generic player controls in edit windows. This may be undesirable "
-"since it overloads some standard text-edition behaviours (esp. control-left/"
-"right)."
-msgstr ""
-"Habilitar controles de reproductor genéricos en las ventanas de edición. "
-"Esto puede ser indeseable, ya que sobrecarga algunos comportamientos de "
-"edición de texto estándar (esp. control-izquierda/derecha)."
+#: ../lib/advene/rules/actions.py:258
+msgid "Set the playing rate"
+msgstr "Ajusta la velocidad de reproducción"
 
-#: ../lib/advene/gui/main.py:4257
-msgid "Open popups"
-msgstr "Abrir ventanas flotantes"
+#: ../lib/advene/rules/actions.py:259
+msgid "Rate (100: normal rate, 200: twice slower)"
+msgstr "Tarifa (100: tasa normal, 200: dos veces más lento)"
 
-#: ../lib/advene/gui/main.py:4258
-msgid "Where should we open adhoc views?"
-msgstr "¿Dónde debemos posicionar las vistas adhoc abiertas?"
+#: ../lib/advene/rules/actions.py:268
+msgid "Play a sound resource"
+msgstr "Reproducir un recurso de sonido"
 
-#: ../lib/advene/gui/main.py:4259
-msgid "as a popup window"
-msgstr "como una ventana flotante"
+#: ../lib/advene/rules/actions.py:269
+msgid "Clip id"
+msgstr "Id del clip"
 
-#: ../lib/advene/gui/main.py:4260
-msgid "embedded east of the video"
-msgstr "embeber este del video"
+#: ../lib/advene/rules/actions.py:270 ../lib/advene/rules/actions.py:284
+msgid "Volume (0..100)"
+msgstr "Volumen (0..100)"
 
-#: ../lib/advene/gui/main.py:4261
-msgid "embedded west of the video"
-msgstr "embeber oeste del video"
+#: ../lib/advene/rules/actions.py:271 ../lib/advene/rules/actions.py:285
+msgid "Left-right balance: -1 -> full left, 0 -> center, 1 -> full right"
+msgstr ""
+"Equilibrio izquierda-derecha: -1 -> totalmente a la izquierda, 0 -> centro, "
+"1 -> totalmente a la derecha"
 
-#: ../lib/advene/gui/main.py:4262
-msgid "embedded south of the video"
-msgstr "embeber sur del video"
+#: ../lib/advene/rules/actions.py:282
+msgid "Play a sound file"
+msgstr "Reproducir un archivo de sonido"
 
-#: ../lib/advene/gui/main.py:4263
-msgid "embedded at the right of the window"
-msgstr "embeber a la derecha de la ventana"
+#: ../lib/advene/rules/actions.py:283
+msgid "Sound filename"
+msgstr "Nombre del archivo de audio"
 
-#: ../lib/advene/gui/main.py:4266
-msgid "History size"
-msgstr "Tamaño del historial"
+#: ../lib/advene/rules/actions.py:295
+msgid "Set a state variable"
+msgstr "Establecer una variable de estado"
 
-#: ../lib/advene/gui/main.py:4266
-msgid "History filelist size limit"
-msgstr "Limite del tamaño de la lista de archivos del historial"
+#: ../lib/advene/rules/actions.py:296 ../lib/advene/rules/actions.py:308
+msgid "State variable name"
+msgstr "Nombre de variable de estado"
 
-#: ../lib/advene/gui/main.py:4268
-msgid "Remember window size"
-msgstr "Recordar el tamaño de ventana"
+#: ../lib/advene/rules/actions.py:297
+msgid "State value"
+msgstr "Valor de estado"
 
-#: ../lib/advene/gui/main.py:4268
-msgid "Remember the size of opened windows"
-msgstr "Recordar el tamaño de las ventanas abiertas"
+#: ../lib/advene/rules/actions.py:307
+msgid "Increment a state variable"
+msgstr "Incrementar una variable de estado"
 
-#: ../lib/advene/gui/main.py:4269
-msgid "Bookmark snapshot width"
-msgstr "Guardar en separador el ancho de la captura de pantalla"
+#: ../lib/advene/rules/actions.py:317
+msgid "Clear all state variables"
+msgstr "Limpiar todas las variables de estado"
 
-#: ../lib/advene/gui/main.py:4269
-msgid "Width of the snapshots representing bookmarks"
-msgstr "Ancho de las capturas que representan separadores"
+#: ../lib/advene/rules/actions.py:332
+#, python-format
+msgid "Error in the evaluation of the parameter %s:"
+msgstr "Error en la evaluación del parametro %s:"
 
-#: ../lib/advene/gui/main.py:4270
-msgid "Bookmark snapshot precision"
-msgstr "Precisión de captura del separador"
+#: ../lib/advene/rules/actions.py:537
+#, python-format
+msgid "Cannot find the stbv %s"
+msgstr "No se puede encontrar el stbv %s"
 
-#: ../lib/advene/gui/main.py:4270
-msgid "Precision (in ms) of the displayed bookmark snapshots."
-msgstr ""
-"Precisión (en ms) de la visualización de las capturas de separadores "
-"mostrados"
+#: ../lib/advene/rules/actions.py:633
+msgid "The set_rate method is unavailable."
+msgstr "El método set_rate no está disponible"
 
-#: ../lib/advene/gui/main.py:4272
-msgid "General"
-msgstr "General"
+#: ../lib/advene/rules/actions.py:643
+msgid "No 'soundclips' resource folder in the package"
+msgstr "No hay existe una carpeta de recursos de clips de audio en el paquete"
 
-#: ../lib/advene/gui/main.py:4273
-msgid "Weekly update check"
-msgstr "Revisión semanal de actualización"
+#: ../lib/advene/rules/actions.py:668
+msgid "Full volume"
+msgstr "Volumen total "
 
-#: ../lib/advene/gui/main.py:4274
-msgid "On exit,"
-msgstr "Al salir, "
+#: ../lib/advene/rules/actions.py:669
+msgid "Left"
+msgstr "Izquierda"
 
-#: ../lib/advene/gui/main.py:4275
-msgid "How to handle screenshots on exit"
-msgstr "Como manejar capturas de pantalla al salir"
+#: ../lib/advene/rules/actions.py:671
+msgid "Right"
+msgstr "Derecha"
 
-#: ../lib/advene/gui/main.py:4276
-msgid "never save screenshots"
-msgstr "nunca guardar capturas de pantalla"
+#: ../lib/advene/rules/importer.py:29
+msgid "Event history importer"
+msgstr "Importador de eventos históricos"
 
-#: ../lib/advene/gui/main.py:4277
-msgid "always save screenshots"
-msgstr "siempre guardar capturas de pantalla"
+#: ../lib/advene/rules/elements.py:144
+msgid "is equal to"
+msgstr "es igual a"
 
-#: ../lib/advene/gui/main.py:4278
-msgid "ask before saving screenshots"
-msgstr "preguntar antes de guardar capturas de pantalla"
+#: ../lib/advene/rules/elements.py:145
+msgid "is different from"
+msgstr "es diferente de"
 
-#: ../lib/advene/gui/main.py:4280
-msgid "Auto-save"
-msgstr "Guardado automático"
+#: ../lib/advene/rules/elements.py:146
+msgid "contains"
+msgstr "contiene"
 
-#: ../lib/advene/gui/main.py:4281
-msgid "Data auto-save functionality"
-msgstr "Funcionalidad de guardado automático de datos"
+#: ../lib/advene/rules/elements.py:147
+msgid "is greater than"
+msgstr "es mayor que"
 
-#: ../lib/advene/gui/main.py:4282
-msgid "is desactivated"
-msgstr "es desactivado"
+#: ../lib/advene/rules/elements.py:148
+msgid "is lower than"
+msgstr "es menor que"
+
+#: ../lib/advene/rules/elements.py:149
+msgid "matches the regexp"
+msgstr "concuerda la regexp"
 
-#: ../lib/advene/gui/main.py:4283
-msgid "is done automatically"
-msgstr "se realiza automáticamente"
+#: ../lib/advene/rules/elements.py:150
+msgid "is before"
+msgstr "esta antes"
 
-#: ../lib/advene/gui/main.py:4284
-msgid "is done after confirmation"
-msgstr "se realiza después de la confirmación"
+#: ../lib/advene/rules/elements.py:151
+msgid "meets"
+msgstr "reune"
 
-#: ../lib/advene/gui/main.py:4286
-msgid "Auto-save interval (in s)"
-msgstr "Intervalo del guardado automático (en s)"
+#: ../lib/advene/rules/elements.py:152
+msgid "overlaps"
+msgstr "traslapa"
 
-#: ../lib/advene/gui/main.py:4286
-msgid "Interval (in seconds) between package auto-saves"
-msgstr "Intervalo (en segundos) entre cada guardado automático del paquete"
+#: ../lib/advene/rules/elements.py:153
+msgid "during"
+msgstr "dura"
 
-#: ../lib/advene/gui/main.py:4288
-msgid "Workspace"
-msgstr "Espacio de trabajo"
+#: ../lib/advene/rules/elements.py:154
+msgid "starts"
+msgstr "inicia"
 
-#: ../lib/advene/gui/main.py:4290
-msgid "On package saving,"
-msgstr "Al guardar el paquete,"
+#: ../lib/advene/rules/elements.py:155
+msgid "finishes"
+msgstr "termina"
 
-#: ../lib/advene/gui/main.py:4291
-msgid "Do you wish to save the default workspace with the package?"
-msgstr "¿Deseas guardar el área de trabajo predeterminada con el paquete?"
+#: ../lib/advene/rules/elements.py:160
+msgid "is not true"
+msgstr "no es verdadero"
 
-#: ../lib/advene/gui/main.py:4292
-msgid "never save the current workspace"
-msgstr "nunca guardar el área de trabajo actual"
+#: ../lib/advene/rules/elements.py:161
+msgid "is true"
+msgstr "es verdadero"
 
-#: ../lib/advene/gui/main.py:4293
-msgid "always save the current workspace"
-msgstr "siempre guardar el área de trabajo actual"
+#: ../lib/advene/rules/elements.py:165
+msgid "Basic conditions"
+msgstr "Condiciones basicas"
 
-#: ../lib/advene/gui/main.py:4294
-msgid "ask before saving the current workspace"
-msgstr "preguntar antes de guardar el área de trabajo actual"
+#: ../lib/advene/rules/elements.py:166
+msgid "Allen relations"
+msgstr "Relaciones Allen"
 
-#: ../lib/advene/gui/main.py:4296
-#, fuzzy
-msgid "Auto-validation of edited elements"
-msgstr "Validación de la edición de un elemento"
+#: ../lib/advene/rules/elements.py:229 ../lib/advene/rules/elements.py:235
+msgid "Unknown type for overlaps comparison"
+msgstr "Tipo desconocido traslapa la comparacion"
 
-#: ../lib/advene/gui/main.py:4296
-msgid "Automatically validate modified elements when saving the package."
-msgstr ""
+#: ../lib/advene/rules/elements.py:243 ../lib/advene/rules/elements.py:249
+msgid "Unknown type for during comparison"
+msgstr "Tipo desconocido durante la comparacion"
 
-#: ../lib/advene/gui/main.py:4298
-msgid "On package load,"
-msgstr "En la carga del paquete,"
+#: ../lib/advene/rules/elements.py:518 ../lib/advene/rules/elements.py:524
+#, python-format
+msgid "Unknown action %s"
+msgstr "Acción desconocida %s"
 
-#: ../lib/advene/gui/main.py:4299
-msgid "Do you wish to load the workspace saved with the package?"
-msgstr "¿Deseas cargar el espacio de trabajo guardado con el paquete?"
+#: ../lib/advene/rules/elements.py:525
+#, python-format
+msgid "Unknown parameter %s"
+msgstr "Parámetro desconocido %s"
 
-#: ../lib/advene/gui/main.py:4300
-msgid "never load the saved workspace"
-msgstr "nunca cargar el espacio de trabajo guardado"
+#: ../lib/advene/rules/elements.py:530
+msgid "Unknown actions"
+msgstr "Acciones desconocidas"
 
-#: ../lib/advene/gui/main.py:4301
-msgid "always load the saved workspace"
-msgstr "siempre cargar el espacio de trabajo guardado"
+#: ../lib/advene/rules/elements.py:982
+msgid "Start of the editing of an element"
+msgstr "Iniciar la edición de un elemento."
 
-#: ../lib/advene/gui/main.py:4302
-msgid "ask before loading the saved workspace"
-msgstr "preguntar antes de cargar el espacio de trabajo guardado"
+#: ../lib/advene/rules/elements.py:983
+msgid "Cancel of the editing of an element"
+msgstr "Cancelar la edición de un elemento"
 
-#: ../lib/advene/gui/main.py:4305
-msgid "Video Player"
-msgstr "Configura reproductor"
+#: ../lib/advene/rules/elements.py:984
+msgid "Destruction of the edit window of an element"
+msgstr "Destrucción de la ventana de edición de un elemento"
 
-#: ../lib/advene/gui/main.py:4306
-msgid "Autostart"
-msgstr "Autoinicio"
+#: ../lib/advene/rules/elements.py:985
+msgid "Validation of the editing of an element"
+msgstr "Validación de la edición de un elemento"
 
-#: ../lib/advene/gui/main.py:4306
-msgid ""
-"Automatically start the player when loading a media file (either directly or "
-"through a package)"
-msgstr ""
-"Automáticamente iniciar el reproductor cuando se carga un archivo de media "
-"(ya sea directamente o utilizando un paquete)"
+#: ../lib/advene/rules/elements.py:986
+msgid "Ending editing of a package"
+msgstr "Terminando la edicion de un paquete"
 
-#: ../lib/advene/gui/main.py:4307
-msgid "Fulscreen timestamp"
-msgstr "Marca de tiempo en pantalla completa"
+#: ../lib/advene/rules/elements.py:987
+msgid "Beginning of an annotation"
+msgstr "Principio de una anotacion"
 
-#: ../lib/advene/gui/main.py:4307
-msgid "Display the timestamp over the video when in fullscreen mode"
-msgstr ""
-"Mostrar la marca de tiempo sobre el video cuando está en modo pantalla "
-"completa"
+#: ../lib/advene/rules/elements.py:988
+msgid "End of an annotation"
+msgstr "Fin de una anotacion"
 
-#: ../lib/advene/gui/main.py:4308
-msgid "Enable captions"
-msgstr "Habilitar subtítulos"
+#: ../lib/advene/rules/elements.py:989
+msgid "Creation of a new annotation"
+msgstr "Creacion de una nueva anotacion"
 
-#: ../lib/advene/gui/main.py:4308
-msgid "Enable captions over the video"
-msgstr "Habilitar subtítulos sobre el video"
+#: ../lib/advene/rules/elements.py:990
+msgid "Ending editing of an annotation"
+msgstr "Finalizando la edicion de una anotacion"
 
-#: ../lib/advene/gui/main.py:4309
-msgid "Caption font"
-msgstr "Fuente de los subtítulos"
+#: ../lib/advene/rules/elements.py:991
+msgid "Suppression of an annotation"
+msgstr "Supresion de una anotacion"
 
-#: ../lib/advene/gui/main.py:4309
-msgid "TrueType font for captions"
-msgstr "Fuente TrueType para etiquetas"
+#: ../lib/advene/rules/elements.py:992
+msgid "Activation of an annotation"
+msgstr "Activacion de una anotacion"
 
-#: ../lib/advene/gui/main.py:4310
-msgid "Enable SVG"
-msgstr "Habilitar SVG"
+#: ../lib/advene/rules/elements.py:993
+msgid "Deactivation of an annotation"
+msgstr "Desactivacion de una anotacion"
 
-#: ../lib/advene/gui/main.py:4310
-msgid "Enable SVG captions over the video"
-msgstr "Habilitar etiquetas SVG sobre el video"
+#: ../lib/advene/rules/elements.py:994
+msgid "Merging of two annotations"
+msgstr "Uniendo dos anotaciones."
 
-#: ../lib/advene/gui/main.py:4312
-msgid "Enable snapshots"
-msgstr "Habilitar captura de pantalla"
+#: ../lib/advene/rules/elements.py:995
+msgid "Moving an annotation"
+msgstr "Mover una anotación"
 
-#: ../lib/advene/gui/main.py:4313
-msgid "Snapshot width"
-msgstr "Ancho de captura de pantalla"
+#: ../lib/advene/rules/elements.py:996
+msgid "Activation of a relation"
+msgstr "Activacion de una relacion"
 
-#: ../lib/advene/gui/main.py:4313
-msgid "Snapshot width in pixels."
-msgstr "Ancho de captura de pantalla en pixeles."
+#: ../lib/advene/rules/elements.py:997
+msgid "Deactivation of a relation"
+msgstr "Desactivacion de una relacion"
 
-#: ../lib/advene/gui/main.py:4314
-msgid "Verbosity"
-msgstr "Verbosidad"
+#: ../lib/advene/rules/elements.py:998
+msgid "Creation of a new relation"
+msgstr "Creacion de una nueva relacion"
 
-#: ../lib/advene/gui/main.py:4314
-msgid "Verbosity level. -1 for no messages."
-msgstr "Nivel de verbosidad: -1 para no mostrar mensajes."
+#: ../lib/advene/rules/elements.py:999
+msgid "Ending editing of a relation"
+msgstr "Terminando de editar una relacion"
 
-#: ../lib/advene/gui/main.py:4317
-msgid "Devices"
-msgstr "Dispositivos"
+#: ../lib/advene/rules/elements.py:1000
+msgid "Suppression of a relation"
+msgstr "Supresion de una relacion"
 
-#: ../lib/advene/gui/main.py:4319
-msgid "Standard"
-msgstr "Estándar"
+#: ../lib/advene/rules/elements.py:1001
+msgid "Creation of a new view"
+msgstr "Creacion de una nueva vista"
 
-#: ../lib/advene/gui/main.py:4321
-msgid "DVD drive"
-msgstr "Lector DVD"
+#: ../lib/advene/rules/elements.py:1002
+msgid "Ending editing of a view"
+msgstr "Terminando de editar una vista"
 
-#: ../lib/advene/gui/main.py:4321
-msgid "Drive letter for the DVD"
-msgstr "Letra del lector para el DVD"
+#: ../lib/advene/rules/elements.py:1003
+msgid "Suppression of a view"
+msgstr "Supresion de una vista"
 
-#: ../lib/advene/gui/main.py:4322
-msgid "GDI"
-msgstr "GDI"
+#: ../lib/advene/rules/elements.py:1004
+msgid "Creation of a new query"
+msgstr "Creación de una nueva busqueda"
 
-#: ../lib/advene/gui/main.py:4323
-msgid "Direct X"
-msgstr "Direct X"
+#: ../lib/advene/rules/elements.py:1005
+msgid "Ending editing of a query"
+msgstr "Terminando de editar una busqueda"
 
-#: ../lib/advene/gui/main.py:4325
-msgid "DVD device"
-msgstr "Dispositivo DVD"
+#: ../lib/advene/rules/elements.py:1006
+msgid "Suppression of a query"
+msgstr "Supresion de una búsqueda"
 
-#: ../lib/advene/gui/main.py:4325
-msgid "Device for the DVD"
-msgstr "Dispositivo para el DVD"
+#: ../lib/advene/rules/elements.py:1007
+msgid "Creation of a new schema"
+msgstr "Creacion de un nuevo esquema"
 
-#: ../lib/advene/gui/main.py:4326
-msgid "X11"
-msgstr "X11"
+#: ../lib/advene/rules/elements.py:1008
+msgid "Ending editing of a schema"
+msgstr "Terminando de editar un esquema"
 
-#: ../lib/advene/gui/main.py:4327
-msgid "XVideo"
-msgstr "XVideo"
+#: ../lib/advene/rules/elements.py:1009
+msgid "Suppression of a schema"
+msgstr "Supresion de un esquema"
 
-#: ../lib/advene/gui/main.py:4328
-msgid "GL"
-msgstr "GL"
+#: ../lib/advene/rules/elements.py:1011
+msgid "Ending editing an annotation type"
+msgstr "Terminando de editar un tipo de anotacion"
 
-#: ../lib/advene/gui/main.py:4330
-msgid "Video output"
-msgstr "Salida de video"
+#: ../lib/advene/rules/elements.py:1012
+msgid "Suppression of an annotation type"
+msgstr "Supresión de un tipo de anotacion"
 
-#: ../lib/advene/gui/main.py:4330
-msgid "Video output module"
-msgstr "Módulo de salida de video"
+#: ../lib/advene/rules/elements.py:1013
+msgid "Creation of a new relation type"
+msgstr "Creación de un nuevo tipo de relacion"
 
-#: ../lib/advene/gui/main.py:4332
-msgid "Recorder options"
-msgstr "Opciones de grabadora"
+#: ../lib/advene/rules/elements.py:1014
+msgid "Ending editing a relation type"
+msgstr "Terminando de editar un tipo de relacion"
 
-#: ../lib/advene/gui/main.py:4333
-msgid "Audio input"
-msgstr "Entrada de audio"
+#: ../lib/advene/rules/elements.py:1015
+msgid "Suppression of a relation type"
+msgstr "Suprimiendo un tipo de relacion"
 
-#: ../lib/advene/gui/main.py:4333
-msgid "Device name for audio input (with gstrecorder plugin)"
-msgstr ""
-"Nombre del dispositivo para la entrada de audio (con el plugin gstrecorder)"
+#: ../lib/advene/rules/elements.py:1016
+msgid "Creation of a new resource"
+msgstr "Creación de un nuevo recurso"
 
-#: ../lib/advene/gui/main.py:4334
-msgid "Record video"
-msgstr "Grabar video"
+#: ../lib/advene/rules/elements.py:1017
+msgid "Ending editing of a resource"
+msgstr "Finalizando la edición de un recurso"
 
-#: ../lib/advene/gui/main.py:4334
-msgid "Record both video and audio"
-msgstr "Grabar ambos video y audio"
+#: ../lib/advene/rules/elements.py:1018
+msgid "Suppression of a resource"
+msgstr "Supresión de un recurso"
 
-#: ../lib/advene/gui/main.py:4337
-msgid "<i>Experimental</i>"
-msgstr "<i>Experimental</i>"
+#: ../lib/advene/rules/elements.py:1019
+msgid "Modification of the tag"
+msgstr "Modificación de la etiqueta"
 
-#: ../lib/advene/gui/main.py:4338
-msgid "Embed the caption scroller below the video"
-msgstr "Embeber el desplazamiento de subtítulos debajo del video"
+#: ../lib/advene/rules/elements.py:1020
+msgid "Activating a link"
+msgstr "Activando un link"
 
-#: ../lib/advene/gui/main.py:4339
-msgid "Embed the caption view below the video"
-msgstr "Embeber la vista de subtítulos debajo del video"
+#: ../lib/advene/rules/elements.py:1021
+msgid "Player start"
+msgstr "Reproductor inicia"
 
-#: ../lib/advene/gui/main.py:4341
-msgid "Time-related"
-msgstr "Relacionado con el tiempo"
+#: ../lib/advene/rules/elements.py:1022
+msgid "Player stop"
+msgstr "Reproductor detiene"
 
-#: ../lib/advene/gui/main.py:4342
-msgid "Time format"
-msgstr "Formato del tiempo"
+#: ../lib/advene/rules/elements.py:1023
+msgid "Player pause"
+msgstr "Reproductor pausa"
 
-#: ../lib/advene/gui/main.py:4342
-msgid "Format used to display timecodes"
-msgstr "Formato utilizado para mostrar códigos de tiempo"
+#: ../lib/advene/rules/elements.py:1024
+msgid "Player resume"
+msgstr "Reproductor continua"
 
-#: ../lib/advene/gui/main.py:4356
-msgid "Default FPS"
-msgstr "FPS predeterminados"
+#: ../lib/advene/rules/elements.py:1025
+msgid "Going to a given position"
+msgstr "Ir a una posición dada"
 
-#: ../lib/advene/gui/main.py:4357
-msgid ""
-"Default FPS (frame-per-second) value, when entering or displaying timestamps "
-"with frame numbers."
-msgstr ""
-"Valor predeterminado FPS (cuadros por segundo), cuando se entra o se "
-"muestran las marcas de tiempo con números del marco."
+#: ../lib/advene/rules/elements.py:1026
+msgid "Loading a new package"
+msgstr "Cargando un nuevo paquete"
 
-#: ../lib/advene/gui/main.py:4358
-msgid "Time increment"
-msgstr "Incremento del tiempo"
+#: ../lib/advene/rules/elements.py:1027
+msgid "Activating a package"
+msgstr "Activando un paquete"
 
-#: ../lib/advene/gui/main.py:4358
-msgid ""
-"Skip duration, when using control-left/right or forward/rewind buttons (in "
-"ms)."
-msgstr ""
-"Saltar duración, cuando se utiliza control-izquierda/derecha o avance / "
-"retroceso (en ms)."
+#: ../lib/advene/rules/elements.py:1028
+msgid "Saving the package"
+msgstr "Guardando el paquete"
 
-#: ../lib/advene/gui/main.py:4359
-msgid "Second time increment"
-msgstr "Incremento del segundo tiempo"
+#: ../lib/advene/rules/elements.py:1029
+msgid "Start of the dynamic view"
+msgstr "Estado de la vista dinamica"
 
-#: ../lib/advene/gui/main.py:4359
-msgid "Skip duration, when using control-shift-left/right (in ms)."
-msgstr ""
-"Saltar duración, cuando se utiliza control-shift-izquierda/derecha (en ms)."
+#: ../lib/advene/rules/elements.py:1030
+msgid "End of the dynamic view"
+msgstr "Fin de la vista dinámica"
 
-#: ../lib/advene/gui/main.py:4360
-msgid "Third time increment"
-msgstr "Incremento del tercer tiempo"
+#: ../lib/advene/rules/elements.py:1031
+msgid "Start of the application"
+msgstr "Inicio de la aplicacion"
 
-#: ../lib/advene/gui/main.py:4360
-msgid "Skip duration, when using control-shift-up/down (in ms)."
-msgstr "Saltar duración, cuando se utiliza control-shift-arriba/abajo (en ms)."
+#: ../lib/advene/rules/elements.py:1032
+msgid "End of the application"
+msgstr "Fin de la aplicacion"
 
-#: ../lib/advene/gui/main.py:4361
-msgid "Custom Up/Down"
-msgstr "Personalizar Arriba / Abajo"
+#: ../lib/advene/rules/elements.py:1033
+msgid "User-defined event"
+msgstr "Eventos definidos por el usuario"
 
-#: ../lib/advene/gui/main.py:4361
-msgid ""
-"Use third time increment for up/down navigation without having to hold shift."
-msgstr ""
-"Utilizar incremento de  tercer tiempo para la navegación hacia arriba / "
-"abajo sin tener que sostener shift."
+#: ../lib/advene/rules/elements.py:1034
+msgid "Modification of the associated media"
+msgstr "Modificación del medio asociado"
 
-#: ../lib/advene/gui/main.py:4363
-msgid "Scroll increment"
-msgstr "Incremento del desplazamiento"
+#: ../lib/advene/rules/elements.py:1035
+msgid "Highlight a bookmark"
+msgstr "Resaltar separador"
 
-#: ../lib/advene/gui/main.py:4363
-msgid ""
-"On most annotations, control+scrollwheel will increment/decrement their "
-"bounds by this value (in ms)."
-msgstr ""
-"En la mayoría de las anotaciones, control + rueda de desplazamiento "
-"aumentará / disminuirá sus límites por este valor (en ms)."
+#: ../lib/advene/rules/elements.py:1036
+msgid "Unhighlight a bookmark"
+msgstr "Remover resaltado del separador"
 
-#: ../lib/advene/gui/main.py:4364
-msgid "Second scroll increment"
-msgstr "Incremento del segundo desplazamiento"
+#: ../lib/advene/rules/elements.py:1037
+msgid "Updating duration of the movie"
+msgstr "Actualizando la duración de la película"
 
-#: ../lib/advene/gui/main.py:4364
-msgid ""
-"On most annotations, control+shift+scrollwheel will increment/decrement "
-"their bounds by this value (in ms)."
-msgstr ""
-"En la mayoría de las anotaciones, control + shift + scroll aumentará / "
-"disminuirá sus límites por este valor (en ms)."
+#: ../lib/advene/rules/elements.py:1038
+msgid "Displaying a popup"
+msgstr "Muestra una ventana flotante"
 
-#: ../lib/advene/gui/main.py:4366
-msgid "Player sync"
-msgstr "Sincronizar reproductor"
+#: ../lib/advene/rules/elements.py:1039
+msgid "Updating a snapshot"
+msgstr "Actualiza una captura"
 
-#: ../lib/advene/gui/main.py:4366
-msgid ""
-"Interval (in ms) with which we synchronize slave players. Setting a too-low "
-"value could render the application unusable. Use 0 to disable continuous "
-"synchronization."
-msgstr ""
-"Intervalo (en ms) por el cual vamos a sincronizar los reproductores "
-"esclavos. Establecer un valor demasiado bajo puede dejar la aplicación "
-"inutilizable. Utiliza 0 para deshabilitar la sincronización contínua."
+#: ../lib/advene/rules/elements.py:1077
+msgid "Player control"
+msgstr "Control del reproductor"
 
-#: ../lib/advene/gui/main.py:4367
-msgid "Timeline parameters"
-msgstr "Parámetros de la línea del tiempo"
+#: ../lib/advene/rules/elements.py:1078
+msgid "Audio enrichment"
+msgstr "Enriquecer audio"
 
-#: ../lib/advene/gui/main.py:4368
-msgid "Font size for annotation widgets"
-msgstr "Tamaño de la fuente para los widgets de anotación"
+#: ../lib/advene/rules/elements.py:1079
+msgid "Image enrichment"
+msgstr "Enriquecer imagen"
 
-#: ../lib/advene/gui/main.py:4369
-msgid "Button height"
-msgstr "Altura de los botones"
+#: ../lib/advene/rules/elements.py:1080
+msgid "External display control"
+msgstr "Control de la pantalla externa"
 
-#: ../lib/advene/gui/main.py:4369
-msgid "Height of annotation widgets"
-msgstr "Altura de los widgets de anotación"
+#: ../lib/advene/rules/elements.py:1081
+msgid "Popup"
+msgstr "Ventana flotante"
 
-#: ../lib/advene/gui/main.py:4370
-msgid "Interline height"
-msgstr "Algura del interlineado"
+#: ../lib/advene/rules/elements.py:1083
+msgid "State"
+msgstr "Estado"
 
-#: ../lib/advene/gui/main.py:4370
-msgid "Height of interlines"
-msgstr "Altura del interlineado"
+#: ../lib/advene/rules/elements.py:1084
+msgid "GUI actions"
+msgstr "Acciones GUI"
 
-#: ../lib/advene/gui/main.py:4372
-msgid "Text content"
-msgstr "Contenido de texto"
+#: ../lib/advene/rules/elements.py:1085
+msgid "Expert"
+msgstr "Acciones genéricas"
 
-#: ../lib/advene/gui/main.py:4373
-msgid "Completion mode"
-msgstr "Modo de terminación"
+#: ../lib/advene/util/helper.py:409
+msgid "Annotation"
+msgstr "Anotacion"
 
-#: ../lib/advene/gui/main.py:4373
-msgid "Enable dynamic completion mode"
-msgstr "Habilitar modo de terminación dinámico"
+#: ../lib/advene/util/helper.py:410
+msgid "Relation"
+msgstr "Relacion"
 
-#: ../lib/advene/gui/main.py:4374
-msgid "Abbreviation mode"
-msgstr "Modo de abreviación"
+#: ../lib/advene/util/helper.py:416
+msgid "Resource Folder"
+msgstr "Folder de recursos"
 
-#: ../lib/advene/gui/main.py:4374
-msgid "Enable abbreviation mode"
-msgstr "Habilitar modo de abreviación"
+#: ../lib/advene/util/helper.py:452
+msgid "---- Elements ----"
+msgstr "---- Elementos ----"
 
-#: ../lib/advene/gui/main.py:4375
-msgid "Abbreviations"
-msgstr "Abreviaciones"
+#: ../lib/advene/util/helper.py:458
+msgid "---- Attributes ----"
+msgstr "---- Atributos ----"
 
-#: ../lib/advene/gui/main.py:4375
-msgid ""
-"Text abbreviations. 1 entry per line. Each line consists of the abbreviation "
-"followed by its replacement."
-msgstr ""
-"Abreviaciones de texto. 1 entrada por línea. Cada línea consiste de la "
-"abreviación seguida de su reemplazo."
+#: ../lib/advene/util/helper.py:461
+msgid "---- Methods ----"
+msgstr "---- Metodos ----"
 
-#: ../lib/advene/gui/main.py:4377
-msgid "Text-To-Speech"
-msgstr "Texto-a-voz"
+#: ../lib/advene/util/helper.py:534
+#, python-format
+msgid "Cannot read %(filename)s: %(error)s"
+msgstr "No se puede leer %(filename)s: %(error)s"
 
-#: ../lib/advene/gui/main.py:4378
-msgid "TTS language"
-msgstr "Lenguaje TTS"
+#: ../lib/advene/util/helper.py:541
+#, fuzzy, python-format
+msgid "File %s is not an Advene zip package - no mimetype."
+msgstr "El archivo %s no es un paquete zip de Advene."
 
-#: ../lib/advene/gui/main.py:4379
-msgid "What language settings should be used for text-to-speech"
-msgstr "Qué preferencias de lenguaje deben ser utilizadas para texto-a-voz"
+#: ../lib/advene/util/helper.py:543
+#, fuzzy, python-format
+msgid "File %(fname)s is not an Advene zip package - wrong mimetype %(type)s."
+msgstr "El archivo %s no es un paquete zip de Advene."
 
-#: ../lib/advene/gui/main.py:4380
-msgid "English"
-msgstr "Inglés"
+#: ../lib/advene/util/helper.py:559
+#, python-format
+msgid ""
+"Error:\n"
+"%s"
+msgstr ""
+"Error:\n"
+"%s"
 
-#: ../lib/advene/gui/main.py:4381
-msgid "French"
-msgstr "Francés"
+#: ../lib/advene/util/helper.py:641
+msgid "schema"
+msgstr "esquema"
 
-#: ../lib/advene/gui/main.py:4382
-msgid "Spanish"
-msgstr "Español"
+#: ../lib/advene/util/helper.py:641
+msgid "schemas"
+msgstr "esquemas"
 
-#: ../lib/advene/gui/main.py:4384
-msgid "TTS Encoding"
-msgstr "Codificación TTS"
+#: ../lib/advene/util/helper.py:642
+msgid "annotation"
+msgstr "anotacion"
 
-#: ../lib/advene/gui/main.py:4385
-msgid "What encoding should be used to communicate with the TTS engine"
-msgstr ""
-"Qué codificación debe ser utilizada para comunicarse con la máquina TTS"
+#: ../lib/advene/util/helper.py:642
+msgid "annotations"
+msgstr "anotaciones"
 
-#: ../lib/advene/gui/main.py:4386
-msgid "TTS Engine"
-msgstr "Máquina TTS"
+#: ../lib/advene/util/helper.py:643 ../lib/advene/util/helper.py:644
+msgid "annotation type"
+msgstr "tipo de anotacion"
 
-#: ../lib/advene/gui/main.py:4387
-msgid ""
-"Which TTS engine should be used (modification requires restarting Advene to "
-"take into account)"
-msgstr ""
-"Cuál máquina TTS debe ser utilizada (la modificación requiere reiniciar "
-"Advene para tomarlo en cuenta)"
+#: ../lib/advene/util/helper.py:643 ../lib/advene/util/helper.py:644
+msgid "annotation types"
+msgstr "tipos de anotaciones"
 
-#: ../lib/advene/gui/main.py:4388
-msgid "Automatic"
-msgstr "Automático"
+#: ../lib/advene/util/helper.py:645
+msgid "relation"
+msgstr "relacion"
 
-#: ../lib/advene/gui/main.py:4389
-msgid "eSpeak"
-msgstr "eSpeak"
+#: ../lib/advene/util/helper.py:645
+msgid "relations"
+msgstr "relaciones"
 
-#: ../lib/advene/gui/main.py:4390
-msgid "Custom script with standard input"
-msgstr "Script personalizado con entrada estándar"
+#: ../lib/advene/util/helper.py:646 ../lib/advene/util/helper.py:647
+msgid "relation type"
+msgstr "tipos de relacion"
 
-#: ../lib/advene/gui/main.py:4391
-msgid "Custom script with arguments"
-msgstr "Script personalizado con argumentos"
+#: ../lib/advene/util/helper.py:646 ../lib/advene/util/helper.py:647
+msgid "relation types"
+msgstr "tipos de relaciones"
 
-#: ../lib/advene/gui/main.py:4392
-msgid "SAPI"
-msgstr "SAPI"
+#: ../lib/advene/util/helper.py:648
+msgid "query"
+msgstr "busqueda"
 
-#: ../lib/advene/gui/main.py:4393
-msgid "MacOS X say"
-msgstr "MacOS X dice"
+#: ../lib/advene/util/helper.py:648
+msgid "queries"
+msgstr "busquedas"
 
-#: ../lib/advene/gui/main.py:4394
-msgid "Generic (text output)"
-msgstr "Genérica (salida de texto)"
+#: ../lib/advene/util/helper.py:649
+msgid "view"
+msgstr "vista"
 
-#: ../lib/advene/gui/main.py:4438
-msgid "You should restart Advene to take some options into account."
-msgstr "Debes reiniciar Advene para tomar algunas opciones en cuenta. "
+#: ../lib/advene/util/helper.py:649
+msgid "views"
+msgstr "vistas"
 
-#: ../lib/advene/gui/main.py:4447
-#, python-format
-msgid "Imagecache saved to %s"
-msgstr "El cache de la imagen guardado en %s"
+#: ../lib/advene/util/helper.py:650
+msgid "package"
+msgstr "paquete"
 
-#: ../lib/advene/gui/main.py:4460
-msgid "Restarting player..."
-msgstr "Reiniciando el reproductor..."
+#: ../lib/advene/util/helper.py:650
+msgid "packages"
+msgstr "paquetes"
 
-#: ../lib/advene/gui/main.py:4512
-msgid "Advene log"
-msgstr "Bitácora de Advene"
+#: ../lib/advene/util/helper.py:662
+#, python-format
+msgid "No %s"
+msgstr "No %s"
 
-#: ../lib/advene/gui/main.py:4581
-msgid "Select the package to merge"
-msgstr "Selecciona el paquete a unir"
+#: ../lib/advene/util/helper.py:664
+#, python-format
+msgid "1 %s"
+msgstr "1 %s"
 
-#: ../lib/advene/gui/main.py:4602
-msgid "Saving workspace"
-msgstr "Guardando el espacio de trabajo"
+#: ../lib/advene/util/helper.py:666
+#, python-format
+msgid "%(count)d %(plural)s"
+msgstr "%(count)d %(plural)s"
 
-#: ../lib/advene/gui/main.py:4605
-msgid "Enter a view name to save the workspace"
-msgstr "Ingresar el nombre de una vista para guardar el espacio de trabajo"
+#: ../lib/advene/util/website_export.py:63
+#, python-format
+msgid "%s exists but is not a directory. Cancelling website export"
+msgstr ""
+"%s existe pero no es un directorio. Cancelando la exportación a sitio web"
 
-#: ../lib/advene/gui/main.py:4606
-msgid "Default workspace"
-msgstr "Espacio de trabajo predeterminado"
+#: ../lib/advene/util/website_export.py:69
+#, python-format
+msgid "%s does not exist"
+msgstr "%s no existe"
 
-#: ../lib/advene/gui/main.py:4607
-msgid "Open this workspace when opening the package"
-msgstr "Abrir este espacio de trabajo cuando se abra el paquete"
+#: ../lib/advene/util/website_export.py:423
+msgid "Starting export"
+msgstr "Inicializando exportación"
 
-#: ../lib/advene/gui/main.py:4641
+#: ../lib/advene/util/website_export.py:452
 #, python-format
-msgid "Error: the view %s exists and is not a workspace view."
-msgstr "Error: La vista %s existe y no es un espacio de trabajo. "
+msgid "Depth %d"
+msgstr "Profundidad %d"
 
-#: ../lib/advene/gui/main.py:4672
+#: ../lib/advene/util/website_export.py:456
 #, python-format
-msgid "Cannot save default workspace: %s"
-msgstr "No se puede guardar el espacio de trabajo predeterminado: %s"
+msgid "Depth %(depth)d: processing %(url)s"
+msgstr "Profundidad %(depth)d: procesando %(url)s"
 
-#: ../lib/advene/gui/main.py:4682
-msgid "Standard workspace has been saved"
-msgstr "El espacio de trabajo estándar ha sido guardado"
+#: ../lib/advene/util/website_export.py:478
+msgid "Finalizing"
+msgstr "Finalizando"
 
-#: ../lib/advene/gui/main.py:4689
-msgid "Website export"
-msgstr "Exportar a sitio web"
+#: ../lib/advene/util/website_export.py:512
+#, python-format
+msgid ""
+"<p><strong>You should probably begin at <a href=\"%(href)s\">%(title)s</a>.</"
+"strong></p>"
+msgstr ""
+"<p><strong>Deberías comenzar en<a href=\"%(href)s\">%(title)s</a>.</strong></"
+"p>"
 
-#: ../lib/advene/gui/main.py:4690
-msgid "Exporting views to a website"
-msgstr "Exportar vistas a un sitio web"
+#: ../lib/advene/util/website_export.py:555
+msgid "Export complete"
+msgstr "Exportación completa"
 
-#: ../lib/advene/gui/main.py:4693
-msgid "Output directory"
-msgstr "Directorio de salida"
+#: ../lib/advene/util/importer.py:134
+msgid "Generic importer"
+msgstr "Importador generico"
 
-#: ../lib/advene/gui/main.py:4702
-msgid "Specify the output directory"
-msgstr "Especifica el directorio de salida"
+#: ../lib/advene/util/importer.py:188
+msgid "Usage: %prog [options] source-file destination-file"
+msgstr "Uso: %prog [options] archivo-origen archivo-destino"
 
-#: ../lib/advene/gui/main.py:4711
-msgid "Maximum recursion depth"
-msgstr "Profundidad de recursión máxima"
+#: ../lib/advene/util/importer.py:192
+msgid "Specify the offset in ms"
+msgstr "Especificar la compensacion en ms"
 
-#: ../lib/advene/gui/main.py:4718
-msgid "Video URL"
-msgstr "URL del video"
+#: ../lib/advene/util/importer.py:264
+msgid ""
+"Import filter error. The asynchronous API should be used, please report a "
+"bug."
+msgstr ""
+"Error para importar filtro. El API asíncrono debería de ser utilizado, por "
+"favor reporta un bug."
 
-#: ../lib/advene/gui/main.py:4720
+#: ../lib/advene/util/importer.py:266
 msgid ""
-"URL for the video, if it is available on a sharing website (Only Youtube for "
-"the moment).\n"
-" It can also be a h264/ogg file, which will in this case be handled by the "
-"HTML5 video player."
+"Import filter error. No conversion method is defined,  please report a bug."
 msgstr ""
-"URL del video, si está disponible en un sitio web para compartir (únicamente "
-"Youtube por el momento).\n"
-"También puede ser un archivo h264/ogg, el cual en este caso será manejado "
-"por el reproductor de video de HTML5."
+"Error para importar filtro. No está definido un método de conversión, por "
+"favor reporta un bug."
 
-#: ../lib/advene/gui/main.py:4770
-msgid "Could not export data: "
-msgstr "No se pueden exportar los datos:"
+#: ../lib/advene/util/importer.py:532
+msgid "ExternalApp importer"
+msgstr "Importador de ExternalApp"
 
-#: ../lib/advene/gui/main.py:4772
+#: ../lib/advene/util/importer.py:546
 #, python-format
-msgid "Website export to %s completed"
-msgstr "Exportar sitio web a %s completado"
-
-#: ../lib/advene/gui/main.py:4811
-msgid "This video player is not able to grab specific screenshots"
+msgid ""
+"The <b>%s</b> application does not seem to be installed. Please check that "
+"it is present and that its path is correctly specified in preferences."
 msgstr ""
-"Este reproductor de video no es capaz de obtener capturas de pantalla "
-"específicas"
+"La aplicación <b>%s</b> parece no estar instalada. Por favor revisa que esté "
+"presente y que su ruta (path) esté especificada de manera correcta en las "
+"preferencias."
 
-#: ../lib/advene/gui/main.py:4821
+#: ../lib/advene/util/importer.py:548
 #, python-format
-msgid "Updating %d snapshots"
-msgstr "Actualiza %d capturas"
-
-#: ../lib/advene/gui/main.py:4826
-msgid "No snapshot to update"
-msgstr "No hay capturas para actualizar"
+msgid "The file %s does not seem to exist."
+msgstr "El archivo %s parece no existir."
 
-#: ../lib/advene/gui/main.py:4835 ../lib/advene/gui/main.py:4947
-msgid "You first must load a movie into Advene"
-msgstr "Primero debes de cargar un archivo de video en Advene"
+#: ../lib/advene/util/importer.py:570
+#, python-format
+msgid "Could not run %(appname)s: %(msg)s"
+msgstr "No se puede correr %(appname)s: %(msg)s"
 
-#: ../lib/advene/gui/main.py:4838 ../lib/advene/gui/main.py:4950
+#: ../lib/advene/util/importer.py:572
 #, python-format
-msgid "The movie %s does not seem to exist."
-msgstr "La película %s parece que no existe."
+msgid "Processing %s"
+msgstr "Procesando  %s"
 
-#: ../lib/advene/gui/main.py:4895
-msgid "Generating screenshots"
-msgstr "Generando capturas de pantalla"
+#: ../lib/advene/util/importer.py:576
+msgid "Cleaning up..."
+msgstr "Limpiando..."
 
-#: ../lib/advene/gui/main.py:4900
-msgid ""
-"<b>Screenshot generation</b>\n"
-"\n"
-"Screenshots will be captured approximately every 500ms.\n"
-"\n"
-"If the movie was paused or playing, the capture will begin at the current "
-"position. Else, it will begin at the beginning of the movie.\n"
-"Note that the main interface will not be refreshed as long as this window is "
-"open."
+#: ../lib/advene/util/importer.py:687
+msgid "Text importer"
+msgstr "Importador de texto"
+
+#: ../lib/advene/util/importer.py:700 ../lib/advene/util/importer.py:1225
+msgid "Specify the encoding of the input file (latin1, utf8...)"
+msgstr "Especifica la codificación del archivo de entrada (latin1, utf8...)"
+
+#: ../lib/advene/util/importer.py:703
+msgid "Should the timestamps be encoded relative to the first timestamp?"
 msgstr ""
-"<b>Generación de captura de pantalla </b>\n"
-" \n"
-" Las capturas de pantalla se realizarán cada 500 ms. aproximadamente\n"
-" \n"
-"Si la película se pausa o se reproduce, la captura se iniciará en la "
-"posición actual. Si no, va a comenzar por el principio de la película.\n"
-"Ten en cuenta que la interfaz principal no se actualizará mientras esta "
-"ventana está abierta."
 
-#: ../lib/advene/gui/main.py:4941
-msgid ""
-"The <b>shotdetect</b> application does not seem to be installed. Please "
-"check that it is present and that its path is correctly specified in "
-"preferences."
+#: ../lib/advene/util/importer.py:706
+msgid "Unit to consider for integers"
 msgstr ""
-"La aplicación <b> shotdetect </ b> parece que no está instalada. Por favor, "
-"comprueba que está instalada y que su ruta (PATH) se ha especificado "
-"correctamente en las preferencias."
 
-#: ../lib/advene/gui/main.py:4981
+#: ../lib/advene/util/importer.py:709
 msgid ""
-"Cannot import shotdetect output. Did you install the shotdetect software?"
+"What timestamps are present in a line (only begin, both begin and end, or "
+"automatic recognition)"
 msgstr ""
-"No se puede importar la salida de la detección de capturas. ¿Instalaste el "
-"software para la detección de capturas?"
 
-#: ../lib/advene/gui/main.py:4998
-msgid "Incomplete shots"
-msgstr "Tomas incompletas"
+#: ../lib/advene/util/importer.py:852
+msgid "lsdvd importer"
+msgstr "Importador lsdvd"
 
-#: ../lib/advene/gui/main.py:5001
-#, python-format
-msgid "Detected %s shots"
-msgstr "Detectadas %s tomas"
+#: ../lib/advene/util/importer.py:879
+msgid "Processing data"
+msgstr "Procesando datos"
 
-#: ../lib/advene/gui/main.py:5103
-#, python-format
-msgid "Could not run shotdetect: %s"
-msgstr "No se pudo correr detección de capturas: %s"
+#: ../lib/advene/util/importer.py:897 ../lib/advene/util/importer.py:957
+msgid "DVD Chapter"
+msgstr "Capitulo de DVD"
+
+#: ../lib/advene/util/importer.py:901
+msgid "Launching lsdvd..."
+msgstr "Lanzando lsdvd..."
+
+#: ../lib/advene/util/importer.py:913
+msgid "chaplin importer"
+msgstr "Importador chaplin"
+
+#: ../lib/advene/util/importer.py:971
+msgid "Xi importer"
+msgstr "Importador Xi"
+
+#: ../lib/advene/util/importer.py:1039
+msgid "ELAN importer"
+msgstr "Importador ELAN"
 
-#: ../lib/advene/gui/main.py:5107
+#: ../lib/advene/util/importer.py:1092
 #, python-format
-msgid "Detecting shots from %s"
-msgstr "Detectando capturas de %s"
+msgid "Converting tier %s"
+msgstr "Convirtiendo nivel %s"
+
+#: ../lib/advene/util/importer.py:1189
+msgid "Processing time slots"
+msgstr "Procesando casillas de tiempo"
+
+#: ../lib/advene/util/importer.py:1204
+msgid "Fixing forward references"
+msgstr "Corrigiendo referencias siguientes"
 
-#: ../lib/advene/gui/main.py:5160
-msgid "Shot detection"
-msgstr "Detección de tomas"
+#: ../lib/advene/util/importer.py:1206
+msgid "Creating relations"
+msgstr "Creando relaciones"
+
+#: ../lib/advene/util/importer.py:1218
+msgid "Subtitle (SRT) importer"
+msgstr "Importador de subtítulos (SRT)"
+
+#: ../lib/advene/util/importer.py:1276
+#, python-format
+msgid "Subtitles from %s"
+msgstr "Subtítulos de %s"
 
-#: ../lib/advene/gui/main.py:5166
+#: ../lib/advene/util/importer.py:1281
 msgid ""
-"<b>Shot detection</b>\n"
-"\n"
-"Advene will try to detect shots from the currently loaded movie. The "
-"threshold parameter is used to specify the sensitivity of the algorithm, and "
-"should typically be between 50 and 80. If too many shots are detected, try "
-"to augment its value."
+"Cannot decode subtitle file. Try to specify an encoding (latin1 perhaps?)."
 msgstr ""
-"<b>Detección de capturas</b>\n"
-"\n"
-"Advene intentará detectar capturas en la película cargada en ese momento. El "
-"parámetro de umbral se utiliza para especificar la sensibilidad del "
-"algoritmo, y normalmente debe ser de entre 50 y 80. Si se detectan "
-"demasiadas capturas, trata de aumentar su valor."
 
-#: ../lib/advene/gui/main.py:5182
-msgid "Sensitivity"
-msgstr "Sensibilidad"
+#: ../lib/advene/util/importer.py:1292
+msgid "PRAAT importer"
+msgstr "Importador PRAAT"
 
-#: ../lib/advene/gui/popup.py:138
-msgid "Choose the file to insert"
-msgstr "Elige un archivo a insertar"
+#: ../lib/advene/util/importer.py:1381
+msgid "CMML importer"
+msgstr "Importar CMML"
+
+#: ../lib/advene/util/importer.py:1444
+msgid "Parsing clip information"
+msgstr "Analizando información de clip"
+
+#: ../lib/advene/util/importer.py:1544
+msgid "Creating CMML schema"
+msgstr "Creando esquema CMML"
+
+#: ../lib/advene/util/importer.py:1568
+msgid "Parsing stream information"
+msgstr "Analizando flujo de información"
+
+#: ../lib/advene/util/importer.py:1602
+msgid "IRI importer"
+msgstr "Importar IRI"
+
+#: ../lib/advene/util/importer.py:1611
+msgid "Generate one type per view"
+msgstr "Genera un tipo por vista"
 
-#: ../lib/advene/gui/popup.py:146
-msgid "Select a valid identifier"
-msgstr "Selecciona un identificador válido"
+#: ../lib/advene/util/importer.py:1630
+#, python-format
+msgid "Parsing ensemble %s"
+msgstr "Analizando ensamble %s"
 
-#: ../lib/advene/gui/popup.py:147
+#: ../lib/advene/util/importer.py:1641
 #, python-format
-msgid ""
-"The filename %s contains invalid characters\n"
-"that have been replaced.\n"
-"You can modify this identifier if necessary:"
-msgstr ""
-"El nombre de archivo %s contiene caracteres no válidos\n"
-"que han sido reemplazados.\n"
-"Puedes modificar este identificador si es necesario:"
+msgid "Parsing decoupage %s"
+msgstr "Analizando desacoplaje %s"
 
-#: ../lib/advene/gui/popup.py:158
-msgid "Choose the soundclip to insert"
-msgstr "Elegir clip de audio para insertar"
+#: ../lib/advene/util/importer.py:1676
+msgid "Parsing views"
+msgstr "Analizando vistas"
 
-#: ../lib/advene/gui/popup.py:162
-msgid "Choose the directory to insert"
-msgstr "Elige un directorio para insertar"
+#: ../lib/advene/util/importer.py:1723 ../lib/advene/util/importer.py:1812
+msgid "Initializing package"
+msgstr "Inicializando paquete"
 
-#: ../lib/advene/gui/popup.py:177
-msgid "Named-Entity extraction using NERD"
-msgstr ""
+#: ../lib/advene/util/importer.py:1761
+msgid "IRIData importer"
+msgstr "Importador IRIData"
 
-#: ../lib/advene/gui/popup.py:181
-msgid ""
-"Give the offset to use\n"
-"on specified element.\n"
-"It is in ms and can be\n"
-"either positive or negative."
-msgstr ""
-"Da la compensacion para usar\n"
-"en el elemento especificado.\n"
-"Esta en ms y puede ser\n"
-"tanto positiva como negativa."
+#: ../lib/advene/util/importer.py:1775
+msgid "Parsing sound values"
+msgstr "Analizando valores de sonido"
 
-#: ../lib/advene/gui/popup.py:225
-#, python-format
-msgid "Replace content in %s"
-msgstr "Reemplazar contenido en %s"
+#: ../lib/advene/util/importer.py:1787
+msgid "Creating annotations"
+msgstr "Creando anotaciones"
 
-#: ../lib/advene/gui/popup.py:228
-#, python-format
-msgid "Replace content in annotations of type %s"
-msgstr "Reemplazar el contenido en las anotaciones de tipo %s"
+#, fuzzy
+#~ msgid "Got exception. Trying to continue."
+#~ msgstr "Hubo excepción %s. Tratando de continuar. "
 
-#: ../lib/advene/gui/popup.py:231
-msgid "Replace content in all annotations"
-msgstr "Reemplazar contenido en todas las anotaciones"
+#~ msgid ""
+#~ "Player not active - cached duration   : %(duration)s (%(durationms)d ms)"
+#~ msgstr ""
+#~ "Reproductor no activo - duración en cache : %(duration)s (%(durationms)d "
+#~ "ms) "
 
-#: ../lib/advene/gui/popup.py:324
-#, python-format
-msgid "Copy id %s"
-msgstr "Copiar id %s"
+#~ msgid "You first must load a movie into Advene"
+#~ msgstr "Primero debes de cargar un archivo de video en Advene"
 
-#: ../lib/advene/gui/popup.py:358
-#, python-format
-msgid ""
-"<b>Statistics about %s</b>\n"
-"\n"
-msgstr ""
-"<b>Estadísticas acerca %s</b>\n"
-"\n"
+#~ msgid "The movie %s does not seem to exist."
+#~ msgstr "La película %s parece que no existe."
 
-#: ../lib/advene/gui/popup.py:364
-#, python-format
-msgid "Renumbering annotations of type %s"
-msgstr "Renumerando las anotaciones del tipo %s"
+#~ msgid "Generating screenshots"
+#~ msgstr "Generando capturas de pantalla"
 
-#: ../lib/advene/gui/popup.py:371
-msgid ""
-"<b>Renumber all annotations according to their order.</b>\n"
-"\n"
-"<i>Note that this action cannot be undone.</i>\n"
-"Replace the first numeric value of the annotation content with the new "
-"annotation number.\n"
-"If no numeric value is found and the annotation is structured, it will "
-"insert the number.\n"
-"If no numeric value is found and the annotation is of type text/plain, it "
-"will overwrite the annotation content.\n"
-"The offset parameter allows you to renumber from a given annotation."
-msgstr ""
-"<b>Cambiar la numeración de todas las anotaciones de acuerdo a su orden.</"
-"b>\n"
-"\n"
-"<i>Esta acción no se puede deshacer.</i>\n"
-"Coloca el primer valor numérico del contenido de anotación con el nuevo "
-"número de anotación.\n"
-"Si no se encuentra ningún valor numérico y la anotación es estructurada, se "
-"insertará el número.\n"
-" Si no se encuentra ningún valor numérico y la anotación es de tipo text/"
-"plain, sobrescribirá el contenido de la anotación.\n"
-"El parámetro de desplazamiento le permite volver a numerar a partir de una "
-"anotación dada."
+#~ msgid ""
+#~ "<b>Screenshot generation</b>\n"
+#~ "\n"
+#~ "Screenshots will be captured approximately every 500ms.\n"
+#~ "\n"
+#~ "If the movie was paused or playing, the capture will begin at the current "
+#~ "position. Else, it will begin at the beginning of the movie.\n"
+#~ "Note that the main interface will not be refreshed as long as this window "
+#~ "is open."
+#~ msgstr ""
+#~ "<b>Generación de captura de pantalla </b>\n"
+#~ " \n"
+#~ " Las capturas de pantalla se realizarán cada 500 ms. aproximadamente\n"
+#~ " \n"
+#~ "Si la película se pausa o se reproduce, la captura se iniciará en la "
+#~ "posición actual. Si no, va a comenzar por el principio de la película.\n"
+#~ "Ten en cuenta que la interfaz principal no se actualizará mientras esta "
+#~ "ventana está abierta."
 
-#: ../lib/advene/gui/popup.py:377 ../lib/advene/gui/popup.py:484
-msgid "Offset"
-msgstr "Compensar"
+#~ msgid "Chronological order"
+#~ msgstr "Orden cronológico"
 
-#: ../lib/advene/gui/popup.py:399
-#, python-format
-msgid "Renumbering %d annotations"
-msgstr "Volviendo a numerar %d anotaciones"
+#~ msgid "Completeness and chronological order"
+#~ msgstr "Nivel de completado y orden cronológico"
 
-#: ../lib/advene/gui/popup.py:408
-#, python-format
-msgid "Annotation #%d"
-msgstr "Anotación #%d"
+#~ msgid "Reorder active bookmarks"
+#~ msgstr "Reorganizar los separadores activos"
 
-#: ../lib/advene/gui/popup.py:445
-#, python-format
-msgid ""
-"Exporting annotation %(title)s\n"
-"from %(begin)s to %(end)s\n"
-"to %%(filename)s"
-msgstr ""
-"Exportando anotación %(title)s\n"
-"de %(begin)s a %(end)s\n"
-"a %%(filename)s"
+#~ msgid "Preview"
+#~ msgstr "Vista previa"
 
-#: ../lib/advene/gui/popup.py:458
-msgid "Browse"
-msgstr "Navegar"
+#~ msgid "<h1>No playlist</h1>"
+#~ msgstr "<h1>No hay lista de reproduccion</h1>"
 
-#: ../lib/advene/gui/popup.py:466 ../lib/advene/gui/popup.py:853
-msgid "Open in web browser"
-msgstr "Abrir en un navegador web"
+#~ msgid ""
+#~ "<h1>Current playlist</h1>\n"
+#~ "                <ul>%s</ul>"
+#~ msgstr ""
+#~ "<h1>Lista de reproduccion actual</h1>\n"
+#~ "                <ul>%s</ul>"
 
-#: ../lib/advene/gui/popup.py:479
-msgid "Search/replace content"
-msgstr "Buscar / reemplazar contenido "
+#~ msgid "Exception (traceback in console):"
+#~ msgstr "Excepción (registro en consola):"
 
-#: ../lib/advene/gui/popup.py:497
-msgid "Desactivate"
-msgstr "Desactivar"
+#~ msgid "Cannot export to %(fname)s: %(e)s"
+#~ msgstr "No se puede exportar a %(fname)s: %(e)s"
 
-#: ../lib/advene/gui/popup.py:514
-msgid "Loop"
-msgstr "Ciclo"
+#~ msgid "Cannot export to %(host)s:%(port)s %(error)s"
+#~ msgstr "No se puede exportar a %(host)s:%(port)s %(error)s"
 
-#: ../lib/advene/gui/popup.py:515
-msgid "Duplicate"
-msgstr "Duplicar"
+#~ msgid "Cannot send data to %(host)s:%(port)s %(error)s"
+#~ msgstr "No se pueden enviar los datos a %(host)s:%(port)s %(error)s"
 
-#: ../lib/advene/gui/popup.py:519
-msgid "Save snapshot..."
-msgstr "Guardar captura..."
+#~ msgid "Cannot send event %(nb)s to %(host)s:%(port)s %(error)s"
+#~ msgstr "No se puede enviar evento %(nb)s a %(host)s:%(port)s %(error)s"
 
-#: ../lib/advene/gui/popup.py:521
-msgid "Extract video fragment"
-msgstr "Extraer fragmento de video"
+#~ msgid "%(nb)s events sent to %(host)s:%(port)s during session."
+#~ msgstr "%(nb)s eventos enviados a %(host)s:%(port)s durante la sesión."
 
-#: ../lib/advene/gui/popup.py:551
-msgid "Incoming"
-msgstr "Entrando "
+#, fuzzy
+#~ msgid "Store results as markup in the annotation text"
+#~ msgstr ""
+#~ "Busca y reemplaza cadenas de texto en el contenido de las anotaciones"
 
-#: ../lib/advene/gui/popup.py:567
-msgid "Outgoing"
-msgstr "Saliendo "
+#~ msgid "All annotations"
+#~ msgstr "Todas las anotaciones"
 
-#: ../lib/advene/gui/popup.py:582
-msgid "Related annotations"
-msgstr "Anotaciones relacionadas"
+#~ msgid "Display log file"
+#~ msgstr "Mostrar bitácora (log file)"
 
-#: ../lib/advene/gui/popup.py:589
-msgid "Incoming relations"
-msgstr "Relaciones entrantes"
+#~ msgid "Advene log"
+#~ msgstr "Bitácora de Advene"
 
-#: ../lib/advene/gui/popup.py:596
-msgid "Outgoing relations"
-msgstr "Relaciones salientes"
+#~ msgid "Raised exception in update_status: %s"
+#~ msgstr "Excepcion levantada en update_status: %s"
 
-#: ../lib/advene/gui/popup.py:612
-#, python-format
-msgid "Begin: %s"
-msgstr "Inicio: %s"
+#, fuzzy
+#~ msgid "WebAnnotation importer"
+#~ msgstr "Importador AnnotationGraph"
 
-#: ../lib/advene/gui/popup.py:614
-#, python-format
-msgid "End: %s"
-msgstr "Final: %s"
+#, fuzzy
+#~ msgid "NERD applied to %s"
+#~ msgstr "Vista aplicada a %s\n"
 
-#: ../lib/advene/gui/popup.py:615
-#, python-format
-msgid "Duration: %s"
-msgstr "Duración: %s"
+#~ msgid "Detect shots"
+#~ msgstr "Detectar tomas"
 
-#: ../lib/advene/gui/popup.py:622
-msgid "Members:"
-msgstr "Miembros:"
+#~ msgid "Automatically detect shots"
+#~ msgstr "Detectar tomas automáticamente"
 
-#: ../lib/advene/gui/popup.py:635
-msgid "Edit package properties..."
-msgstr "Editar propiedades de los paquetes..."
+#~ msgid "Tree view"
+#~ msgstr "Vista de arbol"
 
-#: ../lib/advene/gui/popup.py:636 ../lib/advene/gui/popup.py:756
-#, python-format
-msgid "%d annotations(s) - statistics"
-msgstr "%d anotaciones - estadísticas"
+#~ msgid "Schema editor"
+#~ msgstr "Editor de esquema"
 
-#: ../lib/advene/gui/popup.py:638 ../lib/advene/gui/popup.py:864
-msgid "Create a new static view..."
-msgstr "Crear una nueva vista..."
+#~ msgid "Visualise the activity trace preview"
+#~ msgstr "Visualizar la vista previa de la actividad de rastreo"
 
-#: ../lib/advene/gui/popup.py:639 ../lib/advene/gui/popup.py:865
-msgid "Create a new dynamic view..."
-msgstr "Crear una nueva vista dinámica..."
+#~ msgid "Visualise the activity trace as a timeline"
+#~ msgstr "Visualizar la actividad de rastreo como línea de tiempo"
 
-#: ../lib/advene/gui/popup.py:640 ../lib/advene/gui/popup.py:751
-msgid "Create a new annotation..."
-msgstr "Crear una nueva anotacion"
+#~ msgid ""
+#~ "Error: unable to find an edit popup for %(element)s:\n"
+#~ "%(error)s"
+#~ msgstr ""
+#~ "Error: no es posible encontrar una ventana flotante de edición para "
+#~ "%(element)s:\n"
+#~ "%(error)s"
 
-#: ../lib/advene/gui/popup.py:642 ../lib/advene/gui/popup.py:867
-msgid "Create a new schema..."
-msgstr "Crear un nuevo esquema..."
+#~ msgid ""
+#~ "The <b>shotdetect</b> application does not seem to be installed. Please "
+#~ "check that it is present and that its path is correctly specified in "
+#~ "preferences."
+#~ msgstr ""
+#~ "La aplicación <b> shotdetect </ b> parece que no está instalada. Por "
+#~ "favor, comprueba que está instalada y que su ruta (PATH) se ha "
+#~ "especificado correctamente en las preferencias."
 
-#: ../lib/advene/gui/popup.py:643 ../lib/advene/gui/popup.py:862
-msgid "Create a new query..."
-msgstr "Crear una nueva busqueda..."
+#~ msgid ""
+#~ "Cannot import shotdetect output. Did you install the shotdetect software?"
+#~ msgstr ""
+#~ "No se puede importar la salida de la detección de capturas. ¿Instalaste "
+#~ "el software para la detección de capturas?"
 
-#: ../lib/advene/gui/popup.py:651
-msgid "Create a new folder..."
-msgstr "Crear una nueva carpeta..."
+#~ msgid "Incomplete shots"
+#~ msgstr "Tomas incompletas"
 
-#: ../lib/advene/gui/popup.py:652
-msgid "Create a new resource file..."
-msgstr "Crear un nuevo archivo de recurso..."
+#~ msgid "Detected %s shots"
+#~ msgstr "Detectadas %s tomas"
 
-#: ../lib/advene/gui/popup.py:653
-msgid "Insert a new resource file..."
-msgstr "Insertar un nuevo archivo de recurso..."
+#~ msgid "Could not run shotdetect: %s"
+#~ msgstr "No se pudo correr detección de capturas: %s"
 
-#: ../lib/advene/gui/popup.py:654
-msgid "Insert a new resource directory..."
-msgstr "Insertar un nuevo directorio de recursos..."
+#~ msgid "Detecting shots from %s"
+#~ msgstr "Detectando capturas de %s"
 
-#: ../lib/advene/gui/popup.py:663 ../lib/advene/gui/popup.py:665
-msgid "Insert a soundclip..."
-msgstr "Insertar un clip de sonido..."
+#~ msgid "Shot detection"
+#~ msgstr "Detección de tomas"
 
-#: ../lib/advene/gui/popup.py:676
-msgid "Play sound"
-msgstr "Reproducir sonido"
+#~ msgid ""
+#~ "<b>Shot detection</b>\n"
+#~ "\n"
+#~ "Advene will try to detect shots from the currently loaded movie. The "
+#~ "threshold parameter is used to specify the sensitivity of the algorithm, "
+#~ "and should typically be between 50 and 80. If too many shots are "
+#~ "detected, try to augment its value."
+#~ msgstr ""
+#~ "<b>Detección de capturas</b>\n"
+#~ "\n"
+#~ "Advene intentará detectar capturas en la película cargada en ese momento. "
+#~ "El parámetro de umbral se utiliza para especificar la sensibilidad del "
+#~ "algoritmo, y normalmente debe ser de entre 50 y 80. Si se detectan "
+#~ "demasiadas capturas, trata de aumentar su valor."
 
-#: ../lib/advene/gui/popup.py:686
-msgid "Create a new annotation type..."
-msgstr "Crear un nuevo tipo de anotacion..."
+#~ msgid "Sensitivity"
+#~ msgstr "Sensibilidad"
 
-#: ../lib/advene/gui/popup.py:688
-msgid "Create a new relation type..."
-msgstr "Crear un nuevo tipo de relacion..."
+#, fuzzy
+#~ msgid "Min duration"
+#~ msgstr "2s duración"
 
-#: ../lib/advene/gui/popup.py:699
-#, python-format
-msgid "A caption dynamic view for %s already seems to exist."
-msgstr "Un subtítulo dinámico para la vista %s parece que ya existe."
+#, fuzzy
+#~ msgid "Max duration"
+#~ msgstr "2s duración"
 
-#: ../lib/advene/gui/popup.py:708
-#, python-format
-msgid "Caption %s annotations"
-msgstr "Subtítulo %s anotaciones"
+#, fuzzy
+#~ msgid "Mean duration"
+#~ msgstr "2s duración"
 
-#: ../lib/advene/gui/popup.py:740
-msgid "Create a comment view"
-msgstr "Crear una vista de comentario"
+#, fuzzy
+#~ msgid "Total duration"
+#~ msgstr "Duración total"
 
-#: ../lib/advene/gui/popup.py:741
-msgid "Generate a caption dynamic view..."
-msgstr "Genera una vista dinámica de subtítulos"
+#~ msgid "Schema Editor"
+#~ msgstr "Editor de esquema"
 
-#: ../lib/advene/gui/popup.py:742
-msgid "Display as transcription"
-msgstr "Muestra como transcripcion"
+#~ msgid "Display"
+#~ msgstr "Mostrar"
 
-#: ../lib/advene/gui/popup.py:743
-msgid "Display annotations in table"
-msgstr "Muestra las anotaciones en una tabla"
+#~ msgid "Remove relation type"
+#~ msgstr "Remover tipo de relación"
 
-#: ../lib/advene/gui/popup.py:744
-msgid "Export to another format..."
-msgstr "Exportar a otro formato"
+#~ msgid "Create HTML view"
+#~ msgstr "Crear una vista HTML"
 
-#: ../lib/advene/gui/popup.py:746
-msgid "Extract Named Entities..."
-msgstr ""
+#~ msgid "Remove annotation type"
+#~ msgstr "Remover tipo de anotación"
 
-#: ../lib/advene/gui/popup.py:752
-msgid "Delete all annotations"
-msgstr "Borrar todas las anotaciones"
+#~ msgid "Create relation type between this one and..."
+#~ msgstr "Crea un tipo de relación entre este y..."
 
-#: ../lib/advene/gui/popup.py:753
-msgid "Renumber annotations..."
-msgstr "Volviendo a numerar anotaciones"
+#~ msgid "New schema"
+#~ msgstr "Nuevo esquema"
 
-#: ../lib/advene/gui/popup.py:754
-#, fuzzy
-msgid "Shot validation view..."
-msgstr "Vista de validación de capturas"
+#~ msgid "New annotation type"
+#~ msgstr "Nuevo tipo de anotación"
 
-#: ../lib/advene/gui/popup.py:766
-#, python-format
-msgid "A follow dynamic view for %s already seems to exist."
-msgstr "Una siguiente vista dinámica para %s parece que ya existe."
+#~ msgid "New relation type"
+#~ msgstr "Nuevo tipos de relación"
 
-#: ../lib/advene/gui/popup.py:775
-#, python-format
-msgid "Follow %s relation-type"
-msgstr "Seguir %s tipos de relación"
+#~ msgid "Hide this schema"
+#~ msgstr "Esconder este esquema"
 
-#: ../lib/advene/gui/popup.py:784
-msgid "Follow the relation"
-msgstr "Seguir la relación"
+#~ msgid "Export drawing to pdf"
+#~ msgstr "Exportar dibujo a pdf"
 
-#: ../lib/advene/gui/popup.py:804
-msgid "Delete all relations..."
-msgstr "Borrar todas las relaciones..."
+#~ msgid "Choose a filename to export the schema as PDF"
+#~ msgstr "Elige un nombre de archivo para exportar el esquema como PDF"
 
-#: ../lib/advene/gui/popup.py:805
-msgid "Create montage from related annotations"
-msgstr " Crear un montaje de las anotaciones relacionadas"
+#~ msgid "Cannot go back: first item in history"
+#~ msgstr "No se puede ir atrás: primer elemento en el historial"
 
-#: ../lib/advene/gui/popup.py:806
-msgid "Create dynamic view following relations"
-msgstr "Crear una vista dinámica siguiendo relaciones"
+#~ msgid "No children in on_iter_children()!"
+#~ msgstr "No hay hijos en on_iter_children()!"
 
-#: ../lib/advene/gui/popup.py:824
-msgid "Apply query on..."
-msgstr "Aplica la consulta en..."
+#~ msgid "No children in on_iter_nth_child()"
+#~ msgstr "No hay hijos en on_iter_nth_child()"
 
-#: ../lib/advene/gui/popup.py:849
-msgid "Activate view"
-msgstr "Activar vista"
+#~ msgid "Package View"
+#~ msgstr "VIsta de paquete"
 
-#: ../lib/advene/gui/popup.py:851
-msgid "Open adhoc view"
-msgstr "Abrir vista adhoc"
+#, fuzzy
+#~ msgid ""
+#~ "GNU General Public License v. 2\n"
+#~ "See http://www.gnu.org/copyleft/gpl.html for more details"
+#~ msgstr ""
+#~ "GNU General Public License\n"
+#~ "Ver http://www.gnu.org/copyleft/gpl.html para más detalles"
 
 #~ msgid "Adjust annotation bounds..."
 #~ msgstr "Ajustar los límites de la anotación"
@@ -9516,9 +9713,6 @@ msgstr "Abrir vista adhoc"
 #~ msgid "_MediaInformation"
 #~ msgstr "_InformacionMedia"
 
-#~ msgid "Display information about the media"
-#~ msgstr "Muestra información acerca de la media"
-
 #~ msgid "Open %s"
 #~ msgstr "Abrir %s"
 
@@ -9866,9 +10060,6 @@ msgstr "Abrir vista adhoc"
 #~ msgid "Restore layout"
 #~ msgstr "Restaurar el volumen"
 
-#~ msgid "Error: unable to find an edit popup for %s"
-#~ msgstr "Error: incapaz de encontrar un edit popup para %s"
-
 #~ msgid "Should provide a package name"
 #~ msgstr "Debe proveer un nombre de paquete"
 
@@ -10431,9 +10622,6 @@ msgstr "Abrir vista adhoc"
 #~ msgid "URL Stack"
 #~ msgstr "Almacen de URL"
 
-#~ msgid "Import _Transcription"
-#~ msgstr "Importar_Transcripcion"
-
 #~ msgid "Currently edited annotation"
 #~ msgstr "Anotacion editada actual"
 
diff --git a/po/fr.po b/po/fr.po
index d1e65fd..5c753df 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -5,8 +5,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-07-09 17:25+0200\n"
-"PO-Revision-Date: 2014-07-09 17:29+0200\n"
+"POT-Creation-Date: 2017-10-12 22:02+0200\n"
+"PO-Revision-Date: 2017-10-12 22:02+0200\n"
 "Last-Translator: Olivier Aubert <olivier.aubert at liris.cnrs.fr>\n"
 "Language-Team: advene at liris.cnrs.fr\n"
 "Language: \n"
@@ -14,9461 +14,9665 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../lib/advene/model/zippackage.py:187 ../lib/advene/model/zippackage.py:189
-#: ../lib/advene/util/helper.py:538 ../lib/advene/util/helper.py:540
-#, python-format
-msgid "File %s is not an Advene zip package."
-msgstr "Le fichier %s n'est pas un recueil Advene compressé."
-
-#: ../lib/advene/model/zippackage.py:243
-#, python-format
-msgid "Directory %s is not an extracted Advene zip package."
-msgstr "Le répertoire %s n'est pas un recueil Advene décompressé."
-
-#: ../lib/advene/model/bundle.py:296
+#: ../lib/advene/model/bundle.py:292
 #, python-format
 msgid "%s not in bundle"
 msgstr "%s n'est pas dans la liste"
 
-#: ../lib/advene/model/bundle.py:362
+#: ../lib/advene/model/bundle.py:358
 msgid "List of non-typed elements"
 msgstr "List d'éléments non-typés"
 
-#: ../lib/advene/model/bundle.py:367
+#: ../lib/advene/model/bundle.py:363
 #, python-format
 msgid "List of %s elements"
 msgstr "Liste d'éléments de type %s"
 
-#: ../lib/advene/core/controller.py:263 ../lib/advene/rules/actions.py:36
-#: ../lib/advene/gui/plugins/actions.py:40
-msgid "Display a message"
-msgstr "Affiche un message"
+#: ../lib/advene/model/zippackage.py:161 ../lib/advene/model/zippackage.py:163
+#, python-format
+msgid "File %s is not an Advene zip package."
+msgstr "Le fichier %s n'est pas un recueil Advene compressé."
 
-#: ../lib/advene/core/controller.py:264
-#: ../lib/advene/gui/plugins/actions.py:41
-#: ../lib/advene/gui/plugins/actions.py:53
-#: ../lib/advene/gui/plugins/actions.py:71
-#: ../lib/advene/gui/plugins/actions.py:86
-#: ../lib/advene/gui/plugins/actions.py:102
-#: ../lib/advene/gui/plugins/actions.py:203
-msgid "String to display."
-msgstr "Chaîne de caractères à afficher"
+#: ../lib/advene/model/zippackage.py:219
+#, python-format
+msgid "Directory %s is not an extracted Advene zip package."
+msgstr "Le répertoire %s n'est pas un recueil Advene décompressé."
 
-#: ../lib/advene/core/controller.py:362
-msgid "Exception (traceback in console):"
-msgstr "Exception (details dans la console)"
+#: ../lib/advene/gui/widget.py:295
+#, python-format
+msgid "Set of %s annotations"
+msgstr "Ensemble de %s annotations"
 
-#: ../lib/advene/core/controller.py:393
-msgid "No available GUI"
-msgstr "Pas d'interface graphique disponible."
+#: ../lib/advene/gui/widget.py:1006
+#: ../lib/advene/gui/views/transcription.py:459
+#: ../lib/advene/gui/edit/montage.py:60
+msgid "Play"
+msgstr "Lecture"
 
-#: ../lib/advene/core/controller.py:412
-msgid "No available event handler"
-msgstr "Pas de gestionnaire d'événements disponible."
+#: ../lib/advene/gui/widget.py:1010 ../lib/advene/gui/edit/timeadjustment.py:77
+msgid "Refresh snapshot"
+msgstr "Rafraîchir la capture d'écran"
 
-#: ../lib/advene/core/controller.py:420
-msgid "No available gui"
-msgstr "Pas d'interface graphique disponible."
+#: ../lib/advene/gui/widget.py:1014
+msgid "Save as..."
+msgstr "Sauvegarder sous..."
 
-#: ../lib/advene/core/controller.py:436
-#, python-format
-msgid "Warning: redefining an existing feature %s"
-msgstr "Avertissement: vous redéfinissez une fonctionnalité existante %s"
+#: ../lib/advene/gui/widget.py:1019
+msgid "Use current player position"
+msgstr "Utiliser la position courante du lecteur"
 
-#: ../lib/advene/core/controller.py:568
-msgid "All annotations"
-msgstr "Toutes les annotations"
+#: ../lib/advene/gui/widget.py:1025
+msgid "Adjust timestamp"
+msgstr "Ajuster le timecode"
 
-#: ../lib/advene/core/controller.py:569 ../lib/advene/gui/edit/rules.py:358
-#, python-format
-msgid "Annotations of type %s"
-msgstr "Annotations de type %s"
+#: ../lib/advene/gui/main.py:200 ../lib/advene/gui/main.py:314
+msgid "_Select player"
+msgstr "Sélection du lecteur"
 
-#: ../lib/advene/core/controller.py:570 ../lib/advene/gui/edit/imports.py:129
-#: ../lib/advene/gui/edit/imports.py:130
-msgid "Views"
-msgstr "Vues"
+#: ../lib/advene/gui/main.py:202 ../lib/advene/gui/main.py:299
+msgid "_View"
+msgstr "_Vues"
 
-#: ../lib/advene/core/controller.py:570 ../lib/advene/gui/edit/elements.py:521
-msgid "Tags"
-msgstr "Tags"
+#: ../lib/advene/gui/main.py:204 ../lib/advene/gui/main.py:316
+msgid "Packages"
+msgstr "Recueils"
 
-#: ../lib/advene/core/controller.py:570
-msgid "Ids"
-msgstr "Id"
+#: ../lib/advene/gui/main.py:207 ../lib/advene/gui/main.py:258
+msgid "Open recent"
+msgstr "Recueils récents"
 
-#: ../lib/advene/core/controller.py:747
-#, python-format
-msgid ""
-"Cannot start the webserver\n"
-"The following processes seem to use the %(port)s port: %(processes)s"
-msgstr ""
-"Impossible de démarrer le serveur web.\n"
-"Les processus suivants semblent utiliser le port %(port)s: %(processes)s"
+#: ../lib/advene/gui/main.py:252
+msgid "Input from the keyboard (function keys)"
+msgstr "Entrée depuis le clavier (touches de fonction)"
 
-#: ../lib/advene/core/controller.py:797 ../lib/advene/core/controller.py:808
-#, python-format
-msgid "Loaded %(uri)s as %(alias)s"
-msgstr "Chargé %(uri)s sous %(alias)s"
+#: ../lib/advene/gui/main.py:255
+msgid "_File"
+msgstr "_Fichier"
 
-#: ../lib/advene/core/controller.py:799 ../lib/advene/core/controller.py:811
-#, python-format
-msgid "Cannot load package from file %(uri)s: %(error)s"
-msgstr "Impossible de charger le fichier %(uri)s : %(error)s"
+#: ../lib/advene/gui/main.py:256
+msgid "_New package"
+msgstr "_Nouveau recueil"
 
-#: ../lib/advene/core/controller.py:850
-msgid "Deactivating web server"
-msgstr "Désactivation du serveur web"
+#: ../lib/advene/gui/main.py:256
+msgid "Create a new package"
+msgstr "Créer un nouveau recueil"
 
-#: ../lib/advene/core/controller.py:970
-#, python-format
-msgid "Cannot get audio volume: %s"
-msgstr "Impossible d'obtenir le volume: %s"
+#: ../lib/advene/gui/main.py:257
+msgid "_Open package"
+msgstr "_Ouvrir recueil"
 
-#: ../lib/advene/core/controller.py:1020
-#, python-format
-msgid "Cannot open Advene URL %s: the webserver is not running."
-msgstr "Impossible d'ouvrir l'URL Advene %s: le serveur web n'est pas actif."
+#: ../lib/advene/gui/main.py:257
+msgid "Open a package"
+msgstr "Ouvrir un recueil"
 
-#: ../lib/advene/core/controller.py:1128 ../lib/advene/gui/edit/merge.py:272
-msgid "None"
-msgstr "Aucun"
+#: ../lib/advene/gui/main.py:258
+msgid "Show recently opened packages"
+msgstr "Recueils ouverts récemments"
 
-#: ../lib/advene/core/controller.py:1222
-#, python-format
-msgid "Found matching video file in moviepath: %s"
-msgstr "Trouvé fichier vidéo correspondant dans le chemin de recherche : %s"
+#: ../lib/advene/gui/main.py:259
+msgid "_Save package"
+msgstr "_Sauvegarder recueil"
 
-#: ../lib/advene/core/controller.py:1263 ../lib/advene/core/controller.py:1265
-msgid "Analysis of "
-msgstr "Analyse de "
+#: ../lib/advene/gui/main.py:259
+msgid "Save the package"
+msgstr "Sauvegarder le recueil %s"
 
-#: ../lib/advene/core/controller.py:1465
-msgid "Cannot split the annotation: the given position is outside."
-msgstr ""
-"Impossible de supprimer l'annotation : la position indiquée est en dehors"
+#: ../lib/advene/gui/main.py:260
+msgid "Save package as..."
+msgstr "Sauvegarder sous..."
 
-#: ../lib/advene/core/controller.py:1630
-#, python-format
-msgid "Cannot find the template package %(filename)s: %(error)s"
-msgstr "Impossible de trouver le recueil modèle %(filename)s : %(error)s"
+#: ../lib/advene/gui/main.py:260
+msgid "Save the package as..."
+msgstr "Sauvegarder le recueil sous..."
 
-#: ../lib/advene/core/controller.py:1672
-#, python-format
-msgid "Cannot read the imported package %(uri)s: %(error)s"
-msgstr "Impossible de lire le recueil importé %(uri)s : %(error)s"
+#: ../lib/advene/gui/main.py:261
+msgid "Close package"
+msgstr "Fermer recueil"
 
-#: ../lib/advene/core/controller.py:1907
-msgid "Package URI has changed. Reloading package with new URI."
-msgstr "L'URI du recueil a changé. Rechargement du recueil."
+#: ../lib/advene/gui/main.py:261
+msgid "Close the package"
+msgstr "Fermer le recueil"
 
-#: ../lib/advene/core/controller.py:1925
-msgid ""
-"Cannot load package: the following annotations do not have Millisecond "
-"fragments:"
-msgstr ""
-"Impossible de charger le recueil: les annotations suivantes\n"
-"n'ont pas de fragment de type Milliseconde :"
+#: ../lib/advene/gui/main.py:263
+msgid "Save session"
+msgstr "Sauver la session"
 
-#: ../lib/advene/core/controller.py:1952
-#, python-format
-msgid "Cannot handle master attribute, the package %s is not imported."
-msgstr ""
-"Impossible de gérer l'attribut master, le recueil %s n'est pas importé."
+#: ../lib/advene/gui/main.py:263
+msgid "Save the current session (list of opened packages)"
+msgstr "Sauvegarder la session en cours (liste des recueils ouverts)"
 
-#: ../lib/advene/core/controller.py:1954
-#, python-format
-msgid "Checking master package %s for not yet imported elements."
-msgstr "Vérification des éléments à importer depuis le recueil maître %s."
+#: ../lib/advene/gui/main.py:264
+msgid "Save workspace"
+msgstr "Sauver l'environnement"
 
-#: ../lib/advene/core/controller.py:1994
-msgid "Standard summary"
-msgstr "Index standard"
+#: ../lib/advene/gui/main.py:265
+msgid "...as package view"
+msgstr "...comme une vue du recueil"
 
-#: ../lib/advene/core/controller.py:1999
-msgid "Default view"
-msgstr "Vue statique par défaut"
+#: ../lib/advene/gui/main.py:266
+msgid "...as standard workspace"
+msgstr "... comme environnement standard"
 
-#: ../lib/advene/core/controller.py:2041
-#, python-format
-msgid ""
-"Infinite loop in STBV %(name)s: the %(imp)s view is invoked multiple times."
-msgstr ""
-"Boucle infinie dans la vue dynamique %(name)s : la vue %(imp)s est invoquée "
-"plusieurs fois."
+#: ../lib/advene/gui/main.py:266
+msgid "Use the current layout as standard workspace in the future"
+msgstr "Utiliser l'environnement courant comme environnement standard"
 
-#: ../lib/advene/core/controller.py:2131
-#, python-format
-msgid "Got exception %s when stopping player."
-msgstr "Reçu l'exception %s à l'arrêt du lecteur"
+#: ../lib/advene/gui/main.py:268
+msgid "Associate a video _File"
+msgstr "Associer un _Fichier vidéo"
 
-#: ../lib/advene/core/controller.py:2214
-#, python-format
-msgid "Raised exception in update_status: %s"
-msgstr "Exception dans update_status: %s"
+#: ../lib/advene/gui/main.py:268
+msgid "Associate a video file"
+msgstr "Associer un fichier vidéo"
 
-#: ../lib/advene/core/controller.py:2241
-msgid "Unable to start the player."
-msgstr "Impossible de lancer le lecteur."
+#: ../lib/advene/gui/main.py:269
+msgid "Associate a _DVD"
+msgstr "Associer un _DVD"
 
-#: ../lib/advene/core/controller.py:2448
-#, python-format
-msgid "Comment on set of %d annotations"
-msgstr "Commentaire sur %d annotations"
+#: ../lib/advene/gui/main.py:269
+msgid "Associate a chapter from a DVD"
+msgstr "Associer un chapitre de DVD"
 
-#: ../lib/advene/core/controller.py:2450
-#, python-format
-msgid "Comment on %s"
-msgstr "Commentaire sur %s"
+#: ../lib/advene/gui/main.py:270
+msgid "Associate a _Video stream"
+msgstr "Associer un flux _Vidéo"
 
-#: ../lib/advene/core/controller.py:2454
-#, python-format
-msgid ""
-"<h1>Comment on %(title)s</h1>\n"
-"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
-"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
-"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
-"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
-"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
-"\"%(imgurl)s\" ></img></a></span>"
-msgstr ""
-"<h1>Commentaire sur %(title)s</h1>\n"
-"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
-"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
-"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
-"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
-"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
-"\"%(imgurl)s\" ></img></a></span>"
+#: ../lib/advene/gui/main.py:270
+msgid "Enter a video stream address"
+msgstr "Entrer une adresse de flux vidéo"
 
-#: ../lib/advene/core/controller.py:2464
-#, python-format
-msgid "List of %s annotations"
-msgstr "Ensemble de %s annotations"
+#: ../lib/advene/gui/main.py:272
+msgid "_Import File"
+msgstr "_Importer un fichier"
 
-#: ../lib/advene/core/controller.py:2499
-#, python-format
-msgid "Cannot export to %(filename)s: %(e)s"
-msgstr "Impossible d'exporter vers %(filename)s: %(e)s"
+#: ../lib/advene/gui/main.py:272
+msgid "Import data from an external source"
+msgstr "Importer des données depuis une source externe"
 
-#: ../lib/advene/core/controller.py:2514 ../lib/advene/core/controller.py:2523
-#, python-format
-msgid "Error when exporting: %s"
-msgstr "Erreur lors de l'export de %s"
+#: ../lib/advene/gui/main.py:273
+msgid "_Process video"
+msgstr "_Traitement de la vidéo"
 
-#: ../lib/advene/core/controller.py:2525 ../lib/advene/gui/views/table.py:406
-#: ../lib/advene/gui/views/table.py:536
-#, python-format
-msgid "Data exported to %s"
-msgstr "Données exportées vers %s"
+#: ../lib/advene/gui/main.py:273
+msgid "Import data from video processing algorithms"
+msgstr "Extraire automatiquement des données depuis la vidéo"
 
-#: ../lib/advene/core/webcherry.py:51
-msgid "The webserver requires version 3.0 of CherryPy at least."
-msgstr "Le serveur web exige CherryPy version 3.0 ou supérieure."
+#: ../lib/advene/gui/main.py:275
+msgid "Merge package"
+msgstr "Fusionner un recueil"
 
-#: ../lib/advene/core/webcherry.py:167
-#, python-format
-msgid ""
-"\n"
-"            <p>\n"
-"            <a href=\"/admin\">Server administration</a> |\n"
-"            <a href=\"/media\">Media control</a> |\n"
-"            <a href=\"%(path)s?mode=raw\">Raw view</a>\n"
-"            </p>\n"
-"            Location: %(locationbar)s\n"
-"            <hr>\n"
-"            "
-msgstr ""
-"\n"
-"<p>\n"
-"<a href=\"/admin\">Administration du serveur</a> |\n"
-"<a href=\"/media\">Contrôle du lecteur</a> |\n"
-"<a href=\"%(path)s?mode=raw\">Vue brute</a>\n"
-"</p>\n"
-"Chemin courant : %(locationbar)s\n"
-"<hr>"
+#: ../lib/advene/gui/main.py:275
+msgid "Merge elements from another package"
+msgstr "Fusionner les éléments d'un autres recueil"
 
-#: ../lib/advene/core/webcherry.py:227
-msgid "Unspecified Error"
-msgstr "Erreur non spécifiée"
+#: ../lib/advene/gui/main.py:276
+msgid "Import _DVD chapters"
+msgstr "Importer les chapitres du _DVD"
 
-#: ../lib/advene/core/webcherry.py:228
-#, python-format
-msgid ""
-"\n"
-"        <h1>Error</h1>\n"
-"        <p>An error occurred:</p>\n"
-"        %s\n"
-"        "
-msgstr ""
-"\n"
-"        <h1>Erreur</h1>\n"
-"        <p>Une erreur est survenue :</p>\n"
-"        %s\n"
-"        "
+#: ../lib/advene/gui/main.py:276
+msgid "Create annotations based on DVD chapters"
+msgstr "Créer des annotations correspondant aux chapitres du DVD"
 
-#: ../lib/advene/core/webcherry.py:261
-msgid "<h1>No available mediaplayer</h1>"
-msgstr "<h1>Aucune capture d'écran.</h1>"
+#: ../lib/advene/gui/main.py:278
+msgid "_Export..."
+msgstr "Exporter..."
 
-#: ../lib/advene/core/webcherry.py:265
-#, python-format
-msgid ""
-"\n"
-"            <h1>Current STBV: %(currentstbv)s</h1>\n"
-"\n"
-"            <h1>Player status</h1>\n"
-"            <table border=\"1\">\n"
-"            <tr>\n"
-"            <td>Current position</td><td>%(position)s</td>\n"
-"            <td>Duration</td><td>%(duration)s</td>\n"
-"            <td>Player status</td><td>%(status)s</td>\n"
-"            </tr>\n"
-"            </table>\n"
-"            "
-msgstr ""
-"\n"
-"            <h1>Vue STBV courante: %(currentstbv)s</h1>\n"
-"\n"
-"            <h1>Statut du lecteur</h1>\n"
-"            <table border=\"1\">\n"
-"            <tr>\n"
-"            <td>Position</td><td>%(position)s</td>\n"
-"            <td>Durée</td><td>%(duration)s</td>\n"
-"            <td>Statut</td><td>%(status)s</td>\n"
-"            </tr>\n"
-"            </table>\n"
-"            "
+#: ../lib/advene/gui/main.py:278
+msgid "Export data to another format"
+msgstr "Exporter les données dans un autre format"
 
-#: ../lib/advene/core/webcherry.py:284
-msgid "<h1>No playlist</h1>"
-msgstr "<h1>Aucun film chargé</h1>"
+#: ../lib/advene/gui/main.py:279
+msgid "_Website export..."
+msgstr "Exporter vers un site _Web..."
 
-#: ../lib/advene/core/webcherry.py:286
-#, python-format
-msgid ""
-"<h1>Current playlist</h1>\n"
-"                <ul>%s</ul>"
-msgstr ""
-"<h1>Films chargés</h1>\n"
-"                <ul>%s</ul>"
+#: ../lib/advene/gui/main.py:279
+msgid "Export views to a website"
+msgstr "Exporter les vues vers un site web"
 
-#: ../lib/advene/core/webcherry.py:288
-msgid ""
-"\n"
-"                <form action=\"/media/play\" method=\"GET\">\n"
-"                Starting pos: <input type=\"text\" name=\"position\" value="
-"\"0\">\n"
-"                <input type=\"submit\" value=\"Play\">\n"
-"                </form>\n"
-"                <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
-"\">Pause</a><br>\n"
-"                "
-msgstr ""
-"\n"
-"                <form action=\"/media/play\" method=\"GET\">\n"
-"                Position de départ (en ms): <input type=\"text\" name=\"bc\" "
-"value=\"0\">\n"
-"                <input type=\"submit\" value=\"Démarrer\">\n"
-"                </form>\n"
-"                <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
-"\">Pause</a><br>\n"
-"                "
+#: ../lib/advene/gui/main.py:281
+msgid "_Quit"
+msgstr "_Quitter"
 
-#: ../lib/advene/core/webcherry.py:295
-msgid ""
-"<hr />\n"
-"            <form action=\"/media/load\" method=\"GET\">\n"
-"            Add a new file (<em>dvd</em> to play a DVD):\n"
-"            <input type=\"text\" name=\"filename\">\n"
-"            <input type=\"submit\" value=\"Add\">\n"
-"            </form>"
-msgstr ""
-"<hr />\n"
-"            <form action=\"/media/load\" method=\"GET\">\n"
-"            Ajouter un nouveau fichier (<em>dvd</em> pour un DVD):\n"
-"            <input type=\"text\" name=\"filename\">\n"
-"            <input type=\"submit\" value=\"Ajouter\">\n"
-"            </form>"
+#: ../lib/advene/gui/main.py:283
+msgid "_Edit"
+msgstr "Édition"
 
-#: ../lib/advene/core/webcherry.py:301
-msgid ""
-"<h3><a href=\"/media/snapshot\">Access to current packages snapshots</h3>"
-msgstr "<h3><a href=\"/media/snapshot\">Accéder aux captures d'écran</h3>"
+#: ../lib/advene/gui/main.py:284
+msgid "_Undo"
+msgstr "_Undo"
 
-#: ../lib/advene/core/webcherry.py:310
-#, python-format
-msgid "Unknown STBV identifier: %s"
-msgstr "Identificateur STBV inconnu : %s"
+#: ../lib/advene/gui/main.py:285
+msgid "_Find"
+msgstr "_Chercher"
 
-#: ../lib/advene/core/webcherry.py:385
-msgid "Media information"
-msgstr "Information sur le média"
+#: ../lib/advene/gui/main.py:286
+msgid "_Delete"
+msgstr "_Supprimer"
 
-#: ../lib/advene/core/webcherry.py:398
-msgid "File added"
-msgstr "Fichier ajouté"
+#: ../lib/advene/gui/main.py:287
+msgid "Create"
+msgstr "Créer"
 
-#: ../lib/advene/core/webcherry.py:399
-#, python-format
-msgid "<p><strong>%s has been added to the playlist</strong></p>"
-msgstr "<p><strong>%s a été ajouté à la liste</strong></p>"
+#: ../lib/advene/gui/main.py:288 ../lib/advene/gui/main.py:3337
+#: ../lib/advene/util/helper.py:411
+msgid "Schema"
+msgstr "Schéma"
 
-#: ../lib/advene/core/webcherry.py:410 ../lib/advene/core/webcherry.py:472
-msgid "Access to packages snapshots"
-msgstr "Accès aux catpures d'écran"
+#: ../lib/advene/gui/main.py:289 ../lib/advene/gui/edit/rules.py:1086
+#: ../lib/advene/rules/actions.py:238 ../lib/advene/util/helper.py:414
+msgid "View"
+msgstr "Vue"
 
-#: ../lib/advene/core/webcherry.py:420 ../lib/advene/core/webcherry.py:482
-msgid "Unknown package alias"
-msgstr "Alias du recueil inconnu"
+#: ../lib/advene/gui/main.py:290 ../lib/advene/gui/popup.py:488
+#: ../lib/advene/util/helper.py:415
+msgid "Query"
+msgstr "Requête"
 
-#: ../lib/advene/core/webcherry.py:426
-#, python-format
-msgid "Available snapshots for %s"
-msgstr "Captures d'écran disponibles pour le recueil %s"
+#: ../lib/advene/gui/main.py:291 ../lib/advene/util/helper.py:412
+msgid "Annotation Type"
+msgstr "Type d'Annotation"
 
-#: ../lib/advene/core/webcherry.py:432
-#, python-format
-msgid ""
-"<p><a href=\"/media/snapshot/%s?mode=inline\">Display with inline images</"
-"a></p>"
-msgstr ""
-"<p><a href=\"/media/snapshot/%s?mode=inline\">Afficher les vignettes</a></p>"
+#: ../lib/advene/gui/main.py:292 ../lib/advene/util/helper.py:413
+msgid "Relation Type"
+msgstr "Type de Relation"
 
-#: ../lib/advene/core/webcherry.py:439
-msgid "Done"
-msgstr "Fait"
+#: ../lib/advene/gui/main.py:296
+msgid "P_ackage properties"
+msgstr "_Propriétés du recueil"
 
-#: ../lib/advene/core/webcherry.py:441
-msgid "Pending"
-msgstr "En attente"
+#: ../lib/advene/gui/main.py:296
+msgid "Edit package properties"
+msgstr "Éditer les propriétés du recueil"
 
-#: ../lib/advene/core/webcherry.py:487
-#, python-format
-msgid "Unknown annotation id: %s"
-msgstr "Annotation inconnue: %s"
+#: ../lib/advene/gui/main.py:297
+msgid "P_references"
+msgstr "P_références"
 
-#: ../lib/advene/core/webcherry.py:610 ../lib/advene/core/webcherry.py:728
-#, python-format
-msgid "Cannot activate stbvid %(stbvid)s: %(error)s"
-msgstr "Impossible d'écrire dans %(stbvid)s : %(error)s"
+#: ../lib/advene/gui/main.py:297
+msgid "Interface preferences"
+msgstr "Préférences de l'interface"
 
-#: ../lib/advene/core/webcherry.py:675
-msgid "<p>No GUI is available."
-msgstr "<p>Aucune interface n'est disponible."
+#: ../lib/advene/gui/main.py:301
+msgid "_Start Web Browser"
+msgstr "Lancer le navigateur _Web"
 
-#: ../lib/advene/core/webcherry.py:677
-#, python-format
-msgid "<p>Opened adhoc views: %s</p>"
-msgstr "<p>Vues ad-hoc ouvertes : %s</p>"
+#: ../lib/advene/gui/main.py:301
+msgid "Start the web browser"
+msgstr "Lancer le navigateur web"
 
-#: ../lib/advene/core/webcherry.py:678
-msgid "<p>Available adhoc views:</p><ul>"
-msgstr "<p>Vues ad-hoc disponibles : %s</p>"
+#: ../lib/advene/gui/main.py:303
+msgid "Simplify interface"
+msgstr "Simplifier l'interface"
 
-#: ../lib/advene/core/webcherry.py:699
-#, python-format
-msgid "<p>Current stbv: %s</p>"
-msgstr "<p>Vue STBV courante : %s</p>"
+#: ../lib/advene/gui/main.py:303
+msgid "Simplify the application interface (toggle)"
+msgstr "Simplifier l'interface (bascule)"
 
-#: ../lib/advene/core/webcherry.py:700
-#, python-format
-msgid "<p>You can activate the following STBV:</p><ul>%s</ul>"
-msgstr "<p>Vous pouvez activer les STBV suivantes :</p><ul>%s</ul>"
+#: ../lib/advene/gui/main.py:304
+msgid "Evaluator"
+msgstr "Évaluateur"
 
-#: ../lib/advene/core/webcherry.py:702
-msgid "Activate and play"
-msgstr "Activer et jouer"
+#: ../lib/advene/gui/main.py:304
+msgid "Open python evaluator window"
+msgstr "Ouvrir l'évaluateur python"
 
-#: ../lib/advene/core/webcherry.py:708
-msgid "Application information"
-msgstr "Informations sur l'application"
+#: ../lib/advene/gui/main.py:305 ../lib/advene/gui/main.py:4096
+msgid "Webserver log"
+msgstr "Statistiques du serveur web"
 
-#: ../lib/advene/core/webcherry.py:778
-msgid "Missing element id parameter"
-msgstr "Paramètre id manquant"
+#: ../lib/advene/gui/main.py:307
+msgid "_Player"
+msgstr "_Lecteur"
 
-#: ../lib/advene/core/webcherry.py:782
-#, python-format
-msgid "No existing element with id %s"
-msgstr "Aucun élément existant avec l'id %s"
+#: ../lib/advene/gui/main.py:308
+msgid "Go to _Time"
+msgstr "Aller au _Temps"
 
-#: ../lib/advene/core/webcherry.py:791
-#, python-format
-msgid "<p>The GUI view %s does not exist.</p>"
-msgstr "<p>La vue ad-hoc %s n'existe pas.</p>"
+#: ../lib/advene/gui/main.py:308
+msgid "Goto a specified time code"
+msgstr "Aller à un timecode précis"
 
-#: ../lib/advene/core/webcherry.py:798
-msgid "Invalid request"
-msgstr "Requête invalide"
+#: ../lib/advene/gui/main.py:309
+msgid "Save _ImageCache"
+msgstr "Sauvegarder le cache"
 
-#: ../lib/advene/core/webcherry.py:803
-msgid "Invalid configuration variable name"
-msgstr "Nom de variable de configuration invalide"
+#: ../lib/advene/gui/main.py:309
+msgid "Save the contents of the ImageCache to disk"
+msgstr "Sauvegarder le contenu du cache d'images"
 
-#: ../lib/advene/core/webcherry.py:815
-msgid "Invalid value"
-msgstr "Valeur non valide"
+#: ../lib/advene/gui/main.py:310
+msgid "Reset ImageCache"
+msgstr "Vider le cache d'images"
 
-#: ../lib/advene/core/webcherry.py:819
-#, python-format
-msgid "Unsupported method %s"
-msgstr "Méthode non supportée: %s"
+#: ../lib/advene/gui/main.py:310
+msgid "Reset the ImageCache"
+msgstr "Vider le cache d'images"
 
-#: ../lib/advene/core/webcherry.py:845
-#, python-format
-msgid ""
-"\n"
-"        <h1>Authorized hosts</h1>\n"
-"        <table border=\"1\">\n"
-"        <tr><th>Host</th><th>IP Addr</th><th>Action</th></tr>\n"
-"        %s\n"
-"        </table>\n"
-"        <form method=\"GET\">\n"
-"        Add a new hostname to the list :<br>\n"
-"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
-"\"Add\">\n"
-"        </form>\n"
-"        "
-msgstr ""
-"\n"
-"        <h1>Clients autorisés</h1>\n"
-"        <table border=\"1\">\n"
-"        <tr><th>Host</th><th>Adresse IP</th><th>Action</th></tr>\n"
-"        %s\n"
-"        </table>\n"
-"        <form method=\"GET\">\n"
-"        Ajouter une nouvelle adresse à la liste :<br>\n"
-"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
-"\"Ajouter\">\n"
-"        </form>\n"
-"        "
+#: ../lib/advene/gui/main.py:311
+msgid "_Restart player"
+msgstr "_Redémarrer le lecteur"
 
-#: ../lib/advene/core/webcherry.py:859
-msgid "Access control"
-msgstr "Contrôle d'accès"
+#: ../lib/advene/gui/main.py:311
+msgid "Restart the player"
+msgstr "Redémarrer le lecteur"
 
-#: ../lib/advene/core/webcherry.py:864
-msgid "Access control - add a hostname"
-msgstr "Contrôle d'accès - ajouter une adresse"
+#: ../lib/advene/gui/main.py:312
+msgid "Display _Media information"
+msgstr "Informations sur le média"
 
-#: ../lib/advene/core/webcherry.py:872 ../lib/advene/core/webcherry.py:886
-#, python-format
-msgid "<strong>Error: %s is an invalid hostname.</strong>"
-msgstr "<strong>Erreur: %s n'est pas un nom de machine valide.</strong>"
+#: ../lib/advene/gui/main.py:312
+msgid "Display information about the current media"
+msgstr "Afficher des informations sur le média"
 
-#: ../lib/advene/core/webcherry.py:875
-#, python-format
-msgid "<p>Added %s to authorized hosts list.</p>"
-msgstr "<p>Ajouté %s à la liste des clients autorisés.</p>"
+#: ../lib/advene/gui/main.py:313
+msgid "Update annotation screenshots"
+msgstr "Captures d'écran pour les annotations"
 
-#: ../lib/advene/core/webcherry.py:881
-msgid "Access control - delete a hostname"
-msgstr "Contrôle d'accès - supprimer une adresse"
+#: ../lib/advene/gui/main.py:313
+msgid "Update screenshots for annotation bounds"
+msgstr "Générer des captures d'écran pour chaque borne d'annotation"
 
-#: ../lib/advene/core/webcherry.py:889
-msgid "<strong>Cannot remove the localhost access.</strong>"
-msgstr "<strong>Impossible de supprimer l'accès local.</strong>"
+#: ../lib/advene/gui/main.py:314
+msgid "Select the player plugin"
+msgstr "Sélectionner le lecteur vidéo"
 
-#: ../lib/advene/core/webcherry.py:894
-#, python-format
-msgid "<p>Removed %s from authorized hosts list.</p>"
-msgstr "<p>Supprimé %s de la liste des clients autorisés.</p>"
+#: ../lib/advene/gui/main.py:317
+msgid "No package"
+msgstr "Aucun recueil"
 
-#: ../lib/advene/core/webcherry.py:896
-#, python-format
-msgid "<p>%s is not in authorized hosts list.</p>"
-msgstr "<p>%s n'est pas dans la liste des clients autorisés.</p>"
+#: ../lib/advene/gui/main.py:319
+msgid "_Help"
+msgstr "_Aide"
 
-#: ../lib/advene/core/webcherry.py:945
-msgid "Server Administration"
-msgstr "Administration du serveur"
+#: ../lib/advene/gui/main.py:320
+msgid "Help"
+msgstr "Aide"
 
-#: ../lib/advene/core/webcherry.py:953
-#, python-format
-msgid ""
-"\n"
-"        <p><a href=\"/admin/access\">Update the access list</a></p>\n"
-"        <p><a href=\"/admin/methods\">List available TALES methods</a></p>\n"
-"        <p><a href=\"/action\">List available actions</a></p>\n"
-"        <p><a href=\"/admin/reset\">Reset the server</a></p>\n"
-"        <p><a href=\"/media\">Media control</a></p>\n"
-"        <p><a href=\"/application\">Display GUI status</a></p>\n"
-"        <p><a href=\"/admin/list\">List available files</a></p>\n"
-"        <p><a href=\"/packages\">List loaded packages</a> (%(packagelist)s)</"
-"p>\n"
-"        <p>Display mode : %(displaymode)s</p>\n"
-"        <hr>\n"
-"        <p>Load a package :\n"
-"        <form action=\"/admin/load\" method=\"GET\">\n"
-"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
-"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
-"        <input type=\"submit\" value=\"Load\" />\n"
-"        </form>\n"
-"        </body></html>\n"
-"        "
-msgstr ""
-"\n"
-"        <p><a href=\"/admin/access\">Régler le contrôle d'accès</a></p>\n"
-"        <p><a href=\"/admin/methods\">Afficher les méthodes TALES "
-"disponibles</a></p>\n"
-"        <p><a href=\"/action\">Afficher les actions disponibles</a></p>\n"
-"        <p><a href=\"/admin/reset\">Réinitialiser le serveur</a></p>\n"
-"        <p><a href=\"/media\">Contrôle du lecteur</a></p>\n"
-"        <p><a href=\"/application\">Afficher le statut de l'interface "
-"graphique</a></p>\n"
-"        <p><a href=\"/admin/list\">Afficher les fichiers disponibles</a></"
-"p>\n"
-"        <p><a href=\"/packages\">Afficher les recueils chargés</a> "
-"(%(packagelist)s)</p>\n"
-"        <p>Mode d'affichage : %(displaymode)s</p>\n"
-"        <hr>\n"
-"        <p>Charger un nouveau recueil :\n"
-"        <form action=\"/admin/load\" method=\"GET\">\n"
-"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
-"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
-"        <input type=\"submit\" value=\"Charger\" />\n"
-"        </form>\n"
-"        </body></html>\n"
-"        "
+#: ../lib/advene/gui/main.py:321
+msgid "Get support"
+msgstr "Obtenir de l'aide"
 
-#: ../lib/advene/core/webcherry.py:983
-msgid "Available files"
-msgstr "Fichiers disponibles"
+#: ../lib/advene/gui/main.py:322
+msgid "Check for updates"
+msgstr "Vérification de mise à jour"
 
-#: ../lib/advene/core/webcherry.py:1009
-msgid "You should specify an alias"
-msgstr "Vous devez spécifier un alias"
+#: ../lib/advene/gui/main.py:323
+msgid "Display shortcuts"
+msgstr "Afficher les raccourcis"
 
-#: ../lib/advene/core/webcherry.py:1014
-msgid "You should specify an uri"
-msgstr "Vous devez spécifier une URI"
+#: ../lib/advene/gui/main.py:324
+msgid "Display logfile"
+msgstr "Afficher les messages d'information"
 
-#: ../lib/advene/core/webcherry.py:1020
-#, python-format
-msgid "Package %s loaded"
-msgstr "Recueil %s chargé"
+#: ../lib/advene/gui/main.py:324
+msgid "Display log messages"
+msgstr "Affiche les messages de log"
 
-#: ../lib/advene/core/webcherry.py:1021 ../lib/advene/core/webcherry.py:1057
-#, python-format
+#: ../lib/advene/gui/main.py:325
+msgid "Open logfile folder"
+msgstr "Ouvrir le dossier du rapport d'erreur"
+
+#: ../lib/advene/gui/main.py:325
 msgid ""
-"<p>Go to the <a href=\"/packages/%(alias)s\">%(alias)s</a> package, or to "
-"the <a href=\"/packages\">package list</a>."
+"Display logfile folder. It can help when sending the advene.log file by e-"
+"mail."
 msgstr ""
-"<p>Accéder au recueil <a href=\"/packages/%(alias)s\">%(alias)s</a>, ou à la "
-"<a href=\"/packages\">liste des recueils chargés</a>."
+"Afficher le dossier contenant le rapport d'erreurs advene.log, afin d'en "
+"faciliter l'envoi par courriel."
 
-#: ../lib/advene/core/webcherry.py:1024
-#, python-format
-msgid "<p>Cannot load package %(alias)s : %(error)s</p>"
-msgstr "<p>Impossible de charger le recueil %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:326
+msgid "_About"
+msgstr "À _Propos"
 
-#: ../lib/advene/core/webcherry.py:1035
-#, python-format
-msgid "Package %s deleted"
-msgstr "Recueil %s supprimé"
+#: ../lib/advene/gui/main.py:352
+msgid "Open a package file"
+msgstr "Ouvrir un recueil"
 
-#: ../lib/advene/core/webcherry.py:1036
-msgid "<p>Go to the <a href=\"/packages\">package list</a>."
-msgstr ""
-"<p>Consulter la <a href=\"/packages\">liste des recueils disponibles</a>"
+#: ../lib/advene/gui/main.py:353
+msgid "Save the current package"
+msgstr "Sauvegarder le recueil courant"
 
-#: ../lib/advene/core/webcherry.py:1039
-#, python-format
-msgid "<p>Cannot delete package %(alias)s : %(error)s</p>"
-msgstr "<p>Impossible de supprimer le recueil %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:354
+msgid "Save the package with a new name"
+msgstr "Sauvegarder le recueil sous un nouveau nom"
 
-#: ../lib/advene/core/webcherry.py:1056
-#, python-format
-msgid "Package %s saved"
-msgstr "Recueil %s sauvegardé"
+#: ../lib/advene/gui/main.py:355
+msgid "Select movie file..."
+msgstr "Sélectionner un fichier vidéo"
 
-#: ../lib/advene/core/webcherry.py:1060
-#, python-format
-msgid "<p>Cannot save package %(alias)s : %(error)s</p>"
-msgstr "<p>Impossible de sauvegarder le recueil %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:356
+msgid "Select DVD"
+msgstr "Sélectionner un DVD"
 
-#: ../lib/advene/core/webcherry.py:1070
-msgid "Server reset"
-msgstr "Serveur réinitialisé"
+#: ../lib/advene/gui/main.py:358
+#: ../lib/advene/gui/plugins/shotvalidation.py:260
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:810
+#: ../lib/advene/gui/edit/transcribe.py:1178
+msgid "Undo"
+msgstr "Undo"
 
-#: ../lib/advene/core/webcherry.py:1076
-msgid "Available TALES methods"
-msgstr "Méthodes TALES disponibles"
+#: ../lib/advene/gui/main.py:360
+msgid "Create a text annotation"
+msgstr "Créer une annotation textuelle"
 
-#: ../lib/advene/core/webcherry.py:1117
-msgid "Loaded package(s)"
-msgstr "Recueil(s) chargé(s)"
+#: ../lib/advene/gui/main.py:361
+msgid "Create a graphical annotation"
+msgstr "Créer une annotation graphique"
 
-#: ../lib/advene/core/webcherry.py:1119
-msgid ""
-"\n"
-"        <h1>Loaded package(s)</h1>\n"
-"        <table border=\"1\" width=\"50%\">\n"
-"        <tr>\n"
-"        <th>Alias</th>\n"
-"        <th>Action</th>\n"
-"        <th>URI</th>\n"
-"        <th>Annotations</th>\n"
-"        </tr>\n"
-"        "
-msgstr ""
-"\n"
-"        <h1>Recueil(s) chargé(s)</h1>\n"
-"        <table border=\"1\" width=\"50%\">\n"
-"        <tr>\n"
-"        <th>Alias</th>\n"
-"        <th>Action</th>\n"
-"        <th>URI</th>\n"
-"        <th>Annotations</th>\n"
-"        </tr>\n"
-"        "
+#: ../lib/advene/gui/main.py:367
+msgid "List recently opened packages"
+msgstr "Recueils récemment ouverts"
 
-#: ../lib/advene/core/webcherry.py:1131
+#: ../lib/advene/gui/main.py:397
+msgid "Snapshotter activity"
+msgstr "Activité de prise de capture d'écran"
+
+#: ../lib/advene/gui/main.py:399
 #, python-format
-msgid ""
-"<tr>\n"
-"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
-"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
-"%(uri)s\">Reload</a>|<a href=\"/admin/delete?alias=%(alias)s\">Drop</a>|<a "
-"href=\"/admin/save?alias=%(alias)s\">Save</a></td>\n"
-"            <td>%(uri)s</td>\n"
-"            <td>%(size)d</td>\n"
-"            </tr>\n"
-"            "
-msgstr ""
-"<tr>\n"
-"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
-"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
-"%(uri)s\">Recharger</a>|<a href=\"/admin/delete?alias=%(alias)s\">Supprimer</"
-"a>|<a href=\"/admin/save?alias=%(alias)s\">Sauver</a></td>\n"
-"            <td>%(uri)s</td>\n"
-"            <td>%(size)d</td>\n"
-"            </tr>\n"
-"            "
+msgid "%d queued requests"
+msgstr "%d requêtes en attente"
 
-#: ../lib/advene/core/webcherry.py:1204 ../lib/advene/core/webcherry.py:1279
-#: ../lib/advene/core/webcherry.py:1288 ../lib/advene/core/webcherry.py:1296
-#: ../lib/advene/core/webcherry.py:1454 ../lib/advene/core/webcherry.py:1462
-#: ../lib/advene/core/webcherry.py:1470 ../lib/advene/core/webcherry.py:2032
-#: ../lib/advene/core/webcherry.py:2039
-msgid "Error"
-msgstr "Erreur"
+#: ../lib/advene/gui/main.py:400
+msgid "Cancel all requests"
+msgstr "Annuler toutes les requêtes"
 
-#: ../lib/advene/core/webcherry.py:1205
-#, python-format
-msgid "The TALES expression %s is not valid."
-msgstr "L'expression TALES %s n'est pas valide."
+#: ../lib/advene/gui/main.py:405
+msgid "No snapshotter"
+msgstr "Aucun composant de capture d'écran"
 
-#: ../lib/advene/core/webcherry.py:1256
-msgid "Content mode not available on non-content data"
-msgstr ""
-"Le mode <em>Contenu</em> n'est pas applicable aux données qui ne sont pas "
-"des contenus."
+#: ../lib/advene/gui/main.py:427
+msgid "No snapshotting activity"
+msgstr "Aucune requête de capture d'écran en cours"
 
-#: ../lib/advene/core/webcherry.py:1280 ../lib/advene/core/webcherry.py:1289
-#: ../lib/advene/core/webcherry.py:1297 ../lib/advene/core/webcherry.py:1317
-#: ../lib/advene/core/webcherry.py:1321 ../lib/advene/core/webcherry.py:1455
-#: ../lib/advene/core/webcherry.py:1463 ../lib/advene/core/webcherry.py:1471
-#: ../lib/advene/core/webcherry.py:1530 ../lib/advene/core/webcherry.py:1607
-#: ../lib/advene/core/webcherry.py:1727 ../lib/advene/core/webcherry.py:1777
-msgid "<h1>Error</h1>"
-msgstr "<h1>Erreur</h1>"
+#: ../lib/advene/gui/main.py:431
+msgid "Snapshotting"
+msgstr "En cours de capture d'écran"
 
-#: ../lib/advene/core/webcherry.py:1281 ../lib/advene/core/webcherry.py:1322
-#, python-format
-msgid ""
-"<p>There was an error in the template code.</p>\n"
-"                <p>Tag name: <strong>%(tagname)s</strong></p>\n"
-"                <p>Error message: <em>%(message)s</em></p>"
-msgstr ""
-"<p>Il y a une erreur dans le modèle.</p>\n"
-"                <p>Balise: <strong>%(tagname)s</strong></p>\n"
-"                <p>Message d'erreur: <em>%(message)s</em></p>"
+#: ../lib/advene/gui/main.py:447
+msgid "Display application log messages"
+msgstr "Afficher les messages d'information de l'application"
 
-#: ../lib/advene/core/webcherry.py:1290
-#, python-format
-msgid ""
-"<p>An invalid character is in the Context:</p>\n"
-"                <p>Error message: <em>%(error)s</em></p><pre>%(message)s</"
-"pre>"
-msgstr ""
-"<p>Un caractère invalide est dans le Contexte :</p>\n"
-"                <p>Message d'erreur: <em>%(error)s</em></p><pre>%(message)s</"
-"pre>"
+#: ../lib/advene/gui/main.py:488
+msgid "Quicksearch lists"
+msgstr "Listes de recherche"
 
-#: ../lib/advene/core/webcherry.py:1298
-#, python-format
-msgid ""
-"<p>There was an error in the TALES expression.</p>\n"
-"                <pre>%s</pre>"
-msgstr ""
-"<p>Il y a une erreur dans l'expression TALES.</p>\n"
-"                <pre>%s</pre>"
+#: ../lib/advene/gui/main.py:494
+msgid "Please specify the lists of elements to be searched."
+msgstr "Spécifiez les listes d'éléments à rechercher."
 
-#: ../lib/advene/core/webcherry.py:1318
+#: ../lib/advene/gui/main.py:513
 #, python-format
 msgid ""
-"<p>There was an error.</p>\n"
-"                <pre>%s</pre>"
+"Searching on %s.\n"
+"Left click to launch the search, right-click to set the quicksearch options"
 msgstr ""
-"<p>Une erreur est survenue.</p>\n"
-"                <pre>%s</pre>"
+"Recherche sur %s.\n"
+"Clic gauche pour lancer la recherche, click droit pour régler les options de "
+"recherche"
 
-#: ../lib/advene/core/webcherry.py:1342
+#: ../lib/advene/gui/main.py:514
 #, python-format
-msgid ""
-"\n"
-"            <hr>\n"
-"            <p>\n"
-"            Location: %(location)s<br>\n"
-"            <form name=\"navigation\" method=\"GET\">\n"
-"            <a href=\"%(levelup)s\">Up one level</a> |\n"
-"            Next level :\n"
-"            <select name=\"path\" onchange=\"submit()\">\n"
-"            "
-msgstr ""
-"\n"
-"        <hr>\n"
-"        <p>\n"
-"        Chemin courant : %(location)s<br>\n"
-"        <form name=\"navigation\" method=\"GET\">\n"
-"        <a href=\"%(levelup)s\">Remonter d'un niveau</a> |\n"
-"        Niveau suivant :\n"
-"        <select name=\"path\" onchange=\"submit()\">\n"
-"        "
+msgid "String to search in %s"
+msgstr "Chaîne à rechercher dans %s"
 
-#: ../lib/advene/core/webcherry.py:1360
-msgid ""
-"\n"
-"            </select> View: <select name=\"view\" onchange=\"submit()\">\n"
-"            <option selected></option>\n"
-"            "
-msgstr ""
-"\n"
-"        </select> Vue : <select name=\"view\" onchange=\"submit()\">\n"
-"        <option selected></option>\n"
-"        "
+#: ../lib/advene/gui/main.py:527 ../lib/advene/gui/main.py:531
+msgid "Tracing : "
+msgstr "Trace : "
 
-#: ../lib/advene/core/webcherry.py:1378
-#, python-format
-msgid ""
-"<hr>\n"
-"            <p>Evaluating expression \"<strong>%(expression)s</strong>\" on "
-"package %(uri)s returns %(value)s</p>\n"
-"            "
-msgstr ""
-"<hr>\n"
-"        <p>L'évaluation de l'expression \"<strong>%(expression)s</strong>\" "
-"sur le recueil %(uri)s retourne %(value)s</p>\n"
-"        "
+#: ../lib/advene/gui/main.py:527
+msgid "off"
+msgstr "off"
 
-#: ../lib/advene/core/webcherry.py:1414
-#, python-format
-msgid "<p>Package <strong>%s</strong> not loaded</p>"
-msgstr "<p>Le recueil <strong>%s</strong> n'est pas chargé</p>"
+#: ../lib/advene/gui/main.py:531
+msgid "on"
+msgstr "on"
 
-#: ../lib/advene/core/webcherry.py:1456
-#, python-format
-msgid ""
-"<p>There was an error in the template code.</p>\n"
-"            <p>Tag name: <strong>%(tagname)s</strong></p>\n"
-"            <p>Error message: <em>%(message)s</em></p>"
-msgstr ""
-"<p>Il y a une erreur dans le modèle.</p>\n"
-"            <p>Balise: <strong>%(tagname)s</strong></p>\n"
-"            <p>Message d'erreur: <em>%(message)s</em></p>"
+#: ../lib/advene/gui/main.py:543
+#: ../lib/advene/gui/views/interactivequery.py:410
+msgid "String to search"
+msgstr "Chaîne à rechercher"
 
-#: ../lib/advene/core/webcherry.py:1464
-#, python-format
-msgid ""
-"<p>There was an error in the expression.</p>\n"
-"            <pre>%s</pre>"
-msgstr ""
-"<p>Il y a une erreur dans l'expression.</p>\n"
-"            <pre>%s</pre>"
+#: ../lib/advene/gui/main.py:551
+msgid "Launch search"
+msgstr "Lancer la recherche"
+
+#: ../lib/advene/gui/main.py:556
+msgid "Ignore case"
+msgstr "Ignorer la casse"
+
+#: ../lib/advene/gui/main.py:561
+msgid "Searched elements"
+msgstr "Éléments recherchés"
+
+#: ../lib/advene/gui/main.py:645
+msgid "Playing"
+msgstr "Lecture"
+
+#: ../lib/advene/gui/main.py:646
+msgid "Pause"
+msgstr "Pause"
+
+#: ../lib/advene/gui/main.py:647
+msgid "Init"
+msgstr "Initialisation"
+
+#: ../lib/advene/gui/main.py:648 ../lib/advene/gui/views/table.py:314
+#: ../lib/advene/gui/edit/elements.py:1809
+msgid "End"
+msgstr "Fin"
+
+#: ../lib/advene/gui/main.py:649
+msgid "Undefined"
+msgstr "Indéfini"
 
-#: ../lib/advene/core/webcherry.py:1472
+#: ../lib/advene/gui/main.py:660
 #, python-format
 msgid ""
-"<p>Cannot resolve TALES expression %(expr)s on package %(package)s<p><pre>\n"
-"            %(type)s\n"
-"            %(value)s\n"
-"            %(traceback)s</pre>"
-msgstr ""
-"<p>Impossible d'interpéter l'expression TALES %(expr)s sur le recueil "
-"%(package)s<p><pre>\n"
-"                %(type)s\n"
-"                %(value)s\n"
-"                %(traceback)s</pre>"
+"Wrong player shortcut modifier %s in configuration. Fallback on Control."
+msgstr "Raccourci clavier du lecteur %s invalide. Contrôle sera utilisé."
 
-#: ../lib/advene/core/webcherry.py:1531 ../lib/advene/core/webcherry.py:1728
-msgid "<p>Cannot set the value : invalid path</p>"
-msgstr "<p>Impossible de mettre à jour : chemin invalide</p>"
+#: ../lib/advene/gui/main.py:679
+msgid "Exception in update_annotation"
+msgstr "Exception dans update_annotation"
 
-#: ../lib/advene/core/webcherry.py:1593 ../lib/advene/core/webcherry.py:1846
+#: ../lib/advene/gui/main.py:707
+msgid "Exception in update_relation"
+msgstr "Exception dans update_relation"
+
+#: ../lib/advene/gui/main.py:729
+msgid "Exception in update_view"
+msgstr "Exception dans update_view"
+
+#: ../lib/advene/gui/main.py:758
+msgid "Exception in update_query"
+msgstr "Exception dans update_query"
+
+#: ../lib/advene/gui/main.py:778
+msgid "Exception in update_resource"
+msgstr "Exception dans update_resource"
+
+#: ../lib/advene/gui/main.py:798
+msgid "Exception in update_schema"
+msgstr "Exception dans update_schema"
+
+#: ../lib/advene/gui/main.py:818
+msgid "Exception in update_annotationtype"
+msgstr "Exception dans update_annotationtype"
+
+#: ../lib/advene/gui/main.py:845
+msgid "Exception in update_relationtype"
+msgstr "Exception dans update_relationtype"
+
+#: ../lib/advene/gui/main.py:951
+msgid "Enter the new time value"
+msgstr "Entrez le nouveau temps"
+
+#: ../lib/advene/gui/main.py:975
 #, python-format
-msgid ""
-"<h1>Error</h1><p>When creating resource %(path)s, the resource folder "
-"%(folder)s could not be created.</p>"
-msgstr ""
-"<h1>Erreur</h1><p>Lors de la création de la ressource %(path)s, le "
-"répertoire %(folder)s n'a pas pu être créé.</p>"
+msgid "Replace content in %d elements"
+msgstr "Remplacer du texte dans %d elements"
 
-#: ../lib/advene/core/webcherry.py:1602 ../lib/advene/core/webcherry.py:1856
-msgid "Resource successfuly created/updated"
-msgstr "Ressource mise à jour"
+#: ../lib/advene/gui/main.py:988
+msgid "Find word"
+msgstr "Trouver le mot"
 
-#: ../lib/advene/core/webcherry.py:1611
-msgid "Value successfuly updated"
-msgstr "Valeur mise à jour"
+#: ../lib/advene/gui/main.py:995
+msgid "Replace by"
+msgstr "Remplacer par"
 
-#: ../lib/advene/core/webcherry.py:1613
+#: ../lib/advene/gui/main.py:1023
 #, python-format
-msgid ""
-"Unable to update the attribute %(attribute)s for element %(element)s: "
-"%(error)s."
-msgstr ""
-"Impossible de mettre à jour l'attribut %(attribute)s de l'élément "
-"%(element)s: %(error)s."
+msgid "%(search)s has been replaced by %(replace)s in %(count)d element(s)."
+msgstr "%(search)s a été remplacé par %(replace)s dans %(count)d éléments(s)."
 
-#: ../lib/advene/core/webcherry.py:1724
-msgid "<p>Invalid request</p>."
-msgstr "<p>Requête invalide</p>"
+#: ../lib/advene/gui/main.py:1032
+msgid "The video extracting feature is not available."
+msgstr "La fonctionnalité d'extraction de vidéo n'est pas disponible"
 
-#: ../lib/advene/core/webcherry.py:1788 ../lib/advene/core/webcherry.py:1805
-msgid "Value updated"
-msgstr "Valeur mise à jour"
+#: ../lib/advene/gui/main.py:1035
+msgid "Video export"
+msgstr "Export vidéo"
 
-#: ../lib/advene/core/webcherry.py:1789
+#: ../lib/advene/gui/main.py:1037
 #, python-format
+msgid "Exporting video montage/fragment to %%(filename)s"
+msgstr "Export du fragment/montage vidéo vers %%(filename)s"
+
+#: ../lib/advene/gui/main.py:1039
+msgid "Please choose a destination filename"
+msgstr "Choisissez le fichier destination"
+
+#: ../lib/advene/gui/main.py:1117
 msgid ""
-"\n"
-"                <h1>Value updated</h1>\n"
-"                The value of %(path)s has been updated to\n"
-"                <pre>\n"
-"                %(value)s\n"
-"                </pre>\n"
-"                "
+"No media association is defined in the package. Please use the 'File/"
+"Associate a video file' menu item to associate a media file."
 msgstr ""
-"\n"
-"                    <h1>Valeur mise à jour</h1>\n"
-"                    La valeur de %(path)s a été fixée à :\n"
-"                    <pre>\n"
-"                    %(value)s\n"
-"                    </pre>\n"
-"                    "
+"Aucun fichier vidéo n'est défini dans le recueil. Utilisez le menu 'Fichier/"
+"Associer un fichier vidéo' pour associer un fichier vidéo"
 
-#: ../lib/advene/core/webcherry.py:1806
+#: ../lib/advene/gui/main.py:1119
 #, python-format
 msgid ""
-"\n"
-"                    <h1>Value updated</h1>\n"
-"                    The value of %(path)s has been updated to\n"
-"                    <pre>\n"
-"                    %(value)s\n"
-"                    </pre>\n"
-"                    "
+"The associated media %s could not be found. Please use the 'File/Associate a "
+"video file' menu item to associate a media file."
 msgstr ""
-"\n"
-"                    <h1>Contenu mis à jour</h1>\n"
-"                    Le contenu de %(path)s a été fixé à :\n"
-"                    <pre>\n"
-"                    %(value)s\n"
-"                    </pre>\n"
-"                    "
+"La vidéo associée %s est introuvable. Utilisez le menu 'Fichier/Associer un "
+"fichier vidéo' pour associer un fichier vidéo."
 
-#: ../lib/advene/core/webcherry.py:1817
+#: ../lib/advene/gui/main.py:1121
 #, python-format
 msgid ""
-"Malformed request: cannot update the value of %(attribute)s in %(tales)s."
+"You are now working with the following video:\n"
+"%s"
 msgstr ""
-"Requête invalide : impossible de mettre à jour la valeur de %(attribute)s "
-"dans %(tales)s."
+"Vous travaillez maintenant avec la vidéo suivante :\\n\n"
+"%s"
 
-#: ../lib/advene/core/webcherry.py:1860
-msgid "Cannot create an element in something else than a package."
-msgstr "Impossible de créer un élément dans autre chose qu'un recueil."
+#: ../lib/advene/gui/main.py:1217
+msgid "Open this view..."
+msgstr "Ouvrir cette vue..."
 
-#: ../lib/advene/core/webcherry.py:1877
-#, python-format
-msgid "The identifier %s already exists."
-msgstr "L'identificateur %s est déjà défini."
+#: ../lib/advene/gui/main.py:1218 ../lib/advene/gui/plugins/actions.py:286
+#: ../lib/advene/gui/views/viewbook.py:130
+msgid "...in its own window"
+msgstr "...dans sa propre fenêtre"
 
-#: ../lib/advene/core/webcherry.py:1889
-#, python-format
-msgid "<p>Error while creating view %(id)s</p><pre>%(error)s</pre>"
-msgstr "<p>Erreur lors de la création de la vue %(id)s</p><pre>%(error)s</pre>"
+#: ../lib/advene/gui/main.py:1219 ../lib/advene/gui/plugins/actions.py:287
+#: ../lib/advene/gui/views/viewbook.py:131
+#: ../lib/advene/gui/views/__init__.py:398
+msgid "...embedded east of the video"
+msgstr "...intégrée à l'est de la vidéo"
 
-#: ../lib/advene/core/webcherry.py:1895
-msgid "View created"
-msgstr "Vue créée"
+#: ../lib/advene/gui/main.py:1220 ../lib/advene/gui/plugins/actions.py:288
+#: ../lib/advene/gui/views/viewbook.py:132
+#: ../lib/advene/gui/views/__init__.py:399
+msgid "...embedded west of the video"
+msgstr "...intégrée à l'ouest de la vidéo"
 
-#: ../lib/advene/core/webcherry.py:1896
-#, python-format
-msgid ""
-"\n"
-"                 <h1>View <em>%(id)s</em> created</h1>\n"
-"                 <p>The view <a href=\"%(url)s\">%(id)s</a> was successfully "
-"created.</p>\n"
-"                 "
-msgstr ""
-"\n"
-"                     <h1>Vue <em>%(id)s</em> créée</h1>\n"
-"                     <p>La vue <a href=\"%(url)s\">%(id)s</a> a été "
-"correctement créée.</p>\n"
-"                     "
+#: ../lib/advene/gui/main.py:1221 ../lib/advene/gui/plugins/actions.py:289
+#: ../lib/advene/gui/views/viewbook.py:133
+#: ../lib/advene/gui/views/__init__.py:400
+msgid "...embedded south of the video"
+msgstr "...intégrée au sud de la vidéo"
 
-#: ../lib/advene/core/webcherry.py:1912
-#, python-format
-msgid "Missing %s parameter"
-msgstr "Paramètre %s manquant"
+#: ../lib/advene/gui/main.py:1222 ../lib/advene/gui/plugins/actions.py:290
+#: ../lib/advene/gui/views/viewbook.py:134
+#: ../lib/advene/gui/views/__init__.py:401
+msgid "...embedded at the right of the window"
+msgstr "...intégrée à droite de la vidéo"
 
-#: ../lib/advene/core/webcherry.py:1915
-#, python-format
-msgid "Relation type %s does not exist"
-msgstr "Le type de relation %s n'existe pas"
+#: ../lib/advene/gui/main.py:1234
+msgid "_All available views"
+msgstr "_Toutes les vues disponibles"
 
-#: ../lib/advene/core/webcherry.py:1922 ../lib/advene/core/webcherry.py:1925
-#, python-format
-msgid "Annotation %s does not exist"
-msgstr "L'annotation %s n'existe pas"
+#: ../lib/advene/gui/main.py:1250 ../lib/advene/gui/views/timeline.py:126
+msgid "Timeline"
+msgstr "Ligne de Temps"
 
-#: ../lib/advene/core/webcherry.py:1928
-#, python-format
-msgid ""
-"<p>Cannot create relation between %(member1)s and %(member2)s: invalid type</"
-"p>"
-msgstr ""
-"<p>Impossible de créer une relation entre %(member1)s et %(member2)s : type "
-"invalide</p>"
+#: ../lib/advene/gui/main.py:1251 ../lib/advene/gui/views/finder.py:808
+msgid "Package finder"
+msgstr "Navigateur de recueil"
 
-#: ../lib/advene/core/webcherry.py:1940
-#, python-format
-msgid ""
-"<p>Error while creating relation between %(member1)s and %(member2)s :</"
-"p><pre>%(error)s</pre>"
-msgstr ""
-"<p>Erreur lors de la création de la relation entre %(member1)s et "
-"%(member2)s : </p><pre>%(error)s</pre>"
+#: ../lib/advene/gui/main.py:1252
+msgid "Transcription of annotations"
+msgstr "Transcription d'annotations"
 
-#: ../lib/advene/core/webcherry.py:1943
-msgid "Relation created"
-msgstr "Relation créée"
+#: ../lib/advene/gui/main.py:1253
+msgid "Annotation table"
+msgstr "Tableau d'annotations"
 
-#: ../lib/advene/core/webcherry.py:1944
-#, python-format
-msgid "<h1>Relation <em>%s</em> created</h1>"
-msgstr "<h1>Relation <em>%s</em> créée</h1>"
+#: ../lib/advene/gui/main.py:1256
+msgid "Note-taking editor"
+msgstr "Éditeur de prise de notes"
 
-#: ../lib/advene/core/webcherry.py:1954
-#, python-format
-msgid "Annotation type %s does not exist"
-msgstr "Le type d'annotation %s n'existe pas"
+#: ../lib/advene/gui/main.py:1257
+msgid "Active bookmarks"
+msgstr "Signets actifs"
 
-#: ../lib/advene/core/webcherry.py:1971
-#, python-format
+#: ../lib/advene/gui/main.py:1260 ../lib/advene/gui/views/tagbag.py:57
+msgid "Bag of tags"
+msgstr "Sac à tags"
+
+#: ../lib/advene/gui/main.py:1261
+msgid "TALES explorer"
+msgstr "Explorateur TALES"
+
+#: ../lib/advene/gui/main.py:1262
+msgid "Dynamic montage"
+msgstr "Montage dynamique"
+
+#: ../lib/advene/gui/main.py:1263 ../lib/advene/gui/plugins/videoplayer.py:37
+msgid "Video player"
+msgstr "Lecteur vidéo"
+
+#: ../lib/advene/gui/main.py:1266
+msgid "Open a comment view in the web browser"
+msgstr "Ouvrir une vue de commentaire dans le navigateur web"
+
+#: ../lib/advene/gui/main.py:1267
+msgid "Create or open a comment view"
+msgstr "Créer ou éditer une vue de commentaire"
+
+#: ../lib/advene/gui/main.py:1270
 msgid ""
-"<p>Error while creating annotation of type %(type)s :<pre>\n"
-"                    %(errortype)s\n"
-"                    %(value)s\n"
-"                    %(traceback)s</pre>"
+"Edit window placeholder (annotation and relation edit windows will be put "
+"here)"
 msgstr ""
-"<p>Erreur lors de la création d'une annotation du type %(type)s :<pre>\n"
-"                     %(errortype)s\n"
-"                     %(value)s\n"
-"                     %(traceback)s</pre>"
+"Emplacement de fenêtres d'édition (les fenêtres d'édition d'annotations et "
+"relations seront placées ici)"
 
-#: ../lib/advene/core/webcherry.py:1983
-#, python-format
-msgid "Annotation %s created"
-msgstr "Annotation %s créée"
+#: ../lib/advene/gui/main.py:1271
+msgid "Display edition history"
+msgstr "Afficher l'historique d'édition"
 
-#: ../lib/advene/core/webcherry.py:1985
-#, python-format
-msgid "Error: Cannot create an object of type %s."
-msgstr "Erreur: impossible de créer un objet de type %s."
+#: ../lib/advene/gui/main.py:1300
+msgid "The webserver could not be started. Static views cannot be accessed."
+msgstr ""
+"Le serveur web n'est pas lancé. Vous ne pouvez pas accéder aux vues "
+"statiques."
 
-#: ../lib/advene/core/webcherry.py:1988
+#: ../lib/advene/gui/main.py:1381
 #, python-format
 msgid ""
-"Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</"
-"code></p>"
+"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s has been "
+"released</b> on %(date)s, but you are running version %(current)s.\n"
+"You can download the latest version from the Advene website: http://advene."
+"org/</span>"
 msgstr ""
-"Erreur: Impossible d'effectuer l'action <em>%(action)s</em> sur <code>"
-"%(object)s</code>"
+"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s est "
+"disponible</b> depuis le %(date)s, mais vous utilisez la version "
+"%(current)s.\n"
+"Vous pouvez télécharger la dernière version depuis le site web d'Advene: "
+"http://www.advene.org/</span>"
 
-#: ../lib/advene/core/webcherry.py:2001
-msgid "Available actions"
-msgstr "Actions disponibles"
+#: ../lib/advene/gui/main.py:1386
+msgid "Go to the website"
+msgstr "Aller sur le site web"
 
-#: ../lib/advene/core/webcherry.py:2010
-#, python-format
-msgid "<li>%(name)s: %(value)s"
-msgstr "<li>%(name)s: %(value)s"
+#: ../lib/advene/gui/main.py:1392
+msgid "Advene release"
+msgstr "Nouvelle version d'Advene"
 
-#: ../lib/advene/core/webcherry.py:2033
+#: ../lib/advene/gui/main.py:1398
 #, python-format
-msgid "<p>Unknown action</p><pre>Action: %s</pre>"
-msgstr "<p>Action inconnue</p><pre>Action : %s</pre>"
+msgid "You are using a up-to-date version of Advene (%(current)s)."
+msgstr "Vous utilisez une version à jour d'Advene (%(current)s)."
 
-#: ../lib/advene/core/webcherry.py:2040
-msgid "Missing parameter(s) :<ul>"
-msgstr "Paramètre(s) manquant(s) :<ul>"
+#: ../lib/advene/gui/main.py:1398
+msgid "Advene is up-to-date"
+msgstr "Advene est à jour"
 
-#: ../lib/advene/core/webcherry.py:2076
-msgid "Advene web resources"
-msgstr "Ressources web d'Advene"
+#: ../lib/advene/gui/main.py:1412
+msgid "Choose a color"
+msgstr "Choisissez une couleur"
 
-#: ../lib/advene/core/webcherry.py:2082
-msgid "Advene webserver"
-msgstr "Serveur web Advene"
+#: ../lib/advene/gui/main.py:1444
+msgid "Select an annotation to loop on it"
+msgstr "Sélectionnez l'annotation sur laquelle boucler"
 
-#: ../lib/advene/core/webcherry.py:2083
+#: ../lib/advene/gui/main.py:1446
 #, python-format
+msgid "Looping on %s"
+msgstr "Boucler sur %s"
+
+#: ../lib/advene/gui/main.py:1516 ../lib/advene/gui/main.py:2443
+msgid "No active dynamic view"
+msgstr "Aucune vue dynamique active"
+
+#: ../lib/advene/gui/main.py:1527
+msgid "Create a new dynamic view."
+msgstr "Créer une nouvelle vue dynamique."
+
+#: ../lib/advene/gui/main.py:1546
+msgid "Edit the current dynamic view."
+msgstr "Éditer la vue dynamique courante"
+
+#: ../lib/advene/gui/main.py:1558
+msgid "No dynamic view"
+msgstr "Pas de vue dynamique"
+
+#: ../lib/advene/gui/main.py:1589
+msgid "Playing rate"
+msgstr "Vitesse de lecture"
+
+#: ../lib/advene/gui/main.py:1737
+msgid "History"
+msgstr "Historique"
+
+#: ../lib/advene/gui/main.py:1744
+msgid "Popups"
+msgstr "Popups"
+
+#: ../lib/advene/gui/main.py:1748
 msgid ""
-"<p>Welcome on the <a href=\"http://liris.cnrs.fr/advene/\">Advene</a> "
-"webserver run by %(userid)s on %(serveraddress)s.</p>"
+"You can drag and drop view icons (timeline, treeview, transcription...) in "
+"notebooks to embed various views."
 msgstr ""
-"<p>Bienvenue sur le serveur web <a href=\"http://liris.cnrs.fr/advene/"
-"\">Advene</a> exécuté par %(userid)s sur %(serveraddress)s.</p>"
+"Vous pouvez glisser-déposer les icônes des vues (ligne de temps,\n"
+"arbre, etc) dans les zones d'onglets pour les y intégrer."
 
-#: ../lib/advene/core/webcherry.py:2090
-msgid ""
-" <p>No package is loaded. You can access the <a href=\"/admin\">server "
-"administration page</a>.<p>"
+#: ../lib/advene/gui/main.py:1748 ../lib/advene/gui/main.py:4123
+msgid "Information"
+msgstr "Information"
+
+#: ../lib/advene/gui/main.py:2034
+msgid "Cannot create annotation. There is no schema to put it in."
 msgstr ""
-" <p>Aucun recueil n'est chargé. Vous pouvez accéder aux <a href=\"/admin"
-"\">formulaires d'administration du serveur</a>.<p>"
+"Impossible de créer l'annotation : il n'y a pas de schéma pour la contenir."
+
+#: ../lib/advene/gui/main.py:2043
+msgid "Default annotation type"
+msgstr "Type d'annotation par défaut"
+
+#: ../lib/advene/gui/main.py:2055
+msgid "Annotation created"
+msgstr "Annotation créée"
+
+#: ../lib/advene/gui/main.py:2088
+msgid "Play/Pause [Control-Tab / Control-Space]"
+msgstr "Lecture/Pause [Contrôle-Tab / Contrôle-Espace]"
 
-#: ../lib/advene/core/webcherry.py:2100
+#: ../lib/advene/gui/main.py:2092
 #, python-format
-msgid ""
-"the <a href=\"/packages/%(alias)s/view/%(view)s\">loaded package's default "
-"view</a>"
-msgstr ""
-"à la <a href=\"/packages/%(alias)s/view/%(view)s\">vue par défaut du "
-"recueil</a>"
+msgid "Rewind (%.02f s) [Control-Left]"
+msgstr "Reculer (%.02f s) [Contrôle-gauche]"
 
-#: ../lib/advene/core/webcherry.py:2102
+#: ../lib/advene/gui/main.py:2096
 #, python-format
-msgid "the <a href=\"/packages/%s\">loaded package's data</a>"
-msgstr "aux <a href=\"/packages/%s\">données du recueil</a>"
+msgid "Forward (%.02f s) [Control-Right]"
+msgstr "Avancer (%.02f s) [Contrôle-droite]"
 
-#: ../lib/advene/core/webcherry.py:2104
-msgid "the <a href=\"/packages\">loaded packages' data</a>"
-msgstr "aux <a href=\"/packages\">recueils disponibles</a>"
+#: ../lib/advene/gui/main.py:2100
+msgid "Previous frame [Control-Down]"
+msgstr "Image précédente [Contrôle-bas]"
+
+#: ../lib/advene/gui/main.py:2104
+msgid "Next frame [Control-Up]"
+msgstr "Image suivante [Contrôle-haut]"
+
+#: ../lib/advene/gui/main.py:2108
+msgid "Fullscreen"
+msgstr "Plein écran"
 
-#: ../lib/advene/core/webcherry.py:2105
+#: ../lib/advene/gui/main.py:2290
+#, python-format
+msgid "Screenshot saved to %s"
+msgstr "Capture sauvegardée dans %s"
+
+#: ../lib/advene/gui/main.py:2292
 #, python-format
 msgid ""
-" <p>You can either access %s or the <a href=\"/admin\">server administration "
-"page</a>.<p>"
+"Screenshot saved in\n"
+" %s"
 msgstr ""
-" <p>Vous pouvez accéder soit %s, soit aux <a href=\"/admin\">formulaires "
-"d'administration du serveur</a>.<p>"
+"Capture sauvegardée dans\n"
+" %s"
 
-#: ../lib/advene/core/webcherry.py:2107
+#: ../lib/advene/gui/main.py:2294
 #, python-format
 msgid ""
-"<hr><p align=\"right\"><em>Document generated by <a href=\"http://liris.cnrs."
-"fr/advene/\">Advene</a> v. %s.</em></p>"
+"Could not save screenshot:\n"
+" %s"
 msgstr ""
-"<hr><p align=\"right\"><em>Document généré par <a href=\"http://liris.cnrs."
-"fr/advene/\">Advene</a> v. %s.</em></p>"
+"Impossible de sauvegarder la capture:\n"
+" %s"
 
-#: ../lib/advene/core/webcherry.py:2189 ../lib/advene/core/webcherry.py:2198
-#, python-format
-msgid "Cannot start HTTP server: %s"
-msgstr "Impossible de lancer le serveur HTTP : %s"
+#: ../lib/advene/gui/main.py:2302
+msgid "Save screenshot to..."
+msgstr "Sauver la capture d'écran sous..."
+
+#: ../lib/advene/gui/main.py:2320
+msgid "Could not take snapshot with enough precision"
+msgstr "Impossible de faire une capture avec suffisamment de précision"
 
-#: ../lib/advene/util/website_export.py:61
+#: ../lib/advene/gui/main.py:2358
+msgid "Export package data"
+msgstr "Exporter les données du recueil"
+
+#: ../lib/advene/gui/main.py:2360
 #, python-format
-msgid "%s exists but is not a directory. Cancelling website export"
-msgstr "%s existe mais n'est pas un répertoire. Abandon de l'export."
+msgid "Export annotation type %s"
+msgstr "Exporter le type d'annotation %s"
 
-#: ../lib/advene/util/website_export.py:67
+#: ../lib/advene/gui/main.py:2362
 #, python-format
-msgid "%s does not exist"
-msgstr "%s n'existe pas"
+msgid "Export element %s"
+msgstr "Exporter l'élément %s"
 
-#: ../lib/advene/util/website_export.py:422
-msgid "Starting export"
-msgstr "Début de l'export"
+#: ../lib/advene/gui/main.py:2388
+msgid "Export format"
+msgstr "Format d'export"
 
-#: ../lib/advene/util/website_export.py:451
-#, python-format
-msgid "Depth %d"
-msgstr "Profondeur %d"
+#: ../lib/advene/gui/main.py:2425
+msgid " (modified)"
+msgstr " (modifié)"
 
-#: ../lib/advene/util/website_export.py:455
+#: ../lib/advene/gui/main.py:2428
 #, python-format
-msgid "Depth %(depth)d: processing %(url)s"
-msgstr "Profondeur %(depth)d: traitement de %(url)s"
+msgid "Activate %s"
+msgstr "Activer %s"
 
-#: ../lib/advene/util/website_export.py:477
-msgid "Finalizing"
-msgstr "Finalisation"
-
-#: ../lib/advene/util/website_export.py:511
-#, python-format
-msgid ""
-"<p><strong>You should probably begin at <a href=\"%(href)s\">%(title)s</a>.</"
-"strong></p>"
-msgstr ""
-"<p><strong>Vous devriez probablement commencer à <a href=\"%(href)s\">"
-"%(title)s</a>.</strong></p>"
+#: ../lib/advene/gui/main.py:2598
+msgid "Saved workspace"
+msgstr "Environnement sauvegardé"
 
-#: ../lib/advene/util/website_export.py:554
-msgid "Export complete"
-msgstr "Export terminé"
+#: ../lib/advene/gui/main.py:2651
+msgid "Restoring workspace..."
+msgstr "Restauration de l'environnement"
 
-#: ../lib/advene/util/importer.py:134
-msgid "Generic importer"
-msgstr "Importateur générique"
+#: ../lib/advene/gui/main.py:2657
+#, python-format
+msgid "Do you wish to restore the %s workspace ?"
+msgstr "Voulez-vous restaurer l'environnement %s ?"
 
-#: ../lib/advene/util/importer.py:161
-msgid "Usage: %prog [options] source-file destination-file"
-msgstr "Usage: %prog [options] fichier-source fichier-destination"
+#: ../lib/advene/gui/main.py:2662
+msgid "Clear the current workspace"
+msgstr "Vider l'environnement courant"
 
-#: ../lib/advene/util/importer.py:165
-msgid "Specify the offset in ms"
-msgstr "Précisez l'offset en ms"
+#: ../lib/advene/gui/main.py:2683
+#, python-format
+msgid "View %s is not an adhoc view"
+msgstr "La vue %s n'est pas une vue adhoc"
 
-#: ../lib/advene/util/importer.py:210
-msgid ""
-"Import filter error. The asynchronous API should be used, please report a "
-"bug."
-msgstr ""
-"Erreur dans le filtre d'import. L'API asynchrone devrait être\n"
-"utilisée, faites un rapport de bug SVP."
+#: ../lib/advene/gui/main.py:2694
+#, python-format
+msgid "Cannot identify the adhoc view %s"
+msgstr "Impossible de trouver la vue adhoc %s"
 
-#: ../lib/advene/util/importer.py:212
-msgid ""
-"Import filter error. No conversion method is defined,  please report a bug."
+#: ../lib/advene/gui/main.py:2708
+msgid "Choose the annotation type to display as transcription."
 msgstr ""
-"Erreur dans le filtre d'import. Aucune méthode de conversion définie, faites "
-"un rapport de bug SVP."
+"Choisissez le type d'annotation\n"
+"à afficher sous forme de transcription."
 
-#: ../lib/advene/util/importer.py:344
+#: ../lib/advene/gui/main.py:2743
 #, python-format
-msgid "Converted from %s"
-msgstr "Converti depuis %s"
-
-#: ../lib/advene/util/importer.py:469
-msgid "ExternalApp importer"
-msgstr "Importateur d'application externe"
+msgid "Error: unable to find an edit popup for %(element)s"
+msgstr "Erreur : impossible d'ouvrir une fenêtre d'édition pour %(element)s"
 
-#: ../lib/advene/util/importer.py:483
+#: ../lib/advene/gui/main.py:2750
 #, python-format
-msgid ""
-"The <b>%s</b> application does not seem to be installed. Please check that "
-"it is present and that its path is correctly specified in preferences."
-msgstr ""
-"L'application <b>%s</b> ne semble pas installée. Merci de vérifier qu'elle "
-"est bien présente et que son chemin est correctement spécifié dans les "
-"préférences."
+msgid "Editing %s"
+msgstr "Édition de %s"
 
-#: ../lib/advene/util/importer.py:485
+#: ../lib/advene/gui/main.py:2762
 #, python-format
-msgid "The file %s does not seem to exist."
-msgstr "Le fichier %s semble ne pas exister."
+msgid "Comment view (%s)"
+msgstr "Vue de commentaire (%s)"
 
-#: ../lib/advene/util/importer.py:507
+#: ../lib/advene/gui/main.py:2829
 #, python-format
-msgid "Could not run %(appname)s: %(msg)s"
-msgstr "Impossible d'exécuter %(appname)s: %(msg)s"
+msgid "Package %(uri)s saved: %(annotations)s and %(relations)s."
+msgstr "Recueil %(uri)s sauvé. %(annotations)s et %(relations)s."
 
-# Traitement de %s
-#: ../lib/advene/util/importer.py:509
+#: ../lib/advene/gui/main.py:2840
 #, python-format
-msgid "Processing %s"
-msgstr "Traitement de %s"
+msgid "Activating package %s"
+msgstr "Activation du recueil %s"
 
-#: ../lib/advene/util/importer.py:513
-msgid "Cleaning up..."
-msgstr "Nettoyage..."
+#: ../lib/advene/gui/main.py:2868
+#, python-format
+msgid "Package %(uri)s loaded: %(annotations)s and %(relations)s."
+msgstr "Recueil %(uri)s chargé. %(annotations)s et %(relations)s."
 
-#: ../lib/advene/util/importer.py:633
-msgid "Text importer"
-msgstr "Importateur texte"
+#: ../lib/advene/gui/main.py:2900
+msgid "Do you want to restore the saved workspace ?"
+msgstr "Voulez-vous restaurer l'environnement sauvegardé ?"
 
-#: ../lib/advene/util/importer.py:646 ../lib/advene/util/importer.py:1176
-msgid "Specify the encoding of the input file (latin1, utf8...)"
-msgstr "Spécifiez l'encodage du fichier d'entrée (latin, utf8...)"
+#: ../lib/advene/gui/main.py:2907
+msgid "Advene"
+msgstr "Advene"
 
-#: ../lib/advene/util/importer.py:649
-msgid "Should the timestamps be encoded relative to the first timestamp?"
-msgstr ""
-"Les timecodes doivent-ils être décalés en considérant le premier à zéro ?"
+#: ../lib/advene/gui/main.py:2957
+#, python-format
+msgid "Video player error: %s"
+msgstr "Erreur de lecteur vidéo: %s"
 
-#: ../lib/advene/util/importer.py:652
-msgid "Unit to consider for integers"
-msgstr "Unité à utiliser pour les entiers"
+#: ../lib/advene/gui/main.py:3137 ../lib/advene/gui/main.py:3158
+msgid "Unknown"
+msgstr "Inconnu"
 
-#: ../lib/advene/util/importer.py:655
+#: ../lib/advene/gui/main.py:3228
+#, python-format
 msgid ""
-"What timestamps are present in a line (only begin, both begin and end, or "
-"automatic recognition)"
+"The package(s) %s are modified.\n"
+"Save them now?"
 msgstr ""
-"Quels timecodes sont présents sur une ligne : uniquement le début\n"
-"(begin), début et fin (both) ou reconnaissance automatique (auto)"
-
-#: ../lib/advene/util/importer.py:798
-msgid "lsdvd importer"
-msgstr "Importateur lsdvd"
+"Le(s) recueil(s) %s a été modifié mais pas sauvegardé.\n"
+"Sauvegarder maintenant ?"
 
-#: ../lib/advene/util/importer.py:825
-msgid "Processing data"
-msgstr "Traitement des données"
+#: ../lib/advene/gui/main.py:3252
+#: ../lib/advene/gui/views/interactivequery.py:376
+msgid "Empty quicksearch string"
+msgstr "Chaîne de recherche vide"
 
-#: ../lib/advene/util/importer.py:843 ../lib/advene/util/importer.py:903
-msgid "DVD Chapter"
-msgstr "Chapitre DVD"
+#: ../lib/advene/gui/main.py:3255
+#: ../lib/advene/gui/views/interactivequery.py:281
+#, python-format
+msgid "'%s'"
+msgstr "'%s'"
 
-#: ../lib/advene/util/importer.py:847
-msgid "Launching lsdvd..."
-msgstr "Lancement de lsdvd"
+#: ../lib/advene/gui/main.py:3270
+msgid "Choose an annotation type."
+msgstr "Choisissez un type d'annotation"
 
-#: ../lib/advene/util/importer.py:859
-msgid "chaplin importer"
-msgstr "Importateur chaplin"
+#: ../lib/advene/gui/main.py:3289 ../lib/advene/gui/views/timeline.py:3035
+#: ../lib/advene/gui/edit/transcribe.py:994
+msgid "Create a new annotation type"
+msgstr "Créer un nouveau type d'annotation"
 
-#: ../lib/advene/util/importer.py:917
-msgid "Xi importer"
-msgstr "Importateur Xi"
+#: ../lib/advene/gui/main.py:3314
+msgid "No annotation type is defined."
+msgstr "Aucun type d'annotation n'est défini."
 
-#: ../lib/advene/util/importer.py:986
-msgid "ELAN importer"
-msgstr "Importateur ELAN"
+#: ../lib/advene/gui/main.py:3323
+msgid "Creating a new type."
+msgstr "Création d'un nouveau type."
 
-#: ../lib/advene/util/importer.py:1039
-#, python-format
-msgid "Converting tier %s"
-msgstr "Conversion du tier %s"
+#: ../lib/advene/gui/main.py:3327
+msgid "Title of the new type"
+msgstr "Titre du nouveau type"
 
-#: ../lib/advene/util/importer.py:1140
-msgid "Processing time slots"
-msgstr "Traitement des bornes temporelles"
+#: ../lib/advene/gui/main.py:3328
+msgid ""
+"Id of the new type. It is generated from the title, but you may change it if "
+"necessary."
+msgstr ""
+"Identifiant du nouveau type. Il est généré à partir du titre, mais vous "
+"pouvez le changer si nécessaire."
 
-#: ../lib/advene/util/importer.py:1155
-msgid "Fixing forward references"
-msgstr "Correction des références"
+#: ../lib/advene/gui/main.py:3332
+msgid "Specify the content-type for the annotation type"
+msgstr "Spécifiez le type de contenu pour le type d'annotation"
 
-#: ../lib/advene/util/importer.py:1157
-msgid "Creating relations"
-msgstr "Création des relations"
+#: ../lib/advene/gui/main.py:3334
+msgid "Content type"
+msgstr "Type de contenu"
 
-#: ../lib/advene/util/importer.py:1169
-msgid "Subtitle (SRT) importer"
-msgstr "Importateur sous-titres (SRT)"
+#: ../lib/advene/gui/main.py:3341 ../lib/advene/gui/main.py:3450
+msgid "Create a new schema"
+msgstr "Créer un nouveau schéma"
 
-#: ../lib/advene/util/importer.py:1238
-#, python-format
-msgid "Subtitles from %s"
-msgstr "Sous-titres de %s"
+#: ../lib/advene/gui/main.py:3354
+msgid "Choose an existing schema for the new type, or create a new one"
+msgstr ""
+"Choisissez un schéma existant pour le nouveau type, ou créez un nouveau "
+"schéma."
 
-#: ../lib/advene/util/importer.py:1251
-msgid "PRAAT importer"
-msgstr "Importateur PRAAT"
+#: ../lib/advene/gui/main.py:3357 ../lib/advene/gui/main.py:3465
+msgid "Specify the schema title"
+msgstr "Spécifiez le titre du schéma"
 
-#: ../lib/advene/util/importer.py:1341
-msgid "CMML importer"
-msgstr "Importateur CMML"
+#: ../lib/advene/gui/main.py:3361
+msgid "Title of the new schema"
+msgstr "Titre du nouveau schéma"
 
-#: ../lib/advene/util/importer.py:1404
-msgid "Parsing clip information"
-msgstr "Traitement des informations de clip"
+#: ../lib/advene/gui/main.py:3362
+msgid ""
+"Id of the new schema. It is generated from the title, but you may change it "
+"if necessary."
+msgstr ""
+"Identifiant du nouveau schéma. Il est généré à partir du titre, mais vous "
+"pouvez le changer si nécessaire."
 
-#: ../lib/advene/util/importer.py:1501
-#: ../lib/advene/plugins/transcriber.py:254
-msgid "Creating package"
-msgstr "Création du recueil"
+#: ../lib/advene/gui/main.py:3385
+msgid ""
+"You specified a annotation-type identifier that already exists. Aborting."
+msgstr ""
+"Vous avez spécifié un identifiant déjà existant. Annulation de l'opération."
 
-#: ../lib/advene/util/importer.py:1504
-msgid "Creating CMML schema"
-msgstr "Création du schéma CMML"
+#: ../lib/advene/gui/main.py:3403
+msgid "You specified a existing schema identifier. Using the existing schema."
+msgstr ""
+"Vous avez spécifié un identifiant de schéma déjà existant. Ce dernier sera "
+"utilisé."
 
-#: ../lib/advene/util/importer.py:1508
-#: ../lib/advene/plugins/transcriber.py:260
-msgid "Creating annotation types"
-msgstr "Création des types d'annotation"
+#: ../lib/advene/gui/main.py:3405
+msgid ""
+"You specified an existing identifier that does not reference a schema. "
+"Aborting."
+msgstr ""
+"Vous avez spécifié un identifiant déjà existant qui ne désigne pas un "
+"schéma. Annulation de l'opération."
 
-#: ../lib/advene/util/importer.py:1514
-#: ../lib/advene/plugins/transcriber.py:265
-msgid "Parsing header information"
-msgstr "Traitement de l'entête"
+#: ../lib/advene/gui/main.py:3432
+msgid "Choose a schema."
+msgstr "Choisissez un schéma"
 
-#: ../lib/advene/util/importer.py:1528
-msgid "Parsing stream information"
-msgstr "Traitement des informations sur le média"
+#: ../lib/advene/gui/main.py:3492
+msgid "You specified an existing identifier. Aborting."
+msgstr ""
+"Vous avez spécifié un identifiant déjà existant. Annulation de l'opération."
 
-#: ../lib/advene/util/importer.py:1562
-msgid "IRI importer"
-msgstr "Importateur IRI"
+#: ../lib/advene/gui/main.py:3512
+#, python-format
+msgid "Package %s modified"
+msgstr "Recueil %s modifié"
 
-#: ../lib/advene/util/importer.py:1571
-msgid "Generate one type per view"
-msgstr "Générer un type par vue"
+#: ../lib/advene/gui/main.py:3513
+#, python-format
+msgid ""
+"The package %s has been modified but not saved.\n"
+"Save it now?"
+msgstr ""
+"Le recueil %s a été modifié mais pas sauvegardé.\n"
+"Sauvegarder maintenant ?"
 
-#: ../lib/advene/util/importer.py:1591
+#: ../lib/advene/gui/main.py:3523
 #, python-format
-msgid "Parsing ensemble %s"
-msgstr "Traitement de l'ensemble %s"
+msgid "%s snapshots"
+msgstr "%s captures d'écran"
 
-#: ../lib/advene/util/importer.py:1602
+#: ../lib/advene/gui/main.py:3524
 #, python-format
-msgid "Parsing decoupage %s"
-msgstr "Traitement du découpage %s"
+msgid "Do you want to save the snapshots for media %s?"
+msgstr "Voulez-vous sauvegarder les captures d'écran pour la vidéo %s ?"
 
-#: ../lib/advene/util/importer.py:1638
-msgid "Parsing views"
-msgstr "Traitement des vues"
+#: ../lib/advene/gui/main.py:3531 ../lib/advene/gui/main.py:3540
+#: ../lib/advene/gui/main.py:4541
+#, python-format
+msgid "Cannot save imagecache for %(media)s: %(e)s"
+msgstr "Impossible de sauvegarder le cache pour %(media)s : %(e)s"
 
-#: ../lib/advene/util/importer.py:1686 ../lib/advene/util/importer.py:1775
-msgid "Initializing package"
-msgstr "Initialisation du recueil"
+#: ../lib/advene/gui/main.py:3554
+msgid "first frame"
+msgstr "première image"
 
-#: ../lib/advene/util/importer.py:1724
-msgid "IRIData importer"
-msgstr "Importateur IRIData"
+#: ../lib/advene/gui/main.py:3555
+msgid "last frame"
+msgstr "dernière image"
 
-#: ../lib/advene/util/importer.py:1738
-msgid "Parsing sound values"
-msgstr "Traitement des valeurs d'échantillons de son"
+#: ../lib/advene/gui/main.py:3563
+#, python-format
+msgid "Click on %(bound)s of %(annotation)s"
+msgstr "Cliquer sur %(bound)s de %(annotation)s"
 
-#: ../lib/advene/util/importer.py:1750
-msgid "Creating annotations"
-msgstr "Création des annotations"
+#: ../lib/advene/gui/main.py:3566
+#, python-format
+msgid "Update %(bound)s of %(annotation)s"
+msgstr "Éditer %(bound)s de %(annotation)s"
 
-#: ../lib/advene/util/helper.py:402
-msgid "Package"
-msgstr "Recueil"
-
-#: ../lib/advene/util/helper.py:403
-msgid "Annotation"
-msgstr "Annotation"
+#: ../lib/advene/gui/main.py:3585
+msgid "Click on the frame corresponding to the timestamp value"
+msgstr "Cliquez sur l'image correspondant au temps désiré"
 
-#: ../lib/advene/util/helper.py:404
-msgid "Relation"
-msgstr "Relation"
+#: ../lib/advene/gui/main.py:3587
+msgid "Set new timestamp value"
+msgstr "Fixer le nouveau timecode"
 
-#: ../lib/advene/util/helper.py:405 ../lib/advene/gui/edit/schemaeditor.py:111
-#: ../lib/advene/gui/main.py:276 ../lib/advene/gui/main.py:3270
-msgid "Schema"
-msgstr "Schéma"
+#: ../lib/advene/gui/main.py:3594
+msgid ""
+"<b>Annotation statistics</b>\n"
+"\n"
+msgstr ""
+"<b>Statistiques d'annotations</b>\n"
+"\n"
 
-#: ../lib/advene/util/helper.py:406 ../lib/advene/gui/main.py:279
-msgid "Annotation Type"
-msgstr "Type d'Annotation"
+#: ../lib/advene/gui/main.py:3666
+msgid "Text annotation"
+msgstr "Annotation textuelle"
 
-#: ../lib/advene/util/helper.py:407 ../lib/advene/gui/main.py:280
-msgid "Relation Type"
-msgstr "Type de Relation"
+#: ../lib/advene/gui/main.py:3674 ../lib/advene/gui/main.py:3699
+msgid "Cannot find an appropriate annotation type"
+msgstr "Impossible de trouver un type d'annotation approprié"
 
-#: ../lib/advene/util/helper.py:408 ../lib/advene/rules/actions.py:236
-#: ../lib/advene/gui/edit/rules.py:1087 ../lib/advene/gui/main.py:277
-msgid "View"
-msgstr "Vue"
+#: ../lib/advene/gui/main.py:3676 ../lib/advene/gui/views/bookmarks.py:293
+msgid "Comment here"
+msgstr "Commentez ici"
 
-#: ../lib/advene/util/helper.py:409 ../lib/advene/gui/main.py:278
-#: ../lib/advene/gui/popup.py:459
-msgid "Query"
-msgstr "Requête"
+#: ../lib/advene/gui/main.py:3692
+msgid "Graphical annotation"
+msgstr "Annotation graphique"
 
-#: ../lib/advene/util/helper.py:410
-msgid "Resource Folder"
-msgstr "Répertoire de ressources"
+#: ../lib/advene/gui/main.py:3744
+msgid ""
+"An unsaved template package exists\n"
+"Save it first."
+msgstr ""
+"Un recueil modèle non sauvegardé existe.\n"
+"Sauvegardez-le avant d'essayer d'en créer un nouveau."
 
-#: ../lib/advene/util/helper.py:411 ../lib/advene/gui/edit/create.py:122
-msgid "Resource File"
-msgstr "Fichier de ressource"
+#: ../lib/advene/gui/main.py:3753
+msgid "Package modified"
+msgstr "Recueil modifié"
 
-#: ../lib/advene/util/helper.py:446
-msgid "---- Elements ----"
-msgstr "---- Éléments ----"
+#: ../lib/advene/gui/main.py:3754
+msgid ""
+"The package that you want to close has been modified but not saved.\n"
+"Save it now?"
+msgstr ""
+"Le recueil que vous souhaitez fermer a été modifié mais pas sauvegardé.\n"
+"Sauvegarder maintenant ?"
 
-#: ../lib/advene/util/helper.py:452
-msgid "---- Attributes ----"
-msgstr "---- Attributs ----"
+#: ../lib/advene/gui/main.py:3787
+msgid "Load a package"
+msgstr "Charger un recueil"
 
-#: ../lib/advene/util/helper.py:455
-msgid "---- Methods ----"
-msgstr "---- Méthodes ----"
+#: ../lib/advene/gui/main.py:3800
+msgid ""
+"A video file was selected. Pretend that the user selected 'Select a video "
+"file'..."
+msgstr ""
+"Un fichier vidéo a été sélectionné. On fait comme si l'utilisateur est passé "
+"par \"Sélectionner un fichier vidéo...\""
 
-#: ../lib/advene/util/helper.py:531
+#: ../lib/advene/gui/main.py:3805
 #, python-format
-msgid "Cannot read %(filename)s: %(error)s"
-msgstr "Impossible de lire %(filename)s : %(error)s"
+msgid ""
+"The file %s does not look like a valid Advene package. It should have a .azp "
+"or .xml extension. Try to open anyway?"
+msgstr ""
+"Le fichier %s ne ressemble pas à un recueil Advene valide. Il devrait avoir "
+"une extension .azp ou .xml. Voulez-vous essayer tout de même de l'ouvrir ?"
 
-#: ../lib/advene/util/helper.py:555
-#, python-format
+#: ../lib/advene/gui/main.py:3814
 msgid ""
-"Error:\n"
-"%s"
+"You are trying to load a session file, but there are unsaved packages. "
+"Proceed anyway?"
 msgstr ""
-"Erreur :\n"
-"%s"
+"Vous essayez de charger un fichier de session, mais il existe des recueil "
+"non sauvegardés. Continuer tout de même ?"
 
-#: ../lib/advene/util/helper.py:565
+#: ../lib/advene/gui/main.py:3823
 #, python-format
 msgid ""
-"Package %(title)s:\n"
-"%(schema)s\n"
-"%(annotation)s in %(annotation_type)s\n"
-"%(relation)s in %(relation_type)s\n"
-"%(query)s\n"
-"%(view)s\n"
-"\n"
-"Description:\n"
-"%(description)s\n"
+"Cannot load package %(filename)s:\n"
+"%(error)s"
 msgstr ""
-"Recueil %(title)s:\n"
-"%(schema)s\n"
-"%(annotation)s dans %(annotation_type)s\n"
-"%(relation)s dans %(relation_type)s\n"
-"%(query)s\n"
-"%(view)s\n"
-"\n"
-"Description:\n"
-"%(description)s\n"
+"Impossible de charger le recueil %(filename)s :\n"
+"%(error)s"
 
-#: ../lib/advene/util/helper.py:592
-msgid "Min duration"
-msgstr "Durée min"
+#: ../lib/advene/gui/main.py:3843 ../lib/advene/gui/main.py:3899
+msgid "Do you want to save the current workspace ?"
+msgstr "Voulez-vous sauvegarder l'environnement en cours ?"
 
-#: ../lib/advene/util/helper.py:593
-msgid "Max duration"
-msgstr "Durée max"
+#: ../lib/advene/gui/main.py:3858 ../lib/advene/gui/main.py:3914
+#, python-format
+msgid "Could not save the package: %s"
+msgstr "Impossible de sauvegarder le recueil: %s"
 
-#: ../lib/advene/util/helper.py:594
-msgid "Mean duration"
-msgstr "Durée moyenne"
+#: ../lib/advene/gui/main.py:3871
+#, python-format
+msgid "Save the package %s"
+msgstr "Sauvegarde du recueil %s"
 
-#: ../lib/advene/util/helper.py:595
-msgid "Total duration"
-msgstr "Durée totale"
+#: ../lib/advene/gui/main.py:3884
+msgid "Invalid file extension"
+msgstr "Extension de fichier invalide"
 
-#: ../lib/advene/util/helper.py:601
-msgid "schema"
-msgstr "schéma"
+#: ../lib/advene/gui/main.py:3885
+#, python-format
+msgid ""
+"Your package contains resources,\n"
+"the filename (%s) should have a .azp extension.\n"
+"Should I put the correct extension?"
+msgstr ""
+"Votre recueil contient des ressources,\n"
+"le nom de fichier (%s) devrait avoir l'extension .azp.\n"
+"Corriger le nom de fichier ?"
 
-#: ../lib/advene/util/helper.py:601
-msgid "schemas"
-msgstr "schémas"
+#: ../lib/advene/gui/main.py:3889
+msgid "OK, the resources will be lost."
+msgstr "OK, les ressources seront perdues."
 
-#: ../lib/advene/util/helper.py:602
-msgid "annotation"
-msgstr "annotation"
+#: ../lib/advene/gui/main.py:3891
+msgid "Aborting package saving"
+msgstr "Abandon de la sauvegarde"
 
-#: ../lib/advene/util/helper.py:602
-msgid "annotations"
-msgstr "annotations"
+#: ../lib/advene/gui/main.py:3925
+msgid "Save the session in..."
+msgstr "Sauver la session dans..."
 
-#: ../lib/advene/util/helper.py:603 ../lib/advene/util/helper.py:604
-msgid "annotation type"
-msgstr "type d'annotation"
+#: ../lib/advene/gui/main.py:3936
+#, python-format
+msgid "Session saved in %s"
+msgstr "Session sauvegardée dans %s"
 
-#: ../lib/advene/util/helper.py:603 ../lib/advene/util/helper.py:604
-msgid "annotation types"
-msgstr "types d'annotation"
+#: ../lib/advene/gui/main.py:3945
+msgid "Do you confirm the creation of annotations matching the DVD chapters?"
+msgstr ""
+"Confirmez-vous la création d'annotations correspondant aux chapitres du DVD ?"
 
-#: ../lib/advene/util/helper.py:605
-msgid "relation"
-msgstr "relation"
+#: ../lib/advene/gui/main.py:3951
+msgid "Cannot import DVD chapters. Did you install the lsdvd software?"
+msgstr ""
+"Impossible d'importer les chapitres du DVD. Avez-vous installé l'application "
+"lsdvd ?"
 
-#: ../lib/advene/util/helper.py:605
-msgid "relations"
-msgstr "relations"
+#: ../lib/advene/gui/main.py:3959
+msgid "The associated media is not a DVD."
+msgstr "Le média associé n'est pas un DVD."
 
-#: ../lib/advene/util/helper.py:606 ../lib/advene/util/helper.py:607
-msgid "relation type"
-msgstr "type de relation"
+# Traitement de %s
+#: ../lib/advene/gui/main.py:3970
+#, python-format
+msgid "Processing %s video"
+msgstr "Traitement de la vidéo %s"
 
-#: ../lib/advene/util/helper.py:606 ../lib/advene/util/helper.py:607
-msgid "relation types"
-msgstr "types de relation"
+#: ../lib/advene/gui/main.py:3973
+msgid "No associated video file"
+msgstr "Aucun fichier vidéo associé"
 
-#: ../lib/advene/util/helper.py:608
-msgid "query"
-msgstr "requête"
+#: ../lib/advene/gui/main.py:4000
+msgid "Standard RuleSet"
+msgstr "Ensemble de règles standard"
 
-#: ../lib/advene/util/helper.py:608
-msgid "queries"
-msgstr "requêtes"
+#: ../lib/advene/gui/main.py:4112
+#, python-format
+msgid ""
+"Media information\n"
+"\n"
+"URI: %(uri)s\n"
+"Framerate: %(framerate_denom)d / %(framerate_num)d (%(framerate).02f )\n"
+"Duration: %(duration_formatted)s (%(duration)d ms) (cached: "
+"%(cached_duration_formatted)s)\n"
+"Current position: %(position_formatted)s (%(position)d ms)\n"
+"\n"
+"Original image size: %(width)d x %(height)d\n"
+"\n"
+"Image cache information: %(imagecache)s\n"
+msgstr ""
+"Information media\n"
+"\n"
+"URI: %(uri)s\n"
+"Taux: %(framerate_denom)d / %(framerate_num)d (%(framerate).02f )\n"
+"Durée: %(duration_formatted)s (%(duration)d ms) (cached: "
+"%(cached_duration_formatted)s)\n"
+"Position courante: %(position_formatted)s (%(position)d ms)\n"
+"\n"
+"Taille d'image originale: %(width)d x %(height)d\n"
+"\n"
+"Information du cache d'images: %(imagecache)s\n"
 
-#: ../lib/advene/util/helper.py:609
-msgid "view"
-msgstr "vue"
+#: ../lib/advene/gui/main.py:4137
+msgid "Visit the Advene web site for examples and documentation."
+msgstr "Consultez le site web d'Advene pour les exemples et la documentation."
 
-#: ../lib/advene/util/helper.py:609
-msgid "views"
-msgstr "vues"
+#: ../lib/advene/gui/main.py:4170 ../lib/advene/gui/main.py:4258
+msgid "Select a movie file"
+msgstr "Choisissez un fichier vidéo"
 
-#: ../lib/advene/util/helper.py:610
-msgid "package"
-msgstr "recueil"
+#: ../lib/advene/gui/main.py:4182
+msgid "Title/Chapter selection"
+msgstr "Sélection du titre/chapître"
 
-#: ../lib/advene/util/helper.py:610
-msgid "packages"
-msgstr "recueils"
+#: ../lib/advene/gui/main.py:4224
+msgid "Select a video stream"
+msgstr "Choisir un flux vidéo"
 
-#: ../lib/advene/util/helper.py:622
-#, python-format
-msgid "No %s"
-msgstr "Pas de %s"
+#: ../lib/advene/gui/main.py:4225
+msgid "Enter the address of a video stream"
+msgstr "Entrer l'adresse d'un flux vidéo"
 
-#: ../lib/advene/util/helper.py:624
+#: ../lib/advene/gui/main.py:4229
 #, python-format
-msgid "1 %s"
-msgstr "1 %s"
+msgid "Successfully extracted the video stream address (%s) from the url.\n"
+msgstr ""
+"L'adresse du flux vidéo (%s) a été extraite avec succès de l'URL donnée.\n"
 
-#: ../lib/advene/util/helper.py:626
-#, python-format
-msgid "%(count)d %(plural)s"
-msgstr "%(count)d %(plural)s"
+#: ../lib/advene/gui/main.py:4254
+msgid "Package properties"
+msgstr "Proprietes du recueil"
 
-#: ../lib/advene/plugins/cinelab.py:76
-msgid "Cinelab importer"
-msgstr "Importateur Cinelab"
+#: ../lib/advene/gui/main.py:4255 ../lib/advene/gui/edit/elements.py:516
+#: ../lib/advene/gui/edit/elements.py:565
+#: ../lib/advene/gui/edit/elements.py:652
+#: ../lib/advene/gui/edit/elements.py:732
+#: ../lib/advene/gui/edit/elements.py:789
+#: ../lib/advene/gui/edit/elements.py:881
+#: ../lib/advene/gui/edit/elements.py:950
+#: ../lib/advene/gui/edit/elements.py:1062
+#: ../lib/advene/gui/edit/elements.py:1124
+msgid "Author"
+msgstr "Auteur"
 
-#: ../lib/advene/plugins/cinelab.py:119 ../lib/advene/plugins/cinelab.py:121
-#, python-format
-msgid "File %s is not an Advene2 zip package."
-msgstr "Le fichier %s n'est pas un recueil Advene2 compressé."
+#: ../lib/advene/gui/main.py:4255
+msgid "Author name"
+msgstr "Auteur"
 
-#: ../lib/advene/plugins/cinelab.py:176
-msgid "Converting annotation types"
-msgstr "Conversion des types d'annotation"
+#: ../lib/advene/gui/main.py:4256 ../lib/advene/gui/edit/elements.py:517
+#: ../lib/advene/gui/edit/elements.py:566
+#: ../lib/advene/gui/edit/elements.py:653
+#: ../lib/advene/gui/edit/elements.py:733
+#: ../lib/advene/gui/edit/elements.py:790
+#: ../lib/advene/gui/edit/elements.py:882
+#: ../lib/advene/gui/edit/elements.py:951
+#: ../lib/advene/gui/edit/elements.py:1063
+#: ../lib/advene/gui/edit/elements.py:1125
+msgid "Date"
+msgstr "Date"
 
-#: ../lib/advene/plugins/cinelab.py:217
-msgid "Converting views"
-msgstr "Conversion des vues"
+#: ../lib/advene/gui/main.py:4256
+msgid "Package creation date"
+msgstr "Date de création du recueil"
 
-#: ../lib/advene/plugins/cinelab.py:249
-#: ../lib/advene/plugins/youtubeannotations.py:72
-msgid "Importing annotations"
-msgstr "Import des annotations"
+#: ../lib/advene/gui/main.py:4257 ../lib/advene/gui/views/table.py:681
+#: ../lib/advene/gui/util/dialog.py:391 ../lib/advene/gui/edit/imports.py:334
+#: ../lib/advene/gui/edit/dvdselect.py:75
+#: ../lib/advene/gui/edit/transcribe.py:1022
+msgid "Title"
+msgstr "Titre"
 
-#: ../lib/advene/plugins/shotdetectapp.py:41
-msgid "ShotdetectApp importer"
-msgstr "Importateur ShotdetectApp"
+#: ../lib/advene/gui/main.py:4257
+msgid "Package title"
+msgstr "Titre du recueil"
 
-#: ../lib/advene/plugins/shotdetectapp.py:52
-msgid ""
-"Sensitivity of the algorithm. It should typically be between 50 and 80. If "
-"too many shots are detected, try to increase its value."
-msgstr ""
-"La sensibilité de l'algorithme devrait typiquement être entre 50 et\n"
-"80. Si trop de plans sont détectés, essayez d'augmenter sa valeur."
-
-#: ../lib/advene/plugins/shotdetectapp.py:80
-#: ../lib/advene/plugins/goodshotdetector.py:78
-msgid "Detected shots"
-msgstr "Plans détectés"
-
-#: ../lib/advene/plugins/shotdetectapp.py:140 ../lib/advene/gui/main.py:5130
-#, python-format
-msgid "Detected shot #%(num)d at %(pos)s "
-msgstr "Plan #%(num)d détecté à %(pos)s "
+#: ../lib/advene/gui/main.py:4258
+msgid "Associated media"
+msgstr "Media associe"
 
-#: ../lib/advene/plugins/youtubeannotations.py:33
-msgid "Youtube XML annotations importer"
-msgstr "Importateur d'annotations Youtube"
+#: ../lib/advene/gui/main.py:4259 ../lib/advene/gui/views/table.py:315
+msgid "Duration"
+msgstr "Durée"
 
-#: ../lib/advene/plugins/brltty.py:62
-msgid "Input from the braille table."
-msgstr "Entrée depuis la plage Braille"
+#: ../lib/advene/gui/main.py:4259
+msgid "Media duration in ms"
+msgstr "Durée du média en ms"
 
-#: ../lib/advene/plugins/brltty.py:66
-msgid "BrlTTY not installed. There will be no braille support."
-msgstr "BrlTTY n'est pas installé. Il n'y aura pas de support Braille."
+#: ../lib/advene/gui/main.py:4259
+#: ../lib/advene/gui/plugins/eventaccumulator.py:143
+msgid "Reset"
+msgstr "Reset"
 
-#: ../lib/advene/plugins/brltty.py:78
-msgid "Could not initialize BrlTTY. No braille support."
-msgstr "Impossible d'initialiser BrlTTY. Il n'y aura pas de support Braille."
+#: ../lib/advene/gui/main.py:4320 ../lib/advene/gui/views/timeline.py:3522
+#: ../lib/advene/gui/views/timeline.py:3677
+#: ../lib/advene/gui/views/tagbag.py:64
+#: ../lib/advene/gui/edit/properties.py:181
+#: ../lib/advene/gui/edit/transcribe.py:148
+#: ../lib/advene/gui/edit/transcribe.py:1162
+msgid "Preferences"
+msgstr "Préférences"
 
-#: ../lib/advene/plugins/brltty.py:84
-msgid "Display a message in Braille"
-msgstr "Afficher un message en Braille"
+#: ../lib/advene/gui/main.py:4322
+msgid "Paths"
+msgstr "Chemins"
 
-#: ../lib/advene/plugins/brltty.py:85
-msgid "Message to display."
-msgstr "Message à afficher"
+#: ../lib/advene/gui/main.py:4324
+msgid "Data"
+msgstr "Contenu"
 
-#: ../lib/advene/plugins/brltty.py:88 ../lib/advene/plugins/tts.py:81
-#: ../lib/advene/rules/actions.py:40 ../lib/advene/rules/actions.py:107
-#: ../lib/advene/rules/actions.py:123 ../lib/advene/gui/plugins/actions.py:44
-#: ../lib/advene/gui/plugins/actions.py:58
-#: ../lib/advene/gui/plugins/actions.py:110
-#: ../lib/advene/gui/plugins/actions.py:399
-#: ../lib/advene/gui/plugins/actions.py:527
-#: ../lib/advene/gui/edit/rules.py:766
-msgid "The annotation content"
-msgstr "Le contenu de l'annotation"
+#: ../lib/advene/gui/main.py:4324
+msgid "Standard directory for data files"
+msgstr "Répertoire standard pour les fichiers de données"
 
-#: ../lib/advene/plugins/brltty.py:240 ../lib/advene/plugins/tts.py:110
-#: ../lib/advene/gui/plugins/actions.py:234
-msgid "Unknown rule"
-msgstr "Règle inconnue"
+#: ../lib/advene/gui/main.py:4325
+msgid "Movie path"
+msgstr "Chemin de recherche pour les fichiers vidéo"
 
-#: ../lib/advene/plugins/brltty.py:241 ../lib/advene/plugins/tts.py:111
-#: ../lib/advene/gui/plugins/actions.py:235
+#: ../lib/advene/gui/main.py:4325
 #, python-format
 msgid ""
-"Rule %(rulename)s: Error in the evaluation of the parameter "
-"%(parametername)s:"
+"List of directories (separated by %s) to search for movie files (_ means "
+"package directory)"
 msgstr ""
-"Règle %(rulename)s: erreur dans l'évaluation du paramètre %(parametername)s:"
+"Liste de répertoires (séparés par %s) où chercher les vidéos (_ signifie le "
+"même répertoire que le recueil)"
 
-#: ../lib/advene/plugins/brltty.py:256
-#, python-format
-msgid "BrlTTY connection error: %s"
-msgstr "BrlTTY - erreur de connexion: %s"
+#: ../lib/advene/gui/main.py:4326
+msgid "Imagecache"
+msgstr "Cache d'images"
 
-#: ../lib/advene/plugins/brltty.py:273
-msgid "Braille display: "
-msgstr "Affichage braille :"
+#: ../lib/advene/gui/main.py:4326
+msgid "Directory for storing the snapshot cache"
+msgstr "Répertoire où sauvegarder le cache de captures d'écran"
 
-#: ../lib/advene/plugins/brltty.py:279
-msgid "No message"
-msgstr "Pas de message"
+#: ../lib/advene/gui/main.py:4327
+msgid "Player"
+msgstr "Lecteur"
 
-#: ../lib/advene/plugins/goodshotdetector.py:45
-msgid "Shot detection (Delakis version)"
-msgstr "Détection de plans (version Delakis)"
+#: ../lib/advene/gui/main.py:4327
+msgid "Directory of the video player"
+msgstr "Répertoire du lecteur vidéo"
 
-#: ../lib/advene/plugins/goodshotdetector.py:60
-msgid "Cache histogram alongside video files."
-msgstr "Stocker l'histogramme à côté du fichier vidéo"
+#: ../lib/advene/gui/main.py:4328
+msgid "Shotdetect"
+msgstr "Détection de plans"
 
-#: ../lib/advene/plugins/goodshotdetector.py:63
+#: ../lib/advene/gui/main.py:4328
+msgid "Shotdetect application"
+msgstr "Application de détection de plans"
+
+# Interface
+#: ../lib/advene/gui/main.py:4330
+msgid "GUI"
+msgstr "Interface"
+
+#: ../lib/advene/gui/main.py:4331
+msgid "Interface language (after restart)"
+msgstr "Langage de l'interface (après redémarrage)"
+
+#: ../lib/advene/gui/main.py:4331
 msgid ""
-"Parameter profile: safe will detect less cuts, aggressive will detect more "
-"cuts (but more false ones too). default is a compromise."
+"Language used for the interface (necessitates to restart the application)"
 msgstr ""
-"Profil de configuration: \"safe\" détectera moins de coupures,\n"
-"\"aggressive\" en détectera plus (mais plus d'incorrects\n"
-"également). \"default\" est un compromis."
+"Langage utilisé pour l'interface (nécessite de redémarrer l'application)"
 
-#: ../lib/advene/plugins/goodshotdetector.py:77
-#, python-format
-msgid "Shot (%s profile)"
-msgstr "Plan (profil %s)"
+#: ../lib/advene/gui/main.py:4332 ../lib/advene/gui/util/initialconfig.py:88
+msgid "System default"
+msgstr "La valeur du système"
 
-#: ../lib/advene/plugins/goodshotdetector.py:83
-msgid "Loading histogram"
-msgstr "Chargement de l'histogramme"
+#: ../lib/advene/gui/main.py:4337
+msgid "Record activity trace"
+msgstr "Enregistrer la trace d'activité"
 
-#: ../lib/advene/plugins/goodshotdetector.py:146
-msgid "Computing hdiff"
-msgstr "Calcul du hdiff"
+#: ../lib/advene/gui/main.py:4338
+msgid "Expert mode"
+msgstr "Mode expert"
 
-#: ../lib/advene/plugins/goodshotdetector.py:153
-msgid "Detecting cuts"
-msgstr "Détection des plans"
+#: ../lib/advene/gui/main.py:4338
+msgid "Offer advanced possibilities"
+msgstr "Afficher les fonctionnalités avancées"
 
-#: ../lib/advene/plugins/goodshotdetector.py:180
-msgid "Detecting dissolves"
-msgstr "Détection des fondus"
+#: ../lib/advene/gui/main.py:4339
+msgid "Prefer WYSIWYG"
+msgstr "WYSIWYG préféré"
 
-#: ../lib/advene/plugins/goodshotdetector.py:265
-msgid "Extracting histogram"
-msgstr "Extraction de l'histogramme"
+#: ../lib/advene/gui/main.py:4339
+msgid "Use WYSIWYG editors when possible (HTML, SVG)"
+msgstr "Utiliser un éditeur WYSIWYG quand c'est possible (HTML, SVG)"
 
-#: ../lib/advene/plugins/anvil.py:35
-msgid "Anvil importer"
-msgstr "Importateur Anvil"
+#: ../lib/advene/gui/main.py:4340
+msgid "Player control modifier"
+msgstr "Raccourci de contrôle du lecteur"
 
-#: ../lib/advene/plugins/annotationgraph.py:40
-msgid "AnnotationGraph importer"
-msgstr "Importateur AnnotationGraph"
+#: ../lib/advene/gui/main.py:4340
+msgid ""
+"Generic player control modifier: key used in combination with arrows/space/"
+"tab to control the player. Click the button and press key+space to choose "
+"the modifier."
+msgstr ""
+"Touche pour le contrôle général du lecteur vidéo: cette touche sera utilisée "
+"en combinaison avec flêches/espace/tab pour contrôler le lecteur vidéo. "
+"Cliquez sur le bouton et utilisez Touche+espace pour choisir la touche."
 
-#: ../lib/advene/plugins/fcp.py:33
-msgid "Final Cut Pro XML importer"
-msgstr "Importateur Final Cut Pro XML"
+#: ../lib/advene/gui/main.py:4341
+msgid "Player control in edit popups"
+msgstr "Contrôle du lecteur dans les fenêtres d'édition"
 
-#: ../lib/advene/plugins/fcp.py:55
-msgid "FCP clipitem"
-msgstr "FCP clipitem"
+#: ../lib/advene/gui/main.py:4341
+msgid ""
+"Enable generic player controls in edit windows. This may be undesirable "
+"since it overloads some standard text-edition behaviours (esp. control-left/"
+"right)."
+msgstr ""
+"Activer les raccourcis globaux de contrôle du lecteur dans les\n"
+"fenêtres d'édition. Ce comportement peut être indésirable car il\n"
+"surcharge des raccourcis clavier standard comme contrôle-gauche/droite"
 
-#: ../lib/advene/plugins/fcp.py:75
-msgid "Importing subtitles"
-msgstr "Import des sous-titres"
+#: ../lib/advene/gui/main.py:4342
+msgid "Open popups"
+msgstr "Ouvrir les vues"
 
-#: ../lib/advene/plugins/fcp.py:90
-msgid "Importing clips"
-msgstr "Import des clips"
+#: ../lib/advene/gui/main.py:4343
+msgid "Where should we open adhoc views?"
+msgstr "Où doit-on ouvrir les vues adhoc ?"
 
-#: ../lib/advene/plugins/fcp.py:93
-msgid "No clip"
-msgstr "Pas de clip"
+#: ../lib/advene/gui/main.py:4344
+msgid "as a popup window"
+msgstr "dans des fenêtres indépendantes"
 
-#: ../lib/advene/plugins/tracebuilder.py:219
-#, python-format
-msgid "Cannot export to %(fname)s: %(e)s"
-msgstr "Impossible d'exporter vers %(fname)s: %(e)s"
+#: ../lib/advene/gui/main.py:4345
+msgid "embedded east of the video"
+msgstr "intégrée à l'est de la vidéo"
 
-#: ../lib/advene/plugins/tracebuilder.py:1129
-#: ../lib/advene/plugins/tracebuilder.py:1168
-#, python-format
-msgid "Cannot export to %(host)s:%(port)s %(error)s"
-msgstr "Impossible d'exporter vers %(host)s:%(port)s %(error)s"
+#: ../lib/advene/gui/main.py:4346
+msgid "embedded west of the video"
+msgstr "intégrée à l'ouest de la vidéo"
 
-#: ../lib/advene/plugins/tracebuilder.py:1143
-#, python-format
-msgid "Cannot send data to %(host)s:%(port)s %(error)s"
-msgstr "Impossible d'envoyer des données vers %(host)s:%(port)s %(error)s"
+#: ../lib/advene/gui/main.py:4347
+msgid "embedded south of the video"
+msgstr "intégrée au sud de la vidéo"
 
-#: ../lib/advene/plugins/tracebuilder.py:1191
-#, python-format
-msgid "Cannot send event %(nb)s to %(host)s:%(port)s %(error)s"
-msgstr ""
-"Impossible d'envoyer l'événement %(nb)s vers %(host)s:%(port)s %(error)s"
+#: ../lib/advene/gui/main.py:4348
+msgid "embedded at the right of the window"
+msgstr "intégrée à droite de la fenêtre"
 
-#: ../lib/advene/plugins/tracebuilder.py:1197
-#, python-format
-msgid "%(nb)s events sent to %(host)s:%(port)s during session."
-msgstr "%(nb)s événements envoyés à  %(host)s:%(port)s pendant la session."
+#: ../lib/advene/gui/main.py:4351
+msgid "History size"
+msgstr "Taille de l'historique"
 
-#: ../lib/advene/plugins/dcp.py:65
-msgid "DCP importer"
-msgstr "Importateur DCP"
+#: ../lib/advene/gui/main.py:4351
+msgid "History filelist size limit"
+msgstr "Taille limite de la liste des fichiers"
 
-#: ../lib/advene/plugins/dcp.py:120
-#, python-format
-msgid "Converting #%(num)d / %(count)d"
-msgstr "Conversion #%(num)d / %(count)d"
+#: ../lib/advene/gui/main.py:4353
+msgid "Remember window size"
+msgstr "Mémoriser les tailles des fenêtres"
 
-#: ../lib/advene/plugins/ttl.py:41
-msgid "TurTLe (RDF) importer"
-msgstr "Importateur TurTLe (RDF)"
+#: ../lib/advene/gui/main.py:4353
+msgid "Remember the size of opened windows"
+msgstr "Mémoriser la taille des fenêtres"
 
-#: ../lib/advene/plugins/aeidon_import.py:48
-msgid "Aeidon (subtitles) importer"
-msgstr "Importateur sous-titres (Aeidon)"
+#: ../lib/advene/gui/main.py:4354
+msgid "Bookmark snapshot width"
+msgstr "Largeur des copies d'écran de signets"
 
-#: ../lib/advene/plugins/soundenveloppe.py:47
-#: ../lib/advene/plugins/soundenveloppe.py:143
-#: ../lib/advene/plugins/soundenveloppe.py:145
-msgid "Sound enveloppe"
-msgstr "Enveloppe sonore"
+#: ../lib/advene/gui/main.py:4354
+msgid "Width of the snapshots representing bookmarks"
+msgstr "Largeur des captures d'écran représentant les signets"
 
-#: ../lib/advene/plugins/soundenveloppe.py:60
-msgid "Interval (in ms) at which to take samples."
-msgstr "Intervalle d'échantillonage (en ms)"
+#: ../lib/advene/gui/main.py:4355
+msgid "Bookmark snapshot precision"
+msgstr "Précision des captures d'écran pour les signets"
 
-#: ../lib/advene/plugins/soundenveloppe.py:63
-msgid "Maximum number of samples per annotation."
-msgstr "Nombre maximum d'échantillons par annotation"
+#: ../lib/advene/gui/main.py:4355
+msgid "Precision (in ms) of the displayed bookmark snapshots."
+msgstr "Précision (en ms) des captures d'écran pour les signets."
 
-#: ../lib/advene/plugins/soundenveloppe.py:66
-#: ../lib/advene/plugins/cutter.py:56
-msgid "Channel selection."
-msgstr "Choix du canal"
+#: ../lib/advene/gui/main.py:4357
+msgid "Frame selector (shotvalidation...)"
+msgstr "Sélecteur d'image (validation de plans...)"
 
-#: ../lib/advene/plugins/soundenveloppe.py:90
-#: ../lib/advene/plugins/pocketsphinx.py:119
-#: ../lib/advene/plugins/barcode.py:58
-msgid "Generating annotations"
-msgstr "Création des annotations"
+#: ../lib/advene/gui/main.py:4358
+msgid "Frameselector snapshot width"
+msgstr "Largeur des vignettes de sélection d'image"
 
-#: ../lib/advene/plugins/soundenveloppe.py:115
-#, python-format
-msgid "At %s"
-msgstr "À %s"
+#: ../lib/advene/gui/main.py:4358
+msgid "Width of the snapshots in frameselector"
+msgstr "Largeur des images dans le sélecteur d'image"
 
-#: ../lib/advene/plugins/soundenveloppe.py:162
-msgid "Extracting sound enveloppe"
-msgstr "Extraction de l'enveloppe sonore"
+#: ../lib/advene/gui/main.py:4359
+msgid "Frameselector count"
+msgstr "Nombre d'images"
 
-#: ../lib/advene/plugins/cutter.py:39
-msgid "Audio segmentation"
-msgstr "Segmentation audio"
+#: ../lib/advene/gui/main.py:4359
+msgid "Number of frames displayed in frameselector."
+msgstr "Nombre d'images affichées dans le sélecteur d'image"
 
-#: ../lib/advene/plugins/cutter.py:53
-msgid "Volume threshold (in dB, can be negative) before trigger."
-msgstr "Seuil de détection de silence (en dB, peut être négatif)"
+#: ../lib/advene/gui/main.py:4361
+msgid "General"
+msgstr "Générales"
 
-#: ../lib/advene/plugins/cutter.py:101
-#, python-format
-msgid "Detected %(count)d segments until %(time)s"
-msgstr "Détecté %(count)d segments jusqu'à %(time)s"
+#: ../lib/advene/gui/main.py:4362
+msgid "Weekly update check"
+msgstr "Vérification hebdomadaire des mises à jour"
 
-# Segment audio
-#: ../lib/advene/plugins/cutter.py:119
-msgid "Sound segment"
-msgstr "Segment audio"
+#: ../lib/advene/gui/main.py:4362 ../lib/advene/gui/util/initialconfig.py:90
+msgid "Weekly check for updates on the Advene website"
+msgstr ""
+"Vérifier hebdomadairement si des mises à jour d'Advene sont disponibles"
 
-#: ../lib/advene/plugins/cutter.py:120
-#, python-format
-msgid ""
-"Sound segmentation with a threshold of %(threshold)d dB - channel: "
-"%(channel)s"
-msgstr ""
-"Segmentation sonore avec un seuil de %(threshold)d dB - canal : %(channel)s"
+#: ../lib/advene/gui/main.py:4363
+msgid "On exit,"
+msgstr "À la fin, "
 
-#: ../lib/advene/plugins/cutter.py:138
-msgid "Starting silence detection"
-msgstr "Démarrage de la détection audio"
+#: ../lib/advene/gui/main.py:4364
+msgid "How to handle screenshots on exit"
+msgstr "Comment gérer les captures d'écran à la fin de l'application"
 
-#: ../lib/advene/plugins/montagerenderer.py:43
-msgid "Cannot register montage renderer: Gnonlin plugins are not present."
-msgstr ""
-"Impossible d'initialiser le rendu de montage: les plugins Gnonlin ne sont "
-"pas présents"
+#: ../lib/advene/gui/main.py:4365
+msgid "never save screenshots"
+msgstr "ne jamais sauvegarder les captures d'écran"
 
-#: ../lib/advene/plugins/mpeg7.py:54
-msgid "MPEG7 importer"
-msgstr "Importateur MPEG7"
+#: ../lib/advene/gui/main.py:4366
+msgid "always save screenshots"
+msgstr "toujours sauvegarder les captures d'écran"
 
-#: ../lib/advene/plugins/transcriber.py:40
-msgid "Transcriber importer"
-msgstr "Importateur Transcriber"
+#: ../lib/advene/gui/main.py:4367
+msgid "ask before saving screenshots"
+msgstr "demander avant de sauvegarder les captures d'écran"
 
-#: ../lib/advene/plugins/transcriber.py:86
-msgid "Parsing section information"
-msgstr "Traitement des informations de section"
+#: ../lib/advene/gui/main.py:4369
+msgid "Auto-save"
+msgstr "La sauvegarde automatique"
 
-#: ../lib/advene/plugins/transcriber.py:276
-msgid "Parsing topic and speaker tables information"
-msgstr "Traitement des tables de sujet et orateur"
+#: ../lib/advene/gui/main.py:4370
+msgid "Data auto-save functionality"
+msgstr "Sauvegarde automatique des recueils"
 
-#: ../lib/advene/plugins/featuredetect.py:42
-msgid "Feature detection (face...)"
-msgstr "Reconnaissance de formes"
+#: ../lib/advene/gui/main.py:4371
+msgid "is desactivated"
+msgstr "est désactivée"
 
-#: ../lib/advene/plugins/featuredetect.py:57
-msgid "Sensitivity level."
-msgstr "Niveau de sensibilité"
+#: ../lib/advene/gui/main.py:4372
+msgid "is done automatically"
+msgstr "est activée"
 
-#: ../lib/advene/plugins/featuredetect.py:60
-msgid ""
-"Scale. Original image size will be divided by this factor, in order to speed "
-"up detection."
-msgstr ""
-"La taille d'image sera divisée par ce facteur d'échelle, afin\n"
-"d'accélérer le traitement."
+#: ../lib/advene/gui/main.py:4373
+msgid "is done after confirmation"
+msgstr "est activée avec confirmation"
 
-#: ../lib/advene/plugins/featuredetect.py:63
-msgid "Classifier"
-msgstr "Classificateur"
+#: ../lib/advene/gui/main.py:4375
+msgid "Auto-save interval (in s)"
+msgstr "Intervalle de sauvegarde automatique (en s)"
 
-#: ../lib/advene/plugins/featuredetect.py:77
-#, python-format
-msgid "Feature %s"
-msgstr "Forme %s"
+#: ../lib/advene/gui/main.py:4375
+msgid "Interval (in seconds) between package auto-saves"
+msgstr "Durée (en secondes) entre deux sauvegardes automatiques"
 
-#: ../lib/advene/plugins/featuredetect.py:79
-#, python-format
-msgid "Detected %s"
-msgstr "%s détecté"
+#: ../lib/advene/gui/main.py:4377
+msgid "Workspace"
+msgstr "Environnement"
 
-#: ../lib/advene/plugins/featuredetect.py:81
-msgid "Detection started"
-msgstr "Détection commencée"
+#: ../lib/advene/gui/main.py:4379
+msgid "On package saving,"
+msgstr "Lors de la sauvegarde du recueil,"
 
-#: ../lib/advene/plugins/featuredetect.py:171
-#, python-format
-msgid "Detected %(count)d feature(s) until %(time)s"
-msgstr "%(count)d objet(s) détectés jusqu'à %(time)s"
+#: ../lib/advene/gui/main.py:4380
+msgid "Do you wish to save the default workspace with the package?"
+msgstr "Voulez-vous sauvegarder l'environnement avec le recueil ?"
 
-#: ../lib/advene/plugins/pocketsphinx.py:37
-msgid ""
-"Cannot register speech recognition: Pocketsphinx plugins not found. See "
-"http://cmusphinx.sourceforge.net/wiki/gstreamer for details."
-msgstr ""
-"Impossible d'activer la reconnaissance de la parole: les modules\n"
-"PocketSphinx ne sont pas présents. Voir\n"
-"http://cmusphinx.sourceforge.net/wiki/gstreamer pour plus d'informations."
+#: ../lib/advene/gui/main.py:4381
+msgid "never save the current workspace"
+msgstr "ne jamais sauvegarder l'environnement courant"
 
-#: ../lib/advene/plugins/pocketsphinx.py:41
-msgid "Speech recognition (PocketSphinx)"
-msgstr "Reconnaissance vocale (PocketSphinx)"
+#: ../lib/advene/gui/main.py:4382
+msgid "always save the current workspace"
+msgstr "toujours sauvegarder l'environnement courant"
 
-#: ../lib/advene/plugins/pocketsphinx.py:61
-msgid "Filtering noise level [0..1]."
-msgstr "Niveau de filtrage du bruit [0..1]"
+#: ../lib/advene/gui/main.py:4383
+msgid "ask before saving the current workspace"
+msgstr "demander avant de sauvegarder l'environnement courant"
 
-#: ../lib/advene/plugins/pocketsphinx.py:65
-msgid ""
-"Minimum amount (in milliseconds) of silence required to terminate the "
-"current annotation and start a new one. Decreasing this length will result "
-"in a large amount of short annotations and increasing this length will "
-"result in a small amount of long annotations."
-msgstr ""
-"Temps minimum (en millisecondes) de silence requis pour terminer\n"
-"l'annotation et en commencer une nouvelle. Diminuer cette durée\n"
-"produira beaucoup de petites annotations, l'augmenter donnera quelques\n"
-"longues annotations."
+#: ../lib/advene/gui/main.py:4385
+msgid "Auto-validation of edited elements"
+msgstr "Validation automatique des éléments"
 
-#: ../lib/advene/plugins/pocketsphinx.py:69
-msgid "Use default acoustic and language models."
-msgstr "Utiliser les modèles acoustiques et de langage standard."
+#: ../lib/advene/gui/main.py:4385
+msgid "Automatically validate modified elements when saving the package."
+msgstr "Valider automatiquement les éléments modifiés lors de la sauvegarde."
 
-#: ../lib/advene/plugins/pocketsphinx.py:73
-msgid "Acoustic model (directory)"
-msgstr "Modèle acoustique (répertoire)"
+#: ../lib/advene/gui/main.py:4387
+msgid "On package load,"
+msgstr "Lors du chargement du recueil,"
 
-#: ../lib/advene/plugins/pocketsphinx.py:77
-msgid "Phonetic dictionary (.dic file)"
-msgstr "Dictionnaire phonétique (fichier .dic)"
+#: ../lib/advene/gui/main.py:4388
+msgid "Do you wish to load the workspace saved with the package?"
+msgstr "Voulez-vous restaurer l'environnement sauvegardé avec le recueil ?"
 
-#: ../lib/advene/plugins/pocketsphinx.py:81
-msgid "Language model (.DMP file)"
-msgstr "Modèle de langage (fichier .dmp)"
+#: ../lib/advene/gui/main.py:4389
+msgid "never load the saved workspace"
+msgstr "ne jamais restaurer l'environnement sauvegardé"
 
-#: ../lib/advene/plugins/pocketsphinx.py:144
-#: ../lib/advene/plugins/barcode.py:83
-#, python-format
-msgid "%(count)d utterances until %(time)s"
-msgstr "%(count)d paroles jusqu'à %(time)s"
+#: ../lib/advene/gui/main.py:4390
+msgid "always load the saved workspace"
+msgstr "toujours restaurer l'environnement sauvegardé"
 
-#: ../lib/advene/plugins/pocketsphinx.py:153
-msgid "Speech"
-msgstr "Parole"
+#: ../lib/advene/gui/main.py:4391
+msgid "ask before loading the saved workspace"
+msgstr "demander avant de restaurer l'environnement sauvegardé"
 
-#: ../lib/advene/plugins/pocketsphinx.py:155
-msgid "Recognized speech"
-msgstr "Parole reconnue"
+#: ../lib/advene/gui/main.py:4394
+msgid "Video Player"
+msgstr "Lecteur Vidéo"
 
-#: ../lib/advene/plugins/pocketsphinx.py:191
-msgid "Recognizing speech"
-msgstr "Reconnaissance en cours"
+#: ../lib/advene/gui/main.py:4395
+msgid "Autostart"
+msgstr "Démarrage automatique"
 
-#: ../lib/advene/plugins/barcode.py:36
-msgid "Cannot register barcode extraction: zbar plugin not found."
-msgstr "Impossible d'initialiser l'extraction de qrcode"
+#: ../lib/advene/gui/main.py:4395
+msgid ""
+"Automatically start the player when loading a media file (either directly or "
+"through a package)"
+msgstr ""
+"Lancer automatiquement le lecteur lors du chargement d'une vidéo (soit "
+"directement, soit via un recueil)"
 
-#: ../lib/advene/plugins/barcode.py:40
-msgid "Barcode (qr-code) extraction"
-msgstr "Extraction de QR Code"
+#: ../lib/advene/gui/main.py:4396
+msgid "Fulscreen timestamp"
+msgstr "Timestamp plein-écran"
 
-#: ../lib/advene/plugins/barcode.py:95
-msgid "Barcode"
-msgstr "Barcode"
+#: ../lib/advene/gui/main.py:4396
+msgid "Display the timestamp over the video when in fullscreen mode"
+msgstr "Afficher le temps sur la vidéo en mode plein écran"
 
-#: ../lib/advene/plugins/barcode.py:97
-msgid "Extracted barcode information"
-msgstr "Information qrcode"
+#: ../lib/advene/gui/main.py:4397
+msgid "Enable captions"
+msgstr "Activer le sous-titrage externe"
 
-#: ../lib/advene/plugins/barcode.py:115
-msgid "Extraction barcodes"
-msgstr "Extraction des codes"
+#: ../lib/advene/gui/main.py:4397
+msgid "Enable captions over the video"
+msgstr ""
+"Activer le sous-titrage par le biais d'un composant d'affichage sous le "
+"lecteur vidéo"
 
-#: ../lib/advene/plugins/nerd_plugin.py:47
-msgid "NERD (Named Entity Recognition and Disambiguation)"
-msgstr "NERD (Named Entity Recognition and Disambiguation)"
+#: ../lib/advene/gui/main.py:4398
+msgid "Caption font"
+msgstr "Police de sous-titrage"
 
-#: ../lib/advene/plugins/nerd_plugin.py:68
-msgid "NERD API key"
-msgstr "NERD API key"
+#: ../lib/advene/gui/main.py:4398
+msgid "TrueType font for captions"
+msgstr "Police TrueType pour les sous-titres"
 
-#: ../lib/advene/plugins/nerd_plugin.py:82
-msgid "NER service to use"
-msgstr "Service NER à utiliser"
+#: ../lib/advene/gui/main.py:4399
+msgid "Enable SVG"
+msgstr "Activer le SVG"
 
-#: ../lib/advene/plugins/nerd_plugin.py:88
-msgid "Type of annotation to analyze"
-msgstr "Type d'annotation à analyser"
+#: ../lib/advene/gui/main.py:4399
+msgid "Enable SVG captions over the video"
+msgstr "Activer l'affichage de graphiques SVG sur la vidéo"
 
-#: ../lib/advene/plugins/nerd_plugin.py:93
-msgid "Language to analyze"
-msgstr "Langage à analyser"
+#: ../lib/advene/gui/main.py:4401
+msgid "Enable snapshots"
+msgstr "Activer les copies d'écran"
 
-#: ../lib/advene/plugins/nerd_plugin.py:98
-msgid "Minimum confidence level (between 0.0 and 1.0)"
-msgstr "Niveau de confiance minimum (entre 0.0 et 1.0)"
+#: ../lib/advene/gui/main.py:4402
+msgid "Snapshot width"
+msgstr "Largeur des copies d'écran"
 
-#: ../lib/advene/plugins/nerd_plugin.py:103
-msgid "Interpolate position of annotations"
-msgstr "Interpoler la position des annotations"
+#: ../lib/advene/gui/main.py:4402
+msgid "Snapshot width in pixels."
+msgstr "Largeur (en pixels) des copies d'écran"
 
-#: ../lib/advene/plugins/nerd_plugin.py:108
-msgid "Split by entity type"
-msgstr "Diviser par type d'entité"
+#: ../lib/advene/gui/main.py:4403
+msgid "Verbosity"
+msgstr "Verbosité"
 
-#: ../lib/advene/plugins/nerd_plugin.py:113
-msgid "Store results as markup in the annotation text"
-msgstr "Stocker les résultats comme marquage dans le texte de l'annotation"
+#: ../lib/advene/gui/main.py:4403
+msgid "Verbosity level. -1 for no messages."
+msgstr "Niveau de verbosité. -1 pour pas de messages."
 
-#: ../lib/advene/plugins/nerd_plugin.py:118
-msgid "Create relations between the original annotations and the new ones"
-msgstr "Créer des relations entre les annotations originales et les nouvelles"
+#: ../lib/advene/gui/main.py:4406
+msgid "Devices"
+msgstr "Périphériques"
 
-#: ../lib/advene/plugins/nerd_plugin.py:150
-#, python-format
-msgid "NERD applied to %s"
-msgstr "NERD appliqué à %s"
+#: ../lib/advene/gui/main.py:4408
+msgid "Standard"
+msgstr "Standard"
 
-#: ../lib/advene/plugins/nerd_plugin.py:208
-#, python-format
-msgid "NERD %s"
-msgstr "NERD %s"
+#: ../lib/advene/gui/main.py:4410
+msgid "DVD drive"
+msgstr "Lecteur DVD"
 
-#: ../lib/advene/plugins/ted.py:39
-msgid "TED importer"
-msgstr "Importateur TED"
+#: ../lib/advene/gui/main.py:4410
+msgid "Drive letter for the DVD"
+msgstr "Lettre du lecteur DVD"
 
-#: ../lib/advene/plugins/shotdetect.py:35
-msgid "Shotdetect importer"
-msgstr "Importateur Shotdetect"
+#: ../lib/advene/gui/main.py:4411
+msgid "GDI"
+msgstr "GDI"
 
-#: ../lib/advene/plugins/shotdetect.py:79
-msgid "No shots"
-msgstr "Pas de plans"
+#: ../lib/advene/gui/main.py:4412
+msgid "Direct X"
+msgstr "Direct X"
 
-#: ../lib/advene/plugins/tts.py:77
-msgid "Pronounce a text"
-msgstr "Prononcer un texte"
+#: ../lib/advene/gui/main.py:4414
+msgid "DVD device"
+msgstr "Périphérique DVD"
 
-#: ../lib/advene/plugins/tts.py:78
-msgid "String to pronounce."
-msgstr "Chaîne à prononcer"
+#: ../lib/advene/gui/main.py:4414
+msgid "Device for the DVD"
+msgstr "Device du DVD"
 
-#: ../lib/advene/plugins/tts.py:131 ../lib/advene/gui/plugins/actions.py:259
-#: ../lib/advene/gui/plugins/actions.py:340
-#: ../lib/advene/gui/plugins/actions.py:358
-msgid "No message..."
-msgstr "Pas de message"
+#: ../lib/advene/gui/main.py:4415
+msgid "X11"
+msgstr "X11"
 
-#: ../lib/advene/plugins/tts.py:156
-msgid "TTS disabled. Cannot find the application 'festival' in PATH"
-msgstr ""
-"Synthèse vocale désactivée. Impossible de trouver l'application 'festival'"
+#: ../lib/advene/gui/main.py:4416
+msgid "XVideo"
+msgstr "XVideo"
 
-#: ../lib/advene/plugins/tts.py:158
-msgid "TTS disabled. Cannot find the application 'aplay' in PATH"
-msgstr ""
-"Synthèse vocale désactivée. Impossible de trouver l'application 'aplay'"
+#: ../lib/advene/gui/main.py:4417
+msgid "GL"
+msgstr "GL"
 
-#: ../lib/advene/player/gstreamer.py:434
-msgid "Cannot capture full-resolution snapshot, another capture is ongoing."
-msgstr ""
-"Impossible de faire la capture en pleine résolution, une autre capture\n"
-"est en cours."
-
-#: ../lib/advene/rules/importer.py:29
-msgid "Event history importer"
-msgstr "Importateur d'historique d'événements"
+#: ../lib/advene/gui/main.py:4419
+msgid "Video output"
+msgstr "Sortie vidéo"
 
-#: ../lib/advene/rules/actions.py:37 ../lib/advene/rules/actions.py:102
-#: ../lib/advene/rules/actions.py:120
-msgid "Message to display"
-msgstr "Message à afficher"
+#: ../lib/advene/gui/main.py:4419
+msgid "Video output module"
+msgstr "Module de sortie vidéo"
 
-#: ../lib/advene/rules/actions.py:48
-msgid "Start the player"
-msgstr "Démarrer le lecteur"
+#: ../lib/advene/gui/main.py:4421
+msgid "Recorder options"
+msgstr "Options d'enregistrement"
 
-#: ../lib/advene/rules/actions.py:49
-msgid "Start position (in ms)"
-msgstr "Position de début (en ms)"
+#: ../lib/advene/gui/main.py:4422
+msgid "Audio input"
+msgstr "Entrée audio"
 
-#: ../lib/advene/rules/actions.py:52 ../lib/advene/rules/actions.py:384
-msgid "The movie start"
-msgstr "Le début du film"
+#: ../lib/advene/gui/main.py:4422
+msgid "Device name for audio input (with gstrecorder plugin)"
+msgstr "Nom du périphérique pour l'entrée audio (pour le plugin gstrecorder)"
 
-#: ../lib/advene/rules/actions.py:53 ../lib/advene/rules/actions.py:385
-msgid "The annotation begin"
-msgstr "Le début de l'annotation"
+#: ../lib/advene/gui/main.py:4423
+msgid "Record video"
+msgstr "Enregistrement vidéo"
 
-#: ../lib/advene/rules/actions.py:54 ../lib/advene/rules/actions.py:386
-msgid "The annotation end"
-msgstr "La fin de l'annotation"
+#: ../lib/advene/gui/main.py:4423
+msgid "Record both video and audio"
+msgstr "Enregistrer audio et vidéo"
 
-#: ../lib/advene/rules/actions.py:63 ../lib/advene/gui/views/logwindow.py:129
-msgid "Go to the given position"
-msgstr "Déplacement à une position donnée"
+#: ../lib/advene/gui/main.py:4426
+msgid "<i>Experimental</i>"
+msgstr "Expérimental"
 
-#: ../lib/advene/rules/actions.py:64
-msgid "Goto position (in ms)"
-msgstr "Position (en ms)"
+#: ../lib/advene/gui/main.py:4427 ../lib/advene/gui/views/scroller.py:30
+msgid "Scroller"
+msgstr "Défileur"
 
-#: ../lib/advene/rules/actions.py:73
-msgid "Stop the player"
-msgstr "Arrêter le lecteur"
+#: ../lib/advene/gui/main.py:4427
+msgid "Embed the caption scroller below the video"
+msgstr "Intégrer le dérouleur sous la vidéo"
 
-#: ../lib/advene/rules/actions.py:80
-msgid "Pause the player"
-msgstr "Mettre le lecteur en pause"
+#: ../lib/advene/gui/main.py:4428 ../lib/advene/gui/views/caption.py:29
+msgid "Caption"
+msgstr "Sous-titreur"
 
-#: ../lib/advene/rules/actions.py:87
-msgid "Resume the player"
-msgstr "Relancer le lecteur"
+#: ../lib/advene/gui/main.py:4428
+msgid "Embed the caption view below the video"
+msgstr "Intégrer la visuablisation de sous-titres sous la vidéo"
 
-#: ../lib/advene/rules/actions.py:94
-msgid "Take a snapshot"
-msgstr "Prendre une capture d'écran"
+#: ../lib/advene/gui/main.py:4430
+msgid "Time-related"
+msgstr "Relatives au temps"
 
-#: ../lib/advene/rules/actions.py:101
-msgid "Display a caption"
-msgstr "Afficher un sous-titre"
+#: ../lib/advene/gui/main.py:4431
+msgid "Time format"
+msgstr "Format des temps"
 
-#: ../lib/advene/rules/actions.py:103
-msgid "Duration of the caption"
-msgstr "Durée du sous-titre"
+#: ../lib/advene/gui/main.py:4431
+msgid "Format used to display timecodes"
+msgstr "Format utilisé pour afficher les timecodes"
 
-#: ../lib/advene/rules/actions.py:110 ../lib/advene/rules/actions.py:172
-#: ../lib/advene/gui/plugins/actions.py:61
-#: ../lib/advene/gui/plugins/actions.py:121
-#: ../lib/advene/gui/plugins/actions.py:403
-#: ../lib/advene/gui/plugins/actions.py:538
-msgid "1 second"
-msgstr "1 seconde"
+#: ../lib/advene/gui/main.py:4445
+msgid "Default FPS"
+msgstr "FPS par défaut"
 
-#: ../lib/advene/rules/actions.py:111 ../lib/advene/rules/actions.py:173
-#: ../lib/advene/gui/plugins/actions.py:62
-#: ../lib/advene/gui/plugins/actions.py:122
-#: ../lib/advene/gui/plugins/actions.py:404
-#: ../lib/advene/gui/plugins/actions.py:539
-#: ../lib/advene/gui/edit/rules.py:773
-msgid "The annotation duration"
-msgstr "La durée de l'annotation"
+#: ../lib/advene/gui/main.py:4446
+msgid ""
+"Default FPS (frame-per-second) value, when the information cannot be read "
+"from the media."
+msgstr ""
+"Valeur FPS (image par seconde) par défaut, quand l'information ne peut pas "
+"être obtenue du fichier."
 
-#: ../lib/advene/rules/actions.py:119 ../lib/advene/gui/popup.py:718
-msgid "Caption the annotation"
-msgstr "Sous-titrer l'annotation"
+#: ../lib/advene/gui/main.py:4447
+msgid "Time increment"
+msgstr "Durée pour navigation"
 
-#: ../lib/advene/rules/actions.py:131
-msgid "Display a graphical shape"
-msgstr "Afficher une forme graphique"
+#: ../lib/advene/gui/main.py:4447
+msgid ""
+"Skip duration, when using control-left/right or forward/rewind buttons (in "
+"ms)."
+msgstr ""
+"Réglage de la durée (en ms) utilisée avec contrôle-flèche ou les boutons "
+"avance/retour rapide"
 
-#: ../lib/advene/rules/actions.py:132
-msgid "Shape (square, circle, triangle)"
-msgstr "Forme (square, circle, triangle)"
+#: ../lib/advene/gui/main.py:4448
+msgid "Second time increment"
+msgstr "Seconde durée pour navigation"
 
-#: ../lib/advene/rules/actions.py:133
-#: ../lib/advene/gui/edit/shapewidget.py:342
-#: ../lib/advene/gui/edit/elements.py:891
-#: ../lib/advene/gui/edit/elements.py:971
-#: ../lib/advene/gui/edit/elements.py:1085
-#: ../lib/advene/gui/views/tagbag.py:138
-msgid "Color"
-msgstr "Couleur"
+#: ../lib/advene/gui/main.py:4448
+msgid "Skip duration, when using control-shift-left/right (in ms)."
+msgstr ""
+"Réglage de la durée (en ms) utilisée avec contrôle-shift-flèche ou les "
+"boutons avance/retour rapide"
 
-#: ../lib/advene/rules/actions.py:134
-msgid "x-position (percentage of screen)"
-msgstr "Abscisse (pourcentage de l'écran)"
+#: ../lib/advene/gui/main.py:4449
+msgid "Third time increment"
+msgstr "Troisième durée pour navigation"
 
-#: ../lib/advene/rules/actions.py:135
-msgid "y-position (percentage of screen)"
-msgstr "Ordonnée (pourcentage de l'écran)"
+#: ../lib/advene/gui/main.py:4449
+msgid "Skip duration, when using control-shift-up/down (in ms)."
+msgstr "Réglage de la durée (en ms) utilisée avec contrôle-shift-haut/bas."
 
-#: ../lib/advene/rules/actions.py:136
-msgid "Size (arbitrary units)"
-msgstr "Taille (unité arbitraire)"
+#: ../lib/advene/gui/main.py:4450
+msgid "Custom Up/Down"
+msgstr "Haut/Bas personnalisés"
 
-#: ../lib/advene/rules/actions.py:137
-msgid "Duration of the display in ms"
-msgstr "Durée de l'affichage en ms"
+#: ../lib/advene/gui/main.py:4450
+msgid ""
+"Use third time increment for up/down navigation without having to hold shift."
+msgstr ""
+"Utiliser la troisième durée pour naviguer avec Haut/Bas sans avoir à "
+"utiliser Shift."
 
-#: ../lib/advene/rules/actions.py:145
-msgid "A square"
-msgstr "Un carré"
+#: ../lib/advene/gui/main.py:4452
+msgid "Scroll increment"
+msgstr "Incrément de temps"
 
-#: ../lib/advene/rules/actions.py:146
-msgid "A circle"
-msgstr "Un cercle"
+#: ../lib/advene/gui/main.py:4452
+msgid ""
+"On most annotations, control+scrollwheel will increment/decrement their "
+"bounds by this value (in ms)."
+msgstr ""
+"Sur les annotations, contrôle + molette permet d'incrémenter/décrémenter "
+"leurs bornes de cette valeur (en ms)."
 
-#: ../lib/advene/rules/actions.py:147
-msgid "A triangle"
-msgstr "Un triangle"
+#: ../lib/advene/gui/main.py:4453
+msgid "Second scroll increment"
+msgstr "Second incrément de scroll"
 
-#: ../lib/advene/rules/actions.py:150
-msgid "White"
-msgstr "Blanc"
+#: ../lib/advene/gui/main.py:4453
+msgid ""
+"On most annotations, control+shift+scrollwheel will increment/decrement "
+"their bounds by this value (in ms)."
+msgstr ""
+"Sur les annotations, contrôle + shift + molette permet d'incrémenter/"
+"décrémenter leurs bornes de cette valeur (en ms)."
 
-# Retour rapide
-#: ../lib/advene/rules/actions.py:151
-msgid "Black"
-msgstr "Noir"
+#: ../lib/advene/gui/main.py:4455
+msgid "Player sync"
+msgstr "Synchro des lecteurs"
 
-#: ../lib/advene/rules/actions.py:152
-msgid "Red"
-msgstr "Rouge"
+#: ../lib/advene/gui/main.py:4455
+msgid ""
+"Interval (in ms) with which we synchronize slave players. Setting a too-low "
+"value could render the application unusable. Use 0 to disable continuous "
+"synchronization."
+msgstr ""
+"Intervalle (en ms) avec lequel on synchronise les lecteurs esclaves. Une "
+"valeur trop basse peut rendre l'application inutilisable. Entrez 0 pour "
+"désactiver la synchronisation continue."
 
-#: ../lib/advene/rules/actions.py:153
-msgid "Green"
-msgstr "Vert"
+#: ../lib/advene/gui/main.py:4456
+msgid "Timeline parameters"
+msgstr "Paramètres de la ligne de temps"
 
-#: ../lib/advene/rules/actions.py:154
-msgid "Blue"
-msgstr "Bleu"
+#: ../lib/advene/gui/main.py:4457 ../lib/advene/gui/edit/transcribe.py:156
+msgid "Font size"
+msgstr "Taille de la police"
 
-#: ../lib/advene/rules/actions.py:155
-msgid "Yellow"
-msgstr "Jaune"
+#: ../lib/advene/gui/main.py:4457
+msgid "Font size for annotation widgets"
+msgstr "Taille de la police pour les représentations d'annotations"
 
-#: ../lib/advene/rules/actions.py:158
-msgid "At the top of the screen"
-msgstr "En haut de l'écran"
+#: ../lib/advene/gui/main.py:4458
+msgid "Button height"
+msgstr "Hauteur des boutons"
 
-#: ../lib/advene/rules/actions.py:159 ../lib/advene/rules/actions.py:164
-msgid "In the middle of the screen"
-msgstr "Au milieu de l'écran"
+#: ../lib/advene/gui/main.py:4458
+msgid "Height of annotation widgets"
+msgstr "Hauteur des représentations d'annotations"
 
-#: ../lib/advene/rules/actions.py:160
-msgid "At the bottom of the screen"
-msgstr "En bas de l'écran"
+#: ../lib/advene/gui/main.py:4459
+msgid "Interline height"
+msgstr "Taille des interlignes"
 
-#: ../lib/advene/rules/actions.py:163
-msgid "At the left of the screen"
-msgstr "À gauche de l'écran"
+#: ../lib/advene/gui/main.py:4459
+msgid "Height of interlines"
+msgstr "Taille des interlignes"
 
-#: ../lib/advene/rules/actions.py:167
-#: ../lib/advene/gui/edit/transcribe.py:1164
-#: ../lib/advene/gui/views/activebookmarks.py:547
-msgid "Small"
-msgstr "Petit"
+#: ../lib/advene/gui/main.py:4461
+msgid "Text content"
+msgstr "Contenu textuel"
 
-#: ../lib/advene/rules/actions.py:168
-#: ../lib/advene/gui/edit/transcribe.py:1165
-#: ../lib/advene/gui/views/activebookmarks.py:548
-msgid "Normal"
-msgstr "Normal"
+#: ../lib/advene/gui/main.py:4462
+msgid "Completion mode"
+msgstr "Mode de complétion"
 
-#: ../lib/advene/rules/actions.py:169
-#: ../lib/advene/gui/edit/transcribe.py:1166
-#: ../lib/advene/gui/views/activebookmarks.py:549
-msgid "Large"
-msgstr "Grand"
+#: ../lib/advene/gui/main.py:4462
+msgid "Enable dynamic completion mode"
+msgstr "Activer la complétion dynamique"
 
-#: ../lib/advene/rules/actions.py:181
-msgid "Zero the volume during the annotation"
-msgstr "Couper le son durant l'annotation"
+#: ../lib/advene/gui/main.py:4463
+msgid "Predefined terms only"
+msgstr "Uniquement les termes prédéfinis"
 
-#: ../lib/advene/rules/actions.py:188
-msgid "Zero the volume"
-msgstr "Couper le son"
+#: ../lib/advene/gui/main.py:4463
+msgid "If completion is enabled, complete only with predefined terms."
+msgstr ""
+"Si la complétion est active, compléter uniquement avec les termes prédéfinis."
 
-#: ../lib/advene/rules/actions.py:195
-msgid "Restore the volume"
-msgstr "Restaurer le son"
+#: ../lib/advene/gui/main.py:4464
+msgid "Abbreviation mode"
+msgstr "Mode abbréviation"
 
-#: ../lib/advene/rules/actions.py:203
-msgid "Activate a STBV"
-msgstr "Activer une vue dynamique"
+#: ../lib/advene/gui/main.py:4464
+msgid "Enable abbreviation mode"
+msgstr "Activer l'expansion des abbréviations"
 
-#: ../lib/advene/rules/actions.py:204
-msgid "STBV id"
-msgstr "Identificateur de la vue dynamique"
+#: ../lib/advene/gui/main.py:4465
+msgid "Abbreviations"
+msgstr "Abbréviations"
 
-#: ../lib/advene/rules/actions.py:213
-msgid "Send a user event"
-msgstr "Envoyer un événement utilisateur"
+#: ../lib/advene/gui/main.py:4465
+msgid ""
+"Text abbreviations. 1 entry per line. Each line consists of the abbreviation "
+"followed by its replacement."
+msgstr ""
+"Abbréviations textuelles. Une entrée par ligne. Chaque ligne contient "
+"l'abbréviation suivie par son remplacement."
 
-#: ../lib/advene/rules/actions.py:214
-msgid "Identifier"
-msgstr "Identificateur"
+#: ../lib/advene/gui/main.py:4467
+msgid "Text-To-Speech"
+msgstr "Synthèse vocale"
 
-#: ../lib/advene/rules/actions.py:215
-msgid "Delay in ms before sending the event."
-msgstr "Délai en ms avant l'envoi de l'événement."
+#: ../lib/advene/gui/main.py:4468
+msgid "TTS language"
+msgstr "Langue de la synthèse vocale"
 
-#: ../lib/advene/rules/actions.py:225
-msgid "Open a URL in the web browser"
-msgstr "Ouvrir une URL dans le navigateur web"
+#: ../lib/advene/gui/main.py:4469
+msgid "What language settings should be used for text-to-speech"
+msgstr "Quelle langue doit être utilisée pour la synthèse vocale"
 
-#: ../lib/advene/rules/actions.py:226 ../lib/advene/gui/plugins/actions.py:103
-#: ../lib/advene/gui/views/logwindow.py:159
-msgid "URL"
-msgstr "URL"
-
-#: ../lib/advene/rules/actions.py:235
-msgid "Open a static view"
-msgstr "Ouvrir une vue statique"
-
-#: ../lib/advene/rules/actions.py:246
-msgid "Set the audio volume"
-msgstr "Fixer le volume"
+#: ../lib/advene/gui/main.py:4470
+msgid "English"
+msgstr "Anglais"
 
-#: ../lib/advene/rules/actions.py:247
-msgid "Volume level (from 0 to 100)"
-msgstr "Niveau de volume (0 à 100)"
+#: ../lib/advene/gui/main.py:4471
+msgid "French"
+msgstr "Français"
 
-#: ../lib/advene/rules/actions.py:256
-msgid "Set the playing rate"
-msgstr "Fixer la vitesse"
+#: ../lib/advene/gui/main.py:4472
+msgid "Spanish"
+msgstr "Espagnol"
 
-#: ../lib/advene/rules/actions.py:257
-msgid "Rate (100: normal rate, 200: twice slower)"
-msgstr "Vitesse (100: vitesse normale, 200: deux fois plus lent)"
+#: ../lib/advene/gui/main.py:4474
+msgid "TTS Encoding"
+msgstr "Encodage TTS"
 
-#: ../lib/advene/rules/actions.py:266
-msgid "Play a sound resource"
-msgstr "Jouer une ressource son"
+#: ../lib/advene/gui/main.py:4475
+msgid "What encoding should be used to communicate with the TTS engine"
+msgstr ""
+"Quel encodage de caractères doit être utilisé pour communiquer avec le "
+"moteur de synthèse vocale"
 
-#: ../lib/advene/rules/actions.py:267
-msgid "Clip id"
-msgstr "Clip id"
+#: ../lib/advene/gui/main.py:4476
+msgid "TTS Engine"
+msgstr "Moteur de synthèse vocale"
 
-#: ../lib/advene/rules/actions.py:268 ../lib/advene/rules/actions.py:282
-msgid "Volume (0..100)"
-msgstr "Volume (0 à 100)"
+#: ../lib/advene/gui/main.py:4477
+msgid ""
+"Which TTS engine should be used (modification requires restarting Advene to "
+"take into account)"
+msgstr ""
+"Quel moteur de synthèse vocale doit être utilisé (le changement requiert le "
+"redémarrage de l'application pour être pris en compte)"
 
-#: ../lib/advene/rules/actions.py:269 ../lib/advene/rules/actions.py:283
-msgid "Left-right balance: -1 -> full left, 0 -> center, 1 -> full right"
-msgstr "Balance droite-gauche : -1 -> gauche, 0 -> centre, 1 -> droite"
+#: ../lib/advene/gui/main.py:4478
+msgid "Automatic"
+msgstr "Automatique"
 
-#: ../lib/advene/rules/actions.py:280
-msgid "Play a sound file"
-msgstr "Jouer un fichier son externe"
+#: ../lib/advene/gui/main.py:4479
+msgid "eSpeak"
+msgstr "eSpeak"
 
-#: ../lib/advene/rules/actions.py:281
-msgid "Sound filename"
-msgstr "Nom du fichier son"
+#: ../lib/advene/gui/main.py:4480
+msgid "Custom script with standard input"
+msgstr "Script personnel via l'entrée standard"
 
-#: ../lib/advene/rules/actions.py:293
-msgid "Set a state variable"
-msgstr "Définir une variable d'état"
+#: ../lib/advene/gui/main.py:4481
+msgid "Custom script with arguments"
+msgstr "Script personnel via les arguments"
 
-#: ../lib/advene/rules/actions.py:294 ../lib/advene/rules/actions.py:306
-msgid "State variable name"
-msgstr "Nom de la variable d'état"
+#: ../lib/advene/gui/main.py:4482
+msgid "SAPI"
+msgstr "SAPI"
 
-#: ../lib/advene/rules/actions.py:295
-msgid "State value"
-msgstr "Valeu"
+#: ../lib/advene/gui/main.py:4483
+msgid "MacOS X say"
+msgstr "Commande \"say\" de MacOS X"
 
-#: ../lib/advene/rules/actions.py:305
-msgid "Increment a state variable"
-msgstr "Incrémenter une variable d'état"
+#: ../lib/advene/gui/main.py:4484
+msgid "Generic (text output)"
+msgstr "Générique (affichage du texte)"
 
-#: ../lib/advene/rules/actions.py:315
-msgid "Clear all state variables"
-msgstr "Effacer toutes les variables d'état"
+#: ../lib/advene/gui/main.py:4530
+msgid "You should restart Advene to take some options into account."
+msgstr "Vous devez redémarrer Advene pour prendre certaines options en compte."
 
-#: ../lib/advene/rules/actions.py:330
+#: ../lib/advene/gui/main.py:4539
 #, python-format
-msgid "Error in the evaluation of the parameter %s:"
-msgstr "Erreur dans l'évaluation du paramètre %s :"
+msgid "Imagecache saved to %s"
+msgstr "Cache d'image sauvé dans %s"
 
-#: ../lib/advene/rules/actions.py:389 ../lib/advene/gui/plugins/actions.py:247
-#, python-format
-msgid "The %s-related outgoing annotation"
-msgstr "L'annotation liée par une relation sortante de type %s"
+#: ../lib/advene/gui/main.py:4552
+msgid "Restarting player..."
+msgstr "Redémarrage du lecteur multimédia..."
 
-#: ../lib/advene/rules/actions.py:391 ../lib/advene/gui/plugins/actions.py:249
-#, python-format
-msgid "The %s-related incoming annotation"
-msgstr "L'annotation liée par une relation entrante de type %s"
+#: ../lib/advene/gui/main.py:4647 ../lib/advene/gui/views/timeline.py:1121
+#: ../lib/advene/rules/elements.py:1010
+msgid "Creation of a new annotation type"
+msgstr "Création d'un nouveau type d'annotation"
 
-#: ../lib/advene/rules/actions.py:551
-#, python-format
-msgid "Cannot find the stbv %s"
-msgstr "Impossible de trouver la vue dynamique %s"
+#: ../lib/advene/gui/main.py:4655 ../lib/advene/gui/views/timeline.py:1150
+msgid ""
+"Select the schema where you want to\n"
+"create the new relation type."
+msgstr ""
+"Sélectionnez le schéma où vous désirez\n"
+"créer le nouveau type de relation."
 
-#: ../lib/advene/rules/actions.py:615 ../lib/advene/gui/views/viewbook.py:263
-#, python-format
-msgid "Cannot find the view %s"
-msgstr "Impossible de trouver la vue  %s"
+#: ../lib/advene/gui/main.py:4673
+msgid "Select the package to merge"
+msgstr "Sélectionnez le recueil à fusionner"
 
-#: ../lib/advene/rules/actions.py:647
-msgid "The set_rate method is unavailable."
-msgstr "La méthode set_rate n'est pas disponible"
+#: ../lib/advene/gui/main.py:4694
+msgid "Saving workspace"
+msgstr "Sauvegarde de l'environnement"
 
-#: ../lib/advene/rules/actions.py:657
-msgid "No 'soundclips' resource folder in the package"
-msgstr "Pas de ressource 'soundclips' dans ce recueil"
+#: ../lib/advene/gui/main.py:4697
+msgid "Enter a view name to save the workspace"
+msgstr "Entrez un nom de vue pour sauvegarder cet environnement"
 
-#: ../lib/advene/rules/actions.py:683
-msgid "Full volume"
-msgstr "Volume maximum"
+#: ../lib/advene/gui/main.py:4698
+msgid "Default workspace"
+msgstr "Environnement standard"
 
-#: ../lib/advene/rules/actions.py:684
-msgid "Left"
-msgstr "Gauche"
+#: ../lib/advene/gui/main.py:4699
+msgid "Open this workspace when opening the package"
+msgstr "Ouvrir cet environnement lors du chargement du recueil"
 
-#: ../lib/advene/rules/actions.py:685
-#: ../lib/advene/gui/edit/transcribe.py:1196
-msgid "Center"
-msgstr "Centrer"
+#: ../lib/advene/gui/main.py:4722 ../lib/advene/gui/views/__init__.py:305
+#, python-format
+msgid "Error: the identifier %s contains invalid characters."
+msgstr "Erreur : l'identifiant %s contient des caractères non valides."
 
-#: ../lib/advene/rules/actions.py:686
-msgid "Right"
-msgstr "À droite"
+#: ../lib/advene/gui/main.py:4733
+#, python-format
+msgid "Error: the view %s exists and is not a workspace view."
+msgstr "Erreur : la vue %s existe mais n'est pas une vue d'environnement"
 
-#: ../lib/advene/rules/elements.py:141
-msgid "is equal to"
-msgstr "est égal à"
+#: ../lib/advene/gui/main.py:4764
+#, python-format
+msgid "Cannot save default workspace: %s"
+msgstr "Impossible de sauvegarder l'environnement par défaut : %s"
 
-#: ../lib/advene/rules/elements.py:142
-msgid "is different from"
-msgstr "est différent de"
+#: ../lib/advene/gui/main.py:4774
+msgid "Standard workspace has been saved"
+msgstr "L'environnement standard a été sauvé"
 
-#: ../lib/advene/rules/elements.py:143
-msgid "contains"
-msgstr "contient"
+#: ../lib/advene/gui/main.py:4781
+msgid "Website export"
+msgstr "Export de site web"
 
-#: ../lib/advene/rules/elements.py:144
-msgid "is greater than"
-msgstr "est supérieur à"
+#: ../lib/advene/gui/main.py:4782
+msgid "Exporting views to a website"
+msgstr "Exporter les vues vers un site web"
 
-#: ../lib/advene/rules/elements.py:145
-msgid "is lower than"
-msgstr "est inférieur à"
+#: ../lib/advene/gui/main.py:4785
+msgid "Output directory"
+msgstr "Répertoire destination"
 
-#: ../lib/advene/rules/elements.py:146
-msgid "matches the regexp"
-msgstr "correspond à l'expression"
+#: ../lib/advene/gui/main.py:4794
+msgid "Specify the output directory"
+msgstr "Précisez le répertoire de destination"
 
-#: ../lib/advene/rules/elements.py:147
-msgid "is before"
-msgstr "précède"
+#: ../lib/advene/gui/main.py:4803
+msgid "Maximum recursion depth"
+msgstr "Niveau maximal de récursivité"
 
-#: ../lib/advene/rules/elements.py:148
-msgid "meets"
-msgstr "touch"
+#: ../lib/advene/gui/main.py:4810
+msgid "Video URL"
+msgstr "URL de la vidéo"
 
-#: ../lib/advene/rules/elements.py:149
-msgid "overlaps"
-msgstr "intersecte"
+#: ../lib/advene/gui/main.py:4812
+msgid ""
+"URL for the video, if it is available on a sharing website (Only Youtube for "
+"the moment).\n"
+" It can also be a h264/ogg file, which will in this case be handled by the "
+"HTML5 video player."
+msgstr ""
+"URL pour la vidéo, si elle est disponible en ligne (youtube seulement\n"
+" pour le moment).\n"
+"Ce peut aussi être un fichier h264 ou ogg, qui sera dans ce cas\n"
+" intégré via un player HTML5."
 
-#: ../lib/advene/rules/elements.py:150
-msgid "during"
-msgstr "est contenue dans"
+#: ../lib/advene/gui/main.py:4862
+msgid "Could not export data: "
+msgstr "Impossible d'exporter les données : "
 
-#: ../lib/advene/rules/elements.py:151
-msgid "starts"
-msgstr "commence avec"
+#: ../lib/advene/gui/main.py:4864
+#, python-format
+msgid "Website export to %s completed"
+msgstr "Export de site web vers %s terminé"
 
-#: ../lib/advene/rules/elements.py:152
-msgid "finishes"
-msgstr "termine avec"
+#: ../lib/advene/gui/main.py:4903
+msgid "This video player is not able to grab specific screenshots"
+msgstr ""
+"Ce lecteur vidéo n'est pas capable de faire des captures d'écran à des "
+"moments précis."
 
-#: ../lib/advene/rules/elements.py:157
-msgid "is not true"
-msgstr "n'est pas vrai"
+#: ../lib/advene/gui/main.py:4909
+#, python-format
+msgid "Updating %d snapshots"
+msgstr "Mise-à-jour de %d vignette(s)"
 
-#: ../lib/advene/rules/elements.py:158
-msgid "is true"
-msgstr "est vrai"
+#: ../lib/advene/gui/main.py:4914
+msgid "No snapshot to update"
+msgstr "Aucune capture d'écran à mettre à jour"
 
-#: ../lib/advene/rules/elements.py:162
-msgid "Basic conditions"
-msgstr "Conditions élémenaires"
+#: ../lib/advene/gui/plugins/shotvalidation.py:37
+msgid "Shot validation view"
+msgstr "Vue de validation de plans"
 
-#: ../lib/advene/rules/elements.py:163
-msgid "Allen relations"
-msgstr "Relations de Allen"
+#: ../lib/advene/gui/plugins/shotvalidation.py:39
+msgid "Display shot validation interface"
+msgstr "Afficher l'interface de validation de plans"
 
-#: ../lib/advene/rules/elements.py:226 ../lib/advene/rules/elements.py:232
-msgid "Unknown type for overlaps comparison"
-msgstr "Type inconnu pour comparaison de recouvrement"
+#: ../lib/advene/gui/plugins/shotvalidation.py:115
+#, python-format
+msgid "Merged #%(first)d-#%(second)d into #%(first)d"
+msgstr "Fusionné #%(first)d-#%(second)d dans #%(first)d"
 
-#: ../lib/advene/rules/elements.py:240 ../lib/advene/rules/elements.py:246
-msgid "Unknown type for during comparison"
-msgstr "Type inconnu pour comparaison"
+#: ../lib/advene/gui/plugins/shotvalidation.py:145
+msgid "Last action undone"
+msgstr "Annulé la dernière action"
 
-#: ../lib/advene/rules/elements.py:515 ../lib/advene/rules/elements.py:521
+#: ../lib/advene/gui/plugins/shotvalidation.py:163
 #, python-format
-msgid "Unknown action %s"
-msgstr "Action inconnue %s"
+msgid "Split annotation #%(current)d into #%(current)d and #%(next)d"
+msgstr "Coupé l'annotation #%(current)d en #%(current)d et #%(next)d"
 
-#: ../lib/advene/rules/elements.py:522
+#: ../lib/advene/gui/plugins/shotvalidation.py:168
 #, python-format
-msgid "Unknown parameter %s"
-msgstr "Paramètre inconnu %s"
-
-#: ../lib/advene/rules/elements.py:527
-msgid "Unknown actions"
-msgstr "Actions inconnues"
+msgid "Cannot split annotation #%(current)d: out of bounds."
+msgstr "Impossible de couper l'annotation #%(current)d: en dehors des bornes."
 
-#: ../lib/advene/rules/elements.py:972
-msgid "Start of the editing of an element"
-msgstr "Début de l'édition d'un élément"
+#: ../lib/advene/gui/plugins/shotvalidation.py:188
+#, python-format
+msgid "Changed cut between #%(first)d and %(second)d"
+msgstr "Changé le cut entre #%(first)d et %(second)d"
 
-#: ../lib/advene/rules/elements.py:973
-msgid "Cancel of the editing of an element"
-msgstr "Abandon de l'édition d'un élément"
+#: ../lib/advene/gui/plugins/shotvalidation.py:191
+msgid "Changed begin time for first annotation"
+msgstr "Changé la borne de début pour la première annotation"
 
-#: ../lib/advene/rules/elements.py:974
-msgid "Destruction of the edit window of an element"
-msgstr "Destruction de la fenêtre d'édition d'un élément"
+#: ../lib/advene/gui/plugins/shotvalidation.py:197
+msgid "No annotations to adjust"
+msgstr "Aucune annotation à ajuster"
 
-#: ../lib/advene/rules/elements.py:975
-msgid "Validation of the editing of an element"
-msgstr "Validation de l'édition d'un élément"
+#: ../lib/advene/gui/plugins/shotvalidation.py:204
+msgid ""
+"Click on the frame just after the cut to adjust the cut time.\n"
+"Control-click on a frame to indicate a missing cut."
+msgstr ""
+"Cliquez sur l'image juste après le cut pour ajuster le moment du cut.\n"
+"Contrôle-clique sur une image indique un cut manquant."
 
-#: ../lib/advene/rules/elements.py:976
-msgid "Ending editing of a package"
-msgstr "Fin de l'édition d'un recueil"
-
-#: ../lib/advene/rules/elements.py:977
-msgid "Beginning of an annotation"
-msgstr "Début d'une annotation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:212
+#, python-format
+msgid "Begin of #%(index)d (title: %(content)s)"
+msgstr "Début de #%(index)d (titre: %(content)s)"
 
-#: ../lib/advene/rules/elements.py:978
-msgid "End of an annotation"
-msgstr "Fin d'une annotation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:226
+msgid "< Previous cut"
+msgstr "< Cut précédent"
 
-#: ../lib/advene/rules/elements.py:979
-msgid "Creation of a new annotation"
-msgstr "Création d'une nouvelle annotation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:227
+msgid "Display previous cut"
+msgstr "Afficher le cut précédent"
 
-#: ../lib/advene/rules/elements.py:980
-msgid "Ending editing of an annotation"
-msgstr "Fin de l'édition d'une annotation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:234
+msgid "Next cut >"
+msgstr "Cut suivant >"
 
-#: ../lib/advene/rules/elements.py:981
-msgid "Suppression of an annotation"
-msgstr "Suppression d'une annotation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:235
+msgid "Display next cut"
+msgstr "Afficher le cut suivant"
 
-#: ../lib/advene/rules/elements.py:982
-msgid "Activation of an annotation"
-msgstr "Activation d'une annotation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:250
+#: ../lib/advene/gui/views/annotationdisplay.py:92
+#: ../lib/advene/gui/views/timeline.py:86
+msgid "Current time"
+msgstr "Temps courant"
 
-#: ../lib/advene/rules/elements.py:983
-msgid "Deactivation of an annotation"
-msgstr "Désactivation d'une annotation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:251
+msgid "Go to annotation containing current player time."
+msgstr "Aller à l'annotation contenant le temps courant du lecteur"
 
-#: ../lib/advene/rules/elements.py:984
-msgid "Merging of two annotations"
-msgstr "Fusion de deux annotations"
+#: ../lib/advene/gui/plugins/shotvalidation.py:255
+#: ../lib/advene/gui/edit/frameselector.py:200
+msgid "Refresh snapshots"
+msgstr "Rafraîchir les captures d'écran"
 
-#: ../lib/advene/rules/elements.py:985
-msgid "Moving an annotation"
-msgstr "Déplacement d'une annotation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:256
+#: ../lib/advene/gui/edit/frameselector.py:201
+msgid "Refresh missing snapshots"
+msgstr "Rafraîchir les captures d'écran"
 
-#: ../lib/advene/rules/elements.py:986
-msgid "Activation of a relation"
-msgstr "Activation d'une relation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:261
+msgid "Undo last modification"
+msgstr "Annuler la dernière modification"
 
-#: ../lib/advene/rules/elements.py:987
-msgid "Deactivation of a relation"
-msgstr "Désactivation d'une relation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:267
+msgid "Merge with previous"
+msgstr "Fusionner avec la précédente"
 
-#: ../lib/advene/rules/elements.py:988
-msgid "Creation of a new relation"
-msgstr "Création d'une nouvelle relation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:268
+msgid "Merge with previous annotation, i.e. remove this bound."
+msgstr "Fusionner avec la précédente annotation, i.e. supprimer cette borne."
 
-#: ../lib/advene/rules/elements.py:989
-msgid "Ending editing of a relation"
-msgstr "Fin de l'édition d'une relation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:273
+msgid "Close view."
+msgstr "Fermer la vue"
 
-#: ../lib/advene/rules/elements.py:990
-msgid "Suppression of a relation"
-msgstr "Suppression d'une relation"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:44
+msgid "Activity trace"
+msgstr "Trace d'activité"
 
-#: ../lib/advene/rules/elements.py:991
-msgid "Creation of a new view"
-msgstr "Création d'une nouvelle vue"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:74
+#: ../lib/advene/gui/plugins/eventaccumulator.py:75
+#: ../lib/advene/gui/plugins/tracetimeline.py:65
+#: ../lib/advene/gui/plugins/tracetimeline.py:66
+#: ../lib/advene/gui/plugins/tracepreview.py:72
+#: ../lib/advene/gui/plugins/tracepreview.py:73
+msgid "Beginning edition"
+msgstr "Début de l'édition"
 
-#: ../lib/advene/rules/elements.py:992
-msgid "Ending editing of a view"
-msgstr "Fin de l'édition d'une Vue"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:76
+#: ../lib/advene/gui/plugins/eventaccumulator.py:77
+#: ../lib/advene/gui/plugins/eventaccumulator.py:78
+#: ../lib/advene/gui/plugins/tracetimeline.py:67
+#: ../lib/advene/gui/plugins/tracetimeline.py:68
+#: ../lib/advene/gui/plugins/tracetimeline.py:69
+#: ../lib/advene/gui/plugins/tracepreview.py:74
+#: ../lib/advene/gui/plugins/tracepreview.py:75
+#: ../lib/advene/gui/plugins/tracepreview.py:76
+msgid "Canceling edition"
+msgstr "Abandon de l'édition"
 
-#: ../lib/advene/rules/elements.py:993
-msgid "Suppression of a view"
-msgstr "Suppression d'une vue"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:79
+#: ../lib/advene/gui/plugins/tracetimeline.py:70
+#: ../lib/advene/gui/plugins/tracepreview.py:77
+msgid "Ending edition"
+msgstr "Fin de l'édition"
 
-#: ../lib/advene/rules/elements.py:994
-msgid "Creation of a new query"
-msgstr "Création d'une nouvelle requête"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:135
+msgid " Trace : "
+msgstr "Trace : "
 
-#: ../lib/advene/rules/elements.py:995
-msgid "Ending editing of a query"
-msgstr "Fin de l'édition d'une requête"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:139
+msgid " Filters"
+msgstr "Filtres"
 
-#: ../lib/advene/rules/elements.py:996
-msgid "Suppression of a query"
-msgstr "Suppression d'une requête"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:168
+msgid " Time : "
+msgstr " Temps : "
 
-#: ../lib/advene/rules/elements.py:997
-msgid "Creation of a new schema"
-msgstr "Création d'un nouveau schéma"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:178
+msgid " Max. : "
+msgstr " Max. : "
 
-#: ../lib/advene/rules/elements.py:998
-msgid "Ending editing of a schema"
-msgstr "Fin de l'édition d'un schéma"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:187
+msgid "Export"
+msgstr "Export"
 
-#: ../lib/advene/rules/elements.py:999
-msgid "Suppression of a schema"
-msgstr "Suppression d'un schéma"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:203
+#: ../lib/advene/gui/plugins/tracetimeline.py:665
+msgid "Exporting traces"
+msgstr "Export des traces"
 
-#: ../lib/advene/rules/elements.py:1000
-#: ../lib/advene/gui/views/timeline.py:1029 ../lib/advene/gui/main.py:4555
-msgid "Creation of a new annotation type"
-msgstr "Création d'un nouveau type d'annotation"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:208
+#: ../lib/advene/gui/plugins/tracetimeline.py:670
+#, python-format
+msgid ""
+"Export done to\n"
+"%s"
+msgstr ""
+"Export effectué vers\n"
+"%s"
 
-#: ../lib/advene/rules/elements.py:1001
-msgid "Ending editing an annotation type"
-msgstr "Fin de l'édition d'un type d'annotation"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:254
+msgid "Defining Filters"
+msgstr "Définition de filtres"
 
-#: ../lib/advene/rules/elements.py:1002
-msgid "Suppression of an annotation type"
-msgstr "Suppression d'un type d'annotation"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:560
+#: ../lib/advene/gui/plugins/eventaccumulator.py:615
+#: ../lib/advene/gui/plugins/tracepreview.py:214
+#, python-format
+msgid "of an annotation (%s)"
+msgstr "d'une annotation (%s)"
 
-#: ../lib/advene/rules/elements.py:1003
-msgid "Creation of a new relation type"
-msgstr "Création d'un nouveau type de relation"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:562
+#: ../lib/advene/gui/plugins/eventaccumulator.py:617
+#: ../lib/advene/gui/plugins/tracepreview.py:216
+#, python-format
+msgid "of a relation (%s)"
+msgstr "d'une relation (%s)"
 
-#: ../lib/advene/rules/elements.py:1004
-msgid "Ending editing a relation type"
-msgstr "Fin de l'édition d'un type de relation"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:564
+#: ../lib/advene/gui/plugins/eventaccumulator.py:619
+#: ../lib/advene/gui/plugins/tracepreview.py:218
+#, python-format
+msgid "of an annotation type (%s)"
+msgstr "d'un type d'annotation (%s)"
 
-#: ../lib/advene/rules/elements.py:1005
-msgid "Suppression of a relation type"
-msgstr "Suppression d'un type de relation"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:566
+#: ../lib/advene/gui/plugins/eventaccumulator.py:621
+#: ../lib/advene/gui/plugins/tracepreview.py:220
+#, python-format
+msgid "of a relation type (%s)"
+msgstr "d'un type de relation (%s)"
 
-#: ../lib/advene/rules/elements.py:1006
-msgid "Creation of a new resource"
-msgstr "Création d'une nouvelle ressource"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:568
+#: ../lib/advene/gui/plugins/eventaccumulator.py:623
+#: ../lib/advene/gui/plugins/tracepreview.py:222
+#, python-format
+msgid "of a schema (%s)"
+msgstr "d'un schéma (%s)"
 
-#: ../lib/advene/rules/elements.py:1007
-msgid "Ending editing of a resource"
-msgstr "Fin de l'édition d'une ressource"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:570
+#: ../lib/advene/gui/plugins/eventaccumulator.py:625
+#: ../lib/advene/gui/plugins/tracepreview.py:224
+#, python-format
+msgid "of a view (%s)"
+msgstr "d'une vue (%s)"
 
-#: ../lib/advene/rules/elements.py:1008
-msgid "Suppression of a resource"
-msgstr "Suppression d'une ressource"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:572
+#: ../lib/advene/gui/plugins/eventaccumulator.py:627
+#: ../lib/advene/gui/plugins/tracepreview.py:226
+#, python-format
+msgid "of a package (%s)"
+msgstr "d'un recueil (%s)"
 
-#: ../lib/advene/rules/elements.py:1009
-msgid "Modification of the tag"
-msgstr "Modification du tag"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:574
+#: ../lib/advene/gui/plugins/eventaccumulator.py:629
+#: ../lib/advene/gui/plugins/tracepreview.py:228
+#, python-format
+msgid "of an unknown item (%s)"
+msgstr "d'un élément inconnu (%s)"
 
-#: ../lib/advene/rules/elements.py:1010
-msgid "Activating a link"
-msgstr "Activation d'un lien"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:382
+#, python-format
+msgid "Rendering type %(type)s as %(presentation)s"
+msgstr "Rendu du type %(type)s sous forme de %(presentation)s"
 
-#: ../lib/advene/rules/elements.py:1011
-msgid "Player start"
-msgstr "Lecture"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:527
+msgid "Snapshot only"
+msgstr "Vignette seulement"
 
-#: ../lib/advene/rules/elements.py:1012
-msgid "Player stop"
-msgstr "Stop"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:528
+msgid "Overlayed snapshot only"
+msgstr "Vignette enrichiee seulement"
 
-#: ../lib/advene/rules/elements.py:1013
-msgid "Player pause"
-msgstr "Pause"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:529
+msgid "Timestamp only"
+msgstr "Temps seulement"
 
-#: ../lib/advene/rules/elements.py:1014
-msgid "Player resume"
-msgstr "Relance"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:530
+msgid "Snapshot+timestamp"
+msgstr "Vignette+temps"
 
-#: ../lib/advene/rules/elements.py:1015
-msgid "Going to a given position"
-msgstr "Déplacement à une position donnée"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:531
+msgid "Annotation content"
+msgstr "Le contenu de l'annotation"
 
-#: ../lib/advene/rules/elements.py:1016
-msgid "Loading a new package"
-msgstr "Chargement d'un nouveau recueil"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:546
+msgid "as a list"
+msgstr "comme une liste"
 
-#: ../lib/advene/rules/elements.py:1017
-msgid "Activating a package"
-msgstr "Activation d'un recueil"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:547
+msgid "as a grid"
+msgstr "comme une grille"
 
-#: ../lib/advene/rules/elements.py:1018
-msgid "Saving the package"
-msgstr "Sauvegarde du recueil"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:548
+msgid "as a table"
+msgstr "comme une table"
 
-#: ../lib/advene/rules/elements.py:1019
-msgid "Start of the dynamic view"
-msgstr "Activation d'une vue dynamique"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:549
+#: ../lib/advene/gui/views/viewbook.py:394
+msgid "as a transcription"
+msgstr "comme une transcription"
 
-#: ../lib/advene/rules/elements.py:1020
-msgid "End of the dynamic view"
-msgstr "Fin d'une vue dynamique"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:667
+#: ../lib/advene/gui/views/transcription.py:448
+#, python-format
+msgid "Annotation %s"
+msgstr "Annotation %s"
 
-#: ../lib/advene/rules/elements.py:1021
-msgid "Start of the application"
-msgstr "Début de l'application"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:668
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:687
+msgid "Play video"
+msgstr "Jouer la vidéo"
 
-#: ../lib/advene/rules/elements.py:1022
-msgid "End of the application"
-msgstr "Fin de l'application"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:669
+msgid "Show timestamp only"
+msgstr "Temps seulement"
 
-#: ../lib/advene/rules/elements.py:1023
-msgid "User-defined event"
-msgstr "Événement utilisateur"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:670
+msgid "Show content only"
+msgstr "Contenu seulement"
 
-#: ../lib/advene/rules/elements.py:1024
-msgid "Modification of the associated media"
-msgstr "Modification du média associé"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:671
+msgid "Show snapshot only"
+msgstr "Vignette seulement"
 
-#: ../lib/advene/rules/elements.py:1025
-msgid "Highlight a bookmark"
-msgstr "Surligner un signet"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:673
+msgid "Show overlayed timestamp"
+msgstr "Vignette + timecode surimprimé"
 
-#: ../lib/advene/rules/elements.py:1026
-msgid "Unhighlight a bookmark"
-msgstr "Désurligner un signet"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:674
+msgid "Show overlayed content"
+msgstr "Vignette + contenu surimprimé"
 
-#: ../lib/advene/rules/elements.py:1027
-msgid "Updating duration of the movie"
-msgstr "Modification de la durée du film"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:676
+#, python-format
+msgid "Annotation type %s"
+msgstr "Type d'annotations %s"
 
-#: ../lib/advene/rules/elements.py:1028
-msgid "Displaying a popup"
-msgstr "Affichage d'une popup"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:677
+msgid "display as list"
+msgstr "afficher comme une liste"
 
-#: ../lib/advene/rules/elements.py:1029
-msgid "Updating a snapshot"
-msgstr "Mise-à-jour d'une vignette"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:678
+msgid "display as grid"
+msgstr "afficher comme une grille"
 
-#: ../lib/advene/rules/elements.py:1067
-msgid "Player control"
-msgstr "Contrôle du lecteur"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:679
+msgid "display as table"
+msgstr "afficher comme une table"
 
-#: ../lib/advene/rules/elements.py:1068
-msgid "Audio enrichment"
-msgstr "Enrichissement audio"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:680
+msgid "display as transcription"
+msgstr "afficher comme une transcription"
 
-#: ../lib/advene/rules/elements.py:1069
-msgid "Image enrichment"
-msgstr "Enrichissement image"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:689
+msgid "Open link"
+msgstr "Ouvrir le lien"
 
-#: ../lib/advene/rules/elements.py:1070
-msgid "External display control"
-msgstr "Contrôle d'un affichage extérieur"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:745
+#, python-format
+msgid "HTML editor: cannot parse content (%s)"
+msgstr "Éditeur HTML: impossible de traiter le contenu (%s)"
 
-#: ../lib/advene/rules/elements.py:1071
-msgid "Popup"
-msgstr "Popup"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:776
+#, python-format
+msgid "Heading %d"
+msgstr "Titre %d"
 
-#: ../lib/advene/rules/elements.py:1073
-msgid "State"
-msgstr "Statut "
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:787
+msgid "Bold"
+msgstr "Gras"
 
-#: ../lib/advene/rules/elements.py:1074
-msgid "GUI actions"
-msgstr "Actions sur l'interface"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:788
+msgid "Italic"
+msgstr "Italique"
 
-#: ../lib/advene/rules/elements.py:1075
-msgid "Expert"
-msgstr "Expert"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:789
+msgid "Header"
+msgstr "Titre"
 
-#: ../lib/advene/gui/util/initialconfig.py:82
-msgid "Initial Advene configuration"
-msgstr "Configuration initiale d'Advene"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:791
+msgid "Copy"
+msgstr "Copier"
 
-#: ../lib/advene/gui/util/initialconfig.py:83
-msgid ""
-"<span size='large'><b>Welcome in Advene</b>\n"
-"This is the first time that you run Advene. Please answer some basic "
-"configuration questions. You will be able to modify these choices from the "
-"Advene interface, in the Edit/Preferences menu.</span>"
-msgstr ""
-"<span size='large'><b>Bienvenue dans Advene</b>\n"
-"C'est la première fois que vous utilisez Advene. Vous pouvez maintenant "
-"fixer certaines options de configuration essentielles. Vous pourrez modifier "
-"plus tard ces choix depuis l'interface d'Advene, dans le menu Edit/"
-"Préférences.</span>"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:792
+msgid "Cut"
+msgstr "Couper"
 
-#: ../lib/advene/gui/util/initialconfig.py:84
-msgid "Interface language"
-msgstr "Langue de l'interface"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:793
+msgid "Paste"
+msgstr "Coller"
 
-#: ../lib/advene/gui/util/initialconfig.py:84
-msgid "Language used for the interface"
-msgstr "Langue utilisée pour l'interface"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:795
+#: ../lib/advene/gui/views/timeline.py:139
+msgid "Refresh"
+msgstr "Rafraîchir"
 
-#: ../lib/advene/gui/util/initialconfig.py:88 ../lib/advene/gui/main.py:4247
-msgid "System default"
-msgstr "La valeur du système"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:851
+msgid "WYSIWYG editor"
+msgstr "Éditeur WYSIWYG"
 
-#: ../lib/advene/gui/util/initialconfig.py:90
-msgid "Weekly check for Advene updates on the Advene website"
-msgstr "Vérification hebdomadaire des mises à jour depuis le site web d'Advene"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:861
+msgid "Edit HTML source"
+msgstr "Éditer le source HTML"
 
-#: ../lib/advene/gui/util/initialconfig.py:90 ../lib/advene/gui/main.py:4273
-msgid "Weekly check for updates on the Advene website"
-msgstr ""
-"Vérifier hebdomadairement si des mises à jour d'Advene sont disponibles"
+#: ../lib/advene/gui/plugins/tracetimeline.py:71
+#: ../lib/advene/gui/plugins/tracepreview.py:78
+msgid "Moving to"
+msgstr "Déplacement à"
 
-#: ../lib/advene/gui/util/initialconfig.py:92
-msgid "Preferred directory for data files"
-msgstr "Répertoire préféré pour les fichiers de données"
+#: ../lib/advene/gui/plugins/tracetimeline.py:87
+msgid "Traces"
+msgstr "Traces"
 
-#: ../lib/advene/gui/util/initialconfig.py:92
-msgid "Preferred directory for storing data files (Advene packages)"
-msgstr ""
-"Répertoire préféré pour stocker les fichiers de données (recueils Advene)"
+#: ../lib/advene/gui/plugins/tracetimeline.py:213
+#, python-format
+msgid "%(name)s (%(index)d)"
+msgstr "%(name)s (%(index)d)"
 
-#: ../lib/advene/gui/util/initialconfig.py:94
-msgid "Directories to search for movies"
-msgstr "Répertoires où chercher les films référencés"
+#: ../lib/advene/gui/plugins/tracetimeline.py:241
+msgid "Search"
+msgstr "Chercher"
 
-#: ../lib/advene/gui/util/initialconfig.py:94
+#: ../lib/advene/gui/plugins/tracetimeline.py:254
+#: ../lib/advene/gui/plugins/tracetimeline.py:1214
 #, python-format
-msgid ""
-"List of directories (separated by %(pathsep)s) to search for movie files."
-msgstr "Liste de répertoires (séparés par %(pathsep)s) où chercher les vidéos."
+msgid "%(name)s (%(index)s)"
+msgstr "%(name)s (%(index)s)"
 
-#: ../lib/advene/gui/util/initialconfig.py:95
-msgid "First look for movie file in the same directory as the package"
-msgstr ""
-"Chercher d'abord le fichier vidéo dans le même répertoire que le recueil"
+#: ../lib/advene/gui/plugins/tracetimeline.py:426
+#: ../lib/advene/gui/views/timeline.py:3484
+#: ../lib/advene/gui/edit/montage.py:449
+msgid "Zoom out"
+msgstr "Dézoomer"
 
-#: ../lib/advene/gui/util/initialconfig.py:95
-msgid ""
-"If checked, the movie file will be searched for in the same directory as the "
-"referencing package."
-msgstr ""
-"Si cette case est cochée, les fichiers vidéos seront recherchés d'abord dans "
-"le même répertoire que le recueil qui les référence."
+#: ../lib/advene/gui/plugins/tracetimeline.py:431
+#: ../lib/advene/gui/views/timeline.py:3489
+#: ../lib/advene/gui/edit/montage.py:454
+msgid "Zoom in"
+msgstr "Zoomer"
 
-#: ../lib/advene/gui/util/__init__.py:39
-#: ../lib/advene/gui/edit/schemaeditor.py:1081
-#: ../lib/advene/gui/edit/schemaeditor.py:1202
-#: ../lib/advene/gui/edit/create.py:106
-msgid "Plain text content"
-msgstr "Contenu textuel"
+#: ../lib/advene/gui/plugins/tracetimeline.py:436
+msgid "Zoom 100%"
+msgstr "Zoom 100%"
 
-#: ../lib/advene/gui/util/__init__.py:40
-msgid "HTML content"
-msgstr "Contenu HTML"
+#: ../lib/advene/gui/plugins/tracetimeline.py:440
+msgid "Toggle links lock"
+msgstr "Modifier le verrou des liens"
 
-#: ../lib/advene/gui/util/__init__.py:41
-#: ../lib/advene/gui/edit/schemaeditor.py:1082
-#: ../lib/advene/gui/edit/schemaeditor.py:1203
-#: ../lib/advene/gui/edit/create.py:107
-msgid "Simple-structured content"
-msgstr "Contenu simplement structuré"
+#: ../lib/advene/gui/plugins/tracetimeline.py:448
+msgid "Toggle link mode"
+msgstr "Modifier le mode verrou"
 
-#: ../lib/advene/gui/util/__init__.py:42
-msgid "List of numeric values"
-msgstr "Liste de valeurs numériques"
+#: ../lib/advene/gui/plugins/tracetimeline.py:455
+msgid "Open a trace file"
+msgstr "Ouvrir un fichier de trace"
 
-#: ../lib/advene/gui/util/__init__.py:43
-#: ../lib/advene/gui/edit/schemaeditor.py:1083
-#: ../lib/advene/gui/edit/schemaeditor.py:1204
-#: ../lib/advene/gui/edit/create.py:108
-msgid "SVG graphics content"
-msgstr "Contenu graphique SVG"
+#: ../lib/advene/gui/plugins/tracetimeline.py:470
+msgid "Toggle auto refresh"
+msgstr "Changer le rafraîchissement automatique"
 
-#: ../lib/advene/gui/util/__init__.py:459
-#, python-format
-msgid ""
-"Annotation Type %(title)s:\n"
-"%(count)s"
-msgstr ""
-"Type d'annotation %(title)s:\n"
-"%(count)s"
+#: ../lib/advene/gui/plugins/tracetimeline.py:481
+msgid "Open an existing trace"
+msgstr "Ouvrir une trace existante"
 
-#: ../lib/advene/gui/util/__init__.py:465
-#, python-format
-msgid ""
-"Relation Type %(title)s:\n"
-"%(count)s"
-msgstr ""
-"Type de relation %(title)s:\n"
-"%(count)s"
+#: ../lib/advene/gui/plugins/tracetimeline.py:487
+msgid "Save trace"
+msgstr "Sauver la trace"
 
-#: ../lib/advene/gui/util/dialog.py:376 ../lib/advene/gui/edit/dvdselect.py:95
-#: ../lib/advene/gui/edit/imports.py:331
-#: ../lib/advene/gui/edit/transcribe.py:1055
-#: ../lib/advene/gui/views/table.py:557 ../lib/advene/gui/main.py:4176
-msgid "Title"
-msgstr "Titre"
+#: ../lib/advene/gui/plugins/tracetimeline.py:492
+msgid "Configuration"
+msgstr "Configuration"
 
-#: ../lib/advene/gui/util/dialog.py:385 ../lib/advene/gui/edit/rules.py:1092
-#: ../lib/advene/gui/edit/imports.py:325
-#: ../lib/advene/gui/edit/elements.py:507
-#: ../lib/advene/gui/edit/elements.py:556
-#: ../lib/advene/gui/edit/elements.py:644
-#: ../lib/advene/gui/edit/elements.py:724
-#: ../lib/advene/gui/edit/elements.py:873
-#: ../lib/advene/gui/edit/elements.py:942
-#: ../lib/advene/gui/edit/elements.py:1054
-#: ../lib/advene/gui/edit/elements.py:1115
-#: ../lib/advene/gui/views/table.py:255 ../lib/advene/gui/views/table.py:559
-msgid "Id"
-msgstr "Id"
+#: ../lib/advene/gui/plugins/tracetimeline.py:941
+msgid "Zoom and center on linked items"
+msgstr "Zoomer et centrer sur les items liés"
 
-#: ../lib/advene/gui/util/dialog.py:404 ../lib/advene/gui/util/dialog.py:443
-msgid "Name the element"
-msgstr "Nommer l'élément"
+#: ../lib/advene/gui/plugins/tracetimeline.py:950
+msgid "Edit item"
+msgstr "Éditer l'élément"
 
-#: ../lib/advene/gui/util/dialog.py:407 ../lib/advene/gui/util/dialog.py:444
-msgid "Choose a name for the element"
-msgstr "Choisissez un nom pour l'élément"
+#: ../lib/advene/gui/plugins/tracetimeline.py:954
+msgid "Recreate item"
+msgstr "Recréer l'élément"
 
-#: ../lib/advene/gui/util/dialog.py:482
-msgid "Open a file"
-msgstr "Ouvrir un fichier"
+#: ../lib/advene/gui/plugins/tracetimeline.py:970
+#: ../lib/advene/gui/plugins/tracetimeline.py:991
+#: ../lib/advene/gui/views/timeline.py:2595 ../lib/advene/gui/popup.py:542
+#: ../lib/advene/gui/edit/transcribe.py:495
+msgid "Go to..."
+msgstr "Aller à..."
 
-#: ../lib/advene/gui/util/dialog.py:507 ../lib/advene/gui/util/dialog.py:543
-msgid "N/C"
-msgstr "N/C"
+#: ../lib/advene/gui/plugins/tracetimeline.py:974
+msgid "Zoom on action"
+msgstr "Zoom sur l'action"
 
-#: ../lib/advene/gui/util/dialog.py:512
-msgid "Alias"
-msgstr "Alias"
+#: ../lib/advene/gui/plugins/tracetimeline.py:2018
+#: ../lib/advene/gui/views/timeline.py:3362
+#: ../lib/advene/gui/edit/montage.py:544
+msgid "Inspector"
+msgstr "Inspecteur"
 
-#: ../lib/advene/gui/util/dialog.py:532
-msgid ""
-"Press to\n"
-"display\n"
-"information"
-msgstr ""
-"Cliquez pour\n"
-"afficher\n"
-"des informations"
+#: ../lib/advene/gui/plugins/tracetimeline.py:2023
+msgid "Item Id"
+msgstr "Id de l'élément"
 
-#: ../lib/advene/gui/util/dialog.py:551
-msgid "Wait..."
-msgstr "Patientez..."
+#: ../lib/advene/gui/plugins/tracetimeline.py:2026
+msgid "Item name or class"
+msgstr "Nom ou classe de l'élément"
 
-#: ../lib/advene/gui/util/dialog.py:555
-#, python-format
-msgid "Error: %s"
-msgstr "Erreur : %s"
+#: ../lib/advene/gui/plugins/tracetimeline.py:2030
+msgid "Type or schema"
+msgstr "Type ou schéma"
 
-#: ../lib/advene/gui/util/dialog.py:575
-msgid "Any type of file"
-msgstr "Tout type de fichier"
+#: ../lib/advene/gui/plugins/tracetimeline.py:2033
+msgid "Operations"
+msgstr "Opérations"
 
-#: ../lib/advene/gui/util/dialog.py:577
-msgid "Advene files (.xml, .azp, .apl)"
-msgstr "Fichiers advene (.xml, .azp, .apl)"
+#: ../lib/advene/gui/plugins/tracetimeline.py:2076
+msgid "Comment"
+msgstr "Commentaire"
 
-#: ../lib/advene/gui/util/dialog.py:579
-msgid "Advene session (.apl)"
-msgstr "Session Advene (.apl)"
+#: ../lib/advene/gui/plugins/tracetimeline.py:2108
+#: ../lib/advene/gui/edit/merge.py:191
+msgid "Action"
+msgstr "Action"
 
-#: ../lib/advene/gui/util/dialog.py:580
-msgid "Audio files"
-msgstr "Fichiers audio"
+#: ../lib/advene/gui/plugins/logmessages.py:35
+msgid "Log Messages"
+msgstr "Messages d'information"
 
-#: ../lib/advene/gui/util/dialog.py:581
-msgid "Video files"
-msgstr "Fichiers vidéo"
+#: ../lib/advene/gui/plugins/actions.py:40 ../lib/advene/core/controller.py:307
+#: ../lib/advene/rules/actions.py:38
+msgid "Display a message"
+msgstr "Affiche un message"
 
-#: ../lib/advene/gui/util/dialog.py:626
-#: ../lib/advene/gui/edit/properties.py:418
-msgid "Choose a directory"
-msgstr "Choisissez un répertoire"
+#: ../lib/advene/gui/plugins/actions.py:41
+#: ../lib/advene/gui/plugins/actions.py:53
+#: ../lib/advene/gui/plugins/actions.py:71
+#: ../lib/advene/gui/plugins/actions.py:86
+#: ../lib/advene/gui/plugins/actions.py:102
+#: ../lib/advene/gui/plugins/actions.py:203
+#: ../lib/advene/core/controller.py:308
+msgid "String to display."
+msgstr "Chaîne de caractères à afficher"
 
-#: ../lib/advene/gui/util/dialog.py:679
-msgid "Select an element"
-msgstr "Choisissez un élément"
+#: ../lib/advene/gui/plugins/actions.py:44
+#: ../lib/advene/gui/plugins/actions.py:58
+#: ../lib/advene/gui/plugins/actions.py:110
+#: ../lib/advene/gui/plugins/actions.py:399
+#: ../lib/advene/gui/plugins/actions.py:527 ../lib/advene/gui/edit/rules.py:766
+#: ../lib/advene/plugins/brltty.py:90 ../lib/advene/plugins/tts.py:84
+#: ../lib/advene/rules/actions.py:42 ../lib/advene/rules/actions.py:109
+#: ../lib/advene/rules/actions.py:125
+msgid "The annotation content"
+msgstr "Le contenu de l'annotation"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:32
-msgid "Shot validation view"
-msgstr "Vue de validation de plans"
+#: ../lib/advene/gui/plugins/actions.py:52
+msgid "Display a popup"
+msgstr "Afficher une popup"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:34
-msgid "Display shot validation interface"
-msgstr "Afficher l'interface de validation de plans"
+#: ../lib/advene/gui/plugins/actions.py:54
+#: ../lib/advene/gui/plugins/actions.py:73
+#: ../lib/advene/gui/plugins/actions.py:88
+#: ../lib/advene/gui/plugins/actions.py:104
+#: ../lib/advene/gui/plugins/actions.py:160
+#: ../lib/advene/gui/plugins/actions.py:184
+msgid "Display duration in ms. Ignored if empty."
+msgstr "Durée de l'affichage en ms. Ignoré si vide."
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:111
-#, python-format
-msgid "Merged #%(first)d-#%(second)d into #%(first)d"
-msgstr "Fusionné #%(first)d-#%(second)d dans #%(first)d"
+#: ../lib/advene/gui/plugins/actions.py:61
+#: ../lib/advene/gui/plugins/actions.py:121
+#: ../lib/advene/gui/plugins/actions.py:403
+#: ../lib/advene/gui/plugins/actions.py:538 ../lib/advene/rules/actions.py:112
+#: ../lib/advene/rules/actions.py:174
+msgid "1 second"
+msgstr "1 seconde"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:136
-msgid "Last action undone"
-msgstr "Annulé la dernière action"
+#: ../lib/advene/gui/plugins/actions.py:62
+#: ../lib/advene/gui/plugins/actions.py:122
+#: ../lib/advene/gui/plugins/actions.py:404
+#: ../lib/advene/gui/plugins/actions.py:539 ../lib/advene/gui/edit/rules.py:773
+#: ../lib/advene/rules/actions.py:113 ../lib/advene/rules/actions.py:175
+msgid "The annotation duration"
+msgstr "La durée de l'annotation"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:154
-#, python-format
-msgid "Split annotation #%(current)d into #%(current)d and #%(next)d"
-msgstr "Coupé l'annotation #%(current)d en #%(current)d et #%(next)d"
+#: ../lib/advene/gui/plugins/actions.py:70
+msgid "Popup an entry box"
+msgstr "Affiche une fenêtre proposant d'entrer du texte"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:159
-#, python-format
-msgid "Cannot split annotation #%(current)d: out of bounds."
-msgstr "Impossible de couper l'annotation #%(current)d: en dehors des bornes."
+#: ../lib/advene/gui/plugins/actions.py:72
+msgid "Object where to store the answer (should have a content)"
+msgstr "Objet où stocker la réponse (doit posséder un attribut content)"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:179
-#, python-format
-msgid "Changed cut between #%(first)d and %(second)d"
-msgstr "Changé le cut entre #%(first)d et %(second)d"
+#: ../lib/advene/gui/plugins/actions.py:84
+msgid "Display a popup to go to another position"
+msgstr "Affiche une fenêtre proposant d'aller à une nouvelle position"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:182
-msgid "Changed begin time for first annotation"
-msgstr "Changé la borne de début pour la première annotation"
+#: ../lib/advene/gui/plugins/actions.py:85
+#: ../lib/advene/gui/plugins/actions.py:101
+#: ../lib/advene/gui/plugins/actions.py:155
+#: ../lib/advene/gui/plugins/actions.py:177
+msgid "General description"
+msgstr "Description générale"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:188
-msgid "No annotations to adjust"
-msgstr "Aucune annotation à ajuster"
+#: ../lib/advene/gui/plugins/actions.py:87
+msgid "New position"
+msgstr "Nouvelle position"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:195
-msgid ""
-"Click on the frame just after the cut to adjust the cut time.\n"
-"Control-click on a frame to indicate a missing cut."
-msgstr ""
-"Cliquez sur l'image juste après le cut pour ajuster le moment du cut.\n"
-"Contrôle-clique sur une image indique un cut manquant."
+#: ../lib/advene/gui/plugins/actions.py:90
+#: ../lib/advene/gui/plugins/actions.py:191
+msgid "Go to related annotation"
+msgstr "Aller à l'annotation liée"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:203
-#, python-format
-msgid "Begin of #%(index)d (title: %(content)s)"
-msgstr "Début de #%(index)d (titre: %(content)s)"
+#: ../lib/advene/gui/plugins/actions.py:100
+msgid "Display a popup linking to an URL"
+msgstr "Affiche une fenêtre proposant une URL"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:217
-msgid "< Previous cut"
-msgstr "< Cut précédent"
+#: ../lib/advene/gui/plugins/actions.py:103
+#: ../lib/advene/gui/views/logwindow.py:159 ../lib/advene/rules/actions.py:228
+msgid "URL"
+msgstr "URL"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:218
-msgid "Display previous cut"
-msgstr "Afficher le cut précédent"
+#: ../lib/advene/gui/plugins/actions.py:106
+msgid "string:Display annotation in web browser"
+msgstr "string:Affiche l'annotation dans un navigateur web"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:225
-msgid "Next cut >"
-msgstr "Cut suivant >"
+#: ../lib/advene/gui/plugins/actions.py:113
+#: ../lib/advene/gui/views/logwindow.py:160
+#: ../lib/advene/gui/views/logwindow.py:163
+msgid "See the Advene website"
+msgstr "Voir le site web d'Advene"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:226
-msgid "Display next cut"
-msgstr "Afficher le cut suivant"
+#: ../lib/advene/gui/plugins/actions.py:114
+#: ../lib/advene/gui/views/logwindow.py:164
+msgid "See the annotation"
+msgstr "Voir l'annotation"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:251
-#: ../lib/advene/gui/views/timeline.py:81
-#: ../lib/advene/gui/views/annotationdisplay.py:90
-msgid "Current time"
-msgstr "Temps courant"
+#: ../lib/advene/gui/plugins/actions.py:117
+#: ../lib/advene/gui/views/logwindow.py:167
+msgid "The Advene website"
+msgstr "Le site web d'Advene"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:252
-msgid "Go to annotation containing current player time."
-msgstr "Aller à l'annotation contenant le temps courant du lecteur"
+#: ../lib/advene/gui/plugins/actions.py:118
+#: ../lib/advene/gui/views/logwindow.py:168
+msgid "The annotation URL"
+msgstr "L'URL de l'annotation"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:256
-#: ../lib/advene/gui/edit/frameselector.py:193
-msgid "Refresh snapshots"
-msgstr "Rafraîchir les captures d'écran"
+#: ../lib/advene/gui/plugins/actions.py:130
+msgid "Open an interface view"
+msgstr "Ouvrir une vue d'interface"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:257
-#: ../lib/advene/gui/edit/frameselector.py:194
-msgid "Refresh missing snapshots"
-msgstr "Rafraîchir les captures d'écran"
+#: ../lib/advene/gui/plugins/actions.py:131
+msgid ""
+"View name (timeline, tree, transcription, browser, webbrowser, transcribe)"
+msgstr ""
+"Nom de la vue (timeline, tree, transcription, browser, webbrowser, "
+"transcribe)"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:261
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:806
-#: ../lib/advene/gui/edit/transcribe.py:1211 ../lib/advene/gui/main.py:350
-msgid "Undo"
-msgstr "Undo"
+#: ../lib/advene/gui/plugins/actions.py:132
+msgid "Destination: popup, south, east"
+msgstr "Destination: popup, south, east"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:262
-msgid "Undo last modification"
-msgstr "Annuler la dernière modification"
+#: ../lib/advene/gui/plugins/actions.py:144
+#: ../lib/advene/gui/views/viewbook.py:313
+msgid "Open a saved view"
+msgstr "Ouvrir une vue sauvegardée"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:268
-msgid "Merge with previous"
-msgstr "Fusionner avec la précédente"
+#: ../lib/advene/gui/plugins/actions.py:145
+msgid "Identifier of the saved view"
+msgstr "Identificateur de la vue sauvegardée"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:269
-msgid "Merge with previous annotation, i.e. remove this bound."
-msgstr "Fusionner avec la précédente annotation, i.e. supprimer cette borne."
+#: ../lib/advene/gui/plugins/actions.py:154
+msgid "Display a popup with 2 options"
+msgstr "Affiche une fenêtre proposant 2 choix"
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:274
-msgid "Close view."
-msgstr "Fermer la vue"
+# Description de la première option
+#: ../lib/advene/gui/plugins/actions.py:156
+#: ../lib/advene/gui/plugins/actions.py:178
+msgid "First option description"
+msgstr "Description de la première option"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:60
-#: ../lib/advene/gui/plugins/tracetimeline.py:61
-#: ../lib/advene/gui/plugins/eventaccumulator.py:73
-#: ../lib/advene/gui/plugins/eventaccumulator.py:74
-#: ../lib/advene/gui/plugins/tracepreview.py:72
-#: ../lib/advene/gui/plugins/tracepreview.py:73
-msgid "Beginning edition"
-msgstr "Début de l'édition"
+#: ../lib/advene/gui/plugins/actions.py:157
+#: ../lib/advene/gui/plugins/actions.py:179
+msgid "First position"
+msgstr "Première position"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:62
-#: ../lib/advene/gui/plugins/tracetimeline.py:63
-#: ../lib/advene/gui/plugins/tracetimeline.py:64
-#: ../lib/advene/gui/plugins/eventaccumulator.py:75
-#: ../lib/advene/gui/plugins/eventaccumulator.py:76
-#: ../lib/advene/gui/plugins/eventaccumulator.py:77
-#: ../lib/advene/gui/plugins/tracepreview.py:74
-#: ../lib/advene/gui/plugins/tracepreview.py:75
-#: ../lib/advene/gui/plugins/tracepreview.py:76
-msgid "Canceling edition"
-msgstr "Abandon de l'édition"
+#: ../lib/advene/gui/plugins/actions.py:158
+#: ../lib/advene/gui/plugins/actions.py:180
+msgid "Second option description"
+msgstr "Description de la deuxième option"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:65
-#: ../lib/advene/gui/plugins/eventaccumulator.py:78
-#: ../lib/advene/gui/plugins/tracepreview.py:77
-msgid "Ending edition"
-msgstr "Fin de l'édition"
+#: ../lib/advene/gui/plugins/actions.py:159
+#: ../lib/advene/gui/plugins/actions.py:181
+msgid "Second position"
+msgstr "Deuxième position"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:66
-#: ../lib/advene/gui/plugins/tracepreview.py:78
-msgid "Moving to"
-msgstr "Déplacement à"
+#: ../lib/advene/gui/plugins/actions.py:163
+#: ../lib/advene/gui/plugins/actions.py:187
+msgid "Go to the beginning"
+msgstr "Aller au début"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:82
-msgid "Traces"
-msgstr "Traces"
+#: ../lib/advene/gui/plugins/actions.py:165
+#: ../lib/advene/gui/plugins/actions.py:189
+msgid "Go to the end"
+msgstr "Aller à la fin"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:208
-#, python-format
-msgid "%(name)s (%(index)d)"
-msgstr "%(name)s (%(index)d)"
+#: ../lib/advene/gui/plugins/actions.py:176
+msgid "Display a popup with 3 options"
+msgstr "Affiche une fenêtre proposant 3 choix"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:236
-msgid "Search"
-msgstr "Chercher"
+#: ../lib/advene/gui/plugins/actions.py:182
+msgid "Third option description"
+msgstr "Description de la troisième option"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:249
-#: ../lib/advene/gui/plugins/tracetimeline.py:1224
-#, python-format
-msgid "%(name)s (%(index)s)"
-msgstr "%(name)s (%(index)s)"
+#: ../lib/advene/gui/plugins/actions.py:183
+msgid "Third position"
+msgstr "Troisième position"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:421
-#: ../lib/advene/gui/edit/montage.py:439
-#: ../lib/advene/gui/views/timeline.py:3444
-msgid "Zoom out"
-msgstr "Dézoomer"
+#: ../lib/advene/gui/plugins/actions.py:202
+msgid "Display a popup to navigate to related annotations"
+msgstr "Affiche une fenêtre de navigation suivant les relations"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:426
-#: ../lib/advene/gui/edit/montage.py:444
-#: ../lib/advene/gui/views/timeline.py:3449
-msgid "Zoom in"
-msgstr "Zoomer"
+#: ../lib/advene/gui/plugins/actions.py:204
+#: ../lib/advene/gui/plugins/actions.py:559
+msgid "Choose the related annotation you want to visualise."
+msgstr "Choisissez l'annotation liée que vous souhaitez visualiser."
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:431
-msgid "Zoom 100%"
-msgstr "Zoom 100%"
+#: ../lib/advene/gui/plugins/actions.py:211
+msgid "Create a bookmark"
+msgstr "Créer un signet"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:435
-msgid "Toggle links lock"
-msgstr "Modifier le verrou des liens"
+#: ../lib/advene/gui/plugins/actions.py:212
+msgid "Bookmark position (in ms)"
+msgstr "Position du signet (en ms)"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:443
-msgid "Toggle link mode"
-msgstr "Modifier le mode verrou"
+#: ../lib/advene/gui/plugins/actions.py:213
+msgid "Bookmark content."
+msgstr "Contenu du signet"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:450
-msgid "Open a trace file"
-msgstr "Ouvrir un fichier de trace"
+#: ../lib/advene/gui/plugins/actions.py:214
+msgid "Bookmark"
+msgstr "Signet"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:465
-msgid "Toggle auto refresh"
-msgstr "Changer le rafraîchissement automatique"
+#: ../lib/advene/gui/plugins/actions.py:234 ../lib/advene/plugins/brltty.py:242
+#: ../lib/advene/plugins/tts.py:113
+msgid "Unknown rule"
+msgstr "Règle inconnue"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:476
-msgid "Open an existing trace"
-msgstr "Ouvrir une trace existante"
+#: ../lib/advene/gui/plugins/actions.py:235 ../lib/advene/plugins/brltty.py:243
+#: ../lib/advene/plugins/tts.py:114
+#, python-format
+msgid ""
+"Rule %(rulename)s: Error in the evaluation of the parameter "
+"%(parametername)s:"
+msgstr ""
+"Règle %(rulename)s: erreur dans l'évaluation du paramètre %(parametername)s:"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:482
-msgid "Save trace"
-msgstr "Sauver la trace"
+#: ../lib/advene/gui/plugins/actions.py:247 ../lib/advene/rules/actions.py:385
+#, python-format
+msgid "The %s-related outgoing annotation"
+msgstr "L'annotation liée par une relation sortante de type %s"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:487
-msgid "Configuration"
-msgstr "Configuration"
+#: ../lib/advene/gui/plugins/actions.py:249 ../lib/advene/rules/actions.py:387
+#, python-format
+msgid "The %s-related incoming annotation"
+msgstr "L'annotation liée par une relation entrante de type %s"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:668
-#: ../lib/advene/gui/plugins/eventaccumulator.py:202
-msgid "Exporting traces"
-msgstr "Export des traces"
+#: ../lib/advene/gui/plugins/actions.py:259
+#: ../lib/advene/gui/plugins/actions.py:340
+#: ../lib/advene/gui/plugins/actions.py:358 ../lib/advene/plugins/tts.py:134
+msgid "No message..."
+msgstr "Pas de message"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:673
-#: ../lib/advene/gui/plugins/eventaccumulator.py:207
+#: ../lib/advene/gui/plugins/actions.py:276
 #, python-format
-msgid ""
-"Export done to\n"
-"%s"
-msgstr ""
-"Export effectué vers\n"
-"%s"
+msgid "Error: undefined GUI view %s"
+msgstr "Erreur : la vue d'interface %s n'est pas définie"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:951
-msgid "Zoom and center on linked items"
-msgstr "Zoomer et centrer sur les items liés"
+#: ../lib/advene/gui/plugins/actions.py:322
+#, python-format
+msgid "Element %s does not look like a view"
+msgstr "L'élément %s ne ressemble pas à une vue"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:960
-msgid "Edit item"
-msgstr "Éditer l'élément"
+#: ../lib/advene/gui/plugins/actions.py:350
+msgid "Information popup"
+msgstr "Fenêtre d'information"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:964
-msgid "Recreate item"
-msgstr "Recréer l'élément"
+#: ../lib/advene/gui/plugins/actions.py:364
+#, python-format
+msgid "Empty destination for entry popup: %s"
+msgstr "Destination vide pour la fenêtre d'entrée : %s"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:980
-#: ../lib/advene/gui/plugins/tracetimeline.py:1001
-#: ../lib/advene/gui/edit/transcribe.py:502
-#: ../lib/advene/gui/views/timeline.py:2556 ../lib/advene/gui/popup.py:513
-msgid "Go to..."
-msgstr "Aller à..."
+#: ../lib/advene/gui/plugins/actions.py:367
+#, python-format
+msgid "Destination does not have a content: %s"
+msgstr "La destination ne possède pas de contenu: %s"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:984
-msgid "Zoom on action"
-msgstr "Zoom sur l'action"
+#: ../lib/advene/gui/plugins/actions.py:394
+msgid "Entry popup"
+msgstr "Fenêtre d'entrée"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2030
-#: ../lib/advene/gui/edit/montage.py:535
-#: ../lib/advene/gui/views/timeline.py:3318
-msgid "Inspector"
-msgstr "Inspecteur"
+#: ../lib/advene/gui/plugins/actions.py:419
+msgid "Follow a link"
+msgstr "Suivre un lien"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2035
-msgid "Item Id"
-msgstr "Id de l'élément"
+#: ../lib/advene/gui/plugins/actions.py:423
+msgid "Click to open the URL"
+msgstr "Cliquer pour ouvrir l'URL"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2038
-msgid "Item name or class"
-msgstr "Nom ou classe de l'élément"
+#: ../lib/advene/gui/plugins/actions.py:441
+msgid "URL popup"
+msgstr "Fenêtre URL"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2042
-msgid "Type or schema"
-msgstr "Type ou schéma"
+#: ../lib/advene/gui/plugins/actions.py:454
+#: ../lib/advene/gui/plugins/actions.py:491
+msgid "Make a choice"
+msgstr "Faites un choix"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2045
-msgid "Operations"
-msgstr "Opérations"
+#: ../lib/advene/gui/plugins/actions.py:458
+msgid "Click to go to another position"
+msgstr "Choisissez l'option pour aller à une autre position"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2087
-msgid "Comment"
-msgstr "Commentaire"
+#: ../lib/advene/gui/plugins/actions.py:477
+#: ../lib/advene/gui/plugins/actions.py:515
+#: ../lib/advene/gui/views/singletonpopup.py:98
+msgid "Navigation popup"
+msgstr "Fenêtre de navigation"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2119
-#: ../lib/advene/gui/edit/merge.py:191
-msgid "Action"
-msgstr "Action"
+#: ../lib/advene/gui/plugins/actions.py:500
+#, python-format
+msgid "Choice %d"
+msgstr "Choix %d"
+
+#: ../lib/advene/gui/plugins/actions.py:521
+msgid "The beginning of the annotation"
+msgstr "Le début de l'annotation"
+
+#: ../lib/advene/gui/plugins/actions.py:522
+msgid "The end of the annotation"
+msgstr "La fin de l'annotation"
+
+#: ../lib/advene/gui/plugins/actions.py:523
+msgid "The next annotation of the same type"
+msgstr "L'annotation suivante du même type"
+
+#: ../lib/advene/gui/plugins/actions.py:524
+msgid "The previous annotation of the same type"
+msgstr "L'annotation précédente du même type"
+
+#: ../lib/advene/gui/plugins/actions.py:573
+#, python-format
+msgid ""
+"Through %(title)s%(relation_content)s:\n"
+"%(annotation_content)s"
+msgstr ""
+"Via %(title)s%(relation_content)s:\n"
+"%(annotation_content)s"
+
+#: ../lib/advene/gui/plugins/actions.py:581
+msgid "Relation navigation"
+msgstr "Navigation de relation"
+
+#: ../lib/advene/gui/plugins/actions.py:591
+msgid "New bookmark"
+msgstr "Nouveau signet"
 
-#: ../lib/advene/gui/plugins/kinect.py:41
+#: ../lib/advene/gui/plugins/kinect.py:38
 msgid "Kinect Controller"
 msgstr "Contrôleur Kinect"
 
-#: ../lib/advene/gui/plugins/kinect.py:43
+#: ../lib/advene/gui/plugins/kinect.py:40
 msgid "Kinect control interface"
 msgstr "Interface de contrôle Kinect"
 
-#: ../lib/advene/gui/plugins/actions.py:52
-msgid "Display a popup"
-msgstr "Afficher une popup"
+#: ../lib/advene/gui/plugins/contenthandlers.py:127
+msgid "Label"
+msgstr "Label"
 
-#: ../lib/advene/gui/plugins/actions.py:54
-#: ../lib/advene/gui/plugins/actions.py:73
-#: ../lib/advene/gui/plugins/actions.py:88
-#: ../lib/advene/gui/plugins/actions.py:104
-#: ../lib/advene/gui/plugins/actions.py:160
-#: ../lib/advene/gui/plugins/actions.py:184
-msgid "Display duration in ms. Ignored if empty."
-msgstr "Durée de l'affichage en ms. Ignoré si vide."
+#: ../lib/advene/gui/plugins/contenthandlers.py:177
+#, python-format
+msgid ""
+"Error while parsing SVG content:\n"
+"\n"
+"%s"
+msgstr ""
+"Erreur lors de la lecture du SVG:\n"
+"\n"
+"%s"
 
-#: ../lib/advene/gui/plugins/actions.py:70
-msgid "Popup an entry box"
-msgstr "Affiche une fenêtre proposant d'entrer du texte"
+#: ../lib/advene/gui/plugins/contenthandlers.py:252
+msgid " created from "
+msgstr " créé depuis "
 
-#: ../lib/advene/gui/plugins/actions.py:72
-msgid "Object where to store the answer (should have a content)"
-msgstr "Objet où stocker la réponse (doit posséder un attribut content)"
+#: ../lib/advene/gui/plugins/contenthandlers.py:329
+msgid "Graphical editor"
+msgstr "Éditeur graphique"
 
-#: ../lib/advene/gui/plugins/actions.py:84
-msgid "Display a popup to go to another position"
-msgstr "Affiche une fenêtre proposant d'aller à une nouvelle position"
+#: ../lib/advene/gui/plugins/contenthandlers.py:340
+msgid "Edit XML"
+msgstr "Éditer le XML"
 
-#: ../lib/advene/gui/plugins/actions.py:85
-#: ../lib/advene/gui/plugins/actions.py:101
-#: ../lib/advene/gui/plugins/actions.py:155
-#: ../lib/advene/gui/plugins/actions.py:177
-msgid "General description"
-msgstr "Description générale"
+#: ../lib/advene/gui/plugins/contenthandlers.py:392
+#: ../lib/advene/gui/plugins/contenthandlers.py:448
+#: ../lib/advene/gui/edit/rules.py:188
+#, python-format
+msgid ""
+"The following items seem to be\n"
+"invalid TALES expressions:\n"
+"\n"
+"%s"
+msgstr ""
+"Les éléments suivants semblent être\n"
+"des expressions TALES non valides :\n"
+"\n"
+"%s"
 
-#: ../lib/advene/gui/plugins/actions.py:87
-msgid "New position"
-msgstr "Nouvelle position"
+#: ../lib/advene/gui/plugins/tracepreview.py:61
+msgid "Trace preview"
+msgstr "Prévisualisation de trace"
 
-#: ../lib/advene/gui/plugins/actions.py:90
-#: ../lib/advene/gui/plugins/actions.py:191
-msgid "Go to related annotation"
-msgstr "Aller à l'annotation liée"
+#: ../lib/advene/gui/plugins/tracepreview.py:99
+msgid "Full trace"
+msgstr "Trace entière"
 
-#: ../lib/advene/gui/plugins/actions.py:100
-msgid "Display a popup linking to an URL"
-msgstr "Affiche une fenêtre proposant une URL"
+#: ../lib/advene/gui/plugins/tracepreview.py:100
+msgid "Open the trace timeline view fareast"
+msgstr "Ouvrir la vue timeline de trace"
 
-#: ../lib/advene/gui/plugins/actions.py:106
-msgid "string:Display annotation in web browser"
-msgstr "string:Affiche l'annotation dans un navigateur web"
+#: ../lib/advene/gui/plugins/videoplayer.py:39
+msgid "Complementary video player"
+msgstr "Lecteur vidéo supplémentaire"
 
-#: ../lib/advene/gui/plugins/actions.py:113
-#: ../lib/advene/gui/views/logwindow.py:160
-#: ../lib/advene/gui/views/logwindow.py:163
-msgid "See the Advene website"
-msgstr "Voir le site web d'Advene"
+#: ../lib/advene/gui/plugins/videoplayer.py:45
+#: ../lib/advene/gui/views/bookmarks.py:246
+#: ../lib/advene/gui/views/transcription.py:59
+#: ../lib/advene/gui/views/timeline.py:140 ../lib/advene/gui/edit/montage.py:58
+#: ../lib/advene/gui/edit/transcribe.py:88
+msgid "Save view"
+msgstr "Sauvegarder la vue"
 
-#: ../lib/advene/gui/plugins/actions.py:114
-#: ../lib/advene/gui/views/logwindow.py:164
-msgid "See the annotation"
-msgstr "Voir l'annotation"
+#: ../lib/advene/gui/plugins/videoplayer.py:46
+#: ../lib/advene/gui/views/transcription.py:60
+#: ../lib/advene/gui/views/timeline.py:141 ../lib/advene/gui/views/tagbag.py:65
+#: ../lib/advene/gui/views/interactivequery.py:61
+#: ../lib/advene/gui/edit/transcribe.py:89
+msgid "Save default options"
+msgstr "Sauver les options par défaut"
 
-#: ../lib/advene/gui/plugins/actions.py:117
-#: ../lib/advene/gui/views/logwindow.py:167
-msgid "The Advene website"
-msgstr "Le site web d'Advene"
+#: ../lib/advene/gui/plugins/videoplayer.py:47
+msgid "Select video file"
+msgstr "Choisir un fichier vidéo"
 
-#: ../lib/advene/gui/plugins/actions.py:118
-#: ../lib/advene/gui/views/logwindow.py:168
-msgid "The annotation URL"
-msgstr "L'URL de l'annotation"
+#: ../lib/advene/gui/plugins/videoplayer.py:128
+msgid "Select a video file"
+msgstr "Choisir un fichier vidéo"
 
-#: ../lib/advene/gui/plugins/actions.py:130
-msgid "Open an interface view"
-msgstr "Ouvrir une vue d'interface"
+#: ../lib/advene/gui/plugins/videoplayer.py:250
+msgid "Synchronize"
+msgstr "Synchroniser"
 
-#: ../lib/advene/gui/plugins/actions.py:131
-msgid ""
-"View name (timeline, tree, transcription, browser, webbrowser, transcribe)"
-msgstr ""
-"Nom de la vue (timeline, tree, transcription, browser, webbrowser, "
-"transcribe)"
+#: ../lib/advene/gui/plugins/videoplayer.py:268
+msgid "Offset in ms"
+msgstr "Offset en ms"
 
-#: ../lib/advene/gui/plugins/actions.py:132
-msgid "Destination: popup, south, east"
-msgstr "Destination: popup, south, east"
+#: ../lib/advene/gui/plugins/videoplayer.py:276
+msgid "Drag and drop to get player time"
+msgstr "Glisser/déposer pour obtenir le temps du lecteur"
 
-#: ../lib/advene/gui/plugins/actions.py:144
-#: ../lib/advene/gui/views/viewbook.py:308
-msgid "Open a saved view"
-msgstr "Ouvrir une vue sauvegardée"
+#: ../lib/advene/gui/views/singletonpopup.py:32
+msgid "SingletonPopup"
+msgstr "Fenêtre singleton"
 
-#: ../lib/advene/gui/plugins/actions.py:145
-msgid "Identifier of the saved view"
-msgstr "Identificateur de la vue sauvegardée"
+#: ../lib/advene/gui/views/caption.py:31
+msgid "Display a text caption below the video output"
+msgstr "Composant dédié à l'affichage des sous-titres sous la vidéo"
 
-#: ../lib/advene/gui/plugins/actions.py:154
-msgid "Display a popup with 2 options"
-msgstr "Affiche une fenêtre proposant 2 choix"
+#: ../lib/advene/gui/views/html.py:90
+#, python-format
+msgid "%s%% loaded"
+msgstr "%s%% chargé"
 
-# Description de la première option
-#: ../lib/advene/gui/plugins/actions.py:156
-#: ../lib/advene/gui/plugins/actions.py:178
-msgid "First option description"
-msgstr "Description de la première option"
+#: ../lib/advene/gui/views/html.py:93
+#, python-format
+msgid "Title %s"
+msgstr "Titre %s"
 
-#: ../lib/advene/gui/plugins/actions.py:157
-#: ../lib/advene/gui/plugins/actions.py:179
-msgid "First position"
-msgstr "Première position"
+#: ../lib/advene/gui/views/html.py:157
+msgid "HTML Viewer"
+msgstr "Visualiseur HTML"
 
-#: ../lib/advene/gui/plugins/actions.py:158
-#: ../lib/advene/gui/plugins/actions.py:180
-msgid "Second option description"
-msgstr "Description de la deuxième option"
+#: ../lib/advene/gui/views/html.py:159
+msgid "Embedded HTML widget"
+msgstr "Composant de visualisation HTML"
 
-#: ../lib/advene/gui/plugins/actions.py:159
-#: ../lib/advene/gui/plugins/actions.py:181
-msgid "Second position"
-msgstr "Deuxième position"
+#: ../lib/advene/gui/views/html.py:187
+msgid "No available HTML rendering component"
+msgstr "Aucun moteur de rendu HTML n'est disponible"
 
-#: ../lib/advene/gui/plugins/actions.py:163
-#: ../lib/advene/gui/plugins/actions.py:187
-msgid "Go to the beginning"
-msgstr "Aller au début"
+#: ../lib/advene/gui/views/annotationdisplay.py:43
+msgid "AnnotationDisplay"
+msgstr "AfficheAnnotation"
 
-#: ../lib/advene/gui/plugins/actions.py:165
-#: ../lib/advene/gui/plugins/actions.py:189
-msgid "Go to the end"
-msgstr "Aller à la fin"
+#: ../lib/advene/gui/views/annotationdisplay.py:45
+msgid "Display the contents of an annotation"
+msgstr "Affiche le contenu d'une annotation"
 
-#: ../lib/advene/gui/plugins/actions.py:176
-msgid "Display a popup with 3 options"
-msgstr "Affiche une fenêtre proposant 3 choix"
+#: ../lib/advene/gui/views/annotationdisplay.py:86
+#: ../lib/advene/util/helper.py:610
+msgid "No annotation"
+msgstr "Pas d'annotation"
 
-#: ../lib/advene/gui/plugins/actions.py:182
-msgid "Third option description"
-msgstr "Description de la troisième option"
+#: ../lib/advene/gui/views/annotationdisplay.py:112
+#, python-format
+msgid ""
+"Schema %(schema)s (id %(id)s)\n"
+"%(description)s\n"
+"%(stats)s"
+msgstr ""
+"Schéma %(schema)s\n"
+"%(description)s\n"
+"%(total)s\n"
+"Id: %(id)s"
 
-#: ../lib/advene/gui/plugins/actions.py:183
-msgid "Third position"
-msgstr "Troisième position"
+#: ../lib/advene/gui/views/annotationdisplay.py:233
+msgid "Screenshot"
+msgstr "Aperçu"
 
-#: ../lib/advene/gui/plugins/actions.py:202
-msgid "Display a popup to navigate to related annotations"
-msgstr "Affiche une fenêtre de navigation suivant les relations"
+#: ../lib/advene/gui/views/annotationdisplay.py:255
+#: ../lib/advene/gui/views/relationdisplay.py:104
+msgid "Contents"
+msgstr "Contenu"
 
-#: ../lib/advene/gui/plugins/actions.py:204
-#: ../lib/advene/gui/plugins/actions.py:559
-msgid "Choose the related annotation you want to visualise."
-msgstr "Choisissez l'annotation liée que vous souhaitez visualiser."
+#: ../lib/advene/gui/views/annotationdisplay.py:258
+#: ../lib/advene/gui/views/editaccumulator.py:74
+msgid "Validate"
+msgstr "Valider"
 
-#: ../lib/advene/gui/plugins/actions.py:211
-msgid "Create a bookmark"
-msgstr "Créer un signet"
+#: ../lib/advene/gui/views/relationdisplay.py:34
+msgid "RelationDisplay"
+msgstr "AfficheRelation"
 
-#: ../lib/advene/gui/plugins/actions.py:212
-msgid "Bookmark position (in ms)"
-msgstr "Position du signet (en ms)"
+#: ../lib/advene/gui/views/relationdisplay.py:36
+msgid "Display the contents of a relation"
+msgstr "Affiche le contenu d'une relation"
 
-#: ../lib/advene/gui/plugins/actions.py:213
-msgid "Bookmark content."
-msgstr "Contenu du signet"
+#: ../lib/advene/gui/views/relationdisplay.py:79
+msgid "No relation"
+msgstr "Pas de relation"
 
-#: ../lib/advene/gui/plugins/actions.py:214
-msgid "Bookmark"
-msgstr "Signet"
+#: ../lib/advene/gui/views/relationdisplay.py:113
+#: ../lib/advene/gui/edit/elements.py:588
+#: ../lib/advene/gui/edit/elements.py:1071
+msgid "Members"
+msgstr "Membres"
 
-#: ../lib/advene/gui/plugins/actions.py:276
-#, python-format
-msgid "Error: undefined GUI view %s"
-msgstr "Erreur : la vue d'interface %s n'est pas définie"
+#: ../lib/advene/gui/views/viewplugin.py:60
+msgid "Generic view plugin"
+msgstr "Plugin de vue générique"
 
-#: ../lib/advene/gui/plugins/actions.py:286
-#: ../lib/advene/gui/views/viewbook.py:124 ../lib/advene/gui/main.py:1189
-msgid "...in its own window"
-msgstr "...dans sa propre fenêtre"
+#: ../lib/advene/gui/views/viewplugin.py:62
+msgid "You should not ever see this tooltip..."
+msgstr "Vous ne devriez pas voir cette information..."
 
-#: ../lib/advene/gui/plugins/actions.py:287
-#: ../lib/advene/gui/views/viewbook.py:125
-#: ../lib/advene/gui/views/__init__.py:381 ../lib/advene/gui/main.py:1190
-msgid "...embedded east of the video"
-msgstr "...intégrée à l'est de la vidéo"
+#: ../lib/advene/gui/views/checker.py:37
+msgid "Checker"
+msgstr "Vérificateur"
 
-#: ../lib/advene/gui/plugins/actions.py:288
-#: ../lib/advene/gui/views/viewbook.py:126
-#: ../lib/advene/gui/views/__init__.py:382 ../lib/advene/gui/main.py:1191
-msgid "...embedded west of the video"
-msgstr "...intégrée à l'ouest de la vidéo"
+#: ../lib/advene/gui/views/checker.py:39
+msgid "Check various package properties"
+msgstr "Vérifier diverses propriétés du recueil"
 
-#: ../lib/advene/gui/plugins/actions.py:289
-#: ../lib/advene/gui/views/viewbook.py:127
-#: ../lib/advene/gui/views/__init__.py:383 ../lib/advene/gui/main.py:1192
-msgid "...embedded south of the video"
-msgstr "...intégrée au sud de la vidéo"
+#: ../lib/advene/gui/views/checker.py:89
+msgid "List of possible issues in the current package"
+msgstr "Liste des problèmes possibles dans le recueil."
 
-#: ../lib/advene/gui/plugins/actions.py:290
-#: ../lib/advene/gui/views/viewbook.py:128
-#: ../lib/advene/gui/views/__init__.py:384 ../lib/advene/gui/main.py:1193
-msgid "...embedded at the right of the window"
-msgstr "...intégrée à droite de la vidéo"
+#: ../lib/advene/gui/views/checker.py:107
+msgid "Overlapping"
+msgstr "Recouvrement"
 
-#: ../lib/advene/gui/plugins/actions.py:322
-#, python-format
-msgid "Element %s does not look like a view"
-msgstr "L'élément %s ne ressemble pas à une vue"
+#: ../lib/advene/gui/views/table.py:61
+msgid "Annotation table view"
+msgstr "Tableau d'annotations"
 
-#: ../lib/advene/gui/plugins/actions.py:350
-msgid "Information popup"
-msgstr "Fenêtre d'information"
+#: ../lib/advene/gui/views/table.py:63
+msgid "Display annotations in a table"
+msgstr "Affiche les annotations dans un tableau"
 
-#: ../lib/advene/gui/plugins/actions.py:364
-#, python-format
-msgid "Empty destination for entry popup: %s"
-msgstr "Destination vide pour la fenêtre d'entrée : %s"
+#: ../lib/advene/gui/views/table.py:74
+msgid "Export as CSV"
+msgstr "Exporter en CSV"
 
-#: ../lib/advene/gui/plugins/actions.py:367
-#, python-format
-msgid "Destination does not have a content: %s"
-msgstr "La destination ne possède pas de contenu: %s"
+#: ../lib/advene/gui/views/table.py:268 ../lib/advene/gui/views/table.py:550
+msgid "Snapshot"
+msgstr "Copie d'écran"
 
-#: ../lib/advene/gui/plugins/actions.py:394
-msgid "Entry popup"
-msgstr "Fenêtre d'entrée"
+#: ../lib/advene/gui/views/table.py:281
+#: ../lib/advene/gui/views/timeline.py:1745
+msgid "Cannot update the annotation, its representation is too complex"
+msgstr "Impossible de l'annotation, sa représentation est trop complexe."
 
-#: ../lib/advene/gui/plugins/actions.py:419
-msgid "Follow a link"
-msgstr "Suivre un lien"
+#: ../lib/advene/gui/views/table.py:311 ../lib/advene/gui/edit/elements.py:606
+#: ../lib/advene/gui/edit/elements.py:683
+#: ../lib/advene/gui/edit/elements.py:743
+#: ../lib/advene/gui/edit/elements.py:1134
+msgid "Content"
+msgstr "Contenu"
 
-#: ../lib/advene/gui/plugins/actions.py:423
-msgid "Click to open the URL"
-msgstr "Cliquer pour ouvrir l'URL"
+#: ../lib/advene/gui/views/table.py:312 ../lib/advene/gui/views/table.py:682
+#: ../lib/advene/gui/views/browser.py:368 ../lib/advene/gui/edit/create.py:94
+#: ../lib/advene/gui/edit/elements.py:514
+#: ../lib/advene/gui/edit/elements.py:563
+#: ../lib/advene/gui/edit/elements.py:665
+msgid "Type"
+msgstr "Type"
 
-#: ../lib/advene/gui/plugins/actions.py:441
-msgid "URL popup"
-msgstr "Fenêtre URL"
+#: ../lib/advene/gui/views/table.py:313 ../lib/advene/gui/edit/elements.py:1800
+msgid "Begin"
+msgstr "Début"
 
-#: ../lib/advene/gui/plugins/actions.py:454
-#: ../lib/advene/gui/plugins/actions.py:491
-msgid "Make a choice"
-msgstr "Faites un choix"
+#: ../lib/advene/gui/views/table.py:316 ../lib/advene/gui/views/table.py:683
+#: ../lib/advene/gui/util/dialog.py:400 ../lib/advene/gui/edit/rules.py:1091
+#: ../lib/advene/gui/edit/imports.py:328 ../lib/advene/gui/edit/elements.py:513
+#: ../lib/advene/gui/edit/elements.py:562
+#: ../lib/advene/gui/edit/elements.py:650
+#: ../lib/advene/gui/edit/elements.py:730
+#: ../lib/advene/gui/edit/elements.py:879
+#: ../lib/advene/gui/edit/elements.py:948
+#: ../lib/advene/gui/edit/elements.py:1060
+#: ../lib/advene/gui/edit/elements.py:1121
+msgid "Id"
+msgstr "Id"
 
-#: ../lib/advene/gui/plugins/actions.py:458
-msgid "Click to go to another position"
-msgstr "Choisissez l'option pour aller à une autre position"
+#: ../lib/advene/gui/views/table.py:317 ../lib/advene/gui/views/finder.py:105
+#: ../lib/advene/util/helper.py:408
+msgid "Package"
+msgstr "Recueil"
 
-#: ../lib/advene/gui/plugins/actions.py:477
-#: ../lib/advene/gui/plugins/actions.py:515
-#: ../lib/advene/gui/views/singletonpopup.py:98
-msgid "Navigation popup"
-msgstr "Fenêtre de navigation"
-
-#: ../lib/advene/gui/plugins/actions.py:500
-#, python-format
-msgid "Choice %d"
-msgstr "Choix %d"
-
-#: ../lib/advene/gui/plugins/actions.py:521
-msgid "The beginning of the annotation"
-msgstr "Le début de l'annotation"
-
-#: ../lib/advene/gui/plugins/actions.py:522
-msgid "The end of the annotation"
-msgstr "La fin de l'annotation"
-
-#: ../lib/advene/gui/plugins/actions.py:523
-msgid "The next annotation of the same type"
-msgstr "L'annotation suivante du même type"
-
-#: ../lib/advene/gui/plugins/actions.py:524
-msgid "The previous annotation of the same type"
-msgstr "L'annotation précédente du même type"
+#: ../lib/advene/gui/views/table.py:455 ../lib/advene/gui/views/table.py:633
+msgid "Export data to file..."
+msgstr "Exporter les données vers le fichier..."
 
-#: ../lib/advene/gui/plugins/actions.py:573
+#: ../lib/advene/gui/views/table.py:464 ../lib/advene/gui/views/table.py:642
 #, python-format
-msgid ""
-"Through %(title)s%(relation_content)s:\n"
-"%(annotation_content)s"
-msgstr ""
-"Via %(title)s%(relation_content)s:\n"
-"%(annotation_content)s"
-
-#: ../lib/advene/gui/plugins/actions.py:581
-msgid "Relation navigation"
-msgstr "Navigation de relation"
+msgid "Error while exporting data to %(filename)s: %(error)s"
+msgstr "Impossible d'exporter dans %(filename)s : %(error)s"
 
-#: ../lib/advene/gui/plugins/actions.py:591
-msgid "New bookmark"
-msgstr "Nouveau signet"
+#: ../lib/advene/gui/views/table.py:475
+msgid "id"
+msgstr "id"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:43
-msgid "Activity trace"
-msgstr "Trace d'activité"
+#: ../lib/advene/gui/views/table.py:475
+msgid "type"
+msgstr "type"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:134
-msgid " Trace : "
-msgstr "Trace : "
+#: ../lib/advene/gui/views/table.py:475
+msgid "begin"
+msgstr "début"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:138
-msgid " Filters"
-msgstr "Filtres"
+#: ../lib/advene/gui/views/table.py:475
+msgid "end"
+msgstr "fin"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:142
-#: ../lib/advene/gui/main.py:4178
-msgid "Reset"
-msgstr "Reset"
+#: ../lib/advene/gui/views/table.py:475
+msgid "content"
+msgstr "contenu"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:167
-msgid " Time : "
-msgstr " Temps : "
+#: ../lib/advene/gui/views/table.py:479 ../lib/advene/gui/views/table.py:658
+#: ../lib/advene/core/controller.py:2646
+#, python-format
+msgid "Data exported to %s"
+msgstr "Données exportées vers %s"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:177
-msgid " Max. : "
-msgstr " Max. : "
+#: ../lib/advene/gui/views/table.py:499
+#, python-format
+msgid "Set %(attr)s time to %(time)s"
+msgstr "Fixer le temps de $(attr)s à %(time)s"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:186
-msgid "Export"
-msgstr "Export"
+#: ../lib/advene/gui/views/table.py:558
+msgid "Generic table view"
+msgstr "Tableau d'éléments"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:253
-msgid "Defining Filters"
-msgstr "Définition de filtres"
+#: ../lib/advene/gui/views/table.py:560
+msgid "Display Advene elements in a table."
+msgstr "Affiche des éléments Advene dans un tableau"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:559
-#: ../lib/advene/gui/plugins/eventaccumulator.py:614
-#: ../lib/advene/gui/plugins/tracepreview.py:214
+#: ../lib/advene/gui/views/table.py:583
 #, python-format
-msgid "of an annotation (%s)"
-msgstr "d'une annotation (%s)"
+msgid "Error in source evaluation %(source)s: %(error)s"
+msgstr "Erreur dans l'évaluation de l'expression %(source)s: %(error)s"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:561
-#: ../lib/advene/gui/plugins/eventaccumulator.py:616
-#: ../lib/advene/gui/plugins/tracepreview.py:216
-#, python-format
-msgid "of a relation (%s)"
-msgstr "d'une relation (%s)"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element title"
+msgstr "Titre de l'élément"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:563
-#: ../lib/advene/gui/plugins/eventaccumulator.py:618
-#: ../lib/advene/gui/plugins/tracepreview.py:218
-#, python-format
-msgid "of an annotation type (%s)"
-msgstr "d'un type d'annotation (%s)"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element type"
+msgstr "Type de l'élément"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:565
-#: ../lib/advene/gui/plugins/eventaccumulator.py:620
-#: ../lib/advene/gui/plugins/tracepreview.py:220
-#, python-format
-msgid "of a relation type (%s)"
-msgstr "d'un type de relation (%s)"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element id"
+msgstr "Identificateur de l'élément"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:567
-#: ../lib/advene/gui/plugins/eventaccumulator.py:622
-#: ../lib/advene/gui/plugins/tracepreview.py:222
-#, python-format
-msgid "of a schema (%s)"
-msgstr "d'un schéma (%s)"
+#: ../lib/advene/gui/views/accumulatorpopup.py:51
+msgid "PopupAccumulator"
+msgstr "Accumulateur de popups"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:569
-#: ../lib/advene/gui/plugins/eventaccumulator.py:624
-#: ../lib/advene/gui/plugins/tracepreview.py:224
-#, python-format
-msgid "of a view (%s)"
-msgstr "d'une vue (%s)"
+#: ../lib/advene/gui/views/bookmarks.py:51
+msgid "Bookmarks importer"
+msgstr "Importateur de signets"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:571
-#: ../lib/advene/gui/plugins/eventaccumulator.py:626
-#: ../lib/advene/gui/plugins/tracepreview.py:226
-#, python-format
-msgid "of a package (%s)"
-msgstr "d'un recueil (%s)"
+#: ../lib/advene/gui/views/bookmarks.py:72
+msgid "Bookmarks"
+msgstr "Signets"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:573
-#: ../lib/advene/gui/plugins/eventaccumulator.py:628
-#: ../lib/advene/gui/plugins/tracepreview.py:228
-#, python-format
-msgid "of an unknown item (%s)"
-msgstr "d'un élément inconnu (%s)"
+#: ../lib/advene/gui/views/bookmarks.py:74
+msgid "Bookmark timecodes with their corresponding screenshots"
+msgstr "Mémorise les temps avec les captures d'écran correspondantes"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:122
-msgid "Label"
-msgstr "Label"
+#: ../lib/advene/gui/views/bookmarks.py:80 ../lib/advene/gui/views/tagbag.py:63
+#: ../lib/advene/gui/views/activebookmarks.py:62
+#: ../lib/advene/gui/views/logwindow.py:50 ../lib/advene/gui/edit/montage.py:59
+msgid "Clear"
+msgstr "Effacer"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:172
-#, python-format
-msgid ""
-"Error while parsing SVG content:\n"
-"\n"
-"%s"
-msgstr ""
-"Erreur lors de la lecture du SVG:\n"
-"\n"
-"%s"
+#: ../lib/advene/gui/views/bookmarks.py:145
+msgid "Select the annotation type to generate"
+msgstr "Choisissez le type d'annotation à générer"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:247
-msgid " created from "
-msgstr " créé depuis "
+#: ../lib/advene/gui/views/bookmarks.py:150
+msgid "Choose a duration"
+msgstr "Choisissez une durée"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:315
-msgid "Graphical editor"
-msgstr "Éditeur graphique"
+#: ../lib/advene/gui/views/bookmarks.py:151
+msgid "Enter the standard duration (in ms) of created annotations."
+msgstr "Entrez la durée standard (en ms) des annotations créées"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:326
-msgid "Edit XML"
-msgstr "Éditer le XML"
+#: ../lib/advene/gui/views/bookmarks.py:168
+msgid "Converted from bookmarks"
+msgstr "Converti depuis les signets"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:378
-#: ../lib/advene/gui/plugins/contenthandlers.py:434
-#: ../lib/advene/gui/edit/rules.py:186
+#: ../lib/advene/gui/views/bookmarks.py:172
+#: ../lib/advene/gui/edit/transcribe.py:1114
 #, python-format
 msgid ""
-"The following items seem to be\n"
-"invalid TALES expressions:\n"
-"\n"
-"%s"
+"Conversion completed.\n"
+"%s annotations generated."
 msgstr ""
-"Les éléments suivants semblent être\n"
-"des expressions TALES non valides :\n"
-"\n"
-"%s"
+"Conversion terminée.\n"
+"%s annotations générées."
 
-#: ../lib/advene/gui/plugins/videoplayer.py:36 ../lib/advene/gui/main.py:1235
-msgid "Video player"
-msgstr "Lecteur vidéo"
+#: ../lib/advene/gui/views/bookmarks.py:226
+msgid "Drop a position here to remove it from the list"
+msgstr "Déposez une position ici pour l'enlever de la liste"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:38
-msgid "Complementary video player"
-msgstr "Lecteur vidéo supplémentaire"
+#: ../lib/advene/gui/views/bookmarks.py:244
+#: ../lib/advene/gui/views/activebookmarks.py:496
+msgid "Insert a bookmark for the current video time"
+msgstr "Insérer un signet pour la position courante"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:44
-#: ../lib/advene/gui/edit/montage.py:54
-#: ../lib/advene/gui/edit/transcribe.py:85
-#: ../lib/advene/gui/views/transcription.py:56
 #: ../lib/advene/gui/views/bookmarks.py:245
-#: ../lib/advene/gui/views/timeline.py:135
-msgid "Save view"
-msgstr "Sauvegarder la vue"
-
-#: ../lib/advene/gui/plugins/videoplayer.py:45
-#: ../lib/advene/gui/edit/transcribe.py:86
-#: ../lib/advene/gui/views/tagbag.py:62
-#: ../lib/advene/gui/views/transcription.py:57
-#: ../lib/advene/gui/views/interactivequery.py:60
-#: ../lib/advene/gui/views/timeline.py:136
-msgid "Save default options"
-msgstr "Sauver les options par défaut"
+msgid "Convert bookmarks to annotations"
+msgstr "Convertir les signets en annotations"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:46
-msgid "Select video file"
-msgstr "Choisir un fichier vidéo"
+#: ../lib/advene/gui/views/viewbook.py:39
+msgid "ViewBook"
+msgstr "Collection de vues"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:127
-msgid "Select a video file"
-msgstr "Choisir un fichier vidéo"
+#: ../lib/advene/gui/views/viewbook.py:60
+#: ../lib/advene/gui/views/viewbook.py:67
+msgid "Cannot remove this widget, it is essential."
+msgstr "Impossible de supprimer ce composant, il est essentiel."
 
-#: ../lib/advene/gui/plugins/videoplayer.py:250
-msgid "Synchronize"
-msgstr "Synchroniser"
+#: ../lib/advene/gui/views/viewbook.py:141
+msgid "Detach"
+msgstr "Détacher"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:266
-msgid "Offset in ms"
-msgstr "Offset en ms"
+#: ../lib/advene/gui/views/viewbook.py:145
+#: ../lib/advene/gui/views/editaccumulator.py:80
+msgid "Close"
+msgstr "Fermer"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:274
-msgid "Drag and drop to get player time"
-msgstr "Glisser/déposer pour obtenir le temps du lecteur"
+#: ../lib/advene/gui/views/viewbook.py:162
+msgid "Rename the view"
+msgstr "Renommer la vue"
 
-#: ../lib/advene/gui/plugins/tracepreview.py:61
-msgid "Trace preview"
-msgstr "Prévisualisation de trace"
+#: ../lib/advene/gui/views/viewbook.py:163
+msgid "Please enter the new name of the view"
+msgstr "Entrez le nouveau nom de la vue"
 
-#: ../lib/advene/gui/plugins/tracepreview.py:99
-msgid "Full trace"
-msgstr "Trace entière"
+#: ../lib/advene/gui/views/viewbook.py:202
+msgid "Detach view in its own window, or drag-and-drop to another zone"
+msgstr ""
+"Détacher la vue dans sa propre fenêtre, ou glisser-déposer vers une autre "
+"zone"
 
-#: ../lib/advene/gui/plugins/tracepreview.py:100
-msgid "Open the trace timeline view fareast"
-msgstr "Ouvrir la vue timeline de trace"
+#: ../lib/advene/gui/views/viewbook.py:216
+msgid "Close view"
+msgstr "Fermer la vue"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:376
+#: ../lib/advene/gui/views/viewbook.py:239
+#: ../lib/advene/gui/views/viewbook.py:245
+#: ../lib/advene/gui/edit/elements.py:336
 #, python-format
-msgid "Rendering type %(type)s as %(presentation)s"
-msgstr "Rendu du type %(type)s sous forme de %(presentation)s"
+msgid "Edit %s"
+msgstr "Éditer %s"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:521
-msgid "Snapshot only"
-msgstr "Vignette seulement"
+#: ../lib/advene/gui/views/viewbook.py:268 ../lib/advene/rules/actions.py:601
+#, python-format
+msgid "Cannot find the view %s"
+msgstr "Impossible de trouver la vue  %s"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:522
-msgid "Overlayed snapshot only"
-msgstr "Vignette enrichiee seulement"
+#: ../lib/advene/gui/views/viewbook.py:291
+#, python-format
+msgid "Open a new %s for..."
+msgstr "Ouvrir une nouvelle vue %s pour..."
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:523
-msgid "Timestamp only"
-msgstr "Temps seulement"
+#: ../lib/advene/gui/views/viewbook.py:303
+msgid "Create a new comment view"
+msgstr "Créer une nouvelle vue commentaire"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:524
-msgid "Snapshot+timestamp"
-msgstr "Vignette+temps"
+#: ../lib/advene/gui/views/viewbook.py:305
+msgid "Open a new view"
+msgstr "Ouvrir une nouvelle vue"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:525
-msgid "Annotation content"
-msgstr "Le contenu de l'annotation"
+#: ../lib/advene/gui/views/viewbook.py:388
+#, python-format
+msgid "Use annotation-type %s :"
+msgstr "Utiliser le type d'annotation %s :"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:540
-msgid "as a list"
-msgstr "comme une liste"
+#: ../lib/advene/gui/views/viewbook.py:392
+#: ../lib/advene/gui/views/viewbook.py:418
+msgid "to edit it"
+msgstr "pour l'éditer"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:541
-msgid "as a grid"
-msgstr "comme une grille"
+#: ../lib/advene/gui/views/viewbook.py:393
+#: ../lib/advene/gui/views/viewbook.py:419
+#: ../lib/advene/gui/views/viewbook.py:451
+msgid "to create a new static view"
+msgstr "pour créer une nouvelle vue statique"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:542
-msgid "as a table"
-msgstr "comme une table"
+#: ../lib/advene/gui/views/viewbook.py:395
+msgid "in a timeline"
+msgstr "dans une ligne de temps"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:543
-#: ../lib/advene/gui/views/viewbook.py:380
-msgid "as a transcription"
-msgstr "comme une transcription"
+#: ../lib/advene/gui/views/viewbook.py:396
+msgid "as a montage"
+msgstr "comme un montage"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:661
-#: ../lib/advene/gui/views/transcription.py:461
-#, python-format
-msgid "Annotation %s"
-msgstr "Annotation %s"
+#: ../lib/advene/gui/views/viewbook.py:397
+#: ../lib/advene/gui/views/viewbook.py:450
+msgid "in a table"
+msgstr "dans une table"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:662
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:681
-msgid "Play video"
-msgstr "Jouer la vidéo"
+#: ../lib/advene/gui/views/viewbook.py:398
+#: ../lib/advene/gui/views/viewbook.py:420
+msgid "in a query"
+msgstr "dans une requête"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:663
-msgid "Show timestamp only"
-msgstr "Temps seulement"
+#: ../lib/advene/gui/views/viewbook.py:398
+#: ../lib/advene/gui/views/viewbook.py:420
+#, python-format
+msgid "Query %s"
+msgstr "Requête %s"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:664
-msgid "Show content only"
-msgstr "Contenu seulement"
+#: ../lib/advene/gui/views/viewbook.py:399
+#: ../lib/advene/gui/views/viewbook.py:421
+msgid "in the TALES browser"
+msgstr "dans l'explorateur TALES"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:665
-msgid "Show snapshot only"
-msgstr "Vignette seulement"
+#: ../lib/advene/gui/views/viewbook.py:399
+#, python-format
+msgid "Browsing %s"
+msgstr "Explore %s"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:667
-msgid "Show overlayed timestamp"
-msgstr "Vignette + timecode surimprimé"
+#: ../lib/advene/gui/views/viewbook.py:415
+#, python-format
+msgid "Use annotation %s :"
+msgstr "Utiliser l'annotation %s :"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:668
-msgid "Show overlayed content"
-msgstr "Vignette + contenu surimprimé"
+#: ../lib/advene/gui/views/viewbook.py:421
+#, python-format
+msgid "Browse %s"
+msgstr "Explore %s"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:670
+#: ../lib/advene/gui/views/viewbook.py:422
+msgid "to display its contents"
+msgstr "pour afficher son contenu"
+
+#: ../lib/advene/gui/views/viewbook.py:422
 #, python-format
-msgid "Annotation type %s"
-msgstr "Type d'annotations %s"
+msgid "%s"
+msgstr "%s"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:671
-msgid "display as list"
-msgstr "afficher comme une liste"
+#: ../lib/advene/gui/views/viewbook.py:423
+msgid "as a bookmark"
+msgstr "comme un signet"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:672
-msgid "display as grid"
-msgstr "afficher comme une grille"
+#: ../lib/advene/gui/views/viewbook.py:441
+msgid "as the context for the query..."
+msgstr "comme context pour la requête..."
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:673
-msgid "display as table"
-msgstr "afficher comme une table"
+#: ../lib/advene/gui/views/viewbook.py:445
+msgid "Set of annotations"
+msgstr "Ensemble d'annotations"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:674
-msgid "display as transcription"
-msgstr "afficher comme une transcription"
+#: ../lib/advene/gui/views/viewbook.py:446
+msgid "Use annotations:"
+msgstr "Utiliser les annotations :"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:683
-msgid "Open link"
-msgstr "Ouvrir le lien"
+#: ../lib/advene/gui/views/viewbook.py:449
+msgid "to edit them"
+msgstr "pour les éditer"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:739
-#, python-format
-msgid "HTML editor: cannot parse content (%s)"
-msgstr "Éditeur HTML: impossible de traiter le contenu (%s)"
+#: ../lib/advene/gui/views/viewbook.py:452
+msgid "as bookmarks"
+msgstr "comme des signets"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:772
-#, python-format
-msgid "Heading %d"
-msgstr "Titre %d"
+#: ../lib/advene/gui/views/transcription.py:51
+msgid "Transcription"
+msgstr "Transcription"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:783
-msgid "Bold"
-msgstr "Gras"
+#: ../lib/advene/gui/views/transcription.py:53
+msgid "Display annotations as a text transcription"
+msgstr "Afficher les annotations sous forme de transcription"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:784
-msgid "Italic"
-msgstr "Italique"
+#: ../lib/advene/gui/views/transcription.py:158
+msgid "Transcription options"
+msgstr "Options de transcription"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:785
-msgid "Header"
-msgstr "Titre"
+#: ../lib/advene/gui/views/transcription.py:159
+msgid "Default representation"
+msgstr "Représentation par défaut"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:787
-msgid "Copy"
-msgstr "Copier"
+#: ../lib/advene/gui/views/transcription.py:159
+msgid "Use the default representation for annotations"
+msgstr "Utiliser la représentation par défaut des annotations"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:788
-msgid "Cut"
-msgstr "Couper"
+#: ../lib/advene/gui/views/transcription.py:160
+#: ../lib/advene/gui/edit/elements.py:988
+msgid "Representation"
+msgstr "Représentation"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:789
-msgid "Paste"
-msgstr "Coller"
+#: ../lib/advene/gui/views/transcription.py:160
+msgid ""
+"If default representation is unchecked,\n"
+"this TALES expression that will be used to format the annotations."
+msgstr ""
+"Si la représentation par défaut n'est pas utilisée,\n"
+"cette expression TALES sera utilisée pour formatter les annotations."
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:791
-#: ../lib/advene/gui/edit/schemaeditor.py:64
-#: ../lib/advene/gui/views/timeline.py:134 ../lib/advene/gui/views/tree.py:428
-msgid "Refresh"
-msgstr "Rafraîchir"
+#: ../lib/advene/gui/views/transcription.py:161
+msgid "Separator"
+msgstr "Séparateur"
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:847
-msgid "WYSIWYG editor"
-msgstr "Éditeur WYSIWYG"
+#: ../lib/advene/gui/views/transcription.py:162
+msgid "This separator will be inserted between the annotations."
+msgstr "Ce séparateur sera inséré entre les annotations."
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:857
-msgid "Edit HTML source"
-msgstr "Éditer le source HTML"
+#: ../lib/advene/gui/views/transcription.py:163
+msgid "Whitespace"
+msgstr "Espace"
 
-#: ../lib/advene/gui/plugins/logmessages.py:35
-msgid "Log Messages"
-msgstr "Messages d'information"
+#: ../lib/advene/gui/views/transcription.py:164
+msgid "Newline"
+msgstr "Retour à la ligne"
 
-#: ../lib/advene/gui/edit/dvdselect.py:73
-#: ../lib/advene/gui/edit/importer.py:143
-msgid "Stop"
-msgstr "Stop"
+#: ../lib/advene/gui/views/transcription.py:165
+msgid "Tabulation"
+msgstr "Tabulation"
+
+#: ../lib/advene/gui/views/transcription.py:166
+msgid "Dash"
+msgstr "Tiret"
+
+#: ../lib/advene/gui/views/transcription.py:167
+msgid "User defined"
+msgstr "Défini par l'utilisateur"
 
-#: ../lib/advene/gui/edit/dvdselect.py:82
-#: ../lib/advene/gui/edit/dvdselect.py:112
-msgid "Preview"
-msgstr "Prévisualisation"
+#: ../lib/advene/gui/views/transcription.py:169
+msgid "User-defined separator"
+msgstr "Séparateur défini par l'utilisateur"
 
-#: ../lib/advene/gui/edit/dvdselect.py:91
+#: ../lib/advene/gui/views/transcription.py:169
 msgid ""
-"Select the correct\n"
-"title and chapter\n"
-"of the DVD"
+"Separator used if user-defined is selected.Use \\n for a newline and \\t for "
+"a tabulation."
 msgstr ""
-"Sélectionnez le\n"
-"titre et chapitre\n"
-"adéquats du DVD"
+"Séparateur défini par l'utilisateur.\n"
+"Utilisez \\\\n pour un retour à la ligne et \\\\t pour une tabulation."
 
-#: ../lib/advene/gui/edit/dvdselect.py:104
-msgid "Chapter"
-msgstr "Chapître"
+#: ../lib/advene/gui/views/transcription.py:170
+msgid "Display timestamps"
+msgstr "Afficher les marques de temps"
 
-#: ../lib/advene/gui/edit/merge.py:33
-msgid "Create element"
-msgstr "Créer un élément"
+#: ../lib/advene/gui/views/transcription.py:170
+msgid "Insert timestsamp values"
+msgstr "Insérer les marques de temps"
 
-#: ../lib/advene/gui/edit/merge.py:34
-msgid "Create annotation (duplicate id)"
-msgstr "Créer une annotation (id dupliquée)"
+#: ../lib/advene/gui/views/transcription.py:171
+msgid "Display annotation bounds"
+msgstr "Afficher les bornes des annotations"
 
-#: ../lib/advene/gui/edit/merge.py:35
-msgid "Create relation (duplicate id)"
-msgstr "Créer une relation (id dupliquée)"
+#: ../lib/advene/gui/views/transcription.py:231
+#, python-format
+msgid ""
+"Cannot convert the following annotations,\n"
+"the representation pattern is too complex.\n"
+"%s"
+msgstr ""
+"Impossible de convertir les annotations suivantes,\n"
+"L'expression de représentation est trop complexe.\n"
+"%s"
 
-#: ../lib/advene/gui/edit/merge.py:36
-msgid "Update the color"
-msgstr "Modifier la couleur"
+#: ../lib/advene/gui/views/transcription.py:242
+msgid ""
+"Cannot validate the update.\n"
+"The representation pattern is too complex."
+msgstr ""
+"Impossible de valider la mise à jour.\n"
+"L'expression de représentation est trop complexe."
 
-#: ../lib/advene/gui/edit/merge.py:37
-msgid "Update the representation"
-msgstr "Modifier la représentation"
+#: ../lib/advene/gui/views/transcription.py:268
+msgid "Save transcription to a text file"
+msgstr "Sauvegarder la transcription dans un fichier texte"
 
-#: ../lib/advene/gui/edit/merge.py:38
-msgid "Update the description"
-msgstr "Modifier la description"
+#: ../lib/advene/gui/views/transcription.py:269
+msgid "Apply the modifications"
+msgstr "Valider les modifications"
 
-#: ../lib/advene/gui/edit/merge.py:39
-msgid "Update the title"
-msgstr "Modifier le titre"
+#: ../lib/advene/gui/views/transcription.py:270
+msgid "Find text"
+msgstr "Chercher dans le texte"
 
-#: ../lib/advene/gui/edit/merge.py:40
-msgid "Update the mimetype"
-msgstr "Modifier le type MIME"
+#: ../lib/advene/gui/views/transcription.py:271
+msgid "Quickly switch display options"
+msgstr "Modification rapide des options d'affichage"
 
-#: ../lib/advene/gui/edit/merge.py:41
-msgid "Update the begin time"
-msgstr "Modifier le temps de début"
+#: ../lib/advene/gui/views/transcription.py:272
+msgid "Refresh the transcription"
+msgstr "Rafraîchir la transcription"
 
-#: ../lib/advene/gui/edit/merge.py:42
-msgid "Update the end time"
-msgstr "Modifier le temps de fin"
+#: ../lib/advene/gui/views/transcription.py:273
+msgid "Edit preferences"
+msgstr "Éditer les préférences"
 
-#: ../lib/advene/gui/edit/merge.py:43
-msgid "Update the content"
-msgstr "Modifier le contenu"
+#: ../lib/advene/gui/views/transcription.py:692
+#, python-format
+msgid "Cannot write to %(filename)s: %(error)s:"
+msgstr "Impossible d'écrire dans %(filename)s : %(error)s"
 
-#: ../lib/advene/gui/edit/merge.py:44
-msgid "Update the matchFilter"
-msgstr "Modifier le filtre de vue"
+#: ../lib/advene/gui/views/transcription.py:698
+#: ../lib/advene/gui/edit/transcribe.py:859
+#, python-format
+msgid "Transcription saved to %s"
+msgstr "Transcription sauvegardée dans %s"
 
-#: ../lib/advene/gui/edit/merge.py:45
-msgid "Update the member types"
-msgstr "Mettre à jour les types des membres"
+#: ../lib/advene/gui/views/browser.py:169
+#: ../lib/advene/gui/views/browser.py:171
+msgid "TALES browser"
+msgstr "Explorateur TALES"
 
-#: ../lib/advene/gui/edit/merge.py:46
-msgid "Update tags"
-msgstr "Mettre à jour les tags"
+#: ../lib/advene/gui/views/browser.py:176
+msgid "Display result in table"
+msgstr "Afficher le résultat dans un tableau"
 
-#: ../lib/advene/gui/edit/merge.py:90
-msgid "Difference between original and merged elements"
-msgstr "Différence entre l'élément original et l'élément à fusionner"
+#: ../lib/advene/gui/views/browser.py:199
+msgid "Insert path"
+msgstr "Insérer le chemin TALES"
 
-#: ../lib/advene/gui/edit/merge.py:136
-msgid "Current element"
-msgstr "Élément courant"
+#: ../lib/advene/gui/views/browser.py:200
+msgid "Insert value"
+msgstr "Insérer la valeur"
 
-#: ../lib/advene/gui/edit/merge.py:141
-msgid "Updated element"
-msgstr "Élément mis à jour"
+#: ../lib/advene/gui/views/browser.py:255
+msgid "Expression returned None (there was an exception)"
+msgstr "L'expression a renvoyé None (il y a eu une exception)"
 
-#: ../lib/advene/gui/edit/merge.py:147
-msgid "Show diff"
-msgstr "Montrer les différences"
+#: ../lib/advene/gui/views/browser.py:308
+msgid "Result is not a list"
+msgstr "Le résultat n'est pas une liste"
 
-#: ../lib/advene/gui/edit/merge.py:180
-msgid "Merge?"
-msgstr "Fusionner?"
+#: ../lib/advene/gui/views/browser.py:365
+#: ../lib/advene/gui/edit/shapewidget.py:944
+msgid "Path"
+msgstr "Chemin"
 
-#: ../lib/advene/gui/edit/merge.py:197
-msgid "Element"
-msgstr "Élément"
+#: ../lib/advene/gui/views/browser.py:372
+#: ../lib/advene/gui/edit/elements.py:2163
+msgid "Value"
+msgstr "Valeur"
 
-#: ../lib/advene/gui/edit/merge.py:230 ../lib/advene/gui/edit/imports.py:406
-#, python-format
-msgid "Package %s"
-msgstr "Recueil %s"
+#: ../lib/advene/gui/views/timeline.py:128
+msgid "Display annotations on a timeline"
+msgstr "Vue en ligne de temps"
 
-#: ../lib/advene/gui/edit/merge.py:230 ../lib/advene/gui/edit/imports.py:406
-msgid "No title"
-msgstr "Pas de titre"
+#: ../lib/advene/gui/views/timeline.py:142
+msgid "Limit display to current area"
+msgstr "Limiter l'affichage à la zone courante"
 
-#: ../lib/advene/gui/edit/merge.py:267
-msgid "All"
-msgstr "Tout"
+#: ../lib/advene/gui/views/timeline.py:143
+#: ../lib/advene/gui/views/timeline.py:3307
+msgid "Display whole movie"
+msgstr "Afficher tout le film"
 
-#: ../lib/advene/gui/edit/properties.py:32
-#: ../lib/advene/gui/edit/shapewidget.py:1588
-msgid "Properties"
-msgstr "Propriétés"
+#: ../lib/advene/gui/views/timeline.py:173
+#, python-format
+msgid "Cannot find annotation type %s"
+msgstr "Impossible de trouver le type d'annotation %s"
 
-#: ../lib/advene/gui/edit/properties.py:46
-#: ../lib/advene/gui/edit/transcribe.py:147
-#: ../lib/advene/gui/edit/transcribe.py:1195
-#: ../lib/advene/gui/views/tagbag.py:61
-#: ../lib/advene/gui/views/timeline.py:3483
-#: ../lib/advene/gui/views/timeline.py:3624 ../lib/advene/gui/main.py:4235
-msgid "Preferences"
-msgstr "Préférences"
+#: ../lib/advene/gui/views/timeline.py:234
+msgid "No scrolling"
+msgstr "Pas de défilement"
 
-#: ../lib/advene/gui/edit/properties.py:371
-msgid "Choose a file"
-msgstr "Choisissez un fichier"
+#: ../lib/advene/gui/views/timeline.py:235
+msgid "Continuous scrolling"
+msgstr "Défilement continu"
 
-#: ../lib/advene/gui/edit/importer.py:45
-msgid "Importer"
-msgstr "Importateur"
+#: ../lib/advene/gui/views/timeline.py:236
+msgid "Discrete scrolling"
+msgstr "Défilement discret"
 
-#: ../lib/advene/gui/edit/importer.py:101
-#: ../lib/advene/gui/edit/importer.py:111
-msgid "Advene package importer"
-msgstr "Importateur de recueil Advene"
+#: ../lib/advene/gui/views/timeline.py:237
+msgid "Annotation scrolling"
+msgstr "Défilement sur annotation"
 
-#: ../lib/advene/gui/edit/importer.py:115
-msgid "Not likely"
-msgstr "Non-pertinents"
+#: ../lib/advene/gui/views/timeline.py:582
+#, python-format
+msgid "%d annotations"
+msgstr "%d annotations"
+
+#: ../lib/advene/gui/views/timeline.py:585
+msgid "Display all types"
+msgstr "Afficher tous les types"
 
-#: ../lib/advene/gui/edit/importer.py:137
+#: ../lib/advene/gui/views/timeline.py:587
 #, python-format
-msgid "Completed conversion: %(statistics)s"
-msgstr "Conversion terminée : %(statistics)s"
+msgid ""
+"There are %d annotations.\n"
+"The current timeline may take a long time to display them, so only the first "
+"two annotation types are displayed. Use the annotation type selector (second "
+"button in the timeline) to select other annotations types to display, or "
+"click on the 'Display all types' button below."
+msgstr ""
+"Il y a %d annotations.\n"
+"La timeline actuelle peut prendre beaucoup de temps pour les afficher, donc "
+"seuls les deux premiers types d'annotations sont affichés. Utilisez le "
+"sélecteur de type (deuxième bouton dans la timeline) pour choisir d'autres "
+"types à afficher, ou cliquer sur \"Afficher tous les types\" ci-dessous."
 
-#: ../lib/advene/gui/edit/importer.py:253
-msgid "Choose the file to import"
-msgstr "Choisissez le fichier à importer"
+#: ../lib/advene/gui/views/timeline.py:1055
+msgid "Split at current player position"
+msgstr "Couper à la valeur de la position courante"
 
-#: ../lib/advene/gui/edit/importer.py:272
-msgid "Filter"
-msgstr "Filtre"
+#: ../lib/advene/gui/views/timeline.py:1059
+msgid "Center and zoom"
+msgstr "Centrer et zoomer"
 
-#: ../lib/advene/gui/edit/importer.py:276
-msgid "Options"
-msgstr "Options"
+#: ../lib/advene/gui/views/timeline.py:1163
+msgid "Create a relation"
+msgstr "Créer une relation"
 
-#: ../lib/advene/gui/edit/importer.py:287
-msgid "Start"
-msgstr "Lancer"
+#: ../lib/advene/gui/views/timeline.py:1173
+msgid "Create a new relation-type."
+msgstr "Créer un nouveau type de relation"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:57
-msgid "Schema Editor"
-msgstr "Éditeur de schéma"
+#: ../lib/advene/gui/views/timeline.py:1199
+msgid "Merge with this annotation"
+msgstr "Fusionner avec cette annotation"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:132
-msgid "Display"
-msgstr "Afficher"
+#: ../lib/advene/gui/views/timeline.py:1208
+msgid "Align both begin times"
+msgstr "Aligner les temps de début"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:155
-#: ../lib/advene/gui/edit/shapewidget.py:1587 ../lib/advene/gui/popup.py:472
-#: ../lib/advene/gui/popup.py:476
-msgid "Delete"
-msgstr "Supprimer"
+#: ../lib/advene/gui/views/timeline.py:1209
+msgid "Align both end times"
+msgstr "Aligner les temps de fin"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:762
-msgid "Remove relation type"
-msgstr "Supprimer le type de relation"
+#: ../lib/advene/gui/views/timeline.py:1210
+msgid "Align end time to selected begin time"
+msgstr "Aligner le temps de fin sur le temps de début sélectionné"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:765
-#: ../lib/advene/gui/edit/schemaeditor.py:997
-msgid "Create HTML view"
-msgstr "Créer une vue HTML"
+#: ../lib/advene/gui/views/timeline.py:1211
+msgid "Align begin time to selected end time"
+msgstr "Aligner le temps de début sur le temps de fin sélectionné"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:831
-msgid "Remove annotation type"
-msgstr "Supprimer le type d'annotation"
+#: ../lib/advene/gui/views/timeline.py:1212
+msgid "Align all times"
+msgstr "Aligner tous les temps"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:834
-msgid "Create relation type between this one and..."
-msgstr "Créer un type de relation entre cet élément et ..."
+#: ../lib/advene/gui/views/timeline.py:1250
+msgid "Cannot delete the annotation : it has relations."
+msgstr ""
+"Impossible de supprimer l'annotation :\n"
+"elle fait partie de relations."
 
-#: ../lib/advene/gui/edit/schemaeditor.py:969
-msgid "New schema"
-msgstr "Nouveau schéma"
+#: ../lib/advene/gui/views/timeline.py:1325
+msgid "Select the appropriate relation type"
+msgstr "Sélectionnez le type de relation"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:985 ../lib/advene/gui/popup.py:690
-#: ../lib/advene/gui/popup.py:750 ../lib/advene/gui/popup.py:803
-msgid "Select a color"
-msgstr "Choisissez une couleur"
+#: ../lib/advene/gui/views/timeline.py:1344
+#, python-format
+msgid "Duplicate selection to type %s"
+msgstr "Dupliquer la sélection vers le type %s"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:988
-msgid "New annotation type"
-msgstr "Nouveau type d'annotation"
+#: ../lib/advene/gui/views/timeline.py:1347
+#, python-format
+msgid "Move selection to type %s"
+msgstr "Déplacer la sélection vers le type %s"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:991
-msgid "New relation type"
-msgstr "Nouveau type de relation"
+#: ../lib/advene/gui/views/timeline.py:1356
+#, python-format
+msgid "Duplicate annotation to type %s"
+msgstr "Dupliquer l'annotation vers le type %s"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:994
-msgid "Hide this schema"
-msgstr "Cacher ce schéma"
+#: ../lib/advene/gui/views/timeline.py:1360
+#, python-format
+msgid "Move annotation to type %s"
+msgstr "Déplacer l'annotation vers le type %s"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:1000
-msgid "Export drawing to pdf"
-msgstr "Exporter le schéma en pdf"
+#: ../lib/advene/gui/views/timeline.py:1367
+#, python-format
+msgid "Duplicate to type %(type)s at %(position)s"
+msgstr "Dupliquer vers le type %(type)s à %(position)s"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:1042
-msgid "Choose a filename to export the schema as PDF"
-msgstr "Choisissez un nom pour l'export PDF"
+#: ../lib/advene/gui/views/timeline.py:1373
+#, python-format
+msgid "Move to type %(type)s at %(position)s"
+msgstr "Déplacer vers le type %(type)s à %(position)s"
 
-#: ../lib/advene/gui/edit/rules.py:84 ../lib/advene/gui/edit/rules.py:86
-#: ../lib/advene/gui/edit/create.py:252
-msgid "Rule"
-msgstr "Règle"
+#: ../lib/advene/gui/views/timeline.py:1383
+msgid "Duplicate and create a relation"
+msgstr "Dupliquer et créer une relation"
 
-#: ../lib/advene/gui/edit/rules.py:95 ../lib/advene/gui/edit/create.py:242
-msgid "Subviews"
-msgstr "Vues associées"
+#: ../lib/advene/gui/views/timeline.py:1394
+#, python-format
+msgid "Duplicate at %s and create a relation"
+msgstr "Dupliquer vers %s et créer une relation"
 
-#: ../lib/advene/gui/edit/rules.py:122
-msgid "Add a new rule"
-msgstr "Ajouter une nouvelle règle"
+#: ../lib/advene/gui/views/timeline.py:1425
+msgid "Annotation filter"
+msgstr "Filtre d'annotations "
 
-#: ../lib/advene/gui/edit/rules.py:126
-msgid "Subview"
-msgstr "Vues associées"
+#: ../lib/advene/gui/views/timeline.py:1426
+msgid "Enter the searched string"
+msgstr "Entrez la chaîne recherchée"
 
-#: ../lib/advene/gui/edit/rules.py:129
-msgid "Add a subview list"
-msgstr "Ajouter une nouvelle liste de sous-vuews"
+#: ../lib/advene/gui/views/timeline.py:1534
+#, python-format
+msgid "Duplicate all annotations to type %s"
+msgstr "Dupliquer toutes les annotations vers le type %s"
 
-#: ../lib/advene/gui/edit/rules.py:135
-msgid "Remove the current rule"
-msgstr "Supprimer la règle en cours"
+#: ../lib/advene/gui/views/timeline.py:1536
+#, python-format
+msgid "Move all annotations to type %s"
+msgstr "Déplacer toutes les annotations vers le type %s"
 
-#: ../lib/advene/gui/edit/rules.py:275
-msgid "Source expression"
-msgstr "Expression source"
+#: ../lib/advene/gui/views/timeline.py:1538
+#, python-format
+msgid "Duplicate all annotations matching a string to type %s"
+msgstr ""
+"Dupliquer toutes les annotations contenant une chaîne de caractères vers le "
+"type %s"
 
-#: ../lib/advene/gui/edit/rules.py:277
-msgid "Return expression"
-msgstr "Expression de retour"
+#: ../lib/advene/gui/views/timeline.py:1540
+#, python-format
+msgid "Move all annotations matching a string to type %s"
+msgstr ""
+"Déplacer toutes les annotations contenant une chaîne de caractères vers le "
+"type %s"
 
-#: ../lib/advene/gui/edit/rules.py:351
-msgid "For all elements in "
-msgstr "Pour tous les éléments de "
+#: ../lib/advene/gui/views/timeline.py:1542
+#, python-format
+msgid "Align all annotation time codes using %s as reference."
+msgstr "Aligner les temps pour toutes les annotations sur la base de %s"
 
-#: ../lib/advene/gui/edit/rules.py:352
-msgid "All annotations of the package"
-msgstr "Toutes les annotations du recueil"
+#: ../lib/advene/gui/views/timeline.py:1544
+#, python-format
+msgid "Align all annotation contents using %s as reference"
+msgstr "Copier les contenus pour toutes annotations sur la base de %s"
 
-#: ../lib/advene/gui/edit/rules.py:353
-msgid "All views of the package"
-msgstr "Toutes les vues du recueil"
+#: ../lib/advene/gui/views/timeline.py:2038
+#: ../lib/advene/gui/views/timeline.py:2060
+#, python-format
+msgid "Displaying %(count)d / %(total)d annotations..."
+msgstr "Affichage de %(count)d / %(total)d annotations..."
 
-#: ../lib/advene/gui/edit/rules.py:354 ../lib/advene/gui/edit/rules.py:798
-msgid "The context annotations"
-msgstr "Les annotations du contexte"
+#: ../lib/advene/gui/views/timeline.py:2049
+msgid "Displaying done."
+msgstr "Affichage terminé."
 
-#: ../lib/advene/gui/edit/rules.py:355 ../lib/advene/gui/edit/rules.py:799
-msgid "The annotations of the context type"
-msgstr "Les annotations du type du contexte"
+#: ../lib/advene/gui/views/timeline.py:2478
+msgid "Create a new annotation"
+msgstr "Créer une nouvelle annotation"
 
-#: ../lib/advene/gui/edit/rules.py:370
-msgid "Return "
-msgstr "Retourne "
+#: ../lib/advene/gui/views/timeline.py:2479
+msgid "Zoom on region"
+msgstr "Zoom sur la zone"
 
-#: ../lib/advene/gui/edit/rules.py:372 ../lib/advene/gui/edit/rules.py:787
-msgid "The element"
-msgstr "L'élément"
+#: ../lib/advene/gui/views/timeline.py:2480
+msgid "Restrict display to region"
+msgstr "Limiter l'affichage à la zone sélectionnée"
 
-#: ../lib/advene/gui/edit/rules.py:373 ../lib/advene/gui/edit/rules.py:788
-msgid "The element's content"
-msgstr "Le contenu de l'élément"
+#: ../lib/advene/gui/views/timeline.py:2589
+#: ../lib/advene/gui/edit/transcribe.py:489
+#, python-format
+msgid "Position %s"
+msgstr "Position %s"
 
-#: ../lib/advene/gui/edit/rules.py:388
-msgid "If the element matches "
-msgstr "Si l'élément correspond à "
+#: ../lib/advene/gui/views/timeline.py:2599
+msgid "New annotation at player time"
+msgstr "Nouvelle annotation au temps du lecteur"
 
-#: ../lib/advene/gui/edit/rules.py:390
-msgid "Return the element if it matches "
-msgstr "Renvoie l'élément s'il correspond à "
+#: ../lib/advene/gui/views/timeline.py:2603
+msgid "New annotation at mouse position"
+msgstr "Nouvelle annotation à la position de la souris"
 
-#: ../lib/advene/gui/edit/rules.py:408 ../lib/advene/gui/edit/rules.py:617
-msgid "All conditions must be met"
-msgstr "Toutes les conditions doivent être remplies"
+#: ../lib/advene/gui/views/timeline.py:2607
+msgid "Selection"
+msgstr "Sélection"
 
-#: ../lib/advene/gui/edit/rules.py:409 ../lib/advene/gui/edit/rules.py:618
-msgid "Any condition can be met"
-msgstr "Une des conditions doit être remplie"
+#: ../lib/advene/gui/views/timeline.py:2728
+#, python-format
+msgid "Cannot zoom more %f"
+msgstr "Impossible de zoomer plus %f"
 
-#: ../lib/advene/gui/edit/rules.py:493 ../lib/advene/gui/edit/rules.py:563
+#: ../lib/advene/gui/views/timeline.py:2940
 #, python-format
-msgid "Rule <b>%s</b>"
-msgstr "Règle <b>%s</b>"
+msgid "From schema %s"
+msgstr "Schéma %s"
 
-#: ../lib/advene/gui/edit/rules.py:574
-msgid "Rule name"
-msgstr "Nom de la règle"
+#: ../lib/advene/gui/views/timeline.py:3003
+msgid "Restrict playing to this annotation-type"
+msgstr "Restreindre le jeu à ce type d'annotation"
 
-#: ../lib/advene/gui/edit/rules.py:591
-msgid "Event"
-msgstr "Événement"
+#: ../lib/advene/gui/views/timeline.py:3010
+msgid "Goto previous annotation"
+msgstr "Aller à l'annotation précédente"
 
-#: ../lib/advene/gui/edit/rules.py:599
-msgid "If"
-msgstr "Si"
+#: ../lib/advene/gui/views/timeline.py:3021
+msgid "Goto next annotation"
+msgstr "Aller à l'annotation suivante"
 
-#: ../lib/advene/gui/edit/rules.py:638
-msgid "Then"
-msgstr "Alors"
+#: ../lib/advene/gui/views/timeline.py:3032
+msgid "+"
+msgstr "+"
 
-#: ../lib/advene/gui/edit/rules.py:683
-msgid "When the "
-msgstr "Quand le/la"
+#: ../lib/advene/gui/views/timeline.py:3091
+msgid "Open an annotation display view"
+msgstr "Ouvrir une vue d'affichage de l'annotation"
 
-#: ../lib/advene/gui/edit/rules.py:696
-msgid " occurs,"
-msgstr " intervient,"
+#: ../lib/advene/gui/views/timeline.py:3098
+msgid "Open a slave montage view (coordinated zoom level)"
+msgstr "Ouvrir une vue montage escale (avec zoom coordonné)"
 
-#: ../lib/advene/gui/edit/rules.py:723 ../lib/advene/gui/edit/rules.py:726
-#, python-format
-msgid "Condition expression: %s"
-msgstr "Expression de condition : %s"
+#: ../lib/advene/gui/views/timeline.py:3133
+msgid ""
+"<b>Statistics about current selection</b>\n"
+"\n"
+msgstr ""
+"<b>Statistiques sur la sélection</b>\n"
+"\n"
 
-#: ../lib/advene/gui/edit/rules.py:765
-msgid "The annotation type"
-msgstr "Le type d'annotation"
+#: ../lib/advene/gui/views/timeline.py:3156
+msgid "No selected annotation"
+msgstr "Pas d'annotation sélectionnée"
 
-#: ../lib/advene/gui/edit/rules.py:768
+#: ../lib/advene/gui/views/timeline.py:3160
 #, python-format
-msgid "The value of the %s attribute"
-msgstr "La valeur de l'attribut %s"
+msgid "%d selected annotation(s)"
+msgstr "%d annotation(s) sélectionnée(s)"
 
-#: ../lib/advene/gui/edit/rules.py:770
-msgid "The annotation fragment"
-msgstr "Le fragment de l'annotation"
+#: ../lib/advene/gui/views/timeline.py:3167
+msgid "Unselect all annotations"
+msgstr "Déselectionner toutes les annotations"
 
-#: ../lib/advene/gui/edit/rules.py:771
-msgid "The annotation begin time"
-msgstr "Le temps de début de l'annotation"
+#: ../lib/advene/gui/views/timeline.py:3168
+msgid "Create a static view"
+msgstr "Créer une vue statique"
 
-#: ../lib/advene/gui/edit/rules.py:772
-msgid "The annotation end time"
-msgstr "Le temps de fin de l'annotation"
+#: ../lib/advene/gui/views/timeline.py:3169
+msgid "Highlight selection in other views"
+msgstr "Signaler les annotations actives dans les autres vues"
 
-#: ../lib/advene/gui/edit/rules.py:774
-msgid "The annotation MIME-type"
-msgstr "Le type MIME de l'annotation"
+#: ../lib/advene/gui/views/timeline.py:3170
+#: ../lib/advene/gui/views/timeline.py:3766
+msgid "Tag selection"
+msgstr "Taguer la sélection"
 
-#: ../lib/advene/gui/edit/rules.py:775
-msgid "The annotation's incoming relations"
-msgstr "Les relations entrantes de l'annotation"
+#: ../lib/advene/gui/views/timeline.py:3171
+msgid "Delete selected annotations"
+msgstr "Supprimer les annotations sélectionnées"
 
-#: ../lib/advene/gui/edit/rules.py:776
-msgid "The annotation's outgoing relations"
-msgstr "Les relations sortantes de l'annotation"
+#: ../lib/advene/gui/views/timeline.py:3172
+msgid "Display selection in a table"
+msgstr "Affiche la sélection dans un tableau"
 
-#: ../lib/advene/gui/edit/rules.py:779
-#, python-format
-msgid "The %s-related incoming annotations"
-msgstr "Les annotations liées une relation entrante de type %s"
+#: ../lib/advene/gui/views/timeline.py:3173
+msgid "Center and zoom on selection"
+msgstr "Centrer et zoomer sur la sélection"
 
-#: ../lib/advene/gui/edit/rules.py:783
-#, python-format
-msgid "The %s-related outgoing annotations"
-msgstr "Les annotations liées une relation sortante de type %s"
+#: ../lib/advene/gui/views/timeline.py:3174
+msgid "Edit selected annotations"
+msgstr "Éditer les annotations sélectionnées"
 
-#: ../lib/advene/gui/edit/rules.py:789
-msgid "The element fragment"
-msgstr "Le fragment de l'élément"
+#: ../lib/advene/gui/views/timeline.py:3175
+msgid "Merge annotations"
+msgstr "Fusionner les annotations"
 
-#: ../lib/advene/gui/edit/rules.py:790
-msgid "The element begin time"
-msgstr "Le temps de début de l'élément"
+#: ../lib/advene/gui/views/timeline.py:3176
+msgid "Display statistics"
+msgstr "Afficher les statistiques"
 
-#: ../lib/advene/gui/edit/rules.py:791
-msgid "The element end time"
-msgstr "Le temps de fin de l'élément"
+#: ../lib/advene/gui/views/timeline.py:3183
+msgid "Select all annotations of the same type in this time range"
+msgstr "Sélectionner les annotations du même type dans cette plage de temps"
 
-#: ../lib/advene/gui/edit/rules.py:792
-msgid "The element duration"
-msgstr "La durée de l'élément"
+#: ../lib/advene/gui/views/timeline.py:3186
+msgid "Select all annotations in this time range"
+msgstr "Sélectionner les annotations dans cette plage de temps\n"
 
-#: ../lib/advene/gui/edit/rules.py:793
-msgid "The element type"
-msgstr "Le type d'élément"
+#: ../lib/advene/gui/views/timeline.py:3300
+msgid "Goto previous page"
+msgstr "Aller à la page précédente"
 
-#: ../lib/advene/gui/edit/rules.py:794
-msgid "The element's incoming relations"
-msgstr "Les relations entrantes de l'élément"
+#: ../lib/advene/gui/views/timeline.py:3312
+msgid "Goto next page"
+msgstr "Aller à la page suivante"
 
-#: ../lib/advene/gui/edit/rules.py:795
-msgid "The element's outgoing relations"
-msgstr "Les relations sortantes de l'élément"
+#: ../lib/advene/gui/views/timeline.py:3368
+msgid "Inspector locked. Click here or in the timeline background to unlock."
+msgstr ""
+"Inspecteur verrouillé. Cliquez ici ou dans le fond de la timeline pour\n"
+"déverrouiller."
 
-#: ../lib/advene/gui/edit/rules.py:796
-msgid "The context"
-msgstr "Le contexte"
+#: ../lib/advene/gui/views/timeline.py:3395
+msgid ""
+"Delete the selected annotations or drop an annotation here to delete it."
+msgstr ""
+"Supprimer les annotations sélectionnée ou déposer une annotation ici pour la "
+"supprimer."
 
-#: ../lib/advene/gui/edit/rules.py:797
-msgid "The context fragment"
-msgstr "Le fragment du contexte"
+#: ../lib/advene/gui/views/timeline.py:3418
+msgid ""
+"Drag an annotation type here to remove it from display.\n"
+"Click to edit all displayed types"
+msgstr ""
+"Déposez un type d'annotation ici pour l'enlever de l'affichage.\n"
+"Cliquez pour éditer l'ensemble des types affichés."
 
-#: ../lib/advene/gui/edit/rules.py:809
-#, python-format
-msgid "annotation-type %s"
-msgstr "Type d'annotation %s"
+#: ../lib/advene/gui/views/timeline.py:3430
+msgid "Selection actions"
+msgstr "Actions sur la sélection"
 
-#: ../lib/advene/gui/edit/rules.py:812
-#, python-format
-msgid "relation-type %s"
-msgstr "type de relation %s"
+#: ../lib/advene/gui/views/timeline.py:3441
+msgid "Display relations"
+msgstr "Afficher les relations"
 
-#: ../lib/advene/gui/edit/rules.py:834
-msgid "Select a condition"
-msgstr "Sélectionnez une condition"
+#: ../lib/advene/gui/views/timeline.py:3447
+msgid "Display all relations"
+msgstr "Afficher toutes les relations"
 
-#: ../lib/advene/gui/edit/rules.py:878
-#, python-format
-msgid "Parameter %s"
-msgstr "Paramètre %s"
+#: ../lib/advene/gui/views/timeline.py:3523
+msgid "Center on current player position."
+msgstr "Centrer sur la position courante"
 
-#: ../lib/advene/gui/edit/rules.py:992
-msgid "Select an action"
-msgstr "Sélectionnez une action"
+#: ../lib/advene/gui/views/timeline.py:3539
+msgid "Automatically activate loop when clicking on an annotation"
+msgstr "Activer la boucle automatiquement lors du clic sur une annotation"
 
-#: ../lib/advene/gui/edit/rules.py:1083
-msgid "Activate?"
-msgstr "Activer?"
+#: ../lib/advene/gui/views/timeline.py:3563
+msgid "Displayed"
+msgstr "Affichés"
 
-#: ../lib/advene/gui/edit/shapewidget.py:83
-msgid "Generic shape"
-msgstr "Forme générique"
+#: ../lib/advene/gui/views/timeline.py:3571
+msgid "Not displayed"
+msgstr "Pas affichés"
 
-#: ../lib/advene/gui/edit/shapewidget.py:234
-#: ../lib/advene/gui/edit/shapewidget.py:741
-#, python-format
-msgid "Link to %s"
-msgstr "Lier à  %s"
+#: ../lib/advene/gui/views/timeline.py:3620
+msgid "< All <"
+msgstr "< Tout <"
 
-#: ../lib/advene/gui/edit/shapewidget.py:321
-#: ../lib/advene/gui/views/tagbag.py:132
-msgid "Name"
-msgstr "Nom"
+#: ../lib/advene/gui/views/timeline.py:3624
+msgid "> All >"
+msgstr "> Tout >"
 
-#: ../lib/advene/gui/edit/shapewidget.py:326
-#: ../lib/advene/gui/edit/shapewidget.py:1299
-msgid "Link"
-msgstr "Lien"
+#: ../lib/advene/gui/views/timeline.py:3648
+msgid "Displayed annotation types"
+msgstr "Types d'annotations affichés"
 
-#: ../lib/advene/gui/edit/shapewidget.py:331
-msgid "Link label"
-msgstr "Label du lien"
+#: ../lib/advene/gui/views/timeline.py:3678
+msgid "Relation type"
+msgstr "Type de relation"
 
-#: ../lib/advene/gui/edit/shapewidget.py:349
-msgid "Linewidth"
-msgstr "Largeur de trait"
+#: ../lib/advene/gui/views/timeline.py:3678
+msgid "Display relation types"
+msgstr "Afficher les types de relation"
 
-#: ../lib/advene/gui/edit/shapewidget.py:354
-msgid "Filled"
-msgstr "Rempli"
+#: ../lib/advene/gui/views/timeline.py:3679
+msgid "Relation content"
+msgstr "Contenu de relation"
 
-#: ../lib/advene/gui/edit/shapewidget.py:362
-msgid "Opacity"
-msgstr "Opacité"
+#: ../lib/advene/gui/views/timeline.py:3679
+msgid "Display relation content"
+msgstr "Afficher le contenu des relations"
 
-#: ../lib/advene/gui/edit/shapewidget.py:404
-#, python-format
-msgid "Properties of %s"
-msgstr "Propriétés de %s"
+#: ../lib/advene/gui/views/timeline.py:3680 ../lib/advene/gui/popup.py:545
+msgid "Highlight"
+msgstr "Mise en valeur"
 
-#: ../lib/advene/gui/edit/shapewidget.py:451
-msgid "Rectangle"
-msgstr "Rectangle"
+#: ../lib/advene/gui/views/timeline.py:3680
+msgid "Highlight active annotations"
+msgstr "Signaler les annotations actives"
 
-#: ../lib/advene/gui/edit/shapewidget.py:532
-#: ../lib/advene/gui/edit/shapewidget.py:652
-msgid "Text"
-msgstr "Texte"
+#: ../lib/advene/gui/views/timeline.py:3767
+msgid "Enter the tag for the selection"
+msgstr "Entrez le tag pour la sélection"
 
-#: ../lib/advene/gui/edit/shapewidget.py:663
-msgid "Textsize"
-msgstr "Taille du texte"
+#: ../lib/advene/gui/views/timeline.py:3773
+#: ../lib/advene/gui/views/tagbag.py:165
+msgid "The tag contains invalid characters"
+msgstr "Ce tag contient des caractères non valides."
 
-#: ../lib/advene/gui/edit/shapewidget.py:677
-msgid "Image"
-msgstr "Image"
+#: ../lib/advene/gui/views/relation.py:71
+msgid "Relations view"
+msgstr "Vue des relations"
 
-#: ../lib/advene/gui/edit/shapewidget.py:761
-msgid "Href"
-msgstr "Href"
+#: ../lib/advene/gui/views/editionhistory.py:40
+msgid "Edition History"
+msgstr "Historique d'édition"
 
-#: ../lib/advene/gui/edit/shapewidget.py:771
-msgid "Line"
-msgstr "Ligne"
+#: ../lib/advene/gui/views/editionhistory.py:42
+msgid "Access last edited/created elements"
+msgstr "Éléments récemment édités/créés"
 
-#: ../lib/advene/gui/edit/shapewidget.py:872
-msgid "Draw an arrow"
-msgstr "Dessiner une flêche"
+#: ../lib/advene/gui/views/editionhistory.py:102
+msgid "Created"
+msgstr "Créés"
 
-#: ../lib/advene/gui/edit/shapewidget.py:883
-msgid "Arrow size"
-msgstr "Taille de la flêche"
+#: ../lib/advene/gui/views/editionhistory.py:103
+msgid "Edited"
+msgstr "Édités"
 
-#: ../lib/advene/gui/edit/shapewidget.py:935
-#: ../lib/advene/gui/views/browser.py:359
-msgid "Path"
-msgstr "Chemin"
+#: ../lib/advene/gui/views/tagbag.py:55
+msgid "Tag Bag"
+msgstr "Sac à tags"
 
-#: ../lib/advene/gui/edit/shapewidget.py:1102
-msgid "Close path"
-msgstr "Fermer le chemin"
+#: ../lib/advene/gui/views/tagbag.py:62
+msgid "New tag"
+msgstr "Nouveau tag"
 
-#: ../lib/advene/gui/edit/shapewidget.py:1181
-msgid "Circle"
-msgstr "Cercle"
+#: ../lib/advene/gui/views/tagbag.py:125
+msgid "New tag name"
+msgstr "Nouveau tag"
 
-#: ../lib/advene/gui/edit/shapewidget.py:1239
-msgid "Ellipse"
-msgstr "Ellipse"
+#: ../lib/advene/gui/views/tagbag.py:131
+msgid "Enter a new tag name and select its color."
+msgstr "Entrez un nouveau tag et sélectionnez sa couleur."
 
-#: ../lib/advene/gui/edit/shapewidget.py:1589
-msgid "SVG"
-msgstr "SVG"
+#: ../lib/advene/gui/views/tagbag.py:135
+#: ../lib/advene/gui/edit/shapewidget.py:343
+msgid "Name"
+msgstr "Nom"
 
-#: ../lib/advene/gui/edit/shapewidget.py:2172
-msgid "Load SVG"
-msgstr "Charger un fichier SVG"
+#: ../lib/advene/gui/views/tagbag.py:141
+#: ../lib/advene/gui/edit/shapewidget.py:364
+#: ../lib/advene/gui/edit/elements.py:897
+#: ../lib/advene/gui/edit/elements.py:977
+#: ../lib/advene/gui/edit/elements.py:1091 ../lib/advene/rules/actions.py:135
+msgid "Color"
+msgstr "Couleur"
 
-#: ../lib/advene/gui/edit/shapewidget.py:2178
-msgid "Save SVG"
-msgstr "Sauver le SVG"
+#: ../lib/advene/gui/views/tagbag.py:178
+msgid "Tag bag options"
+msgstr "Options du sac à tags"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:74
-#: ../lib/advene/gui/widget.py:1063
-msgid "Refresh snapshot"
-msgstr "Rafraîchir la capture d'écran"
+#: ../lib/advene/gui/views/tagbag.py:179
+msgid "Update with new tags"
+msgstr "Afficher les nouveaux tags"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:102
-#, python-format
-msgid "Decrement value by %.2f s"
-msgstr "Décrémenter la valeur de %.2f s"
+#: ../lib/advene/gui/views/tagbag.py:179
+msgid "Automatically display new defined tags"
+msgstr "Afficher automatiquement les nouveaux tags"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:104
+#: ../lib/advene/gui/views/tagbag.py:228
 #, python-format
-msgid "Increment value by %.2f s"
-msgstr "Incrémenter la valeur de %.2f s"
+msgid "Choose the color for tag %s"
+msgstr "Choisissez la couleur du tag %s"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:130
-msgid ""
-"Click to play\n"
-"Control+click to set to current time\n"
-"Scroll to modify value (with control/shift)\n"
-"Right-click to invalidate screenshot"
-msgstr ""
-"Cliquer pour jouer\n"
-"Contrôle+clic pour fixer au temps actuel\n"
-"Scroll pour modifier la valeur (avec Contrôle/Shift)\n"
-"Clic droit pour invalider la capture d'écran"
+#: ../lib/advene/gui/views/tagbag.py:252
+msgid "Set color"
+msgstr "Choix de couleur"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:145
-msgid ""
-"Enter a timecode.\n"
-"An integer value will be considered as milliseconds.\n"
-"A float value (12.2) will be considered as seconds.\n"
-"HH:MM:SS.sss values are possible."
-msgstr ""
-"Entrez un timecode.\n"
-"Une valeur entière sera considérée comme des millisecondes.\n"
-"Une valeur flottant (12.2) sera considérée comme des secondes.\n"
-"Il est possible d'utiliser le format HH:MM:SS.sss"
+#: ../lib/advene/gui/views/tagbag.py:253
+msgid "Remove"
+msgstr "Supprimer"
 
-#: ../lib/advene/gui/edit/timeadjustment.py:159
-msgid "Set to current player position"
-msgstr "Fixer à la valeur de la position courante"
+#: ../lib/advene/gui/views/tagbag.py:326
+msgid "Drop a tag here to remove it from the list"
+msgstr "Déposez un tag ici pour le supprimer de la liste."
 
-#: ../lib/advene/gui/edit/create.py:81
-#, python-format
-msgid "%s creation"
-msgstr "Création de %s"
+#: ../lib/advene/gui/views/tagbag.py:336
+msgid "Save as adhoc view"
+msgstr "Sauvegarder comme vue adhoc"
 
-#: ../lib/advene/gui/edit/create.py:82
-#, python-format
-msgid ""
-"To create a new element of type %s,\n"
-"you must give the following information."
-msgstr ""
-"Pour créer un nouvel élément de type %s\\n\n"
-"vous devez fournir les informations suivantes."
+#: ../lib/advene/gui/views/tagbag.py:337
+msgid "Add a new tag"
+msgstr "Ajouter un nouveau tag"
 
-#: ../lib/advene/gui/edit/create.py:92 ../lib/advene/gui/edit/elements.py:508
-#: ../lib/advene/gui/edit/elements.py:557
-#: ../lib/advene/gui/edit/elements.py:659
-#: ../lib/advene/gui/views/browser.py:362 ../lib/advene/gui/views/table.py:251
-#: ../lib/advene/gui/views/table.py:558
-msgid "Type"
-msgstr "Type"
+#: ../lib/advene/gui/views/tagbag.py:338
+msgid "Display all defined tags"
+msgstr "Afficher tous les tags"
 
-#: ../lib/advene/gui/edit/create.py:111
-msgid "Dynamic view"
-msgstr "Vue dynamique"
+#: ../lib/advene/gui/views/__init__.py:197
+msgid "Invalid view id"
+msgstr "Identificateur de vue invalide"
 
-#: ../lib/advene/gui/edit/create.py:112
-msgid "HTML template"
-msgstr "Modèle HTML"
+#: ../lib/advene/gui/views/__init__.py:243
+#, python-format
+msgid "Cannot save default options: %s"
+msgstr "Impossible de sauvegarder les options par défaut : %s"
 
-#: ../lib/advene/gui/edit/create.py:113
-msgid "Plain XML"
-msgstr "Modèle XML"
+#: ../lib/advene/gui/views/__init__.py:254
+#, python-format
+msgid "Default options saved for view %s"
+msgstr "Options par défaut sauvées pour la vue %s"
 
-#: ../lib/advene/gui/edit/create.py:114
-msgid "SVG template"
-msgstr "Modèle SVG"
+#: ../lib/advene/gui/views/__init__.py:282
+#, python-format
+msgid "Error in source evaluation %s"
+msgstr "Erreur dans l'évaluation de l'expression %(source)s"
 
-#: ../lib/advene/gui/edit/create.py:115
-msgid "Plain text template"
-msgstr "Modèle de texte simple"
+#: ../lib/advene/gui/views/__init__.py:299
+#, python-format
+msgid "Saving %s"
+msgstr "Sauver %s"
 
-#: ../lib/advene/gui/edit/create.py:118
-msgid "Simple query"
-msgstr "Requête simple"
+#: ../lib/advene/gui/views/__init__.py:302
+msgid "Enter a view name to save this parametered view"
+msgstr "Entrez un nom de vue pour sauvegarder cette vue paramétrée"
 
-#: ../lib/advene/gui/edit/create.py:120
-msgid "Directory"
-msgstr "Répertoire"
+#: ../lib/advene/gui/views/__init__.py:320
+#, python-format
+msgid "Error: the view %s is not an adhoc view."
+msgstr "Erreur : la vue %s n'est pas une vue ad-hoc"
 
-#: ../lib/advene/gui/edit/create.py:128
-msgid "No available type."
-msgstr "Pas de type disponible."
+#: ../lib/advene/gui/views/__init__.py:345
+msgid "HTML export"
+msgstr "Export HTML"
+
+#: ../lib/advene/gui/views/__init__.py:346
+msgid "Specify a name for the export view"
+msgstr "Choisissez un nom pour l'export de la vue."
 
-#: ../lib/advene/gui/edit/create.py:172
+#: ../lib/advene/gui/views/__init__.py:365
 #, python-format
 msgid ""
-"The identifier %s is not valid.\n"
-"It must be composed of non-accentuated alphabetic characters\n"
-"Underscore is allowed."
+"View successfully exported as %s.\n"
+"Open it in the web browser ?"
 msgstr ""
-"L'identifcateur %s n'est pas valide.\n"
-"Il doit être composé de caractères alphabétiques non-accentués.\n"
-"Le souligné (_) est autorisé."
+"Vue exportée sous le nom %s.\n"
+"Souhaitez-vous l'ouvrir dans le navigateur web ?"
 
-#: ../lib/advene/gui/edit/create.py:177
-#, python-format
-msgid "The identifier %s is already defined."
-msgstr "L'identificateur %s est déjà défini."
+#: ../lib/advene/gui/views/__init__.py:444
+msgid "Actions"
+msgstr "Actions"
 
-#: ../lib/advene/gui/edit/create.py:310
-msgid "New resource data"
-msgstr "Nouvelle ressource"
+#: ../lib/advene/gui/views/__init__.py:469
+msgid "Click or drag-and-drop to reattach view"
+msgstr "Cliquer ou glisser-déposer pour réattacher la vue"
 
-#: ../lib/advene/gui/edit/imports.py:143 ../lib/advene/gui/edit/imports.py:144
-msgid "Schemas"
-msgstr "Schémas"
+#: ../lib/advene/gui/views/finder.py:106
+msgid "List of views"
+msgstr "Liste des vues"
 
-#: ../lib/advene/gui/edit/imports.py:181 ../lib/advene/gui/edit/imports.py:182
-#: ../lib/advene/gui/views/interactivequery.py:464
-msgid "Annotations"
-msgstr "Annotations"
+#: ../lib/advene/gui/views/finder.py:107
+msgid "Static views"
+msgstr "Vues statiques"
 
-#: ../lib/advene/gui/edit/imports.py:195 ../lib/advene/gui/edit/imports.py:196
-#: ../lib/advene/gui/edit/elements.py:517
-msgid "Relations"
-msgstr "Relations"
+#: ../lib/advene/gui/views/finder.py:108
+msgid "Dynamic views"
+msgstr "Vues dynamiques"
 
-#: ../lib/advene/gui/edit/imports.py:209 ../lib/advene/gui/edit/imports.py:210
-msgid "Queries"
-msgstr "Requêtes"
+#: ../lib/advene/gui/views/finder.py:109
+msgid "Admin views"
+msgstr "Vues administratives"
 
-#: ../lib/advene/gui/edit/imports.py:320
-msgid "Imported?"
-msgstr "Importé ?"
+#: ../lib/advene/gui/views/finder.py:110
+msgid "Adhoc views"
+msgstr "Vues adhoc"
 
-#: ../lib/advene/gui/edit/imports.py:337
-#: ../lib/advene/gui/edit/elements.py:509
-#: ../lib/advene/gui/edit/elements.py:558
-#: ../lib/advene/gui/edit/elements.py:645
-#: ../lib/advene/gui/edit/elements.py:725
-#: ../lib/advene/gui/edit/elements.py:782
-#: ../lib/advene/gui/edit/elements.py:874
-#: ../lib/advene/gui/edit/elements.py:943
-#: ../lib/advene/gui/edit/elements.py:1055
-#: ../lib/advene/gui/edit/elements.py:1117
-msgid "URI"
-msgstr "URI"
+#: ../lib/advene/gui/views/finder.py:174
+msgid "No resources"
+msgstr "Pas de ressource"
 
-#: ../lib/advene/gui/edit/imports.py:359
-msgid "Choose the package to import, and its alias"
-msgstr "Choisissez le recueil à importer, et son alias"
+#: ../lib/advene/gui/views/finder.py:551
+#, python-format
+msgid ""
+"View <b>%(title)s</b>\n"
+"Id: %(id)s"
+msgstr ""
+"Vue <b>%(title)s</b>\n"
+"Id: %(id)s"
 
-#: ../lib/advene/gui/edit/montage.py:47
-msgid "Montage"
-msgstr "Montage"
+#: ../lib/advene/gui/views/finder.py:558
+msgid "Open in webbrowser"
+msgstr "Afficher dans un navigateur web"
 
-#: ../lib/advene/gui/edit/montage.py:49
-msgid "Dynamic montage of annotations"
-msgstr "Montage dynamique d'annotations"
+#: ../lib/advene/gui/views/finder.py:559
+#, python-format
+msgid "View applied to %s\n"
+msgstr "Vue appliquée sur %s\n"
 
-#: ../lib/advene/gui/edit/montage.py:55
-#: ../lib/advene/gui/views/logwindow.py:50
-#: ../lib/advene/gui/views/tagbag.py:60
-#: ../lib/advene/gui/views/activebookmarks.py:59
-#: ../lib/advene/gui/views/bookmarks.py:77
-msgid "Clear"
-msgstr "Effacer"
+#: ../lib/advene/gui/views/finder.py:564 ../lib/advene/gui/popup.py:525
+msgid "Activate"
+msgstr "Activer"
 
-#: ../lib/advene/gui/edit/montage.py:56
-#: ../lib/advene/gui/views/transcription.py:472
-#: ../lib/advene/gui/widget.py:1059
-msgid "Play"
-msgstr "Lecture"
+#: ../lib/advene/gui/views/finder.py:567
+msgid "Open in GUI"
+msgstr "Ouvrir dans l'interface"
 
-#: ../lib/advene/gui/edit/montage.py:57
-msgid "Render"
-msgstr "Exporter en vidéo"
+#: ../lib/advene/gui/views/finder.py:569
+msgid "Unknown type of view??"
+msgstr "Type de vue inconnu??"
 
-#: ../lib/advene/gui/edit/montage.py:171
-msgid "Remove from montage"
-msgstr "Supprimer du montage"
+#: ../lib/advene/gui/views/finder.py:597
+msgid "Edit view"
+msgstr "Éditer la vue"
 
-#: ../lib/advene/gui/edit/montage.py:303 ../lib/advene/gui/popup.py:444
-#, python-format
-msgid "Extracting %s"
-msgstr "Extraction de %s"
+#: ../lib/advene/gui/views/finder.py:606
+msgid "Open view"
+msgstr "Ouvrir la vue"
 
-#: ../lib/advene/gui/edit/montage.py:304
+#: ../lib/advene/gui/views/finder.py:646 ../lib/advene/gui/views/finder.py:710
 #, python-format
 msgid ""
-"Exporting montage %(title)s\n"
-"to %%(filename)s"
+"%(type)s <b>%(title)s</b>\n"
+"Id: %(id)s"
 msgstr ""
-"Export du montage %(title)s\n"
-"vers %%(filename)s"
-
-#: ../lib/advene/gui/edit/montage.py:396
-msgid "Drop an annotation here to remove it from the list"
-msgstr "Déposez une annotation ici pour l'enlever de la liste"
+"%(type)s <b>%(title)s</b>\n"
+"Id: %(id)s"
 
-#: ../lib/advene/gui/edit/montage.py:407
-msgid "Play the montage"
-msgstr "Jouer le montage"
+#: ../lib/advene/gui/views/finder.py:661
+#: ../lib/advene/gui/views/interactivequery.py:401
+msgid "Edit query"
+msgstr "Éditer la requête"
 
-#: ../lib/advene/gui/edit/montage.py:412
-msgid "Save the view in the package"
-msgstr "Sauvegarder la vue dans le recueil"
+#: ../lib/advene/gui/views/finder.py:669
+msgid "Try to apply the query on..."
+msgstr "Essayer d'appliquer la requête sur..."
 
-#: ../lib/advene/gui/edit/montage.py:460
-msgid "Set zoom level"
-msgstr "Fixer le niveau de zoom"
+#: ../lib/advene/gui/views/finder.py:687 ../lib/advene/gui/popup.py:860
+msgid "the package"
+msgstr "le recueil"
 
-#: ../lib/advene/gui/edit/montage.py:465
-msgid "Set 100% zoom"
-msgstr "Zoom à 100%"
+#: ../lib/advene/gui/views/finder.py:688 ../lib/advene/gui/popup.py:861
+msgid "all annotations of the package"
+msgstr "toutes les annotations du recueil"
 
-#: ../lib/advene/gui/edit/montage.py:471
-#: ../lib/advene/gui/views/interactivequery.py:439
-msgid "Unhighlight annotations"
-msgstr "Désactiver les annotations"
+#: ../lib/advene/gui/views/finder.py:689 ../lib/advene/gui/popup.py:862
+msgid "the first annotation of the package"
+msgstr "la première annotation du recueil"
 
-#: ../lib/advene/gui/edit/montage.py:475 ../lib/advene/gui/edit/montage.py:484
-#: ../lib/advene/gui/views/interactivequery.py:443
-#: ../lib/advene/gui/views/interactivequery.py:480
-msgid "Highlight annotations"
-msgstr "Activer les annotations"
+#: ../lib/advene/gui/views/finder.py:734
+msgid "Edit resource"
+msgstr "Éditer la ressource"
 
-#: ../lib/advene/gui/edit/montage.py:545
-msgid "Total duration:"
-msgstr "Durée totale :"
+#: ../lib/advene/gui/views/finder.py:769 ../lib/advene/util/helper.py:569
+#, python-format
+msgid ""
+"Package %(title)s:\n"
+"%(schema)s\n"
+"%(annotation)s in %(annotation_type)s\n"
+"%(relation)s in %(relation_type)s\n"
+"%(query)s\n"
+"%(view)s\n"
+"\n"
+"Description:\n"
+"%(description)s\n"
+msgstr ""
+"Recueil %(title)s:\n"
+"%(schema)s\n"
+"%(annotation)s dans %(annotation_type)s\n"
+"%(relation)s dans %(relation_type)s\n"
+"%(query)s\n"
+"%(view)s\n"
+"\n"
+"Description:\n"
+"%(description)s\n"
 
-#: ../lib/advene/gui/edit/frameselector.py:43
-msgid "Click on a frame to select its time."
-msgstr "Cliquer sur une image pour sélectionner son temps."
+#: ../lib/advene/gui/views/finder.py:790
+#, python-format
+msgid "%(type)s %(title)s"
+msgstr "%(type)s %(title)s"
 
-#: ../lib/advene/gui/edit/frameselector.py:177
-msgid "Select the appropriate snapshot"
-msgstr "Sélectionnez l'image appropriée"
-
-#: ../lib/advene/gui/edit/frameselector.py:230
-#: ../lib/advene/gui/edit/frameselector.py:283
-msgid "Click to see more frames or scroll with the mouse wheel"
-msgstr "Cliquez pour voir plus d'images, ou défilez avec la molette"
+#: ../lib/advene/gui/views/finder.py:793 ../lib/advene/gui/edit/elements.py:519
+#: ../lib/advene/gui/edit/elements.py:568
+#: ../lib/advene/gui/edit/elements.py:655
+#: ../lib/advene/gui/edit/elements.py:735
+#: ../lib/advene/gui/edit/elements.py:793
+#: ../lib/advene/gui/edit/elements.py:884
+#: ../lib/advene/gui/edit/elements.py:954
+#: ../lib/advene/gui/edit/elements.py:1066
+msgid "Metadata"
+msgstr "Métadonnées"
 
-#: ../lib/advene/gui/edit/transcribe.py:67
-msgid "Transcription importer"
-msgstr "Importateur de transcription"
+#: ../lib/advene/gui/views/finder.py:810
+msgid "Column-based package finder"
+msgstr "Afficher un navigateur en colonnes du recueil"
 
-#: ../lib/advene/gui/edit/transcribe.py:78
-msgid "Note taking"
-msgstr "Prise de notes"
+#: ../lib/advene/gui/views/editaccumulator.py:46
+msgid "EditAccumulator"
+msgstr "Accumulateur d'édition"
 
-#: ../lib/advene/gui/edit/transcribe.py:80
-msgid "Take notes on the fly as a timestamped transcription"
-msgstr "Prendre des notes au vol sous forme de transcription temporalisée"
+#: ../lib/advene/gui/views/activebookmarks.py:55
+#: ../lib/advene/gui/views/activebookmarks.py:57
+msgid "ActiveBookmarks"
+msgstr "Signets Actifs"
 
-#: ../lib/advene/gui/edit/transcribe.py:87
-#: ../lib/advene/gui/views/activebookmarks.py:60
+#: ../lib/advene/gui/views/activebookmarks.py:63
 msgid "Export as static view"
 msgstr "Exporter en tant que vue statique"
 
-#: ../lib/advene/gui/edit/transcribe.py:148
-msgid "Timestamp"
-msgstr "Temps"
+#: ../lib/advene/gui/views/activebookmarks.py:434
+msgid "Bookmark duration"
+msgstr "Durée du signet."
 
-#: ../lib/advene/gui/edit/transcribe.py:148
-msgid "Click inserts timestamp marks"
-msgstr "Cliquer insére les marques de temps"
+#: ../lib/advene/gui/views/activebookmarks.py:435
+msgid "Enter the duration (in ms) to convert bookmarks into annotations"
+msgstr ""
+"Entrez la durée standard (en ms) pour convertir les signets en annotations."
 
-#: ../lib/advene/gui/edit/transcribe.py:149
-msgid "Insert on single-click"
-msgstr "Insérer sur simple-clic"
+#: ../lib/advene/gui/views/activebookmarks.py:457
+msgid "User-specified duration"
+msgstr "Durée définie par l'utilisateur"
 
-#: ../lib/advene/gui/edit/transcribe.py:149
-msgid "A single click will insert the mark (else a double click is needed)"
-msgstr ""
-"Un simple-clic insérera une marque de temps (sinon, un double-clic est "
-"nécessaire)"
+#: ../lib/advene/gui/views/activebookmarks.py:458
+msgid "2s duration"
+msgstr "Durée de 2s"
 
-#: ../lib/advene/gui/edit/transcribe.py:150
-msgid "Play on scroll"
-msgstr "Jouer après modification"
+#: ../lib/advene/gui/views/activebookmarks.py:459
+msgid "Complete coverage"
+msgstr "Couverture complète"
 
-#: ../lib/advene/gui/edit/transcribe.py:150
-msgid "Play the new position upon timestamp modification"
-msgstr "Joue la nouvelle position après la modification de la marque de temps"
+#: ../lib/advene/gui/views/activebookmarks.py:477
+msgid "Drop a bookmark here to remove it from the list"
+msgstr "Déposez un signet ici pour le supprimer de la liste."
 
-#: ../lib/advene/gui/edit/transcribe.py:151
-msgid "Generate empty annotations"
-msgstr "Contenus vides"
+#: ../lib/advene/gui/views/activebookmarks.py:504
+msgid "Type of the annotations that will be created"
+msgstr "Type d'annotation où les annotations seront créées."
 
-#: ../lib/advene/gui/edit/transcribe.py:151
-msgid "If checked, generate annotations for empty text"
-msgstr "Si coché, des annotations seront générées pour les contenus vides"
+#: ../lib/advene/gui/views/activebookmarks.py:522
+#: ../lib/advene/gui/edit/transcribe.py:1130
+msgid "Smallish"
+msgstr "Tout petit"
 
-#: ../lib/advene/gui/edit/transcribe.py:152
-msgid "Reaction time"
-msgstr "Temps de réaction"
+#: ../lib/advene/gui/views/activebookmarks.py:523
+#: ../lib/advene/gui/edit/transcribe.py:1131 ../lib/advene/rules/actions.py:169
+msgid "Small"
+msgstr "Petit"
 
-#: ../lib/advene/gui/edit/transcribe.py:152
-msgid ""
-"Reaction time (substracted from current player time, except when paused.)"
-msgstr "Temps de réaction (soustrait du temps de la vidéo, sauf en pause)"
+#: ../lib/advene/gui/views/activebookmarks.py:524
+#: ../lib/advene/gui/edit/transcribe.py:1132 ../lib/advene/rules/actions.py:170
+msgid "Normal"
+msgstr "Normal"
 
-#: ../lib/advene/gui/edit/transcribe.py:153
-msgid "Auto-insert"
-msgstr "Insertion automatique"
+#: ../lib/advene/gui/views/activebookmarks.py:525
+#: ../lib/advene/gui/edit/transcribe.py:1133 ../lib/advene/rules/actions.py:171
+msgid "Large"
+msgstr "Grand"
 
-#: ../lib/advene/gui/edit/transcribe.py:153
-msgid "Automatic timestamp mark insertion"
-msgstr "Insertion automatique des marques de temps"
+#: ../lib/advene/gui/views/activebookmarks.py:526
+#: ../lib/advene/gui/edit/transcribe.py:1134
+msgid "Larger"
+msgstr "Plus grand"
 
-#: ../lib/advene/gui/edit/transcribe.py:154
-msgid "Automatic insertion delay"
-msgstr "Délai d'insertion automatique"
+#: ../lib/advene/gui/views/activebookmarks.py:527
+#: ../lib/advene/gui/edit/transcribe.py:1135
+msgid "Huge"
+msgstr "Énorme"
 
-#: ../lib/advene/gui/edit/transcribe.py:154
+#: ../lib/advene/gui/views/activebookmarks.py:537
+msgid "Complete bookmarks into annotations"
+msgstr "Compléter les signets en annotations"
+
+#: ../lib/advene/gui/views/activebookmarks.py:538
+msgid "Save the current state"
+msgstr "Sauvegarder l'état courant"
+
+#: ../lib/advene/gui/views/activebookmarks.py:539
+#: ../lib/advene/gui/edit/transcribe.py:1165
+msgid "Set the size of snaphots"
+msgstr "Fixer la taille des vignettes"
+
+#: ../lib/advene/gui/views/activebookmarks.py:806
+msgid "Remove end timestamp"
+msgstr "Supprimer la marque de temps de fin"
+
+#: ../lib/advene/gui/views/activebookmarks.py:1014
 msgid ""
-"If autoinsert is active, timestamp marks will be automatically inserted when "
-"text is entered after no interaction since this delay (in ms).\n"
-"1000 is typically a good value."
+"Error: cannot find an appropriate schema to create the Active-bookmark type."
 msgstr ""
-"Si l'insertion automatique est enclenchée, des marques de temps sont "
-"automatiquement insérées quand du texte est entré après aucune interaction "
-"depuis ce délai (en ms)\n"
-"1000 est une bonne valeur pour commencer."
+"Erreur: impossible de trouver un schéma approprié pour créer le type Active-"
+"bookmark"
 
-#: ../lib/advene/gui/edit/transcribe.py:155 ../lib/advene/gui/main.py:4368
-msgid "Font size"
-msgstr "Taille de la police"
+#: ../lib/advene/gui/views/activebookmarks.py:1019
+msgid "Active bookmark"
+msgstr "Signet actif"
 
-#: ../lib/advene/gui/edit/transcribe.py:155
-msgid "Font size for text (0 for standard size)"
-msgstr "Taille de la police pour le texte (0 pour la police standard)"
+#: ../lib/advene/gui/views/activebookmarks.py:1057
+msgid "Validate the annotation"
+msgstr "Valider l'annotation"
 
-#: ../lib/advene/gui/edit/transcribe.py:215
-#: ../lib/advene/gui/edit/transcribe.py:219
-#: ../lib/advene/gui/edit/transcribe.py:379
-#: ../lib/advene/gui/edit/transcribe.py:383
-msgid "Invalid timestamp mark"
-msgstr "Marque de temps non valide"
+#: ../lib/advene/gui/views/activebookmarks.py:1201
+msgid "Duplicate bookmark"
+msgstr "Dupliquer le signet"
 
-#: ../lib/advene/gui/edit/transcribe.py:496
-#: ../lib/advene/gui/views/timeline.py:2550
-#, python-format
-msgid "Position %s"
-msgstr "Position %s"
+#: ../lib/advene/gui/views/activebookmarks.py:1202
+msgid "Remove bookmark"
+msgstr "Supprimer le signet"
 
-#: ../lib/advene/gui/edit/transcribe.py:506 ../lib/advene/gui/popup.py:456
-msgid "Edit"
-msgstr "Éditer"
+#: ../lib/advene/gui/views/activebookmarks.py:1211
+msgid "Remove begin timestamp"
+msgstr "Supprimer le temps de début"
 
-#: ../lib/advene/gui/edit/transcribe.py:510
-msgid "Ignore the following text (toggle)"
-msgstr "Ignorer le texte qui suit (bascule)"
+#: ../lib/advene/gui/views/activebookmarks.py:1218
+msgid "Complete bookmark"
+msgstr "Compléter le signet"
 
-#: ../lib/advene/gui/edit/transcribe.py:514
-msgid "Remove mark"
-msgstr "Supprimer la marque"
+#: ../lib/advene/gui/views/activebookmarks.py:1222
+msgid "Change type to"
+msgstr "Changer le type en"
 
-#: ../lib/advene/gui/edit/transcribe.py:518
-msgid "Reaction-time offset"
-msgstr "Décalage du temps de réaction"
+#: ../lib/advene/gui/views/logwindow.py:43
+msgid "Links"
+msgstr "Liens"
 
-#: ../lib/advene/gui/edit/transcribe.py:522
-msgid "-1 sec"
-msgstr "-1 sec"
+#: ../lib/advene/gui/views/logwindow.py:45
+msgid "URL stack"
+msgstr "Pile d'URL"
 
-#: ../lib/advene/gui/edit/transcribe.py:525
-msgid "-0.5 sec"
-msgstr "-0.5 sec"
+#: ../lib/advene/gui/views/logwindow.py:123
+#, python-format
+msgid "Go to %s"
+msgstr "Aller à %s"
 
-#: ../lib/advene/gui/edit/transcribe.py:528
-msgid "-0.1 sec"
-msgstr "-0.1 sec"
+#: ../lib/advene/gui/views/logwindow.py:129 ../lib/advene/rules/actions.py:65
+msgid "Go to the given position"
+msgstr "Déplacement à une position donnée"
 
-#: ../lib/advene/gui/edit/transcribe.py:532
-msgid "+1 sec"
-msgstr "+1 sec"
+#: ../lib/advene/gui/views/logwindow.py:157
+msgid "Push a URL on the stack"
+msgstr "Ajouter une URL à la pile"
 
-#: ../lib/advene/gui/edit/transcribe.py:535
-msgid "+0.5 sec"
-msgstr "+0.5 sec"
+#: ../lib/advene/gui/views/logwindow.py:158
+msgid "Description of the URL"
+msgstr "Description de l'URL"
 
-#: ../lib/advene/gui/edit/transcribe.py:538
-msgid "+0.1 sec"
-msgstr "+0.1 sec"
+#: ../lib/advene/gui/views/interactivequery.py:52
+#: ../lib/advene/gui/views/interactivequery.py:100
+msgid "Interactive query"
+msgstr "Requête interactive"
 
-#: ../lib/advene/gui/edit/transcribe.py:629
-msgid "Invalid timestamp"
-msgstr "Marque de temps invalide"
+#: ../lib/advene/gui/views/interactivequery.py:54
+msgid "Interactive query dialog"
+msgstr "Fenêtre de requête interactive"
 
-#: ../lib/advene/gui/edit/transcribe.py:762
-#, python-format
-msgid "Invalid timestamp mark in conversion: %s"
-msgstr "Marque de temps non valide lors de la conversion: %s"
+#: ../lib/advene/gui/views/interactivequery.py:60
+#: ../lib/advene/gui/views/interactivequery.py:257
+msgid "Save query"
+msgstr "Sauver la requête"
 
-#: ../lib/advene/gui/edit/transcribe.py:879
+#: ../lib/advene/gui/views/interactivequery.py:123
+#: ../lib/advene/gui/views/interactivequery.py:173
 #, python-format
-msgid "Cannot save the file: %s"
-msgstr "Impossible de sauvegarder le fichier : %s"
+msgid ""
+"Invalid query.\n"
+"The following fields have an invalid value:\n"
+"%s"
+msgstr ""
+"Requête invalide.\n"
+"Les champs suivants ne sont pas valides:\n"
+"%s"
 
-#: ../lib/advene/gui/edit/transcribe.py:884
-#: ../lib/advene/gui/views/transcription.py:703
-#, python-format
-msgid "Transcription saved to %s"
-msgstr "Transcription sauvegardée dans %s"
+#: ../lib/advene/gui/views/interactivequery.py:137
+#: ../lib/advene/gui/views/interactivequery.py:297
+msgid "Saving the query..."
+msgstr "Sauvegarde de la requête"
 
-#: ../lib/advene/gui/edit/transcribe.py:890
-#: ../lib/advene/gui/edit/transcribe.py:980
-msgid "This will overwrite the current textual content. Are you sure?"
-msgstr "Ceci va écraser le contenu actuel. Êtes-vous sûr ?"
+#: ../lib/advene/gui/views/interactivequery.py:138
+#: ../lib/advene/gui/views/interactivequery.py:298
+msgid "Give a title and identifier for saving the query"
+msgstr "Donnez un titre à la requête"
 
-#: ../lib/advene/gui/edit/transcribe.py:893
-msgid "Select transcription file to load"
-msgstr "Sélectionnez le fichier de transcription"
+#: ../lib/advene/gui/views/interactivequery.py:181
+msgid "Expert search"
+msgstr "Mode expert"
 
-#: ../lib/advene/gui/edit/transcribe.py:910
+#: ../lib/advene/gui/views/interactivequery.py:187
 #, python-format
-msgid "Cannot open %(filename)s: %(error)s"
-msgstr "Impossible de lire %(filename)s : %(error)s"
+msgid ""
+"TALES error in interactive expression:\n"
+"%s"
+msgstr ""
+"Erreur TALES dans l'expression interactive :<\n"
+"%s"
 
-#: ../lib/advene/gui/edit/transcribe.py:965
-msgid "Cannot import annotations: no existing interface"
-msgstr "Impossible d'importer des annotations : aucune interface disponible"
+#: ../lib/advene/gui/views/interactivequery.py:248
+msgid "Interactive result"
+msgstr "Résultat de requête interactive"
 
-#: ../lib/advene/gui/edit/transcribe.py:967
-msgid "Select the annotation type to import"
-msgstr "Sélectionnez le type d'annotation à importer"
+#: ../lib/advene/gui/views/interactivequery.py:250
+msgid "Interactive result display"
+msgstr "Résultat de requête interactive"
 
-#: ../lib/advene/gui/edit/transcribe.py:976
-#, python-format
-msgid "There are no annotations of type %s"
-msgstr "Il n'y a pas d'annotation de type %s"
+#: ../lib/advene/gui/views/interactivequery.py:275
+msgid "Result of interactive query"
+msgstr "Résultats de la requête interactive"
 
-#: ../lib/advene/gui/edit/transcribe.py:1005
-msgid "Cannot convert the data: no associated package"
-msgstr "Impossible de convertir les données : aucun recueil associé"
+#: ../lib/advene/gui/views/interactivequery.py:279
+msgid "Result of a query"
+msgstr "Résultat d'une requête"
 
-#: ../lib/advene/gui/edit/transcribe.py:1008
-msgid "Converting transcription"
-msgstr "Conversion de la transcription"
+#: ../lib/advene/gui/views/interactivequery.py:334
+#, python-format
+msgid "Comment on annotations containing %s"
+msgstr "Commentaire sur les annotations contenant %s"
 
-#: ../lib/advene/gui/edit/transcribe.py:1014
-msgid "Choose the annotation-type where to create annotations.\n"
-msgstr "Choisissez le type d'annotation où les annotations seront créées.\n"
+#: ../lib/advene/gui/views/interactivequery.py:353
+msgid "Choose the annotation type where annotations will be created."
+msgstr "Choisissez le type d'annotation où les annotations seront créées."
 
-#: ../lib/advene/gui/edit/transcribe.py:1022
-msgid "Delete existing annotations in this type"
-msgstr "Supprimer les annotations existantes de ce type"
+#: ../lib/advene/gui/views/interactivequery.py:357
+#, python-format
+msgid "Copied result of the '%s' query"
+msgstr "Copie du résultat de la requête '%s'"
 
-#: ../lib/advene/gui/edit/transcribe.py:1027
-#: ../lib/advene/gui/views/timeline.py:3009 ../lib/advene/gui/main.py:3222
-msgid "Create a new annotation type"
-msgstr "Créer un nouveau type d'annotation"
-
-#: ../lib/advene/gui/edit/transcribe.py:1045
-msgid "Select type"
-msgstr "Sélection du type"
-
-#: ../lib/advene/gui/edit/transcribe.py:1049
-msgid "You want to create a new type. Please specify its schema and title."
-msgstr "Vous voulez créer un nouveau type. Spécifiez son titre et son schéma."
+#: ../lib/advene/gui/views/interactivequery.py:369
+#, python-format
+msgid "Search/replace content in %d elements"
+msgstr "Rechercher/remplacer dans %d éléments"
 
-#: ../lib/advene/gui/edit/transcribe.py:1061
-msgid "Containing schema"
-msgstr "Schéma"
+#: ../lib/advene/gui/views/interactivequery.py:397
+msgid "Edit query again"
+msgstr "Rééditer la requête"
 
-#: ../lib/advene/gui/edit/transcribe.py:1074
-msgid "Export options"
-msgstr "Options d'export"
+#: ../lib/advene/gui/views/interactivequery.py:411
+msgid "Search again"
+msgstr "Relancer la recherche"
 
-#: ../lib/advene/gui/edit/transcribe.py:1079
-msgid "Generate annotations for empty contents"
-msgstr "Générer des annotations pour les contenus vides"
+#: ../lib/advene/gui/views/interactivequery.py:417
+msgid "Empty result"
+msgstr "Résultat vide"
 
-#: ../lib/advene/gui/edit/transcribe.py:1104
+#: ../lib/advene/gui/views/interactivequery.py:426
 #, python-format
-msgid "The %s identifier already exists. Choose another one."
-msgstr "L'identificateur %s est déjà défini. Choisissez-en un autre."
-
-#: ../lib/advene/gui/edit/transcribe.py:1143
-msgid "Notes converted"
-msgstr "Notes converties"
+msgid "Result is a list of %d annotations."
+msgstr "Le résultat est une liste de %d annotation(s)."
 
-#: ../lib/advene/gui/edit/transcribe.py:1147
-#: ../lib/advene/gui/views/bookmarks.py:169
+#: ../lib/advene/gui/views/interactivequery.py:428
 #, python-format
-msgid ""
-"Conversion completed.\n"
-"%s annotations generated."
-msgstr ""
-"Conversion terminée.\n"
-"%s annotations générées."
-
-#: ../lib/advene/gui/edit/transcribe.py:1163
-#: ../lib/advene/gui/views/activebookmarks.py:546
-msgid "Smallish"
-msgstr "Tout petit"
-
-#: ../lib/advene/gui/edit/transcribe.py:1167
-#: ../lib/advene/gui/views/activebookmarks.py:550
-msgid "Larger"
-msgstr "Plus grand"
+msgid "Result is a list of  %(number)d elements with %(elements)s."
+msgstr "Le résultat est une liste de %(number)d elements avec %(elements)s."
 
-#: ../lib/advene/gui/edit/transcribe.py:1168
-#: ../lib/advene/gui/views/activebookmarks.py:551
-msgid "Huge"
-msgstr "Énorme"
+#: ../lib/advene/gui/views/interactivequery.py:440
+#: ../lib/advene/gui/edit/montage.py:481
+msgid "Unhighlight annotations"
+msgstr "Désactiver les annotations"
 
-#: ../lib/advene/gui/edit/transcribe.py:1190
-msgid "Open"
-msgstr "Ouvrir"
+#: ../lib/advene/gui/views/interactivequery.py:444
+#: ../lib/advene/gui/views/interactivequery.py:481
+#: ../lib/advene/gui/edit/montage.py:485 ../lib/advene/gui/edit/montage.py:494
+msgid "Highlight annotations"
+msgstr "Activer les annotations"
 
-#: ../lib/advene/gui/edit/transcribe.py:1191
-msgid "Save"
-msgstr "Sauver"
+#: ../lib/advene/gui/views/interactivequery.py:465
+#: ../lib/advene/gui/edit/imports.py:184 ../lib/advene/gui/edit/imports.py:185
+msgid "Annotations"
+msgstr "Annotations"
 
-#: ../lib/advene/gui/edit/transcribe.py:1192
-msgid "Save As"
-msgstr "Sauver sous"
+#: ../lib/advene/gui/views/interactivequery.py:471
+msgid "Other elements"
+msgstr "Autres éléments"
 
-#: ../lib/advene/gui/edit/transcribe.py:1193
-msgid "Import"
-msgstr "Importer"
+#: ../lib/advene/gui/views/interactivequery.py:475
+msgid "Display annotations in timeline"
+msgstr "Afficher les annotations dans une ligne de temps"
 
-#: ../lib/advene/gui/edit/transcribe.py:1193
-msgid "Import from annotations"
-msgstr "Importer des annotations"
+#: ../lib/advene/gui/views/interactivequery.py:476
+msgid "Display annotations as transcription"
+msgstr "Afficher les annotations sous forme de transcription"
 
-#: ../lib/advene/gui/edit/transcribe.py:1194
-msgid "Convert"
-msgstr "Convertir"
+#: ../lib/advene/gui/views/interactivequery.py:482
+#: ../lib/advene/gui/views/interactivequery.py:504
+msgid "Export table"
+msgstr "Exporter le tableau"
 
-#: ../lib/advene/gui/edit/transcribe.py:1194
-msgid "Convert to annotations"
-msgstr "Convertir en annotations"
+#: ../lib/advene/gui/views/interactivequery.py:483
+msgid "Create annotations from the result"
+msgstr "Créer des annotations à partir du résultat"
 
-#: ../lib/advene/gui/edit/transcribe.py:1196
-msgid "Center on the current mark"
-msgstr "Centrer sur la marque courante"
+#: ../lib/advene/gui/views/interactivequery.py:484
+msgid "Define a montage with the result"
+msgstr "Définir un montage avec le résultat"
 
-#: ../lib/advene/gui/edit/transcribe.py:1197
-msgid "Find"
-msgstr "Chercher"
+#: ../lib/advene/gui/views/interactivequery.py:485
+msgid "Create a comment view with the result"
+msgstr "Créer un commentaire avec le résultat"
 
-#: ../lib/advene/gui/edit/transcribe.py:1197
-msgid "Search a string"
-msgstr "Rechercher un mot"
+#: ../lib/advene/gui/views/interactivequery.py:486
+msgid "Search and replace strings in the annotations content"
+msgstr "Cherche et remplace du texte dans le contenu des annotations"
 
-#: ../lib/advene/gui/edit/transcribe.py:1198
-msgid "Scale"
-msgstr "Échelle"
+#: ../lib/advene/gui/views/interactivequery.py:511
+msgid "Edit elements"
+msgstr "Éditer les éléments"
 
-#: ../lib/advene/gui/edit/transcribe.py:1198
-#: ../lib/advene/gui/views/activebookmarks.py:564
-msgid "Set the size of snaphots"
-msgstr "Fixer la taille des vignettes"
+#: ../lib/advene/gui/views/interactivequery.py:517
+msgid "Open in python evaluator"
+msgstr "Afficher dans l'évaluateur python"
 
-#: ../lib/advene/gui/edit/transcribe.py:1221
-msgid "Automatically scroll to the mark position when playing"
-msgstr "Défiler automatiquement lors du jeu de la vidéo"
+#: ../lib/advene/gui/views/interactivequery.py:520
+#, python-format
+msgid ""
+"Result:\n"
+"%s"
+msgstr ""
+"Résultat:\n"
+"%s"
 
-#: ../lib/advene/gui/edit/transcribe.py:1223
-msgid "Autoscroll"
-msgstr "Défilement automatique"
+#: ../lib/advene/gui/views/interactivequery.py:562
+msgid "Results of _interactive query"
+msgstr "Résultats de la requête _interactive"
 
-#: ../lib/advene/gui/edit/transcribe.py:1230
-msgid "Autoinsert"
-msgstr "Insertion automatique"
+#: ../lib/advene/gui/popup.py:135
+msgid "Choose the file to insert"
+msgstr "Choisissez le fichier à insérer"
 
-#: ../lib/advene/gui/edit/transcribe.py:1232
-msgid "Automatically insert marks"
-msgstr "Insérer des marques de temps automatiquement"
+#: ../lib/advene/gui/popup.py:143
+msgid "Select a valid identifier"
+msgstr "Sélectionnez un identificateur valide."
 
-#: ../lib/advene/gui/edit/elements.py:74
+#: ../lib/advene/gui/popup.py:144
 #, python-format
-msgid "No edit popup available for element %s"
-msgstr "Pas de fenêtre d'édition disponible pour l'élément %s"
+msgid ""
+"The filename %s contains invalid characters\n"
+"that have been replaced.\n"
+"You can modify this identifier if necessary:"
+msgstr ""
+"Le nom de fichier %s contient des caractères\n"
+"invalides qui ont été remplacés.\n"
+"Vous pouvez modifier cet identificateur si nécessaire."
 
-#: ../lib/advene/gui/edit/elements.py:95
-msgid "Edit Window"
-msgstr "Fenêtre d'édition"
+#: ../lib/advene/gui/popup.py:155
+msgid "Choose the soundclip to insert"
+msgstr "Choisissez le fichier son à insérer"
 
-#: ../lib/advene/gui/edit/elements.py:134
-msgid "Apply changes and close the edit window"
-msgstr "Appliquer les modifications et fermer la fenêtre"
+#: ../lib/advene/gui/popup.py:159
+msgid "Choose the directory to insert"
+msgstr "Choisissez le répertoire à insérer."
 
-#: ../lib/advene/gui/edit/elements.py:139
-msgid "Apply changes"
-msgstr "Appliquer les modifications"
+#: ../lib/advene/gui/popup.py:171
+#, python-format
+msgid "Apply %s"
+msgstr "Appliquer %s"
 
-#: ../lib/advene/gui/edit/elements.py:273
-msgid "Content has been modified. Close anyway and lose data?"
+#: ../lib/advene/gui/popup.py:175
+msgid ""
+"Give the offset to use\n"
+"on specified element.\n"
+"It is in ms and can be\n"
+"either positive or negative."
 msgstr ""
-"Le contenu a été modifié. Souhaitez-vous fermer de toute façon et perdre les "
-"données ?"
+"Indiquez l'offset à ajouter\n"
+"sur l'élément spécifié.\n"
+"La valeur est en ms\n"
+"et peut être positive\n"
+"ou négative."
 
-#: ../lib/advene/gui/edit/elements.py:331
-#: ../lib/advene/gui/views/viewbook.py:234
-#: ../lib/advene/gui/views/viewbook.py:240
+#: ../lib/advene/gui/popup.py:219
 #, python-format
-msgid "Edit %s"
-msgstr "Éditer %s"
+msgid "Replace content in %s"
+msgstr "Remplacer du texte dans %s"
 
-#: ../lib/advene/gui/edit/elements.py:333
+#: ../lib/advene/gui/popup.py:222
 #, python-format
-msgid "View %s (read-only)"
-msgstr "Visualiser %s (lecture seule)"
+msgid "Replace content in annotations of type %s"
+msgstr "Remplacer du texte dans les annotations de type %s"
+
+#: ../lib/advene/gui/popup.py:225
+msgid "Replace content in all annotations"
+msgstr "Remplacer du texte dans toutes les annotations"
 
-#: ../lib/advene/gui/edit/elements.py:369
+#: ../lib/advene/gui/popup.py:318
 #, python-format
-msgid "Display %s"
-msgstr "Afficher %s"
+msgid "Copy id %s"
+msgstr "Copier l'id %s"
 
-#: ../lib/advene/gui/edit/elements.py:453
-msgid "Apply changes and edit previous annotation of same type"
+#: ../lib/advene/gui/popup.py:352
+#, python-format
+msgid ""
+"<b>Statistics about %s</b>\n"
+"\n"
 msgstr ""
-"Valider les modifications et éditer l'annotation précédente du même type"
-
-#: ../lib/advene/gui/edit/elements.py:457
-msgid "Apply changes and edit next annotation of same type"
-msgstr "Valider les modifications et éditer l'annotation suivante du même type"
+"<b>Statistiques sur %s</b>\n"
+"\n"
 
-#: ../lib/advene/gui/edit/elements.py:463
-msgid "Unhighlight annotation"
-msgstr "Désactiver les annotations"
+#: ../lib/advene/gui/popup.py:358
+#, python-format
+msgid "Renumbering annotations of type %s"
+msgstr "Renumérotation des annotations de type %s"
 
-#: ../lib/advene/gui/edit/elements.py:467
-msgid "Highlight annotation"
-msgstr "Activer les annotations"
+#: ../lib/advene/gui/popup.py:365
+msgid ""
+"<b>Renumber all annotations according to their order.</b>\n"
+"\n"
+"<i>Note that this action cannot be undone.</i>\n"
+"Replace the first numeric value of the annotation content with the new "
+"annotation number.\n"
+"If no numeric value is found and the annotation is structured, it will "
+"insert the number.\n"
+"If no numeric value is found and the annotation is of type text/plain, it "
+"will overwrite the annotation content.\n"
+"The offset parameter allows you to renumber from a given annotation."
+msgstr ""
+"<b>Renumérotation des annotations suivant leur ordre.</b>\n"
+"\n"
+"<i>Attention, cette action ne peut pas être annulée.</i>\n"
+"Cette action va remplacer la première valeur numérique de l'annotation par "
+"son numéro d'ordre.\n"
+"Si aucune valeur numérique n'est présente et que l'annotation est "
+"structurée, le numéro sera inséré.\n"
+"Si aucune valeur numérique n'est trouvée et que le type est text/plain, le "
+"contenu de l'annotation sera écrasé.\n"
+"Le paramètre offset permet de commencer la numérotation à partir de "
+"l'annotation offset."
 
-#: ../lib/advene/gui/edit/elements.py:498
-msgid "Fragment"
-msgstr "Fragment"
+#: ../lib/advene/gui/popup.py:371 ../lib/advene/gui/popup.py:513
+msgid "Offset"
+msgstr "Offset"
 
-#: ../lib/advene/gui/edit/elements.py:510
-#: ../lib/advene/gui/edit/elements.py:559
-#: ../lib/advene/gui/edit/elements.py:646
-#: ../lib/advene/gui/edit/elements.py:726
-#: ../lib/advene/gui/edit/elements.py:783
-#: ../lib/advene/gui/edit/elements.py:875
-#: ../lib/advene/gui/edit/elements.py:944
-#: ../lib/advene/gui/edit/elements.py:1056
-#: ../lib/advene/gui/edit/elements.py:1118 ../lib/advene/gui/main.py:4174
-msgid "Author"
-msgstr "Auteur"
+#: ../lib/advene/gui/popup.py:393
+#, python-format
+msgid "Renumbering %d annotations"
+msgstr "Renumérotation de %d annotations"
 
-#: ../lib/advene/gui/edit/elements.py:511
-#: ../lib/advene/gui/edit/elements.py:560
-#: ../lib/advene/gui/edit/elements.py:647
-#: ../lib/advene/gui/edit/elements.py:727
-#: ../lib/advene/gui/edit/elements.py:784
-#: ../lib/advene/gui/edit/elements.py:876
-#: ../lib/advene/gui/edit/elements.py:945
-#: ../lib/advene/gui/edit/elements.py:1057
-#: ../lib/advene/gui/edit/elements.py:1119 ../lib/advene/gui/main.py:4175
-msgid "Date"
-msgstr "Date"
+#: ../lib/advene/gui/popup.py:402
+#, python-format
+msgid "Annotation #%d"
+msgstr "Annotation #%d"
 
-#: ../lib/advene/gui/edit/elements.py:513
-#: ../lib/advene/gui/edit/elements.py:562
-#: ../lib/advene/gui/edit/elements.py:649
-#: ../lib/advene/gui/edit/elements.py:729
-#: ../lib/advene/gui/edit/elements.py:787
-#: ../lib/advene/gui/edit/elements.py:878
-#: ../lib/advene/gui/edit/elements.py:948
-#: ../lib/advene/gui/edit/elements.py:1060
-msgid "Metadata"
-msgstr "Métadonnées"
+#: ../lib/advene/gui/popup.py:433
+#, python-format
+msgid "Splitting package according to %s"
+msgstr "Découpage du recueil selon %s"
 
-#: ../lib/advene/gui/edit/elements.py:582
-#: ../lib/advene/gui/edit/elements.py:1065
-#: ../lib/advene/gui/views/relationdisplay.py:113
-msgid "Members"
-msgstr "Membres"
+#: ../lib/advene/gui/popup.py:436
+#, python-format
+msgid ""
+"For each of the %(count)d annotations in %(atype)s, create a package named "
+"after the source package and the annotation content, copying only "
+"annotations contained in the reference annotation."
+msgstr ""
+"Pour chacune des %(count)d annotations de %(atype)s, créer un recueil nommé "
+"d'après le recueil d'origine et le contenu de l'annotation, en n'y copying "
+"que les annotations contenues dans l'annotation de référence."
 
-#: ../lib/advene/gui/edit/elements.py:600
-#: ../lib/advene/gui/edit/elements.py:677
-#: ../lib/advene/gui/edit/elements.py:737
-#: ../lib/advene/gui/edit/elements.py:1128
-#: ../lib/advene/gui/views/table.py:250
-msgid "Content"
-msgstr "Contenu"
+#: ../lib/advene/gui/popup.py:456
+msgid "Created %(name)s - %(n) annotations"
+msgstr "Créé %(name)s - %(n) annotations"
 
-#: ../lib/advene/gui/edit/elements.py:617
-msgid "Apply changes and visualise in web browser"
-msgstr "Appliquer les modifications et visualiser dans le navigateur"
+#: ../lib/advene/gui/popup.py:473 ../lib/advene/gui/edit/montage.py:309
+#, python-format
+msgid "Extracting %s"
+msgstr "Extraction de %s"
 
-#: ../lib/advene/gui/edit/elements.py:622
-msgid "Apply changes and activate the view"
-msgstr "Appliquer les modifications et activer la vue"
-
-#: ../lib/advene/gui/edit/elements.py:630
-#: ../lib/advene/gui/edit/elements.py:711
-#: ../lib/advene/gui/edit/elements.py:768
-#: ../lib/advene/gui/edit/elements.py:859
-#: ../lib/advene/gui/edit/elements.py:928
-#: ../lib/advene/gui/edit/elements.py:1030
-msgid "Title (name)"
-msgstr "Titre (nom)"
+#: ../lib/advene/gui/popup.py:474
+#, python-format
+msgid ""
+"Exporting annotation %(title)s\n"
+"from %(begin)s to %(end)s\n"
+"to %%(filename)s"
+msgstr ""
+"Export de l'annotation %(title)s\n"
+"depuis %(begin)s à %(end)s\n"
+"to %%(filename)s"
 
-#: ../lib/advene/gui/edit/elements.py:634
-msgid "Name of the view"
-msgstr "Nom de la vue"
+#: ../lib/advene/gui/popup.py:485 ../lib/advene/gui/edit/transcribe.py:499
+msgid "Edit"
+msgstr "Éditer"
 
-#: ../lib/advene/gui/edit/elements.py:658
-msgid "Class"
-msgstr "Classe"
+#: ../lib/advene/gui/popup.py:487
+msgid "Browse"
+msgstr "Explorateur TALES"
 
-#: ../lib/advene/gui/edit/elements.py:661
-msgid "Match Filter"
-msgstr "Masque de filtrage"
+#: ../lib/advene/gui/popup.py:495 ../lib/advene/gui/popup.py:884
+msgid "Open in web browser"
+msgstr "Afficher dans un navigateur web"
 
-#: ../lib/advene/gui/edit/elements.py:699 ../lib/advene/gui/popup.py:821
-#, python-format
-msgid "Exception in query: %s"
-msgstr "Exception dans la requête : %s"
+#: ../lib/advene/gui/popup.py:501 ../lib/advene/gui/popup.py:505
+#: ../lib/advene/gui/edit/shapewidget.py:1601
+msgid "Delete"
+msgstr "Supprimer"
 
-#: ../lib/advene/gui/edit/elements.py:704
-msgid "Validate and run query on package"
-msgstr "Valider et lancer la requête sur le recueil"
+#: ../lib/advene/gui/popup.py:508
+msgid "Search/replace content"
+msgstr "Rechercher/remplacer"
 
-#: ../lib/advene/gui/edit/elements.py:715
-msgid "Name of the query"
-msgstr "Nom de la requête"
+#: ../lib/advene/gui/popup.py:526
+msgid "Desactivate"
+msgstr "Désactiver"
 
-#: ../lib/advene/gui/edit/elements.py:772
-msgid "Name of the package"
-msgstr "Nom du recueil"
+#: ../lib/advene/gui/popup.py:543
+msgid "Loop"
+msgstr "Boucler"
 
-#: ../lib/advene/gui/edit/elements.py:790
-#: ../lib/advene/gui/edit/elements.py:881
-#: ../lib/advene/gui/edit/elements.py:960
-#: ../lib/advene/gui/edit/elements.py:1074
-msgid "Description"
-msgstr "Description"
+#: ../lib/advene/gui/popup.py:544
+msgid "Duplicate"
+msgstr "Dupliquer"
 
-#: ../lib/advene/gui/edit/elements.py:794
-#: ../lib/advene/gui/edit/elements.py:885
-#: ../lib/advene/gui/edit/elements.py:964
-#: ../lib/advene/gui/edit/elements.py:1078
-msgid "Textual description of the package"
-msgstr "Description textuelle du recueil"
+#: ../lib/advene/gui/popup.py:548
+msgid "Save snapshot..."
+msgstr "Prendre une capture d'écran"
 
-#: ../lib/advene/gui/edit/elements.py:799
-msgid "Default dynamic view"
-msgstr "Vue dynamique par défaut"
+#: ../lib/advene/gui/popup.py:550
+msgid "Extract video fragment"
+msgstr "Extraire un fragment vidéo"
 
-#: ../lib/advene/gui/edit/elements.py:803
-msgid "Dynamic view to activate on package load"
-msgstr "Vue dynamique à activer au chargement du recueil"
+#: ../lib/advene/gui/popup.py:580
+msgid "Incoming"
+msgstr "Entrantes"
 
-#: ../lib/advene/gui/edit/elements.py:808
-msgid "Default static view"
-msgstr "Vue statique par défaut"
+#: ../lib/advene/gui/popup.py:596
+msgid "Outgoing"
+msgstr "Sortantes"
 
-#: ../lib/advene/gui/edit/elements.py:812
-msgid "Static view to open on package load"
-msgstr "Vue statique à ouvrir au chargement du recueil"
+#: ../lib/advene/gui/popup.py:611
+msgid "Related annotations"
+msgstr "Annotations liées"
 
-#: ../lib/advene/gui/edit/elements.py:817
-msgid "Default adhoc view"
-msgstr "Vue adhoc par défaut"
+#: ../lib/advene/gui/popup.py:618
+msgid "Incoming relations"
+msgstr "Relations entrantes"
 
-#: ../lib/advene/gui/edit/elements.py:821
-msgid "Adhoc view to open on package load"
-msgstr "Vue adhoc à ouvrir au chargement du recueil"
+#: ../lib/advene/gui/popup.py:625
+msgid "Outgoing relations"
+msgstr "Relations sortantes"
 
-#: ../lib/advene/gui/edit/elements.py:826
-msgid "Cached duration"
-msgstr "Durée mémorisée"
+#: ../lib/advene/gui/popup.py:642
+#, python-format
+msgid "Begin: %s"
+msgstr "Début : %s"
 
-#: ../lib/advene/gui/edit/elements.py:830
-msgid "Cached duration in ms"
-msgstr "Durée mémorisée du média en ms"
+#: ../lib/advene/gui/popup.py:644
+#, python-format
+msgid "End: %s"
+msgstr "Fin : %s"
 
-#: ../lib/advene/gui/edit/elements.py:835
-msgid "Mediafile"
-msgstr "Fichier vidéo"
+#: ../lib/advene/gui/popup.py:645
+#, python-format
+msgid "Duration: %s"
+msgstr "Durée : %s"
 
-#: ../lib/advene/gui/edit/elements.py:839
-msgid "Location of associated media file"
-msgstr "Emplacement du fichier vidéo associé"
+#: ../lib/advene/gui/popup.py:652
+msgid "Members:"
+msgstr "Membres:"
 
-#: ../lib/advene/gui/edit/elements.py:863
-msgid "Name of the schema"
-msgstr "Nom du schéma"
+#: ../lib/advene/gui/popup.py:665
+msgid "Edit package properties..."
+msgstr "Éditer les propriétés du recueil..."
 
-#: ../lib/advene/gui/edit/elements.py:895
-#: ../lib/advene/gui/edit/elements.py:975
-msgid "TALES expression returning a color for the element"
-msgstr "Expression TALES spécifiant une couleur pour l'élément"
+#: ../lib/advene/gui/popup.py:666 ../lib/advene/gui/popup.py:787
+#, python-format
+msgid "%d annotations(s) - statistics"
+msgstr "%d annotation(s) - statistiques"
 
-#: ../lib/advene/gui/edit/elements.py:902
-#: ../lib/advene/gui/edit/elements.py:993
-msgid "Item color"
-msgstr "Couleur de l'item"
+#: ../lib/advene/gui/popup.py:668 ../lib/advene/gui/popup.py:895
+msgid "Create a new static view..."
+msgstr "Créer une nouvelle vue statique..."
 
-#: ../lib/advene/gui/edit/elements.py:906
-#: ../lib/advene/gui/edit/elements.py:997
-msgid ""
-"TALES expression returning a color for the items contained by the element"
-msgstr ""
-"Expression TALES retournant une couleur pour les items contenus dans "
-"l'élément"
+#: ../lib/advene/gui/popup.py:669 ../lib/advene/gui/popup.py:896
+msgid "Create a new dynamic view..."
+msgstr "Créer une nouvelle vue dynamique..."
 
-#: ../lib/advene/gui/edit/elements.py:932
-#: ../lib/advene/gui/edit/elements.py:1034
-msgid "Name of the type"
-msgstr "Nom du type"
+#: ../lib/advene/gui/popup.py:670 ../lib/advene/gui/popup.py:782
+msgid "Create a new annotation..."
+msgstr "Créer une nouvelle annotation..."
 
-#: ../lib/advene/gui/edit/elements.py:950
-#: ../lib/advene/gui/edit/elements.py:1039
-#: ../lib/advene/gui/edit/elements.py:1308
-msgid "MIME Type"
-msgstr "Type MIME"
+#: ../lib/advene/gui/popup.py:672 ../lib/advene/gui/popup.py:898
+msgid "Create a new schema..."
+msgstr "Créer un nouveau schéma"
 
-#: ../lib/advene/gui/edit/elements.py:954
-#: ../lib/advene/gui/edit/elements.py:1043
-msgid "MIMEType of the content"
-msgstr "Type MIME du contenu"
+#: ../lib/advene/gui/popup.py:673 ../lib/advene/gui/popup.py:893
+msgid "Create a new query..."
+msgstr "Créer une nouvelle requête"
 
-#: ../lib/advene/gui/edit/elements.py:982
-#: ../lib/advene/gui/views/transcription.py:165
-msgid "Representation"
-msgstr "Représentation"
+#: ../lib/advene/gui/popup.py:681
+msgid "Create a new folder..."
+msgstr "Créer un nouveau répertoire..."
 
-#: ../lib/advene/gui/edit/elements.py:986
-msgid ""
-"TALES expression used to get a compact representation of the annotations"
-msgstr ""
-"Expression TALES fournissant une représentation compacte des annotations"
+#: ../lib/advene/gui/popup.py:682
+msgid "Create a new resource file..."
+msgstr "Créer une nouvelle ressource"
 
-#: ../lib/advene/gui/edit/elements.py:987
-#, python-format
-msgid "Display %s key"
-msgstr "Afficher la clé %s"
+#: ../lib/advene/gui/popup.py:683
+msgid "Insert a new resource file..."
+msgstr "Insérer un nouveau fichier ressource..."
 
-#: ../lib/advene/gui/edit/elements.py:1003
-msgid "Completions"
-msgstr "Complétions"
+#: ../lib/advene/gui/popup.py:684
+msgid "Insert a new resource directory..."
+msgstr "Insérer un nouveau répertoire ressource..."
 
-#: ../lib/advene/gui/edit/elements.py:1007
-msgid "Space-separated list of words used for content completion"
-msgstr "Liste de mots, séparés par des espaces, utilisés pour la complétion."
+#: ../lib/advene/gui/popup.py:693 ../lib/advene/gui/popup.py:695
+msgid "Insert a soundclip..."
+msgstr "Insérer un fichier son..."
 
-#: ../lib/advene/gui/edit/elements.py:1013
-msgid "Advanced"
-msgstr "Avancées"
+#: ../lib/advene/gui/popup.py:706
+msgid "Play sound"
+msgstr "Jouer un son"
 
-#: ../lib/advene/gui/edit/elements.py:1063
-msgid "Any annotation type"
-msgstr "Tout type d'annotation"
+#: ../lib/advene/gui/popup.py:716
+msgid "Create a new annotation type..."
+msgstr "Créer un nouveau type d'annotation..."
 
-#: ../lib/advene/gui/edit/elements.py:1089
-msgid "TALES expression specifying a color"
-msgstr "Expression TALES spécifiant une couleur"
+#: ../lib/advene/gui/popup.py:718
+msgid "Create a new relation type..."
+msgstr "Créer un nouveau type de relation..."
 
-#: ../lib/advene/gui/edit/elements.py:1116
-msgid "MIMEType"
-msgstr "Type MIME"
+#: ../lib/advene/gui/popup.py:720 ../lib/advene/gui/popup.py:781
+#: ../lib/advene/gui/popup.py:834
+msgid "Select a color"
+msgstr "Choisissez une couleur"
 
-#: ../lib/advene/gui/edit/elements.py:1341
+#: ../lib/advene/gui/popup.py:729
 #, python-format
-msgid "Error: cannot find a content handler for %s"
-msgstr "Erreur : impossible d'ouvrir une fenêtre d'édition pour %s"
+msgid "A caption dynamic view for %s already seems to exist."
+msgstr "Il semble qu'une vue de sous-titrage pour le type %s existe déjà."
 
-#: ../lib/advene/gui/edit/elements.py:1457
-#: ../lib/advene/gui/edit/elements.py:1682
+#: ../lib/advene/gui/popup.py:738
 #, python-format
-msgid ""
-"Cannot read the data:\n"
-"%s"
-msgstr ""
-"Impossible de lire les données :\n"
-"%s"
+msgid "Caption %s annotations"
+msgstr "Sous-titrer les annotations de type %s"
 
-#: ../lib/advene/gui/edit/elements.py:1481
-#: ../lib/advene/gui/edit/elements.py:1707
-msgid "Save content to..."
-msgstr "Sauver le contenu..."
+#: ../lib/advene/gui/popup.py:748 ../lib/advene/rules/actions.py:121
+msgid "Caption the annotation"
+msgstr "Sous-titrer l'annotation"
 
-#: ../lib/advene/gui/edit/elements.py:1492
-#: ../lib/advene/gui/edit/elements.py:1720
-#, python-format
-msgid ""
-"Cannot save the data:\n"
-"%s"
-msgstr ""
-"Impossible de sauvegarder les données :\n"
-"%s"
+#: ../lib/advene/gui/popup.py:770
+msgid "Create a comment view"
+msgstr "Créer une nouvelle vue commentaire"
 
-#: ../lib/advene/gui/edit/elements.py:1511
-#: ../lib/advene/gui/edit/elements.py:1734
-msgid "Open a file (C-o)"
-msgstr "Ouvrir un fichier (C-o)"
+#: ../lib/advene/gui/popup.py:771
+msgid "Generate a caption dynamic view..."
+msgstr "Créer une vue dynamique de sous-titrage..."
 
-#: ../lib/advene/gui/edit/elements.py:1516
-#: ../lib/advene/gui/edit/elements.py:1739
-msgid "Save to a file (C-s)"
-msgstr "Sauvegarder dans un fichier (C-s)"
+#: ../lib/advene/gui/popup.py:772
+msgid "Display as transcription"
+msgstr "Afficher en transcription"
 
-#: ../lib/advene/gui/edit/elements.py:1521
-#: ../lib/advene/gui/edit/elements.py:1744
-msgid "Reload the file (C-r)"
-msgstr "Recharger le fichier (C-r)"
+#: ../lib/advene/gui/popup.py:773
+msgid "Display annotations in table"
+msgstr "Afficher les annotations dans un tableau"
 
-#: ../lib/advene/gui/edit/elements.py:1527
-msgid "Insert a value from the browser (C-i)"
-msgstr "Insérer une valeur depuis le browser (C-i)"
+#: ../lib/advene/gui/popup.py:774
+msgid "Export to another format..."
+msgstr "Exporter dans un autre format..."
 
-#: ../lib/advene/gui/edit/elements.py:1773
-msgid "Begin time is greater than end time"
-msgstr "Le moment de début est plus grand que celui de fin"
+#: ../lib/advene/gui/popup.py:775
+msgid "Split according to annotations"
+msgstr "Découpage selon les annotations"
 
-#: ../lib/advene/gui/edit/elements.py:1803
-#: ../lib/advene/gui/views/table.py:252
-msgid "Begin"
-msgstr "Début"
+#: ../lib/advene/gui/popup.py:777
+#, python-format
+msgid "Apply %s..."
+msgstr "Appliquer %s..."
 
-#: ../lib/advene/gui/edit/elements.py:1812
-#: ../lib/advene/gui/views/table.py:253 ../lib/advene/gui/main.py:628
-msgid "End"
-msgstr "Fin"
+#: ../lib/advene/gui/popup.py:783
+msgid "Delete all annotations"
+msgstr "Supprimer toutes les annotations"
 
-#: ../lib/advene/gui/edit/elements.py:2044
-msgid "Expecting an integer."
-msgstr "Un entier est attendu."
+#: ../lib/advene/gui/popup.py:784
+msgid "Renumber annotations..."
+msgstr "Renuméroter les annotations..."
 
-#: ../lib/advene/gui/edit/elements.py:2076
-#, python-format
-msgid ""
-"The %(attribute)s attribute could not be updated:\n"
-"\n"
-"%(error)s\n"
-"\n"
-"Resetting to the original value."
-msgstr ""
-"L'attribut %(attribute)s ne peut pas être mis à jour:\n"
-"\n"
-"%(error)s\n"
-"\n"
-"Il est remis à son ancienne valeur."
+#: ../lib/advene/gui/popup.py:785
+msgid "Shot validation view..."
+msgstr "Validation de plans..."
 
-#: ../lib/advene/gui/edit/elements.py:2103
+#: ../lib/advene/gui/popup.py:797
 #, python-format
-msgid ""
-"The following attributes cannot be updated:\n"
-"\n"
-"%s"
-msgstr ""
-"Les attributs suivants sont invalides :\n"
-"\n"
-"%s"
+msgid "A follow dynamic view for %s already seems to exist."
+msgstr "Il semble qu'une vue de suivi pour le type %s existe déjà."
 
-#: ../lib/advene/gui/edit/elements.py:2143
+#: ../lib/advene/gui/popup.py:806
 #, python-format
-msgid ""
-"The following attributes could not be updated:\n"
-"\n"
-"%s"
-msgstr ""
-"Les attributs suivants n'ont pas été mis à jour :\n"
-"\n"
-"%s"
+msgid "Follow %s relation-type"
+msgstr "Suivre le type de relation %s"
 
-#: ../lib/advene/gui/edit/elements.py:2160
-msgid "Attribute"
-msgstr "Attribut"
+#: ../lib/advene/gui/popup.py:815
+msgid "Follow the relation"
+msgstr "Suivre la relation"
 
-#: ../lib/advene/gui/edit/elements.py:2168
-#: ../lib/advene/gui/views/browser.py:366
-msgid "Value"
-msgstr "Valeur"
+#: ../lib/advene/gui/popup.py:835
+msgid "Delete all relations..."
+msgstr "Supprimer toutes les relations..."
 
-#: ../lib/advene/gui/edit/elements.py:2259
-msgid "Insert an element"
-msgstr "Insérer un élément"
+#: ../lib/advene/gui/popup.py:836
+msgid "Create montage from related annotations"
+msgstr "Créer un montage suivant les relations"
 
-#: ../lib/advene/gui/edit/elements.py:2260
-msgid "Choose the element to insert."
-msgstr "Choisissez l'élément à insérer."
+#: ../lib/advene/gui/popup.py:837
+msgid "Create dynamic view following relations"
+msgstr "Créer une vue dynamique suivant les relations"
 
-#: ../lib/advene/gui/edit/elements.py:2330
-#: ../lib/advene/gui/edit/elements.py:2373
+#: ../lib/advene/gui/popup.py:852 ../lib/advene/gui/edit/elements.py:705
 #, python-format
-msgid "Some tags contain invalid characters: %s"
-msgstr "Certains tags contiennent des caractères non-valides: %s"
+msgid "Exception in query: %s"
+msgstr "Exception dans la requête : %s"
 
-#: ../lib/advene/gui/edit/elements.py:2353
-msgid "Tags:"
-msgstr "Tags :"
+#: ../lib/advene/gui/popup.py:855
+msgid "Apply query on..."
+msgstr "Appliquer la requête sur..."
 
-#: ../lib/advene/gui/views/browser.py:163
-#: ../lib/advene/gui/views/browser.py:165
-msgid "TALES browser"
-msgstr "Explorateur TALES"
+#: ../lib/advene/gui/popup.py:880
+msgid "Activate view"
+msgstr "Activation d'une vue"
 
-#: ../lib/advene/gui/views/browser.py:170
-msgid "Display result in table"
-msgstr "Afficher le résultat dans un tableau"
+#: ../lib/advene/gui/popup.py:882
+msgid "Open adhoc view"
+msgstr "Ouvrir une vue adhoc"
 
-#: ../lib/advene/gui/views/browser.py:193
-msgid "Insert path"
-msgstr "Insérer le chemin TALES"
+#: ../lib/advene/gui/util/initialconfig.py:82
+msgid "Initial Advene configuration"
+msgstr "Configuration initiale d'Advene"
 
-#: ../lib/advene/gui/views/browser.py:194
-msgid "Insert value"
-msgstr "Insérer la valeur"
+#: ../lib/advene/gui/util/initialconfig.py:83
+msgid ""
+"<span size='large'><b>Welcome in Advene</b>\n"
+"This is the first time that you run Advene. Please answer some basic "
+"configuration questions. You will be able to modify these choices from the "
+"Advene interface, in the Edit/Preferences menu.</span>"
+msgstr ""
+"<span size='large'><b>Bienvenue dans Advene</b>\n"
+"C'est la première fois que vous utilisez Advene. Vous pouvez maintenant "
+"fixer certaines options de configuration essentielles. Vous pourrez modifier "
+"plus tard ces choix depuis l'interface d'Advene, dans le menu Edit/"
+"Préférences.</span>"
 
-#: ../lib/advene/gui/views/browser.py:249
-msgid "Expression returned None (there was an exception)"
-msgstr "L'expression a renvoyé None (il y a eu une exception)"
+#: ../lib/advene/gui/util/initialconfig.py:84
+msgid "Interface language"
+msgstr "Langue de l'interface"
 
-#: ../lib/advene/gui/views/browser.py:302
-msgid "Result is not a list"
-msgstr "Le résultat n'est pas une liste"
+#: ../lib/advene/gui/util/initialconfig.py:84
+msgid "Language used for the interface"
+msgstr "Langue utilisée pour l'interface"
 
-#: ../lib/advene/gui/views/accumulatorpopup.py:49
-msgid "PopupAccumulator"
-msgstr "Accumulateur de popups"
+#: ../lib/advene/gui/util/initialconfig.py:90
+msgid "Weekly check for Advene updates on the Advene website"
+msgstr "Vérification hebdomadaire des mises à jour depuis le site web d'Advene"
 
-#: ../lib/advene/gui/views/editionhistory.py:40
-msgid "Edition History"
-msgstr "Historique d'édition"
+#: ../lib/advene/gui/util/initialconfig.py:92
+msgid "Preferred directory for data files"
+msgstr "Répertoire préféré pour les fichiers de données"
 
-#: ../lib/advene/gui/views/editionhistory.py:42
-msgid "Access last edited/created elements"
-msgstr "Éléments récemment édités/créés"
+#: ../lib/advene/gui/util/initialconfig.py:92
+msgid "Preferred directory for storing data files (Advene packages)"
+msgstr ""
+"Répertoire préféré pour stocker les fichiers de données (recueils Advene)"
 
-#: ../lib/advene/gui/views/editionhistory.py:102
-msgid "Created"
-msgstr "Créés"
+#: ../lib/advene/gui/util/initialconfig.py:94
+msgid "Directories to search for movies"
+msgstr "Répertoires où chercher les films référencés"
 
-#: ../lib/advene/gui/views/editionhistory.py:103
-msgid "Edited"
-msgstr "Édités"
+#: ../lib/advene/gui/util/initialconfig.py:94
+#, python-format
+msgid ""
+"List of directories (separated by %(pathsep)s) to search for movie files."
+msgstr "Liste de répertoires (séparés par %(pathsep)s) où chercher les vidéos."
 
-#: ../lib/advene/gui/views/logwindow.py:43
-msgid "Links"
-msgstr "Liens"
+#: ../lib/advene/gui/util/initialconfig.py:95
+msgid "First look for movie file in the same directory as the package"
+msgstr ""
+"Chercher d'abord le fichier vidéo dans le même répertoire que le recueil"
 
-#: ../lib/advene/gui/views/logwindow.py:45
-msgid "URL stack"
-msgstr "Pile d'URL"
+#: ../lib/advene/gui/util/initialconfig.py:95
+msgid ""
+"If checked, the movie file will be searched for in the same directory as the "
+"referencing package."
+msgstr ""
+"Si cette case est cochée, les fichiers vidéos seront recherchés d'abord dans "
+"le même répertoire que le recueil qui les référence."
 
-#: ../lib/advene/gui/views/logwindow.py:123
-#, python-format
-msgid "Go to %s"
-msgstr "Aller à %s"
+#: ../lib/advene/gui/util/__init__.py:44 ../lib/advene/gui/edit/create.py:108
+msgid "Plain text content"
+msgstr "Contenu textuel"
 
-#: ../lib/advene/gui/views/logwindow.py:157
-msgid "Push a URL on the stack"
-msgstr "Ajouter une URL à la pile"
+#: ../lib/advene/gui/util/__init__.py:45
+msgid "HTML content"
+msgstr "Contenu HTML"
 
-#: ../lib/advene/gui/views/logwindow.py:158
-msgid "Description of the URL"
-msgstr "Description de l'URL"
+#: ../lib/advene/gui/util/__init__.py:46 ../lib/advene/gui/edit/create.py:109
+msgid "Simple-structured content"
+msgstr "Contenu simplement structuré"
 
-#: ../lib/advene/gui/views/checker.py:37
-msgid "Checker"
-msgstr "Vérificateur"
+#: ../lib/advene/gui/util/__init__.py:47
+msgid "List of numeric values"
+msgstr "Liste de valeurs numériques"
 
-#: ../lib/advene/gui/views/checker.py:39
-msgid "Check various package properties"
-msgstr "Vérifier diverses propriétés du recueil"
+#: ../lib/advene/gui/util/__init__.py:48 ../lib/advene/gui/edit/create.py:110
+msgid "SVG graphics content"
+msgstr "Contenu graphique SVG"
 
-#: ../lib/advene/gui/views/checker.py:90
-msgid "List of possible issues in the current package"
-msgstr "Liste des problèmes possibles dans le recueil."
+#: ../lib/advene/gui/util/__init__.py:387
+#, python-format
+msgid ""
+"Annotation Type %(title)s:\n"
+"%(count)s"
+msgstr ""
+"Type d'annotation %(title)s:\n"
+"%(count)s"
 
-#: ../lib/advene/gui/views/checker.py:108
-msgid "Overlapping"
-msgstr "Recouvrement"
+#: ../lib/advene/gui/util/__init__.py:393
+#, python-format
+msgid ""
+"Relation Type %(title)s:\n"
+"%(count)s"
+msgstr ""
+"Type de relation %(title)s:\n"
+"%(count)s"
 
-#: ../lib/advene/gui/views/tagbag.py:52
-msgid "Tag Bag"
-msgstr "Sac à tags"
+#: ../lib/advene/gui/util/dialog.py:419 ../lib/advene/gui/util/dialog.py:458
+msgid "Name the element"
+msgstr "Nommer l'élément"
 
-#: ../lib/advene/gui/views/tagbag.py:54 ../lib/advene/gui/main.py:1232
-msgid "Bag of tags"
-msgstr "Sac à tags"
+#: ../lib/advene/gui/util/dialog.py:422 ../lib/advene/gui/util/dialog.py:459
+msgid "Choose a name for the element"
+msgstr "Choisissez un nom pour l'élément"
 
-#: ../lib/advene/gui/views/tagbag.py:59
-msgid "New tag"
-msgstr "Nouveau tag"
+#: ../lib/advene/gui/util/dialog.py:497
+msgid "Open a file"
+msgstr "Ouvrir un fichier"
 
-#: ../lib/advene/gui/views/tagbag.py:122
-msgid "New tag name"
-msgstr "Nouveau tag"
+#: ../lib/advene/gui/util/dialog.py:522 ../lib/advene/gui/util/dialog.py:560
+msgid "N/C"
+msgstr "N/C"
 
-#: ../lib/advene/gui/views/tagbag.py:128
-msgid "Enter a new tag name and select its color."
-msgstr "Entrez un nouveau tag et sélectionnez sa couleur."
+#: ../lib/advene/gui/util/dialog.py:527
+msgid "Alias"
+msgstr "Alias"
 
-#: ../lib/advene/gui/views/tagbag.py:162
-#: ../lib/advene/gui/views/timeline.py:3720
-msgid "The tag contains invalid characters"
-msgstr "Ce tag contient des caractères non valides."
+#: ../lib/advene/gui/util/dialog.py:545
+msgid ""
+"Press to\n"
+"display\n"
+"information"
+msgstr ""
+"Cliquez pour\n"
+"afficher\n"
+"des informations"
 
-#: ../lib/advene/gui/views/tagbag.py:175
-msgid "Tag bag options"
-msgstr "Options du sac à tags"
+#: ../lib/advene/gui/util/dialog.py:568
+msgid "Wait..."
+msgstr "Patientez..."
 
-#: ../lib/advene/gui/views/tagbag.py:176
-msgid "Update with new tags"
-msgstr "Afficher les nouveaux tags"
+#: ../lib/advene/gui/util/dialog.py:572
+#, python-format
+msgid "Error: %s"
+msgstr "Erreur : %s"
 
-#: ../lib/advene/gui/views/tagbag.py:176
-msgid "Automatically display new defined tags"
-msgstr "Afficher automatiquement les nouveaux tags"
+#: ../lib/advene/gui/util/dialog.py:592
+msgid "Any type of file"
+msgstr "Tout type de fichier"
 
-#: ../lib/advene/gui/views/tagbag.py:225
-#, python-format
-msgid "Choose the color for tag %s"
-msgstr "Choisissez la couleur du tag %s"
+#: ../lib/advene/gui/util/dialog.py:594
+msgid "Advene files (.xml, .azp, .apl)"
+msgstr "Fichiers advene (.xml, .azp, .apl)"
 
-#: ../lib/advene/gui/views/tagbag.py:249
-msgid "Set color"
-msgstr "Choix de couleur"
+#: ../lib/advene/gui/util/dialog.py:596
+msgid "Advene session (.apl)"
+msgstr "Session Advene (.apl)"
 
-#: ../lib/advene/gui/views/tagbag.py:250
-msgid "Remove"
-msgstr "Supprimer"
+#: ../lib/advene/gui/util/dialog.py:597
+msgid "Audio files"
+msgstr "Fichiers audio"
 
-#: ../lib/advene/gui/views/tagbag.py:324
-msgid "Drop a tag here to remove it from the list"
-msgstr "Déposez un tag ici pour le supprimer de la liste."
+#: ../lib/advene/gui/util/dialog.py:598
+msgid "Video files"
+msgstr "Fichiers vidéo"
 
-#: ../lib/advene/gui/views/tagbag.py:333
-msgid "Save as adhoc view"
-msgstr "Sauvegarder comme vue adhoc"
+#: ../lib/advene/gui/util/dialog.py:637
+#: ../lib/advene/gui/edit/properties.py:578
+msgid "Choose a directory"
+msgstr "Choisissez un répertoire"
 
-#: ../lib/advene/gui/views/tagbag.py:334
-msgid "Add a new tag"
-msgstr "Ajouter un nouveau tag"
+#: ../lib/advene/gui/util/dialog.py:690
+msgid "Select an element"
+msgstr "Choisissez un élément"
 
-#: ../lib/advene/gui/views/tagbag.py:335
-msgid "Display all defined tags"
-msgstr "Afficher tous les tags"
+#: ../lib/advene/gui/edit/rules.py:88 ../lib/advene/gui/edit/rules.py:90
+#: ../lib/advene/gui/edit/create.py:254
+msgid "Rule"
+msgstr "Règle"
 
-#: ../lib/advene/gui/views/transcription.py:48
-msgid "Transcription"
-msgstr "Transcription"
+#: ../lib/advene/gui/edit/rules.py:99 ../lib/advene/gui/edit/create.py:244
+msgid "Subviews"
+msgstr "Vues associées"
 
-#: ../lib/advene/gui/views/transcription.py:50
-msgid "Display annotations as a text transcription"
-msgstr "Afficher les annotations sous forme de transcription"
+#: ../lib/advene/gui/edit/rules.py:126
+msgid "Add a new rule"
+msgstr "Ajouter une nouvelle règle"
 
-#: ../lib/advene/gui/views/transcription.py:146
-#, python-format
-msgid "Error in source evaluation %(source)s: %(error)s"
-msgstr "Erreur dans l'évaluation de l'expression %(source)s: %(error)s"
+#: ../lib/advene/gui/edit/rules.py:130
+msgid "Subview"
+msgstr "Vues associées"
 
-#: ../lib/advene/gui/views/transcription.py:163
-msgid "Transcription options"
-msgstr "Options de transcription"
+#: ../lib/advene/gui/edit/rules.py:133
+msgid "Add a subview list"
+msgstr "Ajouter une nouvelle liste de sous-vuews"
 
-#: ../lib/advene/gui/views/transcription.py:164
-msgid "Default representation"
-msgstr "Représentation par défaut"
+#: ../lib/advene/gui/edit/rules.py:139
+msgid "Remove the current rule"
+msgstr "Supprimer la règle en cours"
 
-#: ../lib/advene/gui/views/transcription.py:164
-msgid "Use the default representation for annotations"
-msgstr "Utiliser la représentation par défaut des annotations"
+#: ../lib/advene/gui/edit/rules.py:275
+msgid "Source expression"
+msgstr "Expression source"
 
-#: ../lib/advene/gui/views/transcription.py:165
-msgid ""
-"If default representation is unchecked,\n"
-"this TALES expression that will be used to format the annotations."
-msgstr ""
-"Si la représentation par défaut n'est pas utilisée,\n"
-"cette expression TALES sera utilisée pour formatter les annotations."
+#: ../lib/advene/gui/edit/rules.py:277
+msgid "Return expression"
+msgstr "Expression de retour"
 
-#: ../lib/advene/gui/views/transcription.py:166
-msgid "Separator"
-msgstr "Séparateur"
+#: ../lib/advene/gui/edit/rules.py:351
+msgid "For all elements in "
+msgstr "Pour tous les éléments de "
 
-#: ../lib/advene/gui/views/transcription.py:167
-msgid "This separator will be inserted between the annotations."
-msgstr "Ce séparateur sera inséré entre les annotations."
+#: ../lib/advene/gui/edit/rules.py:352
+msgid "All annotations of the package"
+msgstr "Toutes les annotations du recueil"
 
-#: ../lib/advene/gui/views/transcription.py:168
-msgid "Whitespace"
-msgstr "Espace"
+#: ../lib/advene/gui/edit/rules.py:353
+msgid "All views of the package"
+msgstr "Toutes les vues du recueil"
 
-#: ../lib/advene/gui/views/transcription.py:169
-msgid "Newline"
-msgstr "Retour à la ligne"
+#: ../lib/advene/gui/edit/rules.py:354 ../lib/advene/gui/edit/rules.py:798
+msgid "The context annotations"
+msgstr "Les annotations du contexte"
 
-#: ../lib/advene/gui/views/transcription.py:170
-msgid "Tabulation"
-msgstr "Tabulation"
+#: ../lib/advene/gui/edit/rules.py:355 ../lib/advene/gui/edit/rules.py:799
+msgid "The annotations of the context type"
+msgstr "Les annotations du type du contexte"
 
-#: ../lib/advene/gui/views/transcription.py:171
-msgid "Dash"
-msgstr "Tiret"
+#: ../lib/advene/gui/edit/rules.py:358 ../lib/advene/core/controller.py:610
+#, python-format
+msgid "Annotations of type %s"
+msgstr "Annotations de type %s"
 
-#: ../lib/advene/gui/views/transcription.py:172
-msgid "User defined"
-msgstr "Défini par l'utilisateur"
+#: ../lib/advene/gui/edit/rules.py:370
+msgid "Return "
+msgstr "Retourne "
 
-#: ../lib/advene/gui/views/transcription.py:174
-msgid "User-defined separator"
-msgstr "Séparateur défini par l'utilisateur"
+#: ../lib/advene/gui/edit/rules.py:372 ../lib/advene/gui/edit/rules.py:787
+msgid "The element"
+msgstr "L'élément"
 
-#: ../lib/advene/gui/views/transcription.py:174
-msgid ""
-"Separator used if user-defined is selected.Use \\n for a newline and \\t for "
-"a tabulation."
-msgstr ""
-"Séparateur défini par l'utilisateur.\n"
-"Utilisez \\\\n pour un retour à la ligne et \\\\t pour une tabulation."
+#: ../lib/advene/gui/edit/rules.py:373 ../lib/advene/gui/edit/rules.py:788
+msgid "The element's content"
+msgstr "Le contenu de l'élément"
 
-#: ../lib/advene/gui/views/transcription.py:175
-msgid "Display timestamps"
-msgstr "Afficher les marques de temps"
+#: ../lib/advene/gui/edit/rules.py:388
+msgid "If the element matches "
+msgstr "Si l'élément correspond à "
 
-#: ../lib/advene/gui/views/transcription.py:175
-msgid "Insert timestsamp values"
-msgstr "Insérer les marques de temps"
+#: ../lib/advene/gui/edit/rules.py:390
+msgid "Return the element if it matches "
+msgstr "Renvoie l'élément s'il correspond à "
 
-#: ../lib/advene/gui/views/transcription.py:176
-msgid "Display annotation bounds"
-msgstr "Afficher les bornes des annotations"
+#: ../lib/advene/gui/edit/rules.py:408 ../lib/advene/gui/edit/rules.py:617
+msgid "All conditions must be met"
+msgstr "Toutes les conditions doivent être remplies"
 
-#: ../lib/advene/gui/views/transcription.py:236
-#, python-format
-msgid ""
-"Cannot convert the following annotations,\n"
-"the representation pattern is too complex.\n"
-"%s"
-msgstr ""
-"Impossible de convertir les annotations suivantes,\n"
-"L'expression de représentation est trop complexe.\n"
-"%s"
+#: ../lib/advene/gui/edit/rules.py:409 ../lib/advene/gui/edit/rules.py:618
+msgid "Any condition can be met"
+msgstr "Une des conditions doit être remplie"
 
-#: ../lib/advene/gui/views/transcription.py:247
-msgid ""
-"Cannot validate the update.\n"
-"The representation pattern is too complex."
-msgstr ""
-"Impossible de valider la mise à jour.\n"
-"L'expression de représentation est trop complexe."
+#: ../lib/advene/gui/edit/rules.py:493 ../lib/advene/gui/edit/rules.py:563
+#, python-format
+msgid "Rule <b>%s</b>"
+msgstr "Règle <b>%s</b>"
 
-#: ../lib/advene/gui/views/transcription.py:273
-msgid "Save transcription to a text file"
-msgstr "Sauvegarder la transcription dans un fichier texte"
+#: ../lib/advene/gui/edit/rules.py:574
+msgid "Rule name"
+msgstr "Nom de la règle"
 
-#: ../lib/advene/gui/views/transcription.py:274
-msgid "Apply the modifications"
-msgstr "Valider les modifications"
+#: ../lib/advene/gui/edit/rules.py:591
+msgid "Event"
+msgstr "Événement"
 
-#: ../lib/advene/gui/views/transcription.py:275
-msgid "Find text"
-msgstr "Chercher dans le texte"
+#: ../lib/advene/gui/edit/rules.py:599
+msgid "If"
+msgstr "Si"
 
-#: ../lib/advene/gui/views/transcription.py:276
-msgid "Quickly switch display options"
-msgstr "Modification rapide des options d'affichage"
+#: ../lib/advene/gui/edit/rules.py:638
+msgid "Then"
+msgstr "Alors"
 
-#: ../lib/advene/gui/views/transcription.py:277
-msgid "Refresh the transcription"
-msgstr "Rafraîchir la transcription"
+#: ../lib/advene/gui/edit/rules.py:683
+msgid "When the "
+msgstr "Quand le/la"
 
-#: ../lib/advene/gui/views/transcription.py:278
-msgid "Edit preferences"
-msgstr "Éditer les préférences"
+#: ../lib/advene/gui/edit/rules.py:696
+msgid " occurs,"
+msgstr " intervient,"
 
-#: ../lib/advene/gui/views/transcription.py:697
+#: ../lib/advene/gui/edit/rules.py:723 ../lib/advene/gui/edit/rules.py:726
 #, python-format
-msgid "Cannot write to %(filename)s: %(error)s:"
-msgstr "Impossible d'écrire dans %(filename)s : %(error)s"
-
-#: ../lib/advene/gui/views/activebookmarks.py:52
-#: ../lib/advene/gui/views/activebookmarks.py:54
-msgid "ActiveBookmarks"
-msgstr "Signets Actifs"
+msgid "Condition expression: %s"
+msgstr "Expression de condition : %s"
 
-#: ../lib/advene/gui/views/activebookmarks.py:441
-msgid "Chronological order"
-msgstr "Ordre chronologique"
+#: ../lib/advene/gui/edit/rules.py:765
+msgid "The annotation type"
+msgstr "Le type d'annotation"
 
-#: ../lib/advene/gui/views/activebookmarks.py:442
-msgid "Completeness and chronological order"
-msgstr "Complétude et ordre chronologique"
+#: ../lib/advene/gui/edit/rules.py:768
+#, python-format
+msgid "The value of the %s attribute"
+msgstr "La valeur de l'attribut %s"
 
-#: ../lib/advene/gui/views/activebookmarks.py:458
-msgid "Bookmark duration"
-msgstr "Durée du signet."
+#: ../lib/advene/gui/edit/rules.py:770
+msgid "The annotation fragment"
+msgstr "Le fragment de l'annotation"
 
-#: ../lib/advene/gui/views/activebookmarks.py:459
-msgid "Enter the duration (in ms) to convert bookmarks into annotations"
-msgstr ""
-"Entrez la durée standard (en ms) pour convertir les signets en annotations."
+#: ../lib/advene/gui/edit/rules.py:771
+msgid "The annotation begin time"
+msgstr "Le temps de début de l'annotation"
 
-#: ../lib/advene/gui/views/activebookmarks.py:481
-msgid "User-specified duration"
-msgstr "Durée définie par l'utilisateur"
+#: ../lib/advene/gui/edit/rules.py:772
+msgid "The annotation end time"
+msgstr "Le temps de fin de l'annotation"
 
-#: ../lib/advene/gui/views/activebookmarks.py:482
-msgid "2s duration"
-msgstr "Durée de 2s"
+#: ../lib/advene/gui/edit/rules.py:774
+msgid "The annotation MIME-type"
+msgstr "Le type MIME de l'annotation"
 
-#: ../lib/advene/gui/views/activebookmarks.py:483
-msgid "Complete coverage"
-msgstr "Couverture complète"
+#: ../lib/advene/gui/edit/rules.py:775
+msgid "The annotation's incoming relations"
+msgstr "Les relations entrantes de l'annotation"
 
-#: ../lib/advene/gui/views/activebookmarks.py:501
-msgid "Drop a bookmark here to remove it from the list"
-msgstr "Déposez un signet ici pour le supprimer de la liste."
+#: ../lib/advene/gui/edit/rules.py:776
+msgid "The annotation's outgoing relations"
+msgstr "Les relations sortantes de l'annotation"
 
-#: ../lib/advene/gui/views/activebookmarks.py:520
-#: ../lib/advene/gui/views/bookmarks.py:243
-msgid "Insert a bookmark for the current video time"
-msgstr "Insérer un signet pour la position courante"
+#: ../lib/advene/gui/edit/rules.py:779
+#, python-format
+msgid "The %s-related incoming annotations"
+msgstr "Les annotations liées une relation entrante de type %s"
 
-#: ../lib/advene/gui/views/activebookmarks.py:528
-msgid "Type of the annotations that will be created"
-msgstr "Type d'annotation où les annotations seront créées."
+#: ../lib/advene/gui/edit/rules.py:783
+#, python-format
+msgid "The %s-related outgoing annotations"
+msgstr "Les annotations liées une relation sortante de type %s"
 
-#: ../lib/advene/gui/views/activebookmarks.py:561
-msgid "Reorder active bookmarks"
-msgstr "Réordonner les signets actifs"
+#: ../lib/advene/gui/edit/rules.py:789
+msgid "The element fragment"
+msgstr "Le fragment de l'élément"
 
-#: ../lib/advene/gui/views/activebookmarks.py:562
-msgid "Complete bookmarks into annotations"
-msgstr "Compléter les signets en annotations"
+#: ../lib/advene/gui/edit/rules.py:790
+msgid "The element begin time"
+msgstr "Le temps de début de l'élément"
 
-#: ../lib/advene/gui/views/activebookmarks.py:563
-msgid "Save the current state"
-msgstr "Sauvegarder l'état courant"
+#: ../lib/advene/gui/edit/rules.py:791
+msgid "The element end time"
+msgstr "Le temps de fin de l'élément"
 
-#: ../lib/advene/gui/views/activebookmarks.py:863
-msgid "Remove end timestamp"
-msgstr "Supprimer la marque de temps de fin"
+#: ../lib/advene/gui/edit/rules.py:792
+msgid "The element duration"
+msgstr "La durée de l'élément"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1071
-msgid ""
-"Error: cannot find an appropriate schema to create the Active-bookmark type."
-msgstr ""
-"Erreur: impossible de trouver un schéma approprié pour créer le type Active-"
-"bookmark"
+#: ../lib/advene/gui/edit/rules.py:793
+msgid "The element type"
+msgstr "Le type d'élément"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1076
-msgid "Active bookmark"
-msgstr "Signet actif"
+#: ../lib/advene/gui/edit/rules.py:794
+msgid "The element's incoming relations"
+msgstr "Les relations entrantes de l'élément"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1114
-msgid "Validate the annotation"
-msgstr "Valider l'annotation"
+#: ../lib/advene/gui/edit/rules.py:795
+msgid "The element's outgoing relations"
+msgstr "Les relations sortantes de l'élément"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1260
-msgid "Duplicate bookmark"
-msgstr "Dupliquer le signet"
+#: ../lib/advene/gui/edit/rules.py:796
+msgid "The context"
+msgstr "Le contexte"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1261
-msgid "Remove bookmark"
-msgstr "Supprimer le signet"
+#: ../lib/advene/gui/edit/rules.py:797
+msgid "The context fragment"
+msgstr "Le fragment du contexte"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1270
-msgid "Remove begin timestamp"
-msgstr "Supprimer le temps de début"
+#: ../lib/advene/gui/edit/rules.py:809
+#, python-format
+msgid "annotation-type %s"
+msgstr "Type d'annotation %s"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1277
-msgid "Complete bookmark"
-msgstr "Compléter le signet"
-
-#: ../lib/advene/gui/views/activebookmarks.py:1281
-msgid "Change type to"
-msgstr "Changer le type en"
-
-#: ../lib/advene/gui/views/bookmarks.py:48
-msgid "Bookmarks importer"
-msgstr "Importateur de signets"
-
-#: ../lib/advene/gui/views/bookmarks.py:69
-msgid "Bookmarks"
-msgstr "Signets"
-
-#: ../lib/advene/gui/views/bookmarks.py:71
-msgid "Bookmark timecodes with their corresponding screenshots"
-msgstr "Mémorise les temps avec les captures d'écran correspondantes"
+#: ../lib/advene/gui/edit/rules.py:812
+#, python-format
+msgid "relation-type %s"
+msgstr "type de relation %s"
 
-#: ../lib/advene/gui/views/bookmarks.py:142
-msgid "Select the annotation type to generate"
-msgstr "Choisissez le type d'annotation à générer"
+#: ../lib/advene/gui/edit/rules.py:834
+msgid "Select a condition"
+msgstr "Sélectionnez une condition"
 
-#: ../lib/advene/gui/views/bookmarks.py:147
-msgid "Choose a duration"
-msgstr "Choisissez une durée"
+#: ../lib/advene/gui/edit/rules.py:878
+#, python-format
+msgid "Parameter %s"
+msgstr "Paramètre %s"
 
-#: ../lib/advene/gui/views/bookmarks.py:148
-msgid "Enter the standard duration (in ms) of created annotations."
-msgstr "Entrez la durée standard (en ms) des annotations créées"
+#: ../lib/advene/gui/edit/rules.py:991
+msgid "Select an action"
+msgstr "Sélectionnez une action"
 
-#: ../lib/advene/gui/views/bookmarks.py:165
-msgid "Converted from bookmarks"
-msgstr "Converti depuis les signets"
+#: ../lib/advene/gui/edit/rules.py:1082
+msgid "Activate?"
+msgstr "Activer?"
 
-#: ../lib/advene/gui/views/bookmarks.py:223
-msgid "Drop a position here to remove it from the list"
-msgstr "Déposez une position ici pour l'enlever de la liste"
+#: ../lib/advene/gui/edit/properties.py:110
+msgid "Please press the new key combination"
+msgstr "Entrez la nouvelle combinaison de touches"
 
-#: ../lib/advene/gui/views/bookmarks.py:244
-msgid "Convert bookmarks to annotations"
-msgstr "Convertir les signets en annotations"
+#: ../lib/advene/gui/edit/properties.py:161
+msgid "Disabled"
+msgstr "Désactivé"
 
-#: ../lib/advene/gui/views/bookmarks.py:292 ../lib/advene/gui/main.py:3609
-msgid "Comment here"
-msgstr "Commentez ici"
+#: ../lib/advene/gui/edit/properties.py:167
+#: ../lib/advene/gui/edit/shapewidget.py:1602
+msgid "Properties"
+msgstr "Propriétés"
 
-#: ../lib/advene/gui/views/viewplugin.py:60
-msgid "Generic view plugin"
-msgstr "Plugin de vue générique"
+#: ../lib/advene/gui/edit/properties.py:531
+msgid "Choose a file"
+msgstr "Choisissez un fichier"
 
-#: ../lib/advene/gui/views/viewplugin.py:62
-msgid "You should not ever see this tooltip..."
-msgstr "Vous ne devriez pas voir cette information..."
+#: ../lib/advene/gui/edit/frameselector.py:46
+msgid "Click on a frame to select its time."
+msgstr "Cliquer sur une image pour sélectionner son temps."
 
-#: ../lib/advene/gui/views/interactivequery.py:51
-#: ../lib/advene/gui/views/interactivequery.py:99
-msgid "Interactive query"
-msgstr "Requête interactive"
+#: ../lib/advene/gui/edit/frameselector.py:184
+msgid "Select the appropriate snapshot"
+msgstr "Sélectionnez l'image appropriée"
 
-#: ../lib/advene/gui/views/interactivequery.py:53
-msgid "Interactive query dialog"
-msgstr "Fenêtre de requête interactive"
+#: ../lib/advene/gui/edit/frameselector.py:237
+#: ../lib/advene/gui/edit/frameselector.py:268
+msgid "Click to see more frames or scroll with the mouse wheel"
+msgstr "Cliquez pour voir plus d'images, ou défilez avec la molette"
 
-#: ../lib/advene/gui/views/interactivequery.py:59
-#: ../lib/advene/gui/views/interactivequery.py:256
-msgid "Save query"
-msgstr "Sauver la requête"
+#: ../lib/advene/gui/edit/create.py:83
+#, python-format
+msgid "%s creation"
+msgstr "Création de %s"
 
-#: ../lib/advene/gui/views/interactivequery.py:122
-#: ../lib/advene/gui/views/interactivequery.py:172
+#: ../lib/advene/gui/edit/create.py:84
 #, python-format
 msgid ""
-"Invalid query.\n"
-"The following fields have an invalid value:\n"
-"%s"
+"To create a new element of type %s,\n"
+"you must give the following information."
 msgstr ""
-"Requête invalide.\n"
-"Les champs suivants ne sont pas valides:\n"
-"%s"
+"Pour créer un nouvel élément de type %s\\n\n"
+"vous devez fournir les informations suivantes."
 
-#: ../lib/advene/gui/views/interactivequery.py:136
-#: ../lib/advene/gui/views/interactivequery.py:296
-msgid "Saving the query..."
-msgstr "Sauvegarde de la requête"
+#: ../lib/advene/gui/edit/create.py:113
+msgid "Dynamic view"
+msgstr "Vue dynamique"
 
-#: ../lib/advene/gui/views/interactivequery.py:137
-#: ../lib/advene/gui/views/interactivequery.py:297
-msgid "Give a title and identifier for saving the query"
-msgstr "Donnez un titre à la requête"
+#: ../lib/advene/gui/edit/create.py:114
+msgid "HTML template"
+msgstr "Modèle HTML"
 
-#: ../lib/advene/gui/views/interactivequery.py:180
-msgid "Expert search"
-msgstr "Mode expert"
+#: ../lib/advene/gui/edit/create.py:115
+msgid "Plain XML"
+msgstr "Modèle XML"
 
-#: ../lib/advene/gui/views/interactivequery.py:186
-#, python-format
-msgid ""
-"TALES error in interactive expression:\n"
-"%s"
-msgstr ""
-"Erreur TALES dans l'expression interactive :<\n"
-"%s"
+#: ../lib/advene/gui/edit/create.py:116
+msgid "SVG template"
+msgstr "Modèle SVG"
 
-#: ../lib/advene/gui/views/interactivequery.py:247
-msgid "Interactive result"
-msgstr "Résultat de requête interactive"
+#: ../lib/advene/gui/edit/create.py:117
+msgid "Plain text template"
+msgstr "Modèle de texte simple"
 
-#: ../lib/advene/gui/views/interactivequery.py:249
-msgid "Interactive result display"
-msgstr "Résultat de requête interactive"
+#: ../lib/advene/gui/edit/create.py:120
+msgid "Simple query"
+msgstr "Requête simple"
 
-#: ../lib/advene/gui/views/interactivequery.py:274
-msgid "Result of interactive query"
-msgstr "Résultats de la requête interactive"
+#: ../lib/advene/gui/edit/create.py:122
+msgid "Directory"
+msgstr "Répertoire"
 
-#: ../lib/advene/gui/views/interactivequery.py:278
-msgid "Result of a query"
-msgstr "Résultat d'une requête"
+#: ../lib/advene/gui/edit/create.py:124 ../lib/advene/util/helper.py:417
+msgid "Resource File"
+msgstr "Fichier de ressource"
 
-#: ../lib/advene/gui/views/interactivequery.py:280
-#: ../lib/advene/gui/main.py:3188
-#, python-format
-msgid "'%s'"
-msgstr "'%s'"
+#: ../lib/advene/gui/edit/create.py:130
+msgid "No available type."
+msgstr "Pas de type disponible."
 
-#: ../lib/advene/gui/views/interactivequery.py:333
+#: ../lib/advene/gui/edit/create.py:174
 #, python-format
-msgid "Comment on annotations containing %s"
-msgstr "Commentaire sur les annotations contenant %s"
-
-#: ../lib/advene/gui/views/interactivequery.py:352
-msgid "Choose the annotation type where annotations will be created."
-msgstr "Choisissez le type d'annotation où les annotations seront créées."
+msgid ""
+"The identifier %s is not valid.\n"
+"It must be composed of non-accentuated alphabetic characters\n"
+"Underscore is allowed."
+msgstr ""
+"L'identifcateur %s n'est pas valide.\n"
+"Il doit être composé de caractères alphabétiques non-accentués.\n"
+"Le souligné (_) est autorisé."
 
-#: ../lib/advene/gui/views/interactivequery.py:356
+#: ../lib/advene/gui/edit/create.py:179
 #, python-format
-msgid "Copied result of the '%s' query"
-msgstr "Copie du résultat de la requête '%s'"
+msgid "The identifier %s is already defined."
+msgstr "L'identificateur %s est déjà défini."
 
-#: ../lib/advene/gui/views/interactivequery.py:368
-#, python-format
-msgid "Search/replace content in %d elements"
-msgstr "Rechercher/remplacer dans %d éléments"
+#: ../lib/advene/gui/edit/create.py:312
+msgid "New resource data"
+msgstr "Nouvelle ressource"
 
-#: ../lib/advene/gui/views/interactivequery.py:375
-#: ../lib/advene/gui/main.py:3185
-msgid "Empty quicksearch string"
-msgstr "Chaîne de recherche vide"
+#: ../lib/advene/gui/edit/imports.py:132 ../lib/advene/gui/edit/imports.py:133
+#: ../lib/advene/core/controller.py:611
+msgid "Views"
+msgstr "Vues"
 
-#: ../lib/advene/gui/views/interactivequery.py:396
-msgid "Edit query again"
-msgstr "Rééditer la requête"
+#: ../lib/advene/gui/edit/imports.py:146 ../lib/advene/gui/edit/imports.py:147
+msgid "Schemas"
+msgstr "Schémas"
 
-#: ../lib/advene/gui/views/interactivequery.py:400
-#: ../lib/advene/gui/views/finder.py:436
-msgid "Edit query"
-msgstr "Éditer la requête"
+#: ../lib/advene/gui/edit/imports.py:198 ../lib/advene/gui/edit/imports.py:199
+#: ../lib/advene/gui/edit/elements.py:523
+msgid "Relations"
+msgstr "Relations"
 
-#: ../lib/advene/gui/views/interactivequery.py:409
-#: ../lib/advene/gui/main.py:537
-msgid "String to search"
-msgstr "Chaîne à rechercher"
+#: ../lib/advene/gui/edit/imports.py:212 ../lib/advene/gui/edit/imports.py:213
+msgid "Queries"
+msgstr "Requêtes"
 
-#: ../lib/advene/gui/views/interactivequery.py:410
-msgid "Search again"
-msgstr "Relancer la recherche"
+#: ../lib/advene/gui/edit/imports.py:323
+msgid "Imported?"
+msgstr "Importé ?"
 
-#: ../lib/advene/gui/views/interactivequery.py:416
-msgid "Empty result"
-msgstr "Résultat vide"
+#: ../lib/advene/gui/edit/imports.py:340 ../lib/advene/gui/edit/elements.py:515
+#: ../lib/advene/gui/edit/elements.py:564
+#: ../lib/advene/gui/edit/elements.py:651
+#: ../lib/advene/gui/edit/elements.py:731
+#: ../lib/advene/gui/edit/elements.py:788
+#: ../lib/advene/gui/edit/elements.py:880
+#: ../lib/advene/gui/edit/elements.py:949
+#: ../lib/advene/gui/edit/elements.py:1061
+#: ../lib/advene/gui/edit/elements.py:1123
+msgid "URI"
+msgstr "URI"
 
-#: ../lib/advene/gui/views/interactivequery.py:425
-#, python-format
-msgid "Result is a list of %d annotations."
-msgstr "Le résultat est une liste de %d annotation(s)."
+#: ../lib/advene/gui/edit/imports.py:362
+msgid "Choose the package to import, and its alias"
+msgstr "Choisissez le recueil à importer, et son alias"
 
-#: ../lib/advene/gui/views/interactivequery.py:427
+#: ../lib/advene/gui/edit/imports.py:408 ../lib/advene/gui/edit/merge.py:230
 #, python-format
-msgid "Result is a list of  %(number)d elements with %(elements)s."
-msgstr "Le résultat est une liste de %(number)d elements avec %(elements)s."
-
-#: ../lib/advene/gui/views/interactivequery.py:470
-msgid "Other elements"
-msgstr "Autres éléments"
-
-#: ../lib/advene/gui/views/interactivequery.py:474
-msgid "Display annotations in timeline"
-msgstr "Afficher les annotations dans une ligne de temps"
+msgid "Package %s"
+msgstr "Recueil %s"
 
-#: ../lib/advene/gui/views/interactivequery.py:475
-msgid "Display annotations as transcription"
-msgstr "Afficher les annotations sous forme de transcription"
+#: ../lib/advene/gui/edit/imports.py:408 ../lib/advene/gui/edit/merge.py:230
+msgid "No title"
+msgstr "Pas de titre"
 
-#: ../lib/advene/gui/views/interactivequery.py:481
-#: ../lib/advene/gui/views/interactivequery.py:503
-msgid "Export table"
-msgstr "Exporter le tableau"
+#: ../lib/advene/gui/edit/shapewidget.py:91
+msgid "Generic shape"
+msgstr "Forme générique"
 
-#: ../lib/advene/gui/views/interactivequery.py:482
-msgid "Create annotations from the result"
-msgstr "Créer des annotations à partir du résultat"
+#: ../lib/advene/gui/edit/shapewidget.py:256
+#: ../lib/advene/gui/edit/shapewidget.py:755
+#, python-format
+msgid "Link to %s"
+msgstr "Lier à  %s"
 
-#: ../lib/advene/gui/views/interactivequery.py:483
-msgid "Define a montage with the result"
-msgstr "Définir un montage avec le résultat"
+#: ../lib/advene/gui/edit/shapewidget.py:348
+#: ../lib/advene/gui/edit/shapewidget.py:1304
+msgid "Link"
+msgstr "Lien"
 
-#: ../lib/advene/gui/views/interactivequery.py:484
-msgid "Create a comment view with the result"
-msgstr "Créer un commentaire avec le résultat"
+#: ../lib/advene/gui/edit/shapewidget.py:353
+msgid "Link label"
+msgstr "Label du lien"
 
-#: ../lib/advene/gui/views/interactivequery.py:485
-msgid "Search and replace strings in the annotations content"
-msgstr "Cherche et remplace du texte dans le contenu des annotations"
+#: ../lib/advene/gui/edit/shapewidget.py:371
+msgid "Linewidth"
+msgstr "Largeur de trait"
 
-#: ../lib/advene/gui/views/interactivequery.py:510
-msgid "Edit elements"
-msgstr "Éditer les éléments"
+#: ../lib/advene/gui/edit/shapewidget.py:376
+msgid "Filled"
+msgstr "Rempli"
 
-#: ../lib/advene/gui/views/interactivequery.py:516
-msgid "Open in python evaluator"
-msgstr "Afficher dans l'évaluateur python"
+#: ../lib/advene/gui/edit/shapewidget.py:384
+msgid "Opacity"
+msgstr "Opacité"
 
-#: ../lib/advene/gui/views/interactivequery.py:519
+#: ../lib/advene/gui/edit/shapewidget.py:426
 #, python-format
-msgid ""
-"Result:\n"
-"%s"
-msgstr ""
-"Résultat:\n"
-"%s"
+msgid "Properties of %s"
+msgstr "Propriétés de %s"
 
-#: ../lib/advene/gui/views/interactivequery.py:561
-msgid "Results of _interactive query"
-msgstr "Résultats de la requête _interactive"
+#: ../lib/advene/gui/edit/shapewidget.py:473
+msgid "Rectangle"
+msgstr "Rectangle"
 
-#: ../lib/advene/gui/views/relationdisplay.py:34
-msgid "RelationDisplay"
-msgstr "AfficheRelation"
+#: ../lib/advene/gui/edit/shapewidget.py:553
+#: ../lib/advene/gui/edit/shapewidget.py:666
+msgid "Text"
+msgstr "Texte"
 
-#: ../lib/advene/gui/views/relationdisplay.py:36
-msgid "Display the contents of a relation"
-msgstr "Affiche le contenu d'une relation"
+#: ../lib/advene/gui/edit/shapewidget.py:677
+msgid "Textsize"
+msgstr "Taille du texte"
 
-#: ../lib/advene/gui/views/relationdisplay.py:79
-msgid "No relation"
-msgstr "Pas de relation"
+#: ../lib/advene/gui/edit/shapewidget.py:691
+msgid "Image"
+msgstr "Image"
 
-#: ../lib/advene/gui/views/relationdisplay.py:104
-#: ../lib/advene/gui/views/annotationdisplay.py:253
-msgid "Contents"
-msgstr "Contenu"
+#: ../lib/advene/gui/edit/shapewidget.py:775
+msgid "Href"
+msgstr "Href"
 
-#: ../lib/advene/gui/views/html.py:62
-msgid "Cannot go back: first item in history"
-msgstr ""
-"Impossible de revenir en arrière : c'est le premier élément de l'historique"
+#: ../lib/advene/gui/edit/shapewidget.py:785
+msgid "Line"
+msgstr "Ligne"
 
-#: ../lib/advene/gui/views/html.py:220
-#, python-format
-msgid "%s%% loaded"
-msgstr "%s%% chargé"
+#: ../lib/advene/gui/edit/shapewidget.py:881
+msgid "Draw an arrow"
+msgstr "Dessiner une flêche"
 
-#: ../lib/advene/gui/views/html.py:223
-#, python-format
-msgid "Title %s"
-msgstr "Titre %s"
+#: ../lib/advene/gui/edit/shapewidget.py:892
+msgid "Arrow size"
+msgstr "Taille de la flêche"
 
-#: ../lib/advene/gui/views/html.py:287
-msgid "HTML Viewer"
-msgstr "Visualiseur HTML"
+#: ../lib/advene/gui/edit/shapewidget.py:1107
+msgid "Close path"
+msgstr "Fermer le chemin"
 
-#: ../lib/advene/gui/views/html.py:289
-msgid "Embedded HTML widget"
-msgstr "Composant de visualisation HTML"
+#: ../lib/advene/gui/edit/shapewidget.py:1186
+msgid "Circle"
+msgstr "Cercle"
 
-#: ../lib/advene/gui/views/html.py:319
-msgid "No available HTML rendering component"
-msgstr "Aucun moteur de rendu HTML n'est disponible"
+#: ../lib/advene/gui/edit/shapewidget.py:1241
+msgid "Ellipse"
+msgstr "Ellipse"
 
-#: ../lib/advene/gui/views/viewbook.py:36
-msgid "ViewBook"
-msgstr "Collection de vues"
+#: ../lib/advene/gui/edit/shapewidget.py:1603
+msgid "SVG"
+msgstr "SVG"
 
-#: ../lib/advene/gui/views/viewbook.py:57
-#: ../lib/advene/gui/views/viewbook.py:64
-msgid "Cannot remove this widget, it is essential."
-msgstr "Impossible de supprimer ce composant, il est essentiel."
+#: ../lib/advene/gui/edit/shapewidget.py:2162
+msgid "Load SVG"
+msgstr "Charger un fichier SVG"
 
-#: ../lib/advene/gui/views/viewbook.py:135
-msgid "Detach"
-msgstr "Détacher"
+#: ../lib/advene/gui/edit/shapewidget.py:2168
+msgid "Save SVG"
+msgstr "Sauver le SVG"
 
-#: ../lib/advene/gui/views/viewbook.py:139
-#: ../lib/advene/gui/views/editaccumulator.py:76
-msgid "Close"
-msgstr "Fermer"
+#: ../lib/advene/gui/edit/importer.py:49
+msgid "Importer"
+msgstr "Importateur"
 
-#: ../lib/advene/gui/views/viewbook.py:157
-msgid "Rename the view"
-msgstr "Renommer la vue"
+#: ../lib/advene/gui/edit/importer.py:108
+#: ../lib/advene/gui/edit/importer.py:118
+msgid "Advene package importer"
+msgstr "Importateur de recueil Advene"
 
-#: ../lib/advene/gui/views/viewbook.py:158
-msgid "Please enter the new name of the view"
-msgstr "Entrez le nouveau nom de la vue"
+#: ../lib/advene/gui/edit/importer.py:122
+msgid "Not likely"
+msgstr "Non-pertinents"
 
-#: ../lib/advene/gui/views/viewbook.py:197
-msgid "Detach view in its own window, or drag-and-drop to another zone"
+#: ../lib/advene/gui/edit/importer.py:144
+#, python-format
+msgid ""
+"Completed conversion: %(message)s\n"
+"%(statistics)s"
 msgstr ""
-"Détacher la vue dans sa propre fenêtre, ou glisser-déposer vers une autre "
-"zone"
-
-#: ../lib/advene/gui/views/viewbook.py:211
-msgid "Close view"
-msgstr "Fermer la vue"
+"Conversion terminée : %(message)s\n"
+"%(statistics)s"
 
-#: ../lib/advene/gui/views/viewbook.py:286
-msgid "Open a new transcription for..."
-msgstr "Ouvrir une nouvelle vue transcription pour..."
+#: ../lib/advene/gui/edit/importer.py:151
+msgid "Stop"
+msgstr "Stop"
 
-#: ../lib/advene/gui/views/viewbook.py:298
-msgid "Create a new comment view"
-msgstr "Créer une nouvelle vue commentaire"
+#: ../lib/advene/gui/edit/importer.py:190
+#, python-format
+msgid ""
+"The filter is not ready.\n"
+"%s"
+msgstr "Le filtre n'est pas prêt."
 
-#: ../lib/advene/gui/views/viewbook.py:300
-msgid "Open a new view"
-msgstr "Ouvrir une nouvelle vue"
+#: ../lib/advene/gui/edit/importer.py:279
+msgid "Choose the file to import"
+msgstr "Choisissez le fichier à importer"
 
-#: ../lib/advene/gui/views/viewbook.py:375
-#, python-format
-msgid "Use annotation-type %s :"
-msgstr "Utiliser le type d'annotation %s :"
+#: ../lib/advene/gui/edit/importer.py:299
+msgid "Filter"
+msgstr "Filtre"
 
-#: ../lib/advene/gui/views/viewbook.py:378
-#: ../lib/advene/gui/views/viewbook.py:404
-msgid "to edit it"
-msgstr "pour l'éditer"
+#: ../lib/advene/gui/edit/importer.py:308
+msgid "Options"
+msgstr "Options"
 
-#: ../lib/advene/gui/views/viewbook.py:379
-#: ../lib/advene/gui/views/viewbook.py:405
-#: ../lib/advene/gui/views/viewbook.py:437
-msgid "to create a new static view"
-msgstr "pour créer une nouvelle vue statique"
+#: ../lib/advene/gui/edit/importer.py:318
+msgid "Start"
+msgstr "Lancer"
 
-#: ../lib/advene/gui/views/viewbook.py:381
-msgid "in a timeline"
-msgstr "dans une ligne de temps"
+#: ../lib/advene/gui/edit/dvdselect.py:71
+msgid ""
+"Select the correct\n"
+"title and chapter\n"
+"of the DVD"
+msgstr ""
+"Sélectionnez le\n"
+"titre et chapitre\n"
+"adéquats du DVD"
 
-#: ../lib/advene/gui/views/viewbook.py:382
-msgid "as a montage"
-msgstr "comme un montage"
+#: ../lib/advene/gui/edit/dvdselect.py:84
+msgid "Chapter"
+msgstr "Chapître"
 
-#: ../lib/advene/gui/views/viewbook.py:383
-#: ../lib/advene/gui/views/viewbook.py:436
-msgid "in a table"
-msgstr "dans une table"
+#: ../lib/advene/gui/edit/merge.py:33
+msgid "Create element"
+msgstr "Créer un élément"
 
-#: ../lib/advene/gui/views/viewbook.py:384
-#: ../lib/advene/gui/views/viewbook.py:406
-msgid "in a query"
-msgstr "dans une requête"
+#: ../lib/advene/gui/edit/merge.py:34
+msgid "Create annotation (duplicate id)"
+msgstr "Créer une annotation (id dupliquée)"
 
-#: ../lib/advene/gui/views/viewbook.py:384
-#: ../lib/advene/gui/views/viewbook.py:406
-#, python-format
-msgid "Query %s"
-msgstr "Requête %s"
+#: ../lib/advene/gui/edit/merge.py:35
+msgid "Create relation (duplicate id)"
+msgstr "Créer une relation (id dupliquée)"
 
-#: ../lib/advene/gui/views/viewbook.py:385
-#: ../lib/advene/gui/views/viewbook.py:407
-msgid "in the TALES browser"
-msgstr "dans l'explorateur TALES"
+#: ../lib/advene/gui/edit/merge.py:36
+msgid "Update the color"
+msgstr "Modifier la couleur"
 
-#: ../lib/advene/gui/views/viewbook.py:385
-#, python-format
-msgid "Browsing %s"
-msgstr "Explore %s"
+#: ../lib/advene/gui/edit/merge.py:37
+msgid "Update the representation"
+msgstr "Modifier la représentation"
 
-#: ../lib/advene/gui/views/viewbook.py:401
-#, python-format
-msgid "Use annotation %s :"
-msgstr "Utiliser l'annotation %s :"
+#: ../lib/advene/gui/edit/merge.py:38
+msgid "Update the description"
+msgstr "Modifier la description"
 
-#: ../lib/advene/gui/views/viewbook.py:407
-#, python-format
-msgid "Browse %s"
-msgstr "Explore %s"
+#: ../lib/advene/gui/edit/merge.py:39
+msgid "Update the title"
+msgstr "Modifier le titre"
 
-#: ../lib/advene/gui/views/viewbook.py:408
-msgid "to display its contents"
-msgstr "pour afficher son contenu"
+#: ../lib/advene/gui/edit/merge.py:40
+msgid "Update the mimetype"
+msgstr "Modifier le type MIME"
 
-#: ../lib/advene/gui/views/viewbook.py:408
-#, python-format
-msgid "%s"
-msgstr "%s"
+#: ../lib/advene/gui/edit/merge.py:41
+msgid "Update the begin time"
+msgstr "Modifier le temps de début"
 
-#: ../lib/advene/gui/views/viewbook.py:409
-msgid "as a bookmark"
-msgstr "comme un signet"
+#: ../lib/advene/gui/edit/merge.py:42
+msgid "Update the end time"
+msgstr "Modifier le temps de fin"
 
-#: ../lib/advene/gui/views/viewbook.py:427
-msgid "as the context for the query..."
-msgstr "comme context pour la requête..."
+#: ../lib/advene/gui/edit/merge.py:43
+msgid "Update the content"
+msgstr "Modifier le contenu"
 
-#: ../lib/advene/gui/views/viewbook.py:431
-msgid "Set of annotations"
-msgstr "Ensemble d'annotations"
+#: ../lib/advene/gui/edit/merge.py:44
+msgid "Update the matchFilter"
+msgstr "Modifier le filtre de vue"
 
-#: ../lib/advene/gui/views/viewbook.py:432
-msgid "Use annotations:"
-msgstr "Utiliser les annotations :"
+#: ../lib/advene/gui/edit/merge.py:45
+msgid "Update the member types"
+msgstr "Mettre à jour les types des membres"
 
-#: ../lib/advene/gui/views/viewbook.py:435
-msgid "to edit them"
-msgstr "pour les éditer"
+#: ../lib/advene/gui/edit/merge.py:46
+msgid "Update tags"
+msgstr "Mettre à jour les tags"
 
-#: ../lib/advene/gui/views/viewbook.py:438
-msgid "as bookmarks"
-msgstr "comme des signets"
+#: ../lib/advene/gui/edit/merge.py:90
+msgid "Difference between original and merged elements"
+msgstr "Différence entre l'élément original et l'élément à fusionner"
 
-#: ../lib/advene/gui/views/singletonpopup.py:32
-msgid "SingletonPopup"
-msgstr "Fenêtre singleton"
+#: ../lib/advene/gui/edit/merge.py:136
+msgid "Current element"
+msgstr "Élément courant"
 
-#: ../lib/advene/gui/views/timeline.py:121 ../lib/advene/gui/main.py:1221
-msgid "Timeline"
-msgstr "Ligne de Temps"
+#: ../lib/advene/gui/edit/merge.py:141
+msgid "Updated element"
+msgstr "Élément mis à jour"
 
-#: ../lib/advene/gui/views/timeline.py:123
-msgid "Display annotations on a timeline"
-msgstr "Vue en ligne de temps"
+#: ../lib/advene/gui/edit/merge.py:147
+msgid "Show diff"
+msgstr "Montrer les différences"
 
-#: ../lib/advene/gui/views/timeline.py:137
-msgid "Limit display to current area"
-msgstr "Limiter l'affichage à la zone courante"
+#: ../lib/advene/gui/edit/merge.py:180
+msgid "Merge?"
+msgstr "Fusionner?"
 
-#: ../lib/advene/gui/views/timeline.py:138
-#: ../lib/advene/gui/views/timeline.py:3265
-msgid "Display whole movie"
-msgstr "Afficher tout le film"
+#: ../lib/advene/gui/edit/merge.py:197
+msgid "Element"
+msgstr "Élément"
 
-#: ../lib/advene/gui/views/timeline.py:168
+#: ../lib/advene/gui/edit/merge.py:215
 #, python-format
-msgid "Cannot find annotation type %s"
-msgstr "Impossible de trouver le type d'annotation %s"
+msgid "Merge elements from %(source)s into %(dest)s"
+msgstr "Fusionner les éléments de %(source)s dans %(dest)s"
 
-#: ../lib/advene/gui/views/timeline.py:218
-msgid "No scrolling"
-msgstr "Pas de défilement"
+#: ../lib/advene/gui/edit/merge.py:266
+msgid "All"
+msgstr "Tout"
 
-#: ../lib/advene/gui/views/timeline.py:219
-msgid "Continuous scrolling"
-msgstr "Défilement continu"
+#: ../lib/advene/gui/edit/merge.py:271 ../lib/advene/core/controller.py:1097
+msgid "None"
+msgstr "Aucun"
 
-#: ../lib/advene/gui/views/timeline.py:220
-msgid "Discrete scrolling"
-msgstr "Défilement discret"
+#: ../lib/advene/gui/edit/montage.py:51
+msgid "Montage"
+msgstr "Montage"
 
-#: ../lib/advene/gui/views/timeline.py:221
-msgid "Annotation scrolling"
-msgstr "Défilement sur annotation"
+#: ../lib/advene/gui/edit/montage.py:53
+msgid "Dynamic montage of annotations"
+msgstr "Montage dynamique d'annotations"
 
-#: ../lib/advene/gui/views/timeline.py:483
-#, python-format
-msgid "%d annotations"
-msgstr "%d annotations"
+#: ../lib/advene/gui/edit/montage.py:61
+msgid "Render"
+msgstr "Exporter en vidéo"
 
-#: ../lib/advene/gui/views/timeline.py:486
-msgid "Display all types"
-msgstr "Afficher tous les types"
+#: ../lib/advene/gui/edit/montage.py:176
+msgid "Remove from montage"
+msgstr "Supprimer du montage"
 
-#: ../lib/advene/gui/views/timeline.py:488
+#: ../lib/advene/gui/edit/montage.py:310
 #, python-format
 msgid ""
-"There are %d annotations.\n"
-"The current timeline may take a long time to display them, so only the first "
-"two annotation types are displayed. Use the annotation type selector (second "
-"button in the timeline) to select other annotations types to display, or "
-"click on the 'Display all types' button below."
+"Exporting montage %(title)s\n"
+"to %%(filename)s"
 msgstr ""
-"Il y a %d annotations.\n"
-"La timeline actuelle peut prendre beaucoup de temps pour les afficher, donc "
-"seuls les deux premiers types d'annotations sont affichés. Utilisez le "
-"sélecteur de type (deuxième bouton dans la timeline) pour choisir d'autres "
-"types à afficher, ou cliquer sur \"Afficher tous les types\" ci-dessous."
+"Export du montage %(title)s\n"
+"vers %%(filename)s"
 
-#: ../lib/advene/gui/views/timeline.py:963
-msgid "Split at current player position"
-msgstr "Couper à la valeur de la position courante"
+#: ../lib/advene/gui/edit/montage.py:405
+msgid "Drop an annotation here to remove it from the list"
+msgstr "Déposez une annotation ici pour l'enlever de la liste"
 
-#: ../lib/advene/gui/views/timeline.py:967
-msgid "Center and zoom"
-msgstr "Centrer et zoomer"
+#: ../lib/advene/gui/edit/montage.py:417
+msgid "Play the montage"
+msgstr "Jouer le montage"
 
-#: ../lib/advene/gui/views/timeline.py:1058
-#: ../lib/advene/gui/views/tree.py:808 ../lib/advene/gui/main.py:4563
-msgid ""
-"Select the schema where you want to\n"
-"create the new relation type."
-msgstr ""
-"Sélectionnez le schéma où vous désirez\n"
-"créer le nouveau type de relation."
-
-#: ../lib/advene/gui/views/timeline.py:1071
-#: ../lib/advene/gui/views/tree.py:821
-msgid "Create a relation"
-msgstr "Créer une relation"
-
-#: ../lib/advene/gui/views/timeline.py:1081
-#: ../lib/advene/gui/views/tree.py:831
-msgid "Create a new relation-type."
-msgstr "Créer un nouveau type de relation"
-
-#: ../lib/advene/gui/views/timeline.py:1107
-msgid "Merge with this annotation"
-msgstr "Fusionner avec cette annotation"
-
-#: ../lib/advene/gui/views/timeline.py:1116
-msgid "Align both begin times"
-msgstr "Aligner les temps de début"
-
-#: ../lib/advene/gui/views/timeline.py:1117
-msgid "Align both end times"
-msgstr "Aligner les temps de fin"
-
-#: ../lib/advene/gui/views/timeline.py:1118
-msgid "Align end time to selected begin time"
-msgstr "Aligner le temps de fin sur le temps de début sélectionné"
-
-#: ../lib/advene/gui/views/timeline.py:1119
-msgid "Align begin time to selected end time"
-msgstr "Aligner le temps de début sur le temps de fin sélectionné"
+#: ../lib/advene/gui/edit/montage.py:422
+msgid "Save the view in the package"
+msgstr "Sauvegarder la vue dans le recueil"
 
-#: ../lib/advene/gui/views/timeline.py:1120
-msgid "Align all times"
-msgstr "Aligner tous les temps"
+#: ../lib/advene/gui/edit/montage.py:470
+msgid "Set zoom level"
+msgstr "Fixer le niveau de zoom"
 
-#: ../lib/advene/gui/views/timeline.py:1158
-#: ../lib/advene/gui/views/tree.py:700
-msgid "Cannot delete the annotation : it has relations."
-msgstr ""
-"Impossible de supprimer l'annotation :\n"
-"elle fait partie de relations."
+#: ../lib/advene/gui/edit/montage.py:475
+msgid "Set 100% zoom"
+msgstr "Zoom à 100%"
 
-#: ../lib/advene/gui/views/timeline.py:1233
-msgid "Select the appropriate relation type"
-msgstr "Sélectionnez le type de relation"
+#: ../lib/advene/gui/edit/montage.py:554
+msgid "Total duration:"
+msgstr "Durée totale :"
 
-#: ../lib/advene/gui/views/timeline.py:1252
-#: ../lib/advene/gui/views/tree.py:757
+#: ../lib/advene/gui/edit/timeadjustment.py:97
 #, python-format
-msgid "Duplicate selection to type %s"
-msgstr "Dupliquer la sélection vers le type %s"
+msgid "Decrement value by %.2f s"
+msgstr "Décrémenter la valeur de %.2f s"
 
-#: ../lib/advene/gui/views/timeline.py:1255
-#: ../lib/advene/gui/views/tree.py:760
+#: ../lib/advene/gui/edit/timeadjustment.py:99
 #, python-format
-msgid "Move selection to type %s"
-msgstr "Déplacer la sélection vers le type %s"
+msgid "Increment value by %.2f s"
+msgstr "Incrémenter la valeur de %.2f s"
 
-#: ../lib/advene/gui/views/timeline.py:1264
-#: ../lib/advene/gui/views/tree.py:769
-#, python-format
-msgid "Duplicate annotation to type %s"
-msgstr "Dupliquer l'annotation vers le type %s"
+#: ../lib/advene/gui/edit/timeadjustment.py:128
+msgid ""
+"Click to play\n"
+"Control+click to set to current time\n"
+"Scroll to modify value (with control/shift)\n"
+"Right-click to invalidate screenshot"
+msgstr ""
+"Cliquer pour jouer\n"
+"Contrôle+clic pour fixer au temps actuel\n"
+"Scroll pour modifier la valeur (avec Contrôle/Shift)\n"
+"Clic droit pour invalider la capture d'écran"
 
-#: ../lib/advene/gui/views/timeline.py:1268
-#: ../lib/advene/gui/views/tree.py:773
-#, python-format
-msgid "Move annotation to type %s"
-msgstr "Déplacer l'annotation vers le type %s"
+#: ../lib/advene/gui/edit/timeadjustment.py:143
+msgid ""
+"Enter a timecode.\n"
+"An integer value will be considered as milliseconds.\n"
+"A float value (12.2) will be considered as seconds.\n"
+"HH:MM:SS.sss values are possible."
+msgstr ""
+"Entrez un timecode.\n"
+"Une valeur entière sera considérée comme des millisecondes.\n"
+"Une valeur flottant (12.2) sera considérée comme des secondes.\n"
+"Il est possible d'utiliser le format HH:MM:SS.sss"
 
-#: ../lib/advene/gui/views/timeline.py:1275
-#, python-format
-msgid "Duplicate to type %(type)s at %(position)s"
-msgstr "Dupliquer vers le type %(type)s à %(position)s"
+#: ../lib/advene/gui/edit/timeadjustment.py:157
+msgid "Set to current player position"
+msgstr "Fixer à la valeur de la position courante"
 
-#: ../lib/advene/gui/views/timeline.py:1281
+#: ../lib/advene/gui/edit/elements.py:80
 #, python-format
-msgid "Move to type %(type)s at %(position)s"
-msgstr "Déplacer vers le type %(type)s à %(position)s"
+msgid "No edit popup available for element %s"
+msgstr "Pas de fenêtre d'édition disponible pour l'élément %s"
 
-#: ../lib/advene/gui/views/timeline.py:1291
-#: ../lib/advene/gui/views/tree.py:784
-msgid "Duplicate and create a relation"
-msgstr "Dupliquer et créer une relation"
+#: ../lib/advene/gui/edit/elements.py:100
+msgid "Edit Window"
+msgstr "Fenêtre d'édition"
 
-#: ../lib/advene/gui/views/timeline.py:1302
-#, python-format
-msgid "Duplicate at %s and create a relation"
-msgstr "Dupliquer vers %s et créer une relation"
+#: ../lib/advene/gui/edit/elements.py:139
+msgid "Apply changes and close the edit window"
+msgstr "Appliquer les modifications et fermer la fenêtre"
 
-#: ../lib/advene/gui/views/timeline.py:1333
-msgid "Annotation filter"
-msgstr "Filtre d'annotations "
+#: ../lib/advene/gui/edit/elements.py:144
+msgid "Apply changes"
+msgstr "Appliquer les modifications"
 
-#: ../lib/advene/gui/views/timeline.py:1334
-msgid "Enter the searched string"
-msgstr "Entrez la chaîne recherchée"
+#: ../lib/advene/gui/edit/elements.py:278
+msgid "Content has been modified. Close anyway and lose data?"
+msgstr ""
+"Le contenu a été modifié. Souhaitez-vous fermer de toute façon et perdre les "
+"données ?"
 
-#: ../lib/advene/gui/views/timeline.py:1442
+#: ../lib/advene/gui/edit/elements.py:338
 #, python-format
-msgid "Duplicate all annotations to type %s"
-msgstr "Dupliquer toutes les annotations vers le type %s"
+msgid "View %s (read-only)"
+msgstr "Visualiser %s (lecture seule)"
 
-#: ../lib/advene/gui/views/timeline.py:1444
+#: ../lib/advene/gui/edit/elements.py:374
 #, python-format
-msgid "Move all annotations to type %s"
-msgstr "Déplacer toutes les annotations vers le type %s"
+msgid "Display %s"
+msgstr "Afficher %s"
 
-#: ../lib/advene/gui/views/timeline.py:1446
-#, python-format
-msgid "Duplicate all annotations matching a string to type %s"
+#: ../lib/advene/gui/edit/elements.py:459
+msgid "Apply changes and edit previous annotation of same type"
 msgstr ""
-"Dupliquer toutes les annotations contenant une chaîne de caractères vers le "
-"type %s"
+"Valider les modifications et éditer l'annotation précédente du même type"
 
-#: ../lib/advene/gui/views/timeline.py:1448
-#, python-format
-msgid "Move all annotations matching a string to type %s"
-msgstr ""
-"Déplacer toutes les annotations contenant une chaîne de caractères vers le "
-"type %s"
+#: ../lib/advene/gui/edit/elements.py:463
+msgid "Apply changes and edit next annotation of same type"
+msgstr "Valider les modifications et éditer l'annotation suivante du même type"
 
-#: ../lib/advene/gui/views/timeline.py:1450
-#, python-format
-msgid "Align all annotation time codes using %s as reference."
-msgstr "Aligner les temps pour toutes les annotations sur la base de %s"
+#: ../lib/advene/gui/edit/elements.py:469
+msgid "Unhighlight annotation"
+msgstr "Désactiver les annotations"
 
-#: ../lib/advene/gui/views/timeline.py:1452
-#, python-format
-msgid "Align all annotation contents using %s as reference"
-msgstr "Copier les contenus pour toutes annotations sur la base de %s"
+#: ../lib/advene/gui/edit/elements.py:473
+msgid "Highlight annotation"
+msgstr "Activer les annotations"
 
-#: ../lib/advene/gui/views/timeline.py:1642
-#: ../lib/advene/gui/views/table.py:240
-msgid "Cannot update the annotation, its representation is too complex"
-msgstr "Impossible de l'annotation, sa représentation est trop complexe."
+#: ../lib/advene/gui/edit/elements.py:504
+msgid "Fragment"
+msgstr "Fragment"
 
-#: ../lib/advene/gui/views/timeline.py:1936
-#: ../lib/advene/gui/views/timeline.py:1965
-#, python-format
-msgid "Displaying %(count)d / %(total)d annotations..."
-msgstr "Affichage de %(count)d / %(total)d annotations..."
+#: ../lib/advene/gui/edit/elements.py:527 ../lib/advene/core/controller.py:611
+msgid "Tags"
+msgstr "Tags"
 
-#: ../lib/advene/gui/views/timeline.py:1947
-msgid "Displaying done."
-msgstr "Affichage terminé."
+#: ../lib/advene/gui/edit/elements.py:623
+msgid "Apply changes and visualise in web browser"
+msgstr "Appliquer les modifications et visualiser dans le navigateur"
 
-#: ../lib/advene/gui/views/timeline.py:2439
-msgid "Create a new annotation"
-msgstr "Créer une nouvelle annotation"
+#: ../lib/advene/gui/edit/elements.py:628
+msgid "Apply changes and activate the view"
+msgstr "Appliquer les modifications et activer la vue"
 
-#: ../lib/advene/gui/views/timeline.py:2440
-msgid "Zoom on region"
-msgstr "Zoom sur la zone"
+#: ../lib/advene/gui/edit/elements.py:636
+#: ../lib/advene/gui/edit/elements.py:717
+#: ../lib/advene/gui/edit/elements.py:774
+#: ../lib/advene/gui/edit/elements.py:865
+#: ../lib/advene/gui/edit/elements.py:934
+#: ../lib/advene/gui/edit/elements.py:1036
+msgid "Title (name)"
+msgstr "Titre (nom)"
 
-#: ../lib/advene/gui/views/timeline.py:2441
-msgid "Restrict display to region"
-msgstr "Limiter l'affichage à la zone sélectionnée"
+#: ../lib/advene/gui/edit/elements.py:640
+msgid "Name of the view"
+msgstr "Nom de la vue"
 
-#: ../lib/advene/gui/views/timeline.py:2560
-msgid "New annotation at player time"
-msgstr "Nouvelle annotation au temps du lecteur"
+#: ../lib/advene/gui/edit/elements.py:664
+msgid "Class"
+msgstr "Classe"
 
-#: ../lib/advene/gui/views/timeline.py:2564
-msgid "New annotation at mouse position"
-msgstr "Nouvelle annotation à la position de la souris"
+#: ../lib/advene/gui/edit/elements.py:667
+msgid "Match Filter"
+msgstr "Masque de filtrage"
 
-#: ../lib/advene/gui/views/timeline.py:2568
-msgid "Selection"
-msgstr "Sélection"
+#: ../lib/advene/gui/edit/elements.py:710
+msgid "Validate and run query on package"
+msgstr "Valider et lancer la requête sur le recueil"
 
-#: ../lib/advene/gui/views/timeline.py:2694
-msgid "Cannot zoom more"
-msgstr "Impossible de zoomer plus"
+#: ../lib/advene/gui/edit/elements.py:721
+msgid "Name of the query"
+msgstr "Nom de la requête"
 
-#: ../lib/advene/gui/views/timeline.py:2915
-#, python-format
-msgid "From schema %s"
-msgstr "Schéma %s"
+#: ../lib/advene/gui/edit/elements.py:778
+msgid "Name of the package"
+msgstr "Nom du recueil"
 
-#: ../lib/advene/gui/views/timeline.py:2977
-msgid "Restrict playing to this annotation-type"
-msgstr "Restreindre le jeu à ce type d'annotation"
+#: ../lib/advene/gui/edit/elements.py:796
+#: ../lib/advene/gui/edit/elements.py:887
+#: ../lib/advene/gui/edit/elements.py:966
+#: ../lib/advene/gui/edit/elements.py:1080
+msgid "Description"
+msgstr "Description"
 
-#: ../lib/advene/gui/views/timeline.py:2984
-msgid "Goto previous annotation"
-msgstr "Aller à l'annotation précédente"
+#: ../lib/advene/gui/edit/elements.py:800
+#: ../lib/advene/gui/edit/elements.py:891
+#: ../lib/advene/gui/edit/elements.py:970
+#: ../lib/advene/gui/edit/elements.py:1084
+msgid "Textual description of the package"
+msgstr "Description textuelle du recueil"
 
-#: ../lib/advene/gui/views/timeline.py:2995
-msgid "Goto next annotation"
-msgstr "Aller à l'annotation suivante"
+#: ../lib/advene/gui/edit/elements.py:805
+msgid "Default dynamic view"
+msgstr "Vue dynamique par défaut"
 
-#: ../lib/advene/gui/views/timeline.py:3006
-msgid "+"
-msgstr "+"
+#: ../lib/advene/gui/edit/elements.py:809
+msgid "Dynamic view to activate on package load"
+msgstr "Vue dynamique à activer au chargement du recueil"
 
-#: ../lib/advene/gui/views/timeline.py:3064
-msgid "Open an annotation display view"
-msgstr "Ouvrir une vue d'affichage de l'annotation"
+#: ../lib/advene/gui/edit/elements.py:814
+msgid "Default static view"
+msgstr "Vue statique par défaut"
 
-#: ../lib/advene/gui/views/timeline.py:3071
-msgid "Open a slave montage view (coordinated zoom level)"
-msgstr "Ouvrir une vue montage escale (avec zoom coordonné)"
+#: ../lib/advene/gui/edit/elements.py:818
+msgid "Static view to open on package load"
+msgstr "Vue statique à ouvrir au chargement du recueil"
 
-#: ../lib/advene/gui/views/timeline.py:3106
-msgid ""
-"<b>Statistics about current selection</b>\n"
-"\n"
-msgstr ""
-"<b>Statistiques sur la sélection</b>\n"
-"\n"
+#: ../lib/advene/gui/edit/elements.py:823
+msgid "Default adhoc view"
+msgstr "Vue adhoc par défaut"
 
-#: ../lib/advene/gui/views/timeline.py:3113
-msgid "No selected annotation"
-msgstr "Pas d'annotation sélectionnée"
+#: ../lib/advene/gui/edit/elements.py:827
+msgid "Adhoc view to open on package load"
+msgstr "Vue adhoc à ouvrir au chargement du recueil"
 
-#: ../lib/advene/gui/views/timeline.py:3117
-#, python-format
-msgid "%d selected annotation(s)"
-msgstr "%d annotation(s) sélectionnée(s)"
+#: ../lib/advene/gui/edit/elements.py:832
+msgid "Cached duration"
+msgstr "Durée mémorisée"
 
-#: ../lib/advene/gui/views/timeline.py:3124
-msgid "Unselect all annotations"
-msgstr "Déselectionner toutes les annotations"
+#: ../lib/advene/gui/edit/elements.py:836
+msgid "Cached duration in ms"
+msgstr "Durée mémorisée du média en ms"
 
-#: ../lib/advene/gui/views/timeline.py:3125
-msgid "Create a static view"
-msgstr "Créer une vue statique"
+#: ../lib/advene/gui/edit/elements.py:841
+msgid "Mediafile"
+msgstr "Fichier vidéo"
 
-#: ../lib/advene/gui/views/timeline.py:3126
-msgid "Highlight selection in other views"
-msgstr "Signaler les annotations actives dans les autres vues"
+#: ../lib/advene/gui/edit/elements.py:845
+msgid "Location of associated media file"
+msgstr "Emplacement du fichier vidéo associé"
 
-#: ../lib/advene/gui/views/timeline.py:3127
-#: ../lib/advene/gui/views/timeline.py:3713
-msgid "Tag selection"
-msgstr "Taguer la sélection"
+#: ../lib/advene/gui/edit/elements.py:869
+msgid "Name of the schema"
+msgstr "Nom du schéma"
 
-#: ../lib/advene/gui/views/timeline.py:3128
-msgid "Delete selected annotations"
-msgstr "Supprimer les annotations sélectionnées"
+#: ../lib/advene/gui/edit/elements.py:901
+#: ../lib/advene/gui/edit/elements.py:981
+msgid "TALES expression returning a color for the element"
+msgstr "Expression TALES spécifiant une couleur pour l'élément"
 
-#: ../lib/advene/gui/views/timeline.py:3129
-msgid "Display selection in a table"
-msgstr "Affiche la sélection dans un tableau"
+#: ../lib/advene/gui/edit/elements.py:908
+#: ../lib/advene/gui/edit/elements.py:999
+msgid "Item color"
+msgstr "Couleur de l'item"
 
-#: ../lib/advene/gui/views/timeline.py:3130
-msgid "Center and zoom on selection"
-msgstr "Centrer et zoomer sur la sélection"
+#: ../lib/advene/gui/edit/elements.py:912
+#: ../lib/advene/gui/edit/elements.py:1003
+msgid ""
+"TALES expression returning a color for the items contained by the element"
+msgstr ""
+"Expression TALES retournant une couleur pour les items contenus dans "
+"l'élément"
 
-#: ../lib/advene/gui/views/timeline.py:3131
-msgid "Edit selected annotations"
-msgstr "Éditer les annotations sélectionnées"
-
-#: ../lib/advene/gui/views/timeline.py:3132
-msgid "Merge annotations"
-msgstr "Fusionner les annotations"
-
-#: ../lib/advene/gui/views/timeline.py:3133
-msgid "Display statistics"
-msgstr "Afficher les statistiques"
-
-#: ../lib/advene/gui/views/timeline.py:3258
-msgid "Goto previous page"
-msgstr "Aller à la page précédente"
+#: ../lib/advene/gui/edit/elements.py:938
+#: ../lib/advene/gui/edit/elements.py:1040
+msgid "Name of the type"
+msgstr "Nom du type"
 
-#: ../lib/advene/gui/views/timeline.py:3270
-msgid "Goto next page"
-msgstr "Aller à la page suivante"
+#: ../lib/advene/gui/edit/elements.py:956
+#: ../lib/advene/gui/edit/elements.py:1045
+#: ../lib/advene/gui/edit/elements.py:1314
+msgid "MIME Type"
+msgstr "Type MIME"
 
-#: ../lib/advene/gui/views/timeline.py:3324
-msgid "Inspector locked. Click here or in the timeline background to unlock."
-msgstr ""
-"Inspecteur verrouillé. Cliquez ici ou dans le fond de la timeline pour\n"
-"déverrouiller."
+#: ../lib/advene/gui/edit/elements.py:960
+#: ../lib/advene/gui/edit/elements.py:1049
+msgid "MIMEType of the content"
+msgstr "Type MIME du contenu"
 
-#: ../lib/advene/gui/views/timeline.py:3352
+#: ../lib/advene/gui/edit/elements.py:992
 msgid ""
-"Delete the selected annotations or drop an annotation here to delete it."
+"TALES expression used to get a compact representation of the annotations"
 msgstr ""
-"Supprimer les annotations sélectionnée ou déposer une annotation ici pour la "
-"supprimer."
+"Expression TALES fournissant une représentation compacte des annotations"
 
-#: ../lib/advene/gui/views/timeline.py:3374
-msgid ""
-"Drag an annotation type here to remove it from display.\n"
-"Click to edit all displayed types"
-msgstr ""
-"Déposez un type d'annotation ici pour l'enlever de l'affichage.\n"
-"Cliquez pour éditer l'ensemble des types affichés."
+#: ../lib/advene/gui/edit/elements.py:993
+#, python-format
+msgid "Display %s key"
+msgstr "Afficher la clé %s"
 
-#: ../lib/advene/gui/views/timeline.py:3386
-msgid "Selection actions"
-msgstr "Actions sur la sélection"
+#: ../lib/advene/gui/edit/elements.py:1009
+msgid "Completions"
+msgstr "Complétions"
 
-#: ../lib/advene/gui/views/timeline.py:3401
-msgid "Display relations"
-msgstr "Afficher les relations"
+#: ../lib/advene/gui/edit/elements.py:1013
+msgid "Space-separated list of words used for content completion"
+msgstr "Liste de mots, séparés par des espaces, utilisés pour la complétion."
 
-#: ../lib/advene/gui/views/timeline.py:3407
-msgid "Display all relations"
-msgstr "Afficher toutes les relations"
+#: ../lib/advene/gui/edit/elements.py:1019
+msgid "Advanced"
+msgstr "Avancées"
 
-#: ../lib/advene/gui/views/timeline.py:3484
-msgid "Center on current player position."
-msgstr "Centrer sur la position courante"
+#: ../lib/advene/gui/edit/elements.py:1069
+msgid "Any annotation type"
+msgstr "Tout type d'annotation"
 
-#: ../lib/advene/gui/views/timeline.py:3500
-msgid "Automatically activate loop when clicking on an annotation"
-msgstr "Activer la boucle automatiquement lors du clic sur une annotation"
+#: ../lib/advene/gui/edit/elements.py:1095
+msgid "TALES expression specifying a color"
+msgstr "Expression TALES spécifiant une couleur"
 
-#: ../lib/advene/gui/views/timeline.py:3524
-msgid "Displayed"
-msgstr "Affichés"
+#: ../lib/advene/gui/edit/elements.py:1122
+msgid "MIMEType"
+msgstr "Type MIME"
 
-#: ../lib/advene/gui/views/timeline.py:3532
-msgid "Not displayed"
-msgstr "Pas affichés"
+#: ../lib/advene/gui/edit/elements.py:1347
+#, python-format
+msgid "Error: cannot find a content handler for %s"
+msgstr "Erreur : impossible d'ouvrir une fenêtre d'édition pour %s"
 
-#: ../lib/advene/gui/views/timeline.py:3580
-msgid "< All <"
-msgstr "< Tout <"
+#: ../lib/advene/gui/edit/elements.py:1466
+#: ../lib/advene/gui/edit/elements.py:1679
+#, python-format
+msgid ""
+"Cannot read the data:\n"
+"%s"
+msgstr ""
+"Impossible de lire les données :\n"
+"%s"
 
-#: ../lib/advene/gui/views/timeline.py:3584
-msgid "> All >"
-msgstr "> Tout >"
+#: ../lib/advene/gui/edit/elements.py:1479
+#: ../lib/advene/gui/edit/elements.py:1704
+msgid "Save content to..."
+msgstr "Sauver le contenu..."
 
-#: ../lib/advene/gui/views/timeline.py:3600
-msgid "Displayed annotation types"
-msgstr "Types d'annotations affichés"
+#: ../lib/advene/gui/edit/elements.py:1493
+#: ../lib/advene/gui/edit/elements.py:1717
+#, python-format
+msgid ""
+"Cannot save the data:\n"
+"%s"
+msgstr ""
+"Impossible de sauvegarder les données :\n"
+"%s"
 
-#: ../lib/advene/gui/views/timeline.py:3625
-msgid "Relation type"
-msgstr "Type de relation"
+#: ../lib/advene/gui/edit/elements.py:1508
+#: ../lib/advene/gui/edit/elements.py:1731
+msgid "Open a file (C-o)"
+msgstr "Ouvrir un fichier (C-o)"
 
-#: ../lib/advene/gui/views/timeline.py:3625
-msgid "Display relation types"
-msgstr "Afficher les types de relation"
+#: ../lib/advene/gui/edit/elements.py:1513
+#: ../lib/advene/gui/edit/elements.py:1736
+msgid "Save to a file (C-s)"
+msgstr "Sauvegarder dans un fichier (C-s)"
 
-#: ../lib/advene/gui/views/timeline.py:3626
-msgid "Relation content"
-msgstr "Contenu de relation"
+#: ../lib/advene/gui/edit/elements.py:1518
+#: ../lib/advene/gui/edit/elements.py:1741
+msgid "Reload the file (C-r)"
+msgstr "Recharger le fichier (C-r)"
 
-#: ../lib/advene/gui/views/timeline.py:3626
-msgid "Display relation content"
-msgstr "Afficher le contenu des relations"
+#: ../lib/advene/gui/edit/elements.py:1524
+msgid "Insert a value from the browser (C-i)"
+msgstr "Insérer une valeur depuis le browser (C-i)"
 
-#: ../lib/advene/gui/views/timeline.py:3627 ../lib/advene/gui/popup.py:516
-msgid "Highlight"
-msgstr "Mise en valeur"
+#: ../lib/advene/gui/edit/elements.py:1770
+msgid "Begin time is greater than end time"
+msgstr "Le moment de début est plus grand que celui de fin"
 
-#: ../lib/advene/gui/views/timeline.py:3627
-msgid "Highlight active annotations"
-msgstr "Signaler les annotations actives"
+#: ../lib/advene/gui/edit/elements.py:2042
+msgid "Expecting an integer."
+msgstr "Un entier est attendu."
 
-#: ../lib/advene/gui/views/timeline.py:3714
-msgid "Enter the tag for the selection"
-msgstr "Entrez le tag pour la sélection"
+#: ../lib/advene/gui/edit/elements.py:2074
+#, python-format
+msgid ""
+"The %(attribute)s attribute could not be updated:\n"
+"\n"
+"%(error)s\n"
+"\n"
+"Resetting to the original value."
+msgstr ""
+"L'attribut %(attribute)s ne peut pas être mis à jour:\n"
+"\n"
+"%(error)s\n"
+"\n"
+"Il est remis à son ancienne valeur."
 
-#: ../lib/advene/gui/views/tree.py:248
-msgid "No children in on_iter_children()!"
-msgstr "Pas de fils dans on_iter_children"
+#: ../lib/advene/gui/edit/elements.py:2100
+#, python-format
+msgid ""
+"The following attributes cannot be updated:\n"
+"\n"
+"%s"
+msgstr ""
+"Les attributs suivants sont invalides :\n"
+"\n"
+"%s"
 
-#: ../lib/advene/gui/views/tree.py:263
-msgid "No children in on_iter_nth_child()"
-msgstr "Pas de fils dans on_iter_nth_child"
+#: ../lib/advene/gui/edit/elements.py:2138
+#, python-format
+msgid ""
+"The following attributes could not be updated:\n"
+"\n"
+"%s"
+msgstr ""
+"Les attributs suivants n'ont pas été mis à jour :\n"
+"\n"
+"%s"
 
-#: ../lib/advene/gui/views/tree.py:317
-msgid "List of views"
-msgstr "Liste des vues"
+#: ../lib/advene/gui/edit/elements.py:2155
+msgid "Attribute"
+msgstr "Attribut"
 
-#: ../lib/advene/gui/views/tree.py:318
-msgid "Static views"
-msgstr "Vues statiques"
+#: ../lib/advene/gui/edit/elements.py:2254
+msgid "Insert an element"
+msgstr "Insérer un élément"
 
-#: ../lib/advene/gui/views/tree.py:319
-msgid "Dynamic views"
-msgstr "Vues dynamiques"
+#: ../lib/advene/gui/edit/elements.py:2255
+msgid "Choose the element to insert."
+msgstr "Choisissez l'élément à insérer."
 
-#: ../lib/advene/gui/views/tree.py:320
-msgid "Admin views"
-msgstr "Vues administratives"
+#: ../lib/advene/gui/edit/elements.py:2325
+#: ../lib/advene/gui/edit/elements.py:2368
+#, python-format
+msgid "Some tags contain invalid characters: %s"
+msgstr "Certains tags contiennent des caractères non-valides: %s"
 
-#: ../lib/advene/gui/views/tree.py:321
-msgid "Adhoc views"
-msgstr "Vues adhoc"
+#: ../lib/advene/gui/edit/elements.py:2348
+msgid "Tags:"
+msgstr "Tags :"
 
-#: ../lib/advene/gui/views/tree.py:421 ../lib/advene/gui/main.py:1222
-msgid "Tree view"
-msgstr "Vue en arbre"
+#: ../lib/advene/gui/edit/transcribe.py:70
+msgid "Transcription importer"
+msgstr "Importateur de transcription"
 
-#: ../lib/advene/gui/views/tree.py:453
-msgid "Package View"
-msgstr "Vue du recueil"
+#: ../lib/advene/gui/edit/transcribe.py:81
+msgid "Note taking"
+msgstr "Prise de notes"
 
-#: ../lib/advene/gui/views/editaccumulator.py:42
-msgid "EditAccumulator"
-msgstr "Accumulateur d'édition"
+#: ../lib/advene/gui/edit/transcribe.py:83
+msgid "Take notes on the fly as a timestamped transcription"
+msgstr "Prendre des notes au vol sous forme de transcription temporalisée"
 
-#: ../lib/advene/gui/views/editaccumulator.py:70
-#: ../lib/advene/gui/views/annotationdisplay.py:256
-msgid "Validate"
-msgstr "Valider"
+#: ../lib/advene/gui/edit/transcribe.py:149
+msgid "Timestamp"
+msgstr "Temps"
 
-#: ../lib/advene/gui/views/relation.py:68
-msgid "Relations view"
-msgstr "Vue des relations"
+#: ../lib/advene/gui/edit/transcribe.py:149
+msgid "Click inserts timestamp marks"
+msgstr "Cliquer insére les marques de temps"
 
-#: ../lib/advene/gui/views/caption.py:30 ../lib/advene/gui/main.py:4339
-msgid "Caption"
-msgstr "Sous-titreur"
+#: ../lib/advene/gui/edit/transcribe.py:150
+msgid "Insert on single-click"
+msgstr "Insérer sur simple-clic"
 
-#: ../lib/advene/gui/views/caption.py:32
-msgid "Display a text caption below the video output"
-msgstr "Composant dédié à l'affichage des sous-titres sous la vidéo"
+#: ../lib/advene/gui/edit/transcribe.py:150
+msgid "A single click will insert the mark (else a double click is needed)"
+msgstr ""
+"Un simple-clic insérera une marque de temps (sinon, un double-clic est "
+"nécessaire)"
 
-#: ../lib/advene/gui/views/scroller.py:29 ../lib/advene/gui/main.py:4338
-msgid "Scroller"
-msgstr "Défileur"
+#: ../lib/advene/gui/edit/transcribe.py:151
+msgid "Play on scroll"
+msgstr "Jouer après modification"
 
-#: ../lib/advene/gui/views/finder.py:329
-#, python-format
-msgid ""
-"View <b>%(title)s</b>\n"
-"Id: %(id)s"
-msgstr ""
-"Vue <b>%(title)s</b>\n"
-"Id: %(id)s"
+#: ../lib/advene/gui/edit/transcribe.py:151
+msgid "Play the new position upon timestamp modification"
+msgstr "Joue la nouvelle position après la modification de la marque de temps"
 
-#: ../lib/advene/gui/views/finder.py:336
-msgid "Open in webbrowser"
-msgstr "Afficher dans un navigateur web"
+#: ../lib/advene/gui/edit/transcribe.py:152
+msgid "Generate empty annotations"
+msgstr "Contenus vides"
 
-#: ../lib/advene/gui/views/finder.py:337
-#, python-format
-msgid "View applied to %s\n"
-msgstr "Vue appliquée sur %s\n"
+#: ../lib/advene/gui/edit/transcribe.py:152
+msgid "If checked, generate annotations for empty text"
+msgstr "Si coché, des annotations seront générées pour les contenus vides"
 
-#: ../lib/advene/gui/views/finder.py:342 ../lib/advene/gui/popup.py:496
-msgid "Activate"
-msgstr "Activer"
+#: ../lib/advene/gui/edit/transcribe.py:153
+msgid "Reaction time"
+msgstr "Temps de réaction"
 
-#: ../lib/advene/gui/views/finder.py:345
-msgid "Open in GUI"
-msgstr "Ouvrir dans l'interface"
+#: ../lib/advene/gui/edit/transcribe.py:153
+msgid ""
+"Reaction time (substracted from current player time, except when paused.)"
+msgstr "Temps de réaction (soustrait du temps de la vidéo, sauf en pause)"
 
-#: ../lib/advene/gui/views/finder.py:347
-msgid "Unknown type of view??"
-msgstr "Type de vue inconnu??"
+#: ../lib/advene/gui/edit/transcribe.py:154
+msgid "Auto-insert"
+msgstr "Insertion automatique"
 
-#: ../lib/advene/gui/views/finder.py:372
-msgid "Edit view"
-msgstr "Éditer la vue"
+#: ../lib/advene/gui/edit/transcribe.py:154
+msgid "Automatic timestamp mark insertion"
+msgstr "Insertion automatique des marques de temps"
 
-#: ../lib/advene/gui/views/finder.py:381
-msgid "Open view"
-msgstr "Ouvrir la vue"
+#: ../lib/advene/gui/edit/transcribe.py:155
+msgid "Automatic insertion delay"
+msgstr "Délai d'insertion automatique"
 
-#: ../lib/advene/gui/views/finder.py:421 ../lib/advene/gui/views/finder.py:487
-#, python-format
+#: ../lib/advene/gui/edit/transcribe.py:155
 msgid ""
-"%(type)s <b>%(title)s</b>\n"
-"Id: %(id)s"
-msgstr ""
-"%(type)s <b>%(title)s</b>\n"
-"Id: %(id)s"
-
-#: ../lib/advene/gui/views/finder.py:444
-msgid "Try to apply the query on..."
-msgstr "Essayer d'appliquer la requête sur..."
-
-#: ../lib/advene/gui/views/finder.py:464 ../lib/advene/gui/popup.py:829
-msgid "the package"
-msgstr "le recueil"
+"If autoinsert is active, timestamp marks will be automatically inserted when "
+"text is entered after no interaction since this delay (in ms).\n"
+"1000 is typically a good value."
+msgstr ""
+"Si l'insertion automatique est enclenchée, des marques de temps sont "
+"automatiquement insérées quand du texte est entré après aucune interaction "
+"depuis ce délai (en ms)\n"
+"1000 est une bonne valeur pour commencer."
 
-#: ../lib/advene/gui/views/finder.py:465 ../lib/advene/gui/popup.py:830
-msgid "all annotations of the package"
-msgstr "toutes les annotations du recueil"
+#: ../lib/advene/gui/edit/transcribe.py:156
+msgid "Font size for text (0 for standard size)"
+msgstr "Taille de la police pour le texte (0 pour la police standard)"
 
-#: ../lib/advene/gui/views/finder.py:466 ../lib/advene/gui/popup.py:831
-msgid "the first annotation of the package"
-msgstr "la première annotation du recueil"
+#: ../lib/advene/gui/edit/transcribe.py:216
+#: ../lib/advene/gui/edit/transcribe.py:220
+#: ../lib/advene/gui/edit/transcribe.py:378
+#: ../lib/advene/gui/edit/transcribe.py:382
+msgid "Invalid timestamp mark"
+msgstr "Marque de temps non valide"
 
-#: ../lib/advene/gui/views/finder.py:509
-msgid "Edit resource"
-msgstr "Éditer la ressource"
+#: ../lib/advene/gui/edit/transcribe.py:503
+msgid "Ignore the following text (toggle)"
+msgstr "Ignorer le texte qui suit (bascule)"
 
-#: ../lib/advene/gui/views/finder.py:523 ../lib/advene/gui/main.py:1223
-msgid "Package finder"
-msgstr "Navigateur de recueil"
+#: ../lib/advene/gui/edit/transcribe.py:507
+msgid "Remove mark"
+msgstr "Supprimer la marque"
 
-#: ../lib/advene/gui/views/finder.py:525
-msgid "Column-based package finder"
-msgstr "Afficher un navigateur en colonnes du recueil"
+#: ../lib/advene/gui/edit/transcribe.py:511
+msgid "Reaction-time offset"
+msgstr "Décalage du temps de réaction"
 
-#: ../lib/advene/gui/views/annotationdisplay.py:41
-msgid "AnnotationDisplay"
-msgstr "AfficheAnnotation"
+#: ../lib/advene/gui/edit/transcribe.py:515
+msgid "-1 sec"
+msgstr "-1 sec"
 
-#: ../lib/advene/gui/views/annotationdisplay.py:43
-msgid "Display the contents of an annotation"
-msgstr "Affiche le contenu d'une annotation"
+#: ../lib/advene/gui/edit/transcribe.py:518
+msgid "-0.5 sec"
+msgstr "-0.5 sec"
 
-#: ../lib/advene/gui/views/annotationdisplay.py:84
-msgid "No annotation"
-msgstr "Pas d'annotation"
+#: ../lib/advene/gui/edit/transcribe.py:521
+msgid "-0.1 sec"
+msgstr "-0.1 sec"
 
-#: ../lib/advene/gui/views/annotationdisplay.py:110
-#, python-format
-msgid ""
-"Schema %(schema)s (id %(id)s)\n"
-"%(description)s\n"
-"%(stats)s"
-msgstr ""
-"Schéma %(schema)s\n"
-"%(description)s\n"
-"%(total)s\n"
-"Id: %(id)s"
+#: ../lib/advene/gui/edit/transcribe.py:525
+msgid "+1 sec"
+msgstr "+1 sec"
 
-#: ../lib/advene/gui/views/annotationdisplay.py:231
-msgid "Screenshot"
-msgstr "Aperçu"
+#: ../lib/advene/gui/edit/transcribe.py:528
+msgid "+0.5 sec"
+msgstr "+0.5 sec"
 
-#: ../lib/advene/gui/views/__init__.py:193
-msgid "Invalid view id"
-msgstr "Identificateur de vue invalide"
+#: ../lib/advene/gui/edit/transcribe.py:531
+msgid "+0.1 sec"
+msgstr "+0.1 sec"
 
-#: ../lib/advene/gui/views/__init__.py:239
-#, python-format
-msgid "Cannot save default options: %s"
-msgstr "Impossible de sauvegarder les options par défaut : %s"
+#: ../lib/advene/gui/edit/transcribe.py:618
+msgid "Invalid timestamp"
+msgstr "Marque de temps invalide"
 
-#: ../lib/advene/gui/views/__init__.py:250
+#: ../lib/advene/gui/edit/transcribe.py:738
 #, python-format
-msgid "Default options saved for view %s"
-msgstr "Options par défaut sauvées pour la vue %s"
+msgid "Invalid timestamp mark in conversion: %s"
+msgstr "Marque de temps non valide lors de la conversion: %s"
 
-#: ../lib/advene/gui/views/__init__.py:282
+#: ../lib/advene/gui/edit/transcribe.py:856
 #, python-format
-msgid "Saving %s"
-msgstr "Sauver %s"
+msgid "Cannot save the file: %s"
+msgstr "Impossible de sauvegarder le fichier : %s"
 
-#: ../lib/advene/gui/views/__init__.py:285
-msgid "Enter a view name to save this parametered view"
-msgstr "Entrez un nom de vue pour sauvegarder cette vue paramétrée"
+#: ../lib/advene/gui/edit/transcribe.py:865
+#: ../lib/advene/gui/edit/transcribe.py:947
+msgid "This will overwrite the current textual content. Are you sure?"
+msgstr "Ceci va écraser le contenu actuel. Êtes-vous sûr ?"
 
-#: ../lib/advene/gui/views/__init__.py:288 ../lib/advene/gui/main.py:4630
-#, python-format
-msgid "Error: the identifier %s contains invalid characters."
-msgstr "Erreur : l'identifiant %s contient des caractères non valides."
+#: ../lib/advene/gui/edit/transcribe.py:868
+msgid "Select transcription file to load"
+msgstr "Sélectionnez le fichier de transcription"
 
-#: ../lib/advene/gui/views/__init__.py:303
+#: ../lib/advene/gui/edit/transcribe.py:885
 #, python-format
-msgid "Error: the view %s is not an adhoc view."
-msgstr "Erreur : la vue %s n'est pas une vue ad-hoc"
+msgid "Cannot open %(filename)s: %(error)s"
+msgstr "Impossible de lire %(filename)s : %(error)s"
 
-#: ../lib/advene/gui/views/__init__.py:328
-msgid "HTML export"
-msgstr "Export HTML"
+#: ../lib/advene/gui/edit/transcribe.py:932
+msgid "Cannot import annotations: no existing interface"
+msgstr "Impossible d'importer des annotations : aucune interface disponible"
 
-#: ../lib/advene/gui/views/__init__.py:329
-msgid "Specify a name for the export view"
-msgstr "Choisissez un nom pour l'export de la vue."
+#: ../lib/advene/gui/edit/transcribe.py:934
+msgid "Select the annotation type to import"
+msgstr "Sélectionnez le type d'annotation à importer"
 
-#: ../lib/advene/gui/views/__init__.py:348
+#: ../lib/advene/gui/edit/transcribe.py:943
 #, python-format
-msgid ""
-"View successfully exported as %s.\n"
-"Open it in the web browser ?"
-msgstr ""
-"Vue exportée sous le nom %s.\n"
-"Souhaitez-vous l'ouvrir dans le navigateur web ?"
-
-#: ../lib/advene/gui/views/__init__.py:427
-msgid "Actions"
-msgstr "Actions"
-
-#: ../lib/advene/gui/views/__init__.py:452
-msgid "Click or drag-and-drop to reattach view"
-msgstr "Cliquer ou glisser-déposer pour réattacher la vue"
-
-#: ../lib/advene/gui/views/table.py:55
-msgid "Annotation table view"
-msgstr "Tableau d'annotations"
-
-#: ../lib/advene/gui/views/table.py:57
-msgid "Display annotations in a table"
-msgstr "Affiche les annotations dans un tableau"
-
-#: ../lib/advene/gui/views/table.py:227 ../lib/advene/gui/views/table.py:452
-msgid "Snapshot"
-msgstr "Copie d'écran"
-
-#: ../lib/advene/gui/views/table.py:254 ../lib/advene/gui/main.py:4178
-msgid "Duration"
-msgstr "Durée"
+msgid "There are no annotations of type %s"
+msgstr "Il n'y a pas d'annotation de type %s"
 
-#: ../lib/advene/gui/views/table.py:382 ../lib/advene/gui/views/table.py:511
-msgid "Export data to file..."
-msgstr "Exporter les données vers le fichier..."
+#: ../lib/advene/gui/edit/transcribe.py:972
+msgid "Cannot convert the data: no associated package"
+msgstr "Impossible de convertir les données : aucun recueil associé"
 
-#: ../lib/advene/gui/views/table.py:391 ../lib/advene/gui/views/table.py:520
-#, python-format
-msgid "Error while exporting data to %(filename)s: %(error)s"
-msgstr "Impossible d'exporter dans %(filename)s : %(error)s"
+#: ../lib/advene/gui/edit/transcribe.py:975
+msgid "Converting transcription"
+msgstr "Conversion de la transcription"
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "id"
-msgstr "id"
+#: ../lib/advene/gui/edit/transcribe.py:981
+msgid "Choose the annotation-type where to create annotations.\n"
+msgstr "Choisissez le type d'annotation où les annotations seront créées.\n"
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "type"
-msgstr "type"
+#: ../lib/advene/gui/edit/transcribe.py:989
+msgid "Delete existing annotations in this type"
+msgstr "Supprimer les annotations existantes de ce type"
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "begin"
-msgstr "début"
+#: ../lib/advene/gui/edit/transcribe.py:1012
+msgid "Select type"
+msgstr "Sélection du type"
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "end"
-msgstr "fin"
+#: ../lib/advene/gui/edit/transcribe.py:1016
+msgid "You want to create a new type. Please specify its schema and title."
+msgstr "Vous voulez créer un nouveau type. Spécifiez son titre et son schéma."
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "content"
-msgstr "contenu"
+#: ../lib/advene/gui/edit/transcribe.py:1028
+msgid "Containing schema"
+msgstr "Schéma"
 
-#: ../lib/advene/gui/views/table.py:460
-msgid "Generic table view"
-msgstr "Tableau d'éléments"
+#: ../lib/advene/gui/edit/transcribe.py:1041
+msgid "Export options"
+msgstr "Options d'export"
 
-#: ../lib/advene/gui/views/table.py:462
-msgid "Display Advene elements in a table."
-msgstr "Affiche des éléments Advene dans un tableau"
+#: ../lib/advene/gui/edit/transcribe.py:1046
+msgid "Generate annotations for empty contents"
+msgstr "Générer des annotations pour les contenus vides"
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element title"
-msgstr "Titre de l'élément"
+#: ../lib/advene/gui/edit/transcribe.py:1071
+#, python-format
+msgid "The %s identifier already exists. Choose another one."
+msgstr "L'identificateur %s est déjà défini. Choisissez-en un autre."
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element type"
-msgstr "Type de l'élément"
+#: ../lib/advene/gui/edit/transcribe.py:1110
+msgid "Notes converted"
+msgstr "Notes converties"
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element id"
-msgstr "Identificateur de l'élément"
+#: ../lib/advene/gui/edit/transcribe.py:1157
+msgid "Open"
+msgstr "Ouvrir"
 
-#: ../lib/advene/gui/widget.py:327
-#, python-format
-msgid "Set of %s annotations"
-msgstr "Ensemble de %s annotations"
+#: ../lib/advene/gui/edit/transcribe.py:1158
+msgid "Save"
+msgstr "Sauver"
 
-#: ../lib/advene/gui/widget.py:1067
-msgid "Save as..."
-msgstr "Sauvegarder sous..."
+#: ../lib/advene/gui/edit/transcribe.py:1159
+msgid "Save As"
+msgstr "Sauver sous"
 
-#: ../lib/advene/gui/widget.py:1072
-msgid "Use current player position"
-msgstr "Utiliser la position courante du lecteur"
+#: ../lib/advene/gui/edit/transcribe.py:1160
+msgid "Import"
+msgstr "Importer"
 
-#: ../lib/advene/gui/widget.py:1078
-msgid "Adjust timestamp"
-msgstr "Ajuster le timecode"
+#: ../lib/advene/gui/edit/transcribe.py:1160
+msgid "Import from annotations"
+msgstr "Importer des annotations"
 
-#: ../lib/advene/gui/main.py:193 ../lib/advene/gui/main.py:304
-msgid "_Select player"
-msgstr "Sélection du lecteur"
+#: ../lib/advene/gui/edit/transcribe.py:1161
+msgid "Convert"
+msgstr "Convertir"
 
-#: ../lib/advene/gui/main.py:195 ../lib/advene/gui/main.py:287
-msgid "_View"
-msgstr "_Vues"
+#: ../lib/advene/gui/edit/transcribe.py:1161
+msgid "Convert to annotations"
+msgstr "Convertir en annotations"
 
-#: ../lib/advene/gui/main.py:197 ../lib/advene/gui/main.py:306
-msgid "Packages"
-msgstr "Recueils"
+#: ../lib/advene/gui/edit/transcribe.py:1163 ../lib/advene/rules/actions.py:670
+msgid "Center"
+msgstr "Centrer"
 
-#: ../lib/advene/gui/main.py:200 ../lib/advene/gui/main.py:246
-msgid "Open recent"
-msgstr "Recueils récents"
+#: ../lib/advene/gui/edit/transcribe.py:1163
+msgid "Center on the current mark"
+msgstr "Centrer sur la marque courante"
 
-#: ../lib/advene/gui/main.py:239
-msgid "Input from the keyboard (function keys)"
-msgstr "Entrée depuis le clavier (touches de fonction)"
+#: ../lib/advene/gui/edit/transcribe.py:1164
+msgid "Find"
+msgstr "Chercher"
 
-#: ../lib/advene/gui/main.py:243
-msgid "_File"
-msgstr "_Fichier"
+#: ../lib/advene/gui/edit/transcribe.py:1164
+msgid "Search a string"
+msgstr "Rechercher un mot"
 
-#: ../lib/advene/gui/main.py:244
-msgid "_New package"
-msgstr "_Nouveau recueil"
+#: ../lib/advene/gui/edit/transcribe.py:1165
+msgid "Scale"
+msgstr "Échelle"
 
-#: ../lib/advene/gui/main.py:244
-msgid "Create a new package"
-msgstr "Créer un nouveau recueil"
+#: ../lib/advene/gui/edit/transcribe.py:1188
+msgid "Automatically scroll to the mark position when playing"
+msgstr "Défiler automatiquement lors du jeu de la vidéo"
 
-#: ../lib/advene/gui/main.py:245
-msgid "_Open package"
-msgstr "_Ouvrir recueil"
+#: ../lib/advene/gui/edit/transcribe.py:1190
+msgid "Autoscroll"
+msgstr "Défilement automatique"
 
-#: ../lib/advene/gui/main.py:245
-msgid "Open a package"
-msgstr "Ouvrir un recueil"
+#: ../lib/advene/gui/edit/transcribe.py:1197
+msgid "Autoinsert"
+msgstr "Insertion automatique"
 
-#: ../lib/advene/gui/main.py:246
-msgid "Show recently opened packages"
-msgstr "Recueils ouverts récemments"
+#: ../lib/advene/gui/edit/transcribe.py:1199
+msgid "Automatically insert marks"
+msgstr "Insérer des marques de temps automatiquement"
 
-#: ../lib/advene/gui/main.py:247
-msgid "_Save package"
-msgstr "_Sauvegarder recueil"
+#: ../lib/advene/core/webcherry.py:53
+msgid "The webserver requires version 3.0 of CherryPy at least."
+msgstr "Le serveur web exige CherryPy version 3.0 ou supérieure."
 
-#: ../lib/advene/gui/main.py:247
-msgid "Save the package"
-msgstr "Sauvegarder le recueil %s"
+#: ../lib/advene/core/webcherry.py:169
+#, python-format
+msgid ""
+"\n"
+"            <p>\n"
+"            <a href=\"/admin\">Server administration</a> |\n"
+"            <a href=\"/media\">Media control</a> |\n"
+"            <a href=\"%(path)s?mode=raw\">Raw view</a>\n"
+"            </p>\n"
+"            Location: %(locationbar)s\n"
+"            <hr>\n"
+"            "
+msgstr ""
+"\n"
+"<p>\n"
+"<a href=\"/admin\">Administration du serveur</a> |\n"
+"<a href=\"/media\">Contrôle du lecteur</a> |\n"
+"<a href=\"%(path)s?mode=raw\">Vue brute</a>\n"
+"</p>\n"
+"Chemin courant : %(locationbar)s\n"
+"<hr>"
 
-#: ../lib/advene/gui/main.py:248
-msgid "Save package as..."
-msgstr "Sauvegarder sous..."
+#: ../lib/advene/core/webcherry.py:229
+msgid "Unspecified Error"
+msgstr "Erreur non spécifiée"
 
-#: ../lib/advene/gui/main.py:248
-msgid "Save the package as..."
-msgstr "Sauvegarder le recueil sous..."
+#: ../lib/advene/core/webcherry.py:230
+#, python-format
+msgid ""
+"\n"
+"        <h1>Error</h1>\n"
+"        <p>An error occurred:</p>\n"
+"        %s\n"
+"        "
+msgstr ""
+"\n"
+"        <h1>Erreur</h1>\n"
+"        <p>Une erreur est survenue :</p>\n"
+"        %s\n"
+"        "
 
-#: ../lib/advene/gui/main.py:249
-msgid "Close package"
-msgstr "Fermer recueil"
+#: ../lib/advene/core/webcherry.py:263
+msgid "<h1>No available mediaplayer</h1>"
+msgstr "<h1>Aucune capture d'écran.</h1>"
 
-#: ../lib/advene/gui/main.py:249
-msgid "Close the package"
-msgstr "Fermer le recueil"
+#: ../lib/advene/core/webcherry.py:266
+#, python-format
+msgid ""
+"\n"
+"            <h1>Current STBV: %(currentstbv)s</h1>\n"
+"\n"
+"            <h1>Player status</h1>\n"
+"            <table border=\"1\">\n"
+"            <tr>\n"
+"            <td>Current media</td><td>%(uri)s</td>\n"
+"            <td>Current position</td><td>%(position)s</td>\n"
+"            <td>Duration</td><td>%(duration)s</td>\n"
+"            <td>Player status</td><td>%(status)s</td>\n"
+"            </tr>\n"
+"            </table>\n"
+"            "
+msgstr ""
+"\n"
+"            <h1>Vue STBV courante: %(currentstbv)s</h1>\n"
+"\n"
+"            <h1>Statut du lecteur</h1>\n"
+"            <table border=\"1\">\n"
+"            <tr>\n"
+"            <td>Media</td><td>%(uri)s</td>\n"
+"            <td>Position</td><td>%(position)s</td>\n"
+"            <td>Durée</td><td>%(duration)s</td>\n"
+"            <td>Statut</td><td>%(status)s</td>\n"
+"            </tr>\n"
+"            </table>\n"
+"            "
 
-#: ../lib/advene/gui/main.py:251
-msgid "Save session"
-msgstr "Sauver la session"
+#: ../lib/advene/core/webcherry.py:279
+msgid "No media file"
+msgstr "Pas de fichier vidéo"
 
-#: ../lib/advene/gui/main.py:251
-msgid "Save the current session (list of opened packages)"
-msgstr "Sauvegarder la session en cours (liste des recueils ouverts)"
+#: ../lib/advene/core/webcherry.py:286
+msgid ""
+"\n"
+"            <form action=\"/media/play\" method=\"GET\">\n"
+"            Starting pos: <input type=\"text\" name=\"position\" value="
+"\"0\">\n"
+"            <input type=\"submit\" value=\"Play\">\n"
+"            </form>\n"
+"            <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
+"\">Pause</a><br>\n"
+"            "
+msgstr ""
+"\n"
+"                <form action=\"/media/play\" method=\"GET\">\n"
+"                Position de départ (en ms): <input type=\"text\" name=\"bc\" "
+"value=\"0\">\n"
+"                <input type=\"submit\" value=\"Démarrer\">\n"
+"                </form>\n"
+"                <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
+"\">Pause</a><br>\n"
+"                "
 
-#: ../lib/advene/gui/main.py:252
-msgid "Save workspace"
-msgstr "Sauver l'environnement"
+#: ../lib/advene/core/webcherry.py:293
+msgid ""
+"<hr />\n"
+"            <form action=\"/media/load\" method=\"GET\">\n"
+"            Add a new file (<em>dvd</em> to play a DVD):\n"
+"            <input type=\"text\" name=\"filename\">\n"
+"            <input type=\"submit\" value=\"Add\">\n"
+"            </form>"
+msgstr ""
+"<hr />\n"
+"            <form action=\"/media/load\" method=\"GET\">\n"
+"            Ajouter un nouveau fichier (<em>dvd</em> pour un DVD):\n"
+"            <input type=\"text\" name=\"filename\">\n"
+"            <input type=\"submit\" value=\"Ajouter\">\n"
+"            </form>"
 
-#: ../lib/advene/gui/main.py:253
-msgid "...as package view"
-msgstr "...comme une vue du recueil"
+#: ../lib/advene/core/webcherry.py:299
+msgid ""
+"<h3><a href=\"/media/snapshot\">Access to current packages snapshots</h3>"
+msgstr "<h3><a href=\"/media/snapshot\">Accéder aux captures d'écran</h3>"
 
-#: ../lib/advene/gui/main.py:254
-msgid "...as standard workspace"
-msgstr "... comme environnement standard"
+#: ../lib/advene/core/webcherry.py:308
+#, python-format
+msgid "Unknown STBV identifier: %s"
+msgstr "Identificateur STBV inconnu : %s"
 
-#: ../lib/advene/gui/main.py:254
-msgid "Use the current layout as standard workspace in the future"
-msgstr "Utiliser l'environnement courant comme environnement standard"
+#: ../lib/advene/core/webcherry.py:383
+msgid "Media information"
+msgstr "Information sur le média"
 
-#: ../lib/advene/gui/main.py:256
-msgid "Associate a video _File"
-msgstr "Associer un _Fichier vidéo"
+#: ../lib/advene/core/webcherry.py:396
+msgid "File added"
+msgstr "Fichier ajouté"
 
-#: ../lib/advene/gui/main.py:256
-msgid "Associate a video file"
-msgstr "Associer un fichier vidéo"
+#: ../lib/advene/core/webcherry.py:397
+#, python-format
+msgid "<p><strong>%s has been loaded.</strong></p>"
+msgstr "<p><strong>%s a été chargé.</strong></p>"
 
-#: ../lib/advene/gui/main.py:257
-msgid "Associate a _DVD"
-msgstr "Associer un _DVD"
+#: ../lib/advene/core/webcherry.py:408 ../lib/advene/core/webcherry.py:466
+msgid "Access to packages snapshots"
+msgstr "Accès aux catpures d'écran"
 
-#: ../lib/advene/gui/main.py:257
-msgid "Associate a chapter from a DVD"
-msgstr "Associer un chapitre de DVD"
+#: ../lib/advene/core/webcherry.py:418 ../lib/advene/core/webcherry.py:476
+msgid "Unknown package alias"
+msgstr "Alias du recueil inconnu"
 
-#: ../lib/advene/gui/main.py:258
-msgid "Associate a _Video stream"
-msgstr "Associer un flux _Vidéo"
+#: ../lib/advene/core/webcherry.py:424
+#, python-format
+msgid "Available snapshots for %s"
+msgstr "Captures d'écran disponibles pour le recueil %s"
 
-#: ../lib/advene/gui/main.py:258
-msgid "Enter a video stream address"
-msgstr "Entrer une adresse de flux vidéo"
+#: ../lib/advene/core/webcherry.py:430
+#, python-format
+msgid ""
+"<p><a href=\"/media/snapshot/%s?mode=inline\">Display with inline images</"
+"a></p>"
+msgstr ""
+"<p><a href=\"/media/snapshot/%s?mode=inline\">Afficher les vignettes</a></p>"
 
-#: ../lib/advene/gui/main.py:260
-msgid "_Import File"
-msgstr "_Importer un fichier"
+#: ../lib/advene/core/webcherry.py:437
+msgid "Done"
+msgstr "Fait"
 
-#: ../lib/advene/gui/main.py:260
-msgid "Import data from an external source"
-msgstr "Importer des données depuis une source externe"
+#: ../lib/advene/core/webcherry.py:439
+msgid "Pending"
+msgstr "En attente"
 
-#: ../lib/advene/gui/main.py:261
-msgid "_Process video"
-msgstr "_Traitement de la vidéo"
+#: ../lib/advene/core/webcherry.py:481
+#, python-format
+msgid "Unknown annotation id: %s"
+msgstr "Annotation inconnue: %s"
 
-#: ../lib/advene/gui/main.py:261
-msgid "Import data from video processing algorithms"
-msgstr "Extraire automatiquement des données depuis la vidéo"
+#: ../lib/advene/core/webcherry.py:597 ../lib/advene/core/webcherry.py:715
+#, python-format
+msgid "Cannot activate stbvid %(stbvid)s: %(error)s"
+msgstr "Impossible d'écrire dans %(stbvid)s : %(error)s"
 
-#: ../lib/advene/gui/main.py:263
-msgid "Merge package"
-msgstr "Fusionner un recueil"
+#: ../lib/advene/core/webcherry.py:662
+msgid "<p>No GUI is available."
+msgstr "<p>Aucune interface n'est disponible."
 
-#: ../lib/advene/gui/main.py:263
-msgid "Merge elements from another package"
-msgstr "Fusionner les éléments d'un autres recueil"
+#: ../lib/advene/core/webcherry.py:664
+#, python-format
+msgid "<p>Opened adhoc views: %s</p>"
+msgstr "<p>Vues ad-hoc ouvertes : %s</p>"
 
-#: ../lib/advene/gui/main.py:264
-msgid "Import _DVD chapters"
-msgstr "Importer les chapitres du _DVD"
+#: ../lib/advene/core/webcherry.py:665
+msgid "<p>Available adhoc views:</p><ul>"
+msgstr "<p>Vues ad-hoc disponibles : %s</p>"
 
-#: ../lib/advene/gui/main.py:264
-msgid "Create annotations based on DVD chapters"
-msgstr "Créer des annotations correspondant aux chapitres du DVD"
+#: ../lib/advene/core/webcherry.py:686
+#, python-format
+msgid "<p>Current stbv: %s</p>"
+msgstr "<p>Vue STBV courante : %s</p>"
 
-#: ../lib/advene/gui/main.py:266
-msgid "_Export..."
-msgstr "Exporter..."
+#: ../lib/advene/core/webcherry.py:687
+#, python-format
+msgid "<p>You can activate the following STBV:</p><ul>%s</ul>"
+msgstr "<p>Vous pouvez activer les STBV suivantes :</p><ul>%s</ul>"
 
-#: ../lib/advene/gui/main.py:266
-msgid "Export data to another format"
-msgstr "Exporter les données dans un autre format"
+#: ../lib/advene/core/webcherry.py:689
+msgid "Activate and play"
+msgstr "Activer et jouer"
 
-#: ../lib/advene/gui/main.py:267
-msgid "_Website export..."
-msgstr "Exporter vers un site _Web..."
+#: ../lib/advene/core/webcherry.py:695
+msgid "Application information"
+msgstr "Informations sur l'application"
 
-#: ../lib/advene/gui/main.py:267
-msgid "Export views to a website"
-msgstr "Exporter les vues vers un site web"
+#: ../lib/advene/core/webcherry.py:765
+msgid "Missing element id parameter"
+msgstr "Paramètre id manquant"
 
-#: ../lib/advene/gui/main.py:269
-msgid "_Quit"
-msgstr "_Quitter"
+#: ../lib/advene/core/webcherry.py:769
+#, python-format
+msgid "No existing element with id %s"
+msgstr "Aucun élément existant avec l'id %s"
 
-#: ../lib/advene/gui/main.py:271
-msgid "_Edit"
-msgstr "Édition"
+#: ../lib/advene/core/webcherry.py:778
+#, python-format
+msgid "<p>The GUI view %s does not exist.</p>"
+msgstr "<p>La vue ad-hoc %s n'existe pas.</p>"
 
-#: ../lib/advene/gui/main.py:272
-msgid "_Undo"
-msgstr "_Undo"
+#: ../lib/advene/core/webcherry.py:785
+msgid "Invalid request"
+msgstr "Requête invalide"
 
-#: ../lib/advene/gui/main.py:273
-msgid "_Find"
-msgstr "_Chercher"
+#: ../lib/advene/core/webcherry.py:790
+msgid "Invalid configuration variable name"
+msgstr "Nom de variable de configuration invalide"
 
-#: ../lib/advene/gui/main.py:274
-msgid "_Delete"
-msgstr "_Supprimer"
+#: ../lib/advene/core/webcherry.py:802
+msgid "Invalid value"
+msgstr "Valeur non valide"
 
-#: ../lib/advene/gui/main.py:275
-msgid "Create"
-msgstr "Créer"
+#: ../lib/advene/core/webcherry.py:806
+#, python-format
+msgid "Unsupported method %s"
+msgstr "Méthode non supportée: %s"
 
-#: ../lib/advene/gui/main.py:284
-msgid "P_ackage properties"
-msgstr "_Propriétés du recueil"
+#: ../lib/advene/core/webcherry.py:832
+#, python-format
+msgid ""
+"\n"
+"        <h1>Authorized hosts</h1>\n"
+"        <table border=\"1\">\n"
+"        <tr><th>Host</th><th>IP Addr</th><th>Action</th></tr>\n"
+"        %s\n"
+"        </table>\n"
+"        <form method=\"GET\">\n"
+"        Add a new hostname to the list :<br>\n"
+"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
+"\"Add\">\n"
+"        </form>\n"
+"        "
+msgstr ""
+"\n"
+"        <h1>Clients autorisés</h1>\n"
+"        <table border=\"1\">\n"
+"        <tr><th>Host</th><th>Adresse IP</th><th>Action</th></tr>\n"
+"        %s\n"
+"        </table>\n"
+"        <form method=\"GET\">\n"
+"        Ajouter une nouvelle adresse à la liste :<br>\n"
+"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
+"\"Ajouter\">\n"
+"        </form>\n"
+"        "
 
-#: ../lib/advene/gui/main.py:284
-msgid "Edit package properties"
-msgstr "Éditer les propriétés du recueil"
+#: ../lib/advene/core/webcherry.py:846
+msgid "Access control"
+msgstr "Contrôle d'accès"
 
-#: ../lib/advene/gui/main.py:285
-msgid "P_references"
-msgstr "P_références"
+#: ../lib/advene/core/webcherry.py:851
+msgid "Access control - add a hostname"
+msgstr "Contrôle d'accès - ajouter une adresse"
 
-#: ../lib/advene/gui/main.py:285
-msgid "Interface preferences"
-msgstr "Préférences de l'interface"
+#: ../lib/advene/core/webcherry.py:859 ../lib/advene/core/webcherry.py:873
+#, python-format
+msgid "<strong>Error: %s is an invalid hostname.</strong>"
+msgstr "<strong>Erreur: %s n'est pas un nom de machine valide.</strong>"
 
-#: ../lib/advene/gui/main.py:289
-msgid "_Start Web Browser"
-msgstr "Lancer le navigateur _Web"
+#: ../lib/advene/core/webcherry.py:862
+#, python-format
+msgid "<p>Added %s to authorized hosts list.</p>"
+msgstr "<p>Ajouté %s à la liste des clients autorisés.</p>"
 
-#: ../lib/advene/gui/main.py:289
-msgid "Start the web browser"
-msgstr "Lancer le navigateur web"
+#: ../lib/advene/core/webcherry.py:868
+msgid "Access control - delete a hostname"
+msgstr "Contrôle d'accès - supprimer une adresse"
 
-#: ../lib/advene/gui/main.py:291
-msgid "Simplify interface"
-msgstr "Simplifier l'interface"
+#: ../lib/advene/core/webcherry.py:876
+msgid "<strong>Cannot remove the localhost access.</strong>"
+msgstr "<strong>Impossible de supprimer l'accès local.</strong>"
 
-#: ../lib/advene/gui/main.py:291
-msgid "Simplify the application interface (toggle)"
-msgstr "Simplifier l'interface (bascule)"
+#: ../lib/advene/core/webcherry.py:881
+#, python-format
+msgid "<p>Removed %s from authorized hosts list.</p>"
+msgstr "<p>Supprimé %s de la liste des clients autorisés.</p>"
 
-#: ../lib/advene/gui/main.py:292
-msgid "Evaluator"
-msgstr "Évaluateur"
+#: ../lib/advene/core/webcherry.py:883
+#, python-format
+msgid "<p>%s is not in authorized hosts list.</p>"
+msgstr "<p>%s n'est pas dans la liste des clients autorisés.</p>"
 
-#: ../lib/advene/gui/main.py:292
-msgid "Open python evaluator window"
-msgstr "Ouvrir l'évaluateur python"
+#: ../lib/advene/core/webcherry.py:932
+msgid "Server Administration"
+msgstr "Administration du serveur"
 
-#: ../lib/advene/gui/main.py:293 ../lib/advene/gui/main.py:4022
-msgid "Webserver log"
-msgstr "Statistiques du serveur web"
+#: ../lib/advene/core/webcherry.py:940
+#, python-format
+msgid ""
+"\n"
+"        <p><a href=\"/admin/access\">Update the access list</a></p>\n"
+"        <p><a href=\"/admin/methods\">List available TALES methods</a></p>\n"
+"        <p><a href=\"/action\">List available actions</a></p>\n"
+"        <p><a href=\"/admin/reset\">Reset the server</a></p>\n"
+"        <p><a href=\"/media\">Media control</a></p>\n"
+"        <p><a href=\"/application\">Display GUI status</a></p>\n"
+"        <p><a href=\"/admin/list\">List available files</a></p>\n"
+"        <p><a href=\"/packages\">List loaded packages</a> (%(packagelist)s)</"
+"p>\n"
+"        <p>Display mode : %(displaymode)s</p>\n"
+"        <hr>\n"
+"        <p>Load a package :\n"
+"        <form action=\"/admin/load\" method=\"GET\">\n"
+"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
+"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
+"        <input type=\"submit\" value=\"Load\" />\n"
+"        </form>\n"
+"        </body></html>\n"
+"        "
+msgstr ""
+"\n"
+"        <p><a href=\"/admin/access\">Régler le contrôle d'accès</a></p>\n"
+"        <p><a href=\"/admin/methods\">Afficher les méthodes TALES "
+"disponibles</a></p>\n"
+"        <p><a href=\"/action\">Afficher les actions disponibles</a></p>\n"
+"        <p><a href=\"/admin/reset\">Réinitialiser le serveur</a></p>\n"
+"        <p><a href=\"/media\">Contrôle du lecteur</a></p>\n"
+"        <p><a href=\"/application\">Afficher le statut de l'interface "
+"graphique</a></p>\n"
+"        <p><a href=\"/admin/list\">Afficher les fichiers disponibles</a></"
+"p>\n"
+"        <p><a href=\"/packages\">Afficher les recueils chargés</a> "
+"(%(packagelist)s)</p>\n"
+"        <p>Mode d'affichage : %(displaymode)s</p>\n"
+"        <hr>\n"
+"        <p>Charger un nouveau recueil :\n"
+"        <form action=\"/admin/load\" method=\"GET\">\n"
+"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
+"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
+"        <input type=\"submit\" value=\"Charger\" />\n"
+"        </form>\n"
+"        </body></html>\n"
+"        "
 
-#: ../lib/advene/gui/main.py:296
-msgid "_Player"
-msgstr "_Lecteur"
+#: ../lib/advene/core/webcherry.py:970
+msgid "Available files"
+msgstr "Fichiers disponibles"
 
-#: ../lib/advene/gui/main.py:297
-msgid "Go to _Time"
-msgstr "Aller au _Temps"
+#: ../lib/advene/core/webcherry.py:996
+msgid "You should specify an alias"
+msgstr "Vous devez spécifier un alias"
 
-#: ../lib/advene/gui/main.py:297
-msgid "Goto a specified time code"
-msgstr "Aller à un timecode précis"
+#: ../lib/advene/core/webcherry.py:1001
+msgid "You should specify an uri"
+msgstr "Vous devez spécifier une URI"
+
+#: ../lib/advene/core/webcherry.py:1007
+#, python-format
+msgid "Package %s loaded"
+msgstr "Recueil %s chargé"
+
+#: ../lib/advene/core/webcherry.py:1008 ../lib/advene/core/webcherry.py:1044
+#, python-format
+msgid ""
+"<p>Go to the <a href=\"/packages/%(alias)s\">%(alias)s</a> package, or to "
+"the <a href=\"/packages\">package list</a>."
+msgstr ""
+"<p>Accéder au recueil <a href=\"/packages/%(alias)s\">%(alias)s</a>, ou à la "
+"<a href=\"/packages\">liste des recueils chargés</a>."
+
+#: ../lib/advene/core/webcherry.py:1011
+#, python-format
+msgid "<p>Cannot load package %(alias)s : %(error)s</p>"
+msgstr "<p>Impossible de charger le recueil %(alias)s : %(error)s</p>"
+
+#: ../lib/advene/core/webcherry.py:1022
+#, python-format
+msgid "Package %s deleted"
+msgstr "Recueil %s supprimé"
+
+#: ../lib/advene/core/webcherry.py:1023
+msgid "<p>Go to the <a href=\"/packages\">package list</a>."
+msgstr ""
+"<p>Consulter la <a href=\"/packages\">liste des recueils disponibles</a>"
+
+#: ../lib/advene/core/webcherry.py:1026
+#, python-format
+msgid "<p>Cannot delete package %(alias)s : %(error)s</p>"
+msgstr "<p>Impossible de supprimer le recueil %(alias)s : %(error)s</p>"
+
+#: ../lib/advene/core/webcherry.py:1043
+#, python-format
+msgid "Package %s saved"
+msgstr "Recueil %s sauvegardé"
+
+#: ../lib/advene/core/webcherry.py:1047
+#, python-format
+msgid "<p>Cannot save package %(alias)s : %(error)s</p>"
+msgstr "<p>Impossible de sauvegarder le recueil %(alias)s : %(error)s</p>"
+
+#: ../lib/advene/core/webcherry.py:1057
+msgid "Server reset"
+msgstr "Serveur réinitialisé"
+
+#: ../lib/advene/core/webcherry.py:1063
+msgid "Available TALES methods"
+msgstr "Méthodes TALES disponibles"
+
+#: ../lib/advene/core/webcherry.py:1104
+msgid "Loaded package(s)"
+msgstr "Recueil(s) chargé(s)"
+
+#: ../lib/advene/core/webcherry.py:1106
+msgid ""
+"\n"
+"        <h1>Loaded package(s)</h1>\n"
+"        <table border=\"1\" width=\"50%\">\n"
+"        <tr>\n"
+"        <th>Alias</th>\n"
+"        <th>Action</th>\n"
+"        <th>URI</th>\n"
+"        <th>Annotations</th>\n"
+"        </tr>\n"
+"        "
+msgstr ""
+"\n"
+"        <h1>Recueil(s) chargé(s)</h1>\n"
+"        <table border=\"1\" width=\"50%\">\n"
+"        <tr>\n"
+"        <th>Alias</th>\n"
+"        <th>Action</th>\n"
+"        <th>URI</th>\n"
+"        <th>Annotations</th>\n"
+"        </tr>\n"
+"        "
+
+#: ../lib/advene/core/webcherry.py:1118
+#, python-format
+msgid ""
+"<tr>\n"
+"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
+"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
+"%(uri)s\">Reload</a>|<a href=\"/admin/delete?alias=%(alias)s\">Drop</a>|<a "
+"href=\"/admin/save?alias=%(alias)s\">Save</a></td>\n"
+"            <td>%(uri)s</td>\n"
+"            <td>%(size)d</td>\n"
+"            </tr>\n"
+"            "
+msgstr ""
+"<tr>\n"
+"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
+"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
+"%(uri)s\">Recharger</a>|<a href=\"/admin/delete?alias=%(alias)s\">Supprimer</"
+"a>|<a href=\"/admin/save?alias=%(alias)s\">Sauver</a></td>\n"
+"            <td>%(uri)s</td>\n"
+"            <td>%(size)d</td>\n"
+"            </tr>\n"
+"            "
+
+#: ../lib/advene/core/webcherry.py:1191 ../lib/advene/core/webcherry.py:1267
+#: ../lib/advene/core/webcherry.py:1276 ../lib/advene/core/webcherry.py:1284
+#: ../lib/advene/core/webcherry.py:1444 ../lib/advene/core/webcherry.py:1452
+#: ../lib/advene/core/webcherry.py:1460 ../lib/advene/core/webcherry.py:2022
+#: ../lib/advene/core/webcherry.py:2029
+msgid "Error"
+msgstr "Erreur"
+
+#: ../lib/advene/core/webcherry.py:1192
+#, python-format
+msgid "The TALES expression %s is not valid."
+msgstr "L'expression TALES %s n'est pas valide."
+
+#: ../lib/advene/core/webcherry.py:1244
+msgid "Content mode not available on non-content data"
+msgstr ""
+"Le mode <em>Contenu</em> n'est pas applicable aux données qui ne sont pas "
+"des contenus."
+
+#: ../lib/advene/core/webcherry.py:1268 ../lib/advene/core/webcherry.py:1277
+#: ../lib/advene/core/webcherry.py:1285 ../lib/advene/core/webcherry.py:1306
+#: ../lib/advene/core/webcherry.py:1310 ../lib/advene/core/webcherry.py:1445
+#: ../lib/advene/core/webcherry.py:1453 ../lib/advene/core/webcherry.py:1461
+#: ../lib/advene/core/webcherry.py:1520 ../lib/advene/core/webcherry.py:1597
+#: ../lib/advene/core/webcherry.py:1717 ../lib/advene/core/webcherry.py:1767
+msgid "<h1>Error</h1>"
+msgstr "<h1>Erreur</h1>"
+
+#: ../lib/advene/core/webcherry.py:1269 ../lib/advene/core/webcherry.py:1311
+#, python-format
+msgid ""
+"<p>There was an error in the template code.</p>\n"
+"                <p>Tag name: <strong>%(tagname)s</strong></p>\n"
+"                <p>Error message: <em>%(message)s</em></p>"
+msgstr ""
+"<p>Il y a une erreur dans le modèle.</p>\n"
+"                <p>Balise: <strong>%(tagname)s</strong></p>\n"
+"                <p>Message d'erreur: <em>%(message)s</em></p>"
+
+#: ../lib/advene/core/webcherry.py:1278
+#, python-format
+msgid ""
+"<p>An invalid character is in the Context:</p>\n"
+"                <p>Error message: <em>%(error)s</em></p><pre>%(message)s</"
+"pre>"
+msgstr ""
+"<p>Un caractère invalide est dans le Contexte :</p>\n"
+"                <p>Message d'erreur: <em>%(error)s</em></p><pre>%(message)s</"
+"pre>"
+
+#: ../lib/advene/core/webcherry.py:1286
+#, python-format
+msgid ""
+"<p>There was an error in the TALES expression.</p>\n"
+"                <pre>%s</pre>"
+msgstr ""
+"<p>Il y a une erreur dans l'expression TALES.</p>\n"
+"                <pre>%s</pre>"
+
+#: ../lib/advene/core/webcherry.py:1307
+#, python-format
+msgid ""
+"<p>There was an error.</p>\n"
+"                <pre>%s</pre>"
+msgstr ""
+"<p>Une erreur est survenue.</p>\n"
+"                <pre>%s</pre>"
+
+#: ../lib/advene/core/webcherry.py:1331
+#, python-format
+msgid ""
+"\n"
+"            <hr>\n"
+"            <p>\n"
+"            Location: %(location)s<br>\n"
+"            <form name=\"navigation\" method=\"GET\">\n"
+"            <a href=\"%(levelup)s\">Up one level</a> |\n"
+"            Next level :\n"
+"            <select name=\"path\" onchange=\"submit()\">\n"
+"            "
+msgstr ""
+"\n"
+"        <hr>\n"
+"        <p>\n"
+"        Chemin courant : %(location)s<br>\n"
+"        <form name=\"navigation\" method=\"GET\">\n"
+"        <a href=\"%(levelup)s\">Remonter d'un niveau</a> |\n"
+"        Niveau suivant :\n"
+"        <select name=\"path\" onchange=\"submit()\">\n"
+"        "
+
+#: ../lib/advene/core/webcherry.py:1349
+msgid ""
+"\n"
+"            </select> View: <select name=\"view\" onchange=\"submit()\">\n"
+"            <option selected></option>\n"
+"            "
+msgstr ""
+"\n"
+"        </select> Vue : <select name=\"view\" onchange=\"submit()\">\n"
+"        <option selected></option>\n"
+"        "
+
+#: ../lib/advene/core/webcherry.py:1367
+#, python-format
+msgid ""
+"<hr>\n"
+"            <p>Evaluating expression \"<strong>%(expression)s</strong>\" on "
+"package %(uri)s returns %(value)s</p>\n"
+"            "
+msgstr ""
+"<hr>\n"
+"        <p>L'évaluation de l'expression \"<strong>%(expression)s</strong>\" "
+"sur le recueil %(uri)s retourne %(value)s</p>\n"
+"        "
+
+#: ../lib/advene/core/webcherry.py:1403
+#, python-format
+msgid "<p>Package <strong>%s</strong> not loaded</p>"
+msgstr "<p>Le recueil <strong>%s</strong> n'est pas chargé</p>"
+
+#: ../lib/advene/core/webcherry.py:1446
+#, python-format
+msgid ""
+"<p>There was an error in the template code.</p>\n"
+"            <p>Tag name: <strong>%(tagname)s</strong></p>\n"
+"            <p>Error message: <em>%(message)s</em></p>"
+msgstr ""
+"<p>Il y a une erreur dans le modèle.</p>\n"
+"            <p>Balise: <strong>%(tagname)s</strong></p>\n"
+"            <p>Message d'erreur: <em>%(message)s</em></p>"
+
+#: ../lib/advene/core/webcherry.py:1454
+#, python-format
+msgid ""
+"<p>There was an error in the expression.</p>\n"
+"            <pre>%s</pre>"
+msgstr ""
+"<p>Il y a une erreur dans l'expression.</p>\n"
+"            <pre>%s</pre>"
+
+#: ../lib/advene/core/webcherry.py:1462
+#, python-format
+msgid ""
+"<p>Cannot resolve TALES expression %(expr)s on package %(package)s<p><pre>\n"
+"            %(type)s\n"
+"            %(value)s\n"
+"            %(traceback)s</pre>"
+msgstr ""
+"<p>Impossible d'interpéter l'expression TALES %(expr)s sur le recueil "
+"%(package)s<p><pre>\n"
+"                %(type)s\n"
+"                %(value)s\n"
+"                %(traceback)s</pre>"
+
+#: ../lib/advene/core/webcherry.py:1521 ../lib/advene/core/webcherry.py:1718
+msgid "<p>Cannot set the value : invalid path</p>"
+msgstr "<p>Impossible de mettre à jour : chemin invalide</p>"
+
+#: ../lib/advene/core/webcherry.py:1583 ../lib/advene/core/webcherry.py:1836
+#, python-format
+msgid ""
+"<h1>Error</h1><p>When creating resource %(path)s, the resource folder "
+"%(folder)s could not be created.</p>"
+msgstr ""
+"<h1>Erreur</h1><p>Lors de la création de la ressource %(path)s, le "
+"répertoire %(folder)s n'a pas pu être créé.</p>"
+
+#: ../lib/advene/core/webcherry.py:1592 ../lib/advene/core/webcherry.py:1846
+msgid "Resource successfuly created/updated"
+msgstr "Ressource mise à jour"
+
+#: ../lib/advene/core/webcherry.py:1601
+msgid "Value successfuly updated"
+msgstr "Valeur mise à jour"
+
+#: ../lib/advene/core/webcherry.py:1603
+#, python-format
+msgid ""
+"Unable to update the attribute %(attribute)s for element %(element)s: "
+"%(error)s."
+msgstr ""
+"Impossible de mettre à jour l'attribut %(attribute)s de l'élément "
+"%(element)s: %(error)s."
+
+#: ../lib/advene/core/webcherry.py:1714
+msgid "<p>Invalid request</p>."
+msgstr "<p>Requête invalide</p>"
+
+#: ../lib/advene/core/webcherry.py:1778 ../lib/advene/core/webcherry.py:1795
+msgid "Value updated"
+msgstr "Valeur mise à jour"
+
+#: ../lib/advene/core/webcherry.py:1779
+#, python-format
+msgid ""
+"\n"
+"                <h1>Value updated</h1>\n"
+"                The value of %(path)s has been updated to\n"
+"                <pre>\n"
+"                %(value)s\n"
+"                </pre>\n"
+"                "
+msgstr ""
+"\n"
+"                    <h1>Valeur mise à jour</h1>\n"
+"                    La valeur de %(path)s a été fixée à :\n"
+"                    <pre>\n"
+"                    %(value)s\n"
+"                    </pre>\n"
+"                    "
+
+#: ../lib/advene/core/webcherry.py:1796
+#, python-format
+msgid ""
+"\n"
+"                    <h1>Value updated</h1>\n"
+"                    The value of %(path)s has been updated to\n"
+"                    <pre>\n"
+"                    %(value)s\n"
+"                    </pre>\n"
+"                    "
+msgstr ""
+"\n"
+"                    <h1>Contenu mis à jour</h1>\n"
+"                    Le contenu de %(path)s a été fixé à :\n"
+"                    <pre>\n"
+"                    %(value)s\n"
+"                    </pre>\n"
+"                    "
+
+#: ../lib/advene/core/webcherry.py:1807
+#, python-format
+msgid ""
+"Malformed request: cannot update the value of %(attribute)s in %(tales)s."
+msgstr ""
+"Requête invalide : impossible de mettre à jour la valeur de %(attribute)s "
+"dans %(tales)s."
+
+#: ../lib/advene/core/webcherry.py:1850
+msgid "Cannot create an element in something else than a package."
+msgstr "Impossible de créer un élément dans autre chose qu'un recueil."
+
+#: ../lib/advene/core/webcherry.py:1867
+#, python-format
+msgid "The identifier %s already exists."
+msgstr "L'identificateur %s est déjà défini."
+
+#: ../lib/advene/core/webcherry.py:1879
+#, python-format
+msgid "<p>Error while creating view %(id)s</p><pre>%(error)s</pre>"
+msgstr "<p>Erreur lors de la création de la vue %(id)s</p><pre>%(error)s</pre>"
 
-#: ../lib/advene/gui/main.py:298
-msgid "Save _ImageCache"
-msgstr "Sauvegarder le cache"
+#: ../lib/advene/core/webcherry.py:1885
+msgid "View created"
+msgstr "Vue créée"
 
-#: ../lib/advene/gui/main.py:298
-msgid "Save the contents of the ImageCache to disk"
-msgstr "Sauvegarder le contenu du cache d'images"
+#: ../lib/advene/core/webcherry.py:1886
+#, python-format
+msgid ""
+"\n"
+"                 <h1>View <em>%(id)s</em> created</h1>\n"
+"                 <p>The view <a href=\"%(url)s\">%(id)s</a> was successfully "
+"created.</p>\n"
+"                 "
+msgstr ""
+"\n"
+"                     <h1>Vue <em>%(id)s</em> créée</h1>\n"
+"                     <p>La vue <a href=\"%(url)s\">%(id)s</a> a été "
+"correctement créée.</p>\n"
+"                     "
 
-#: ../lib/advene/gui/main.py:299
-msgid "Reset ImageCache"
-msgstr "Vider le cache d'images"
+#: ../lib/advene/core/webcherry.py:1902
+#, python-format
+msgid "Missing %s parameter"
+msgstr "Paramètre %s manquant"
 
-#: ../lib/advene/gui/main.py:299
-msgid "Reset the ImageCache"
-msgstr "Vider le cache d'images"
+#: ../lib/advene/core/webcherry.py:1905
+#, python-format
+msgid "Relation type %s does not exist"
+msgstr "Le type de relation %s n'existe pas"
 
-#: ../lib/advene/gui/main.py:300
-msgid "_Restart player"
-msgstr "_Redémarrer le lecteur"
+#: ../lib/advene/core/webcherry.py:1912 ../lib/advene/core/webcherry.py:1915
+#, python-format
+msgid "Annotation %s does not exist"
+msgstr "L'annotation %s n'existe pas"
 
-#: ../lib/advene/gui/main.py:300
-msgid "Restart the player"
-msgstr "Redémarrer le lecteur"
+#: ../lib/advene/core/webcherry.py:1918
+#, python-format
+msgid ""
+"<p>Cannot create relation between %(member1)s and %(member2)s: invalid type</"
+"p>"
+msgstr ""
+"<p>Impossible de créer une relation entre %(member1)s et %(member2)s : type "
+"invalide</p>"
 
-#: ../lib/advene/gui/main.py:302
-msgid "Update annotation screenshots"
-msgstr "Captures d'écran pour les annotations"
+#: ../lib/advene/core/webcherry.py:1930
+#, python-format
+msgid ""
+"<p>Error while creating relation between %(member1)s and %(member2)s :</"
+"p><pre>%(error)s</pre>"
+msgstr ""
+"<p>Erreur lors de la création de la relation entre %(member1)s et "
+"%(member2)s : </p><pre>%(error)s</pre>"
 
-#: ../lib/advene/gui/main.py:302
-msgid "Update screenshots for annotation bounds"
-msgstr "Générer des captures d'écran pour chaque borne d'annotation"
+#: ../lib/advene/core/webcherry.py:1933
+msgid "Relation created"
+msgstr "Relation créée"
 
-#: ../lib/advene/gui/main.py:303
-msgid "Detect shots"
-msgstr "Détecter les plans"
+#: ../lib/advene/core/webcherry.py:1934
+#, python-format
+msgid "<h1>Relation <em>%s</em> created</h1>"
+msgstr "<h1>Relation <em>%s</em> créée</h1>"
 
-#: ../lib/advene/gui/main.py:303
-msgid "Automatically detect shots"
-msgstr "Détecter automatiquement les plans"
+#: ../lib/advene/core/webcherry.py:1944
+#, python-format
+msgid "Annotation type %s does not exist"
+msgstr "Le type d'annotation %s n'existe pas"
 
-#: ../lib/advene/gui/main.py:304
-msgid "Select the player plugin"
-msgstr "Sélectionner le lecteur vidéo"
+#: ../lib/advene/core/webcherry.py:1961
+#, python-format
+msgid ""
+"<p>Error while creating annotation of type %(type)s :<pre>\n"
+"                    %(errortype)s\n"
+"                    %(value)s\n"
+"                    %(traceback)s</pre>"
+msgstr ""
+"<p>Erreur lors de la création d'une annotation du type %(type)s :<pre>\n"
+"                     %(errortype)s\n"
+"                     %(value)s\n"
+"                     %(traceback)s</pre>"
 
-#: ../lib/advene/gui/main.py:307
-msgid "No package"
-msgstr "Aucun recueil"
+#: ../lib/advene/core/webcherry.py:1973
+#, python-format
+msgid "Annotation %s created"
+msgstr "Annotation %s créée"
 
-#: ../lib/advene/gui/main.py:309
-msgid "_Help"
-msgstr "_Aide"
+#: ../lib/advene/core/webcherry.py:1975
+#, python-format
+msgid "Error: Cannot create an object of type %s."
+msgstr "Erreur: impossible de créer un objet de type %s."
 
-#: ../lib/advene/gui/main.py:310
-msgid "Help"
-msgstr "Aide"
+#: ../lib/advene/core/webcherry.py:1978
+#, python-format
+msgid ""
+"Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</"
+"code></p>"
+msgstr ""
+"Erreur: Impossible d'effectuer l'action <em>%(action)s</em> sur <code>"
+"%(object)s</code>"
 
-#: ../lib/advene/gui/main.py:311
-msgid "Get support"
-msgstr "Obtenir de l'aide"
+#: ../lib/advene/core/webcherry.py:1991
+msgid "Available actions"
+msgstr "Actions disponibles"
 
-#: ../lib/advene/gui/main.py:312
-msgid "Check for updates"
-msgstr "Vérification de mise à jour"
+#: ../lib/advene/core/webcherry.py:2000
+#, python-format
+msgid "<li>%(name)s: %(value)s"
+msgstr "<li>%(name)s: %(value)s"
 
-#: ../lib/advene/gui/main.py:313
-msgid "Display shortcuts"
-msgstr "Afficher les raccourcis"
+#: ../lib/advene/core/webcherry.py:2023
+#, python-format
+msgid "<p>Unknown action</p><pre>Action: %s</pre>"
+msgstr "<p>Action inconnue</p><pre>Action : %s</pre>"
 
-#: ../lib/advene/gui/main.py:314
-msgid "Display logfile"
-msgstr "Afficher les messages d'information"
+#: ../lib/advene/core/webcherry.py:2030
+msgid "Missing parameter(s) :<ul>"
+msgstr "Paramètre(s) manquant(s) :<ul>"
 
-#: ../lib/advene/gui/main.py:314
-msgid "Display log file"
-msgstr "Afficher les messages d'information"
+#: ../lib/advene/core/webcherry.py:2066
+msgid "Advene web resources"
+msgstr "Ressources web d'Advene"
 
-#: ../lib/advene/gui/main.py:315
-msgid "Open logfile folder"
-msgstr "Ouvrir le dossier du rapport d'erreur"
+#: ../lib/advene/core/webcherry.py:2072
+msgid "Advene webserver"
+msgstr "Serveur web Advene"
 
-#: ../lib/advene/gui/main.py:315
+#: ../lib/advene/core/webcherry.py:2073
+#, python-format
 msgid ""
-"Display logfile folder. It can help when sending the advene.log file by e-"
-"mail."
+"<p>Welcome on the <a href=\"http://advene.org/\">Advene</a> webserver run by "
+"%(userid)s on %(serveraddress)s.</p>"
 msgstr ""
-"Afficher le dossier contenant le rapport d'erreurs advene.log, afin d'en "
-"faciliter l'envoi par courriel."
+"<p>Bienvenue sur le serveur web <a href=\"http://advene.org//\">Advene</a> "
+"exécuté par %(userid)s sur %(serveraddress)s.</p>"
 
-#: ../lib/advene/gui/main.py:316
-msgid "_About"
-msgstr "À _Propos"
+#: ../lib/advene/core/webcherry.py:2080
+msgid ""
+" <p>No package is loaded. You can access the <a href=\"/admin\">server "
+"administration page</a>.<p>"
+msgstr ""
+" <p>Aucun recueil n'est chargé. Vous pouvez accéder aux <a href=\"/admin"
+"\">formulaires d'administration du serveur</a>.<p>"
 
-#: ../lib/advene/gui/main.py:336 ../lib/advene/gui/main.py:3750
+#: ../lib/advene/core/webcherry.py:2090
 #, python-format
 msgid ""
-"Cannot load package %(filename)s:\n"
-"%(error)s"
+"the <a href=\"/packages/%(alias)s/view/%(view)s\">loaded package's default "
+"view</a>"
 msgstr ""
-"Impossible de charger le recueil %(filename)s :\n"
-"%(error)s"
-
-#: ../lib/advene/gui/main.py:344
-msgid "Open a package file"
-msgstr "Ouvrir un recueil"
-
-#: ../lib/advene/gui/main.py:345
-msgid "Save the current package"
-msgstr "Sauvegarder le recueil courant"
-
-#: ../lib/advene/gui/main.py:346
-msgid "Save the package with a new name"
-msgstr "Sauvegarder le recueil sous un nouveau nom"
-
-#: ../lib/advene/gui/main.py:347
-msgid "Select movie file..."
-msgstr "Sélectionner un fichier vidéo"
-
-#: ../lib/advene/gui/main.py:348
-msgid "Select DVD"
-msgstr "Sélectionner un DVD"
+"à la <a href=\"/packages/%(alias)s/view/%(view)s\">vue par défaut du "
+"recueil</a>"
 
-#: ../lib/advene/gui/main.py:352
-msgid "Create a text annotation"
-msgstr "Créer une annotation textuelle"
+#: ../lib/advene/core/webcherry.py:2092
+#, python-format
+msgid "the <a href=\"/packages/%s\">loaded package's data</a>"
+msgstr "aux <a href=\"/packages/%s\">données du recueil</a>"
 
-#: ../lib/advene/gui/main.py:353
-msgid "Create a graphical annotation"
-msgstr "Créer une annotation graphique"
+#: ../lib/advene/core/webcherry.py:2094
+msgid "the <a href=\"/packages\">loaded packages' data</a>"
+msgstr "aux <a href=\"/packages\">recueils disponibles</a>"
 
-#: ../lib/advene/gui/main.py:359
-msgid "List recently opened packages"
-msgstr "Recueils récemment ouverts"
+#: ../lib/advene/core/webcherry.py:2095
+#, python-format
+msgid ""
+" <p>You can either access %s or the <a href=\"/admin\">server administration "
+"page</a>.<p>"
+msgstr ""
+" <p>Vous pouvez accéder soit %s, soit aux <a href=\"/admin\">formulaires "
+"d'administration du serveur</a>.<p>"
 
-#: ../lib/advene/gui/main.py:389
-msgid "Snapshotter activity"
-msgstr "Activité de prise de capture d'écran"
+#: ../lib/advene/core/webcherry.py:2097
+#, python-format
+msgid ""
+"<hr><p align=\"right\"><em>Document generated by <a href=\"http://advene.org/"
+"\">Advene</a> v. %s.</em></p>"
+msgstr ""
+"<hr><p align=\"right\"><em>Document généré par <a href=\"http://advene.org/"
+"\">Advene</a> v. %s.</em></p>"
 
-#: ../lib/advene/gui/main.py:391
+#: ../lib/advene/core/webcherry.py:2182 ../lib/advene/core/webcherry.py:2191
 #, python-format
-msgid "%d queued requests"
-msgstr "%d requêtes en attente"
+msgid "Cannot start HTTP server: %s"
+msgstr "Impossible de lancer le serveur HTTP : %s"
 
-#: ../lib/advene/gui/main.py:392
-msgid "Cancel all requests"
-msgstr "Annuler toutes les requêtes"
+#: ../lib/advene/core/controller.py:433
+msgid "No available GUI"
+msgstr "Pas d'interface graphique disponible."
 
-#: ../lib/advene/gui/main.py:397
-msgid "No snapshotter"
-msgstr "Aucun composant de capture d'écran"
+#: ../lib/advene/core/controller.py:452
+msgid "No available event handler"
+msgstr "Pas de gestionnaire d'événements disponible."
 
-#: ../lib/advene/gui/main.py:419
-msgid "No snapshotting activity"
-msgstr "Aucune requête de capture d'écran en cours"
+#: ../lib/advene/core/controller.py:460
+msgid "No available gui"
+msgstr "Pas d'interface graphique disponible."
 
-#: ../lib/advene/gui/main.py:423
-msgid "Snapshotting"
-msgstr "En cours de capture d'écran"
+#: ../lib/advene/core/controller.py:476
+#, python-format
+msgid "Warning: redefining an existing feature %s"
+msgstr "Avertissement: vous redéfinissez une fonctionnalité existante %s"
 
-#: ../lib/advene/gui/main.py:440
-msgid "Display application log messages"
-msgstr "Afficher les messages d'information de l'application"
+#: ../lib/advene/core/controller.py:608
+msgid "Annotations in current package"
+msgstr "Annotations du recueil courant"
 
-#: ../lib/advene/gui/main.py:482
-msgid "Quicksearch lists"
-msgstr "Listes de recherche"
+#: ../lib/advene/core/controller.py:609
+msgid "Annotations in all packages"
+msgstr "Annotations de tous les recueils chargés"
 
-#: ../lib/advene/gui/main.py:488
-msgid "Please specify the lists of elements to be searched."
-msgstr "Spécifiez les listes d'éléments à rechercher."
+#: ../lib/advene/core/controller.py:611
+msgid "Ids"
+msgstr "Id"
 
-#: ../lib/advene/gui/main.py:507
+#: ../lib/advene/core/controller.py:803
 #, python-format
 msgid ""
-"Searching on %s.\n"
-"Left click to launch the search, right-click to set the quicksearch options"
+"Cannot start the webserver\n"
+"The following processes seem to use the %(port)s port: %(processes)s"
 msgstr ""
-"Recherche sur %s.\n"
-"Clic gauche pour lancer la recherche, click droit pour régler les options de "
-"recherche"
+"Impossible de démarrer le serveur web.\n"
+"Les processus suivants semblent utiliser le port %(port)s: %(processes)s"
 
-#: ../lib/advene/gui/main.py:508
+#: ../lib/advene/core/controller.py:852 ../lib/advene/core/controller.py:863
 #, python-format
-msgid "String to search in %s"
-msgstr "Chaîne à rechercher dans %s"
+msgid "Loaded %(uri)s as %(alias)s"
+msgstr "Chargé %(uri)s sous %(alias)s"
 
-#: ../lib/advene/gui/main.py:521 ../lib/advene/gui/main.py:525
-msgid "Tracing : "
-msgstr "Trace : "
+#: ../lib/advene/core/controller.py:854 ../lib/advene/core/controller.py:866
+#, python-format
+msgid "Cannot load package from file %(uri)s: %(error)s"
+msgstr "Impossible de charger le fichier %(uri)s : %(error)s"
 
-#: ../lib/advene/gui/main.py:521
-msgid "off"
-msgstr "off"
+#: ../lib/advene/core/controller.py:905
+msgid "Deactivating web server"
+msgstr "Désactivation du serveur web"
 
-#: ../lib/advene/gui/main.py:525
-msgid "on"
-msgstr "on"
+#: ../lib/advene/core/controller.py:1013
+#, python-format
+msgid "Cannot get audio volume: %s"
+msgstr "Impossible d'obtenir le volume: %s"
+
+#: ../lib/advene/core/controller.py:1025
+#, python-format
+msgid "Cannot open Advene URL %s: the webserver is not running."
+msgstr "Impossible d'ouvrir l'URL Advene %s: le serveur web n'est pas actif."
 
-#: ../lib/advene/gui/main.py:545
-msgid "Launch search"
-msgstr "Lancer la recherche"
+#: ../lib/advene/core/controller.py:1284
+#, python-format
+msgid "Found matching video file in moviepath: %s"
+msgstr "Trouvé fichier vidéo correspondant dans le chemin de recherche : %s"
 
-#: ../lib/advene/gui/main.py:550
-msgid "Ignore case"
-msgstr "Ignorer la casse"
+#: ../lib/advene/core/controller.py:1310 ../lib/advene/core/controller.py:1312
+msgid "Analysis of "
+msgstr "Analyse de "
 
-#: ../lib/advene/gui/main.py:555
-msgid "Searched elements"
-msgstr "Éléments recherchés"
+#: ../lib/advene/core/controller.py:1536
+msgid "Cannot split the annotation: the given position is outside."
+msgstr ""
+"Impossible de supprimer l'annotation : la position indiquée est en dehors"
 
-#: ../lib/advene/gui/main.py:625
-msgid "Playing"
-msgstr "Lecture"
+#: ../lib/advene/core/controller.py:1785
+#, python-format
+msgid "Cannot find the template package %(filename)s: %(error)s"
+msgstr "Impossible de trouver le recueil modèle %(filename)s : %(error)s"
 
-#: ../lib/advene/gui/main.py:626
-msgid "Pause"
-msgstr "Pause"
+#: ../lib/advene/core/controller.py:1832
+#, python-format
+msgid "Cannot read the imported package %(uri)s: %(error)s"
+msgstr "Impossible de lire le recueil importé %(uri)s : %(error)s"
 
-#: ../lib/advene/gui/main.py:627
-msgid "Init"
-msgstr "Initialisation"
+#: ../lib/advene/core/controller.py:2064
+msgid "Package URI has changed. Reloading package with new URI."
+msgstr "L'URI du recueil a changé. Rechargement du recueil."
 
-#: ../lib/advene/gui/main.py:629
-msgid "Undefined"
-msgstr "Indéfini"
+#: ../lib/advene/core/controller.py:2082
+msgid ""
+"Cannot load package: the following annotations do not have Millisecond "
+"fragments:"
+msgstr ""
+"Impossible de charger le recueil: les annotations suivantes\n"
+"n'ont pas de fragment de type Milliseconde :"
 
-#: ../lib/advene/gui/main.py:901
-msgid "Enter the new time value"
-msgstr "Entrez le nouveau temps"
+#: ../lib/advene/core/controller.py:2108
+#, python-format
+msgid "Cannot handle master attribute, the package %s is not imported."
+msgstr ""
+"Impossible de gérer l'attribut master, le recueil %s n'est pas importé."
 
-#: ../lib/advene/gui/main.py:925
+#: ../lib/advene/core/controller.py:2110
 #, python-format
-msgid "Replace content in %d elements"
-msgstr "Remplacer du texte dans %d elements"
+msgid "Checking master package %s for not yet imported elements."
+msgstr "Vérification des éléments à importer depuis le recueil maître %s."
 
-#: ../lib/advene/gui/main.py:938
-msgid "Find word"
-msgstr "Trouver le mot"
+#: ../lib/advene/core/controller.py:2150
+msgid "Standard summary"
+msgstr "Index standard"
 
-#: ../lib/advene/gui/main.py:945
-msgid "Replace by"
-msgstr "Remplacer par"
+#: ../lib/advene/core/controller.py:2155
+msgid "Default view"
+msgstr "Vue statique par défaut"
 
-#: ../lib/advene/gui/main.py:973
+#: ../lib/advene/core/controller.py:2197
 #, python-format
-msgid "%(search)s has been replaced by %(replace)s in %(count)d element(s)."
-msgstr "%(search)s a été remplacé par %(replace)s dans %(count)d éléments(s)."
+msgid ""
+"Infinite loop in STBV %(name)s: the %(imp)s view is invoked multiple times."
+msgstr ""
+"Boucle infinie dans la vue dynamique %(name)s : la vue %(imp)s est invoquée "
+"plusieurs fois."
 
-#: ../lib/advene/gui/main.py:982
-msgid "The video extracting feature is not available."
-msgstr "La fonctionnalité d'extraction de vidéo n'est pas disponible"
+#: ../lib/advene/core/controller.py:2283
+msgid "Got exception when stopping player."
+msgstr "Reçu une exception à l'arrêt du lecteur."
 
-#: ../lib/advene/gui/main.py:985
-msgid "Video export"
-msgstr "Export vidéo"
+#: ../lib/advene/core/controller.py:2335
+msgid "Video player problem"
+msgstr "Problème de lecteur vidéo"
+
+#: ../lib/advene/core/controller.py:2362
+msgid "Unable to start the player."
+msgstr "Impossible de lancer le lecteur."
 
-#: ../lib/advene/gui/main.py:987
+#: ../lib/advene/core/controller.py:2569
 #, python-format
-msgid "Exporting video montage/fragment to %%(filename)s"
-msgstr "Export du fragment/montage vidéo vers %%(filename)s"
+msgid "Comment on set of %d annotations"
+msgstr "Commentaire sur %d annotations"
 
-#: ../lib/advene/gui/main.py:989
-msgid "Please choose a destination filename"
-msgstr "Choisissez le fichier destination"
+#: ../lib/advene/core/controller.py:2571
+#, python-format
+msgid "Comment on %s"
+msgstr "Commentaire sur %s"
 
-#: ../lib/advene/gui/main.py:1067
+#: ../lib/advene/core/controller.py:2575
+#, python-format
 msgid ""
-"No media association is defined in the package. Please use the 'File/"
-"Associate a video file' menu item to associate a media file."
+"<h1>Comment on %(title)s</h1>\n"
+"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
+"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
+"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
+"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
+"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
+"\"%(imgurl)s\" ></img></a></span>"
 msgstr ""
-"Aucun fichier vidéo n'est défini dans le recueil. Utilisez le menu 'Fichier/"
-"Associer un fichier vidéo' pour associer un fichier vidéo"
+"<h1>Commentaire sur %(title)s</h1>\n"
+"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
+"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
+"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
+"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
+"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
+"\"%(imgurl)s\" ></img></a></span>"
 
-#: ../lib/advene/gui/main.py:1069
+#: ../lib/advene/core/controller.py:2585
 #, python-format
-msgid ""
-"The associated media %s could not be found. Please use the 'File/Associate a "
-"video file' menu item to associate a media file."
-msgstr ""
-"La vidéo associée %s est introuvable. Utilisez le menu 'Fichier/Associer un "
-"fichier vidéo' pour associer un fichier vidéo."
+msgid "List of %s annotations"
+msgstr "Ensemble de %s annotations"
 
-#: ../lib/advene/gui/main.py:1071
+#: ../lib/advene/core/controller.py:2620
 #, python-format
-msgid ""
-"You are now working with the following video:\n"
-"%s"
-msgstr ""
-"Vous travaillez maintenant avec la vidéo suivante :\\n\n"
-"%s"
+msgid "Cannot export to %(filename)s: %(e)s"
+msgstr "Impossible d'exporter vers %(filename)s: %(e)s"
 
-#: ../lib/advene/gui/main.py:1188
-msgid "Open this view..."
-msgstr "Ouvrir cette vue..."
+#: ../lib/advene/core/controller.py:2635
+msgid "Error when exporting text template"
+msgstr "Erreur lors de l'export du modèle texte %s"
 
-#: ../lib/advene/gui/main.py:1205
-msgid "_All available views"
-msgstr "_Toutes les vues disponibles"
+#: ../lib/advene/core/controller.py:2644
+msgid "Error when exporting XML template"
+msgstr "Erreur lors de l'export du modèle XML %s"
 
-#: ../lib/advene/gui/main.py:1224
-msgid "Transcription of annotations"
-msgstr "Transcription d'annotations"
+#: ../lib/advene/plugins/featuredetect.py:45
+msgid "Feature detection (face...)"
+msgstr "Reconnaissance de formes"
 
-#: ../lib/advene/gui/main.py:1227
-msgid "Note-taking editor"
-msgstr "Éditeur de prise de notes"
+#: ../lib/advene/plugins/featuredetect.py:60
+msgid "Sensitivity level."
+msgstr "Niveau de sensibilité"
 
-#: ../lib/advene/gui/main.py:1228
-msgid "Active bookmarks"
-msgstr "Signets actifs"
+#: ../lib/advene/plugins/featuredetect.py:63
+msgid ""
+"Scale. Original image size will be divided by this factor, in order to speed "
+"up detection."
+msgstr ""
+"La taille d'image sera divisée par ce facteur d'échelle, afin\n"
+"d'accélérer le traitement."
 
-#: ../lib/advene/gui/main.py:1229
-msgid "Schema editor"
-msgstr "Éditeur de schéma"
+#: ../lib/advene/plugins/featuredetect.py:66
+msgid "Classifier"
+msgstr "Classificateur"
 
-#: ../lib/advene/gui/main.py:1233
-msgid "TALES explorer"
-msgstr "Explorateur TALES"
+#: ../lib/advene/plugins/featuredetect.py:80
+#, python-format
+msgid "Feature %s"
+msgstr "Forme %s"
 
-#: ../lib/advene/gui/main.py:1234
-msgid "Dynamic montage"
-msgstr "Montage dynamique"
+#: ../lib/advene/plugins/featuredetect.py:82
+#, python-format
+msgid "Detected %s"
+msgstr "%s détecté"
 
-#: ../lib/advene/gui/main.py:1238
-msgid "Open a comment view in the web browser"
-msgstr "Ouvrir une vue de commentaire dans le navigateur web"
+#: ../lib/advene/plugins/featuredetect.py:84
+msgid "Detection started"
+msgstr "Détection commencée"
 
-#: ../lib/advene/gui/main.py:1239
-msgid "Create or open a comment view"
-msgstr "Créer ou éditer une vue de commentaire"
+#: ../lib/advene/plugins/featuredetect.py:175
+#, python-format
+msgid "Detected %(count)d feature(s) until %(time)s"
+msgstr "%(count)d objet(s) détectés jusqu'à %(time)s"
 
-#: ../lib/advene/gui/main.py:1242
-msgid ""
-"Edit window placeholder (annotation and relation edit windows will be put "
-"here)"
-msgstr ""
-"Emplacement de fenêtres d'édition (les fenêtres d'édition d'annotations et "
-"relations seront placées ici)"
+#: ../lib/advene/plugins/ted.py:39
+msgid "TED importer"
+msgstr "Importateur TED"
 
-#: ../lib/advene/gui/main.py:1243
-msgid "Display edition history"
-msgstr "Afficher l'historique d'édition"
+#: ../lib/advene/plugins/cutter.py:40
+msgid "Audio segmentation"
+msgstr "Segmentation audio"
 
-#: ../lib/advene/gui/main.py:1244
-msgid "Visualise the activity trace preview"
-msgstr "Prévisualiser la trace d'activité"
+#: ../lib/advene/plugins/cutter.py:55
+msgid "Volume threshold (in dB, can be negative) before trigger."
+msgstr "Seuil de détection de silence (en dB, peut être négatif)"
 
-#: ../lib/advene/gui/main.py:1245
-msgid "Visualise the activity trace as a timeline"
-msgstr "Visualiser la trace d'activité sous forme de ligne de temps"
+#: ../lib/advene/plugins/cutter.py:58
+#: ../lib/advene/plugins/soundenveloppe.py:64
+msgid "Channel selection."
+msgstr "Choix du canal"
 
-#: ../lib/advene/gui/main.py:1274
-msgid "The webserver could not be started. Static views cannot be accessed."
-msgstr ""
-"Le serveur web n'est pas lancé. Vous ne pouvez pas accéder aux vues "
-"statiques."
+#: ../lib/advene/plugins/cutter.py:61
+msgid "Length (in ms) of drop below threshold before silence is detected"
+msgstr "Longueur (en ms) minimale de silence détecté"
+
+#: ../lib/advene/plugins/cutter.py:104
+#, python-format
+msgid "Detected %(count)d segments until %(time)s"
+msgstr "Détecté %(count)d segments jusqu'à %(time)s"
+
+# Segment audio
+#: ../lib/advene/plugins/cutter.py:122
+msgid "Sound segment"
+msgstr "Segment audio"
 
-#: ../lib/advene/gui/main.py:1352
+#: ../lib/advene/plugins/cutter.py:123
 #, python-format
 msgid ""
-"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s has been "
-"released</b> on %(date)s, but you are running version %(current)s.\n"
-"You can download the latest version from the Advene website: http://liris."
-"cnrs.fr/advene/</span>"
+"Sound segmentation with a threshold of %(threshold)d dB - channel: "
+"%(channel)s"
 msgstr ""
-"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s est "
-"disponible</b> depuis le %(date)s, mais vous utilisez la version "
-"%(current)s.\n"
-"Vous pouvez télécharger la dernière version depuis le site web d'Advene: "
-"http://liris.cnrs.fr/advene/</span>"
+"Segmentation sonore avec un seuil de %(threshold)d dB - canal : %(channel)s"
 
-#: ../lib/advene/gui/main.py:1357
-msgid "Go to the website"
-msgstr "Aller sur le site web"
+#: ../lib/advene/plugins/cutter.py:141
+msgid "Starting silence detection"
+msgstr "Démarrage de la détection audio"
 
-#: ../lib/advene/gui/main.py:1363
-msgid "Advene release"
-msgstr "Nouvelle version d'Advene"
+#: ../lib/advene/plugins/ttl.py:41
+msgid "TurTLe (RDF) importer"
+msgstr "Importateur TurTLe (RDF)"
 
-#: ../lib/advene/gui/main.py:1369
-#, python-format
-msgid "You are using a up-to-date version of Advene (%(current)s)."
-msgstr "Vous utilisez une version à jour d'Advene (%(current)s)."
+#: ../lib/advene/plugins/shotdetect.py:38
+msgid "Shotdetect XML importer"
+msgstr "Importateur XML Shotdetect"
 
-#: ../lib/advene/gui/main.py:1369
-msgid "Advene is up-to-date"
-msgstr "Advene est à jour"
+#: ../lib/advene/plugins/shotdetect.py:82
+msgid "No shots"
+msgstr "Pas de plans"
 
-#: ../lib/advene/gui/main.py:1383
-msgid "Choose a color"
-msgstr "Choisissez une couleur"
+#: ../lib/advene/plugins/pocketsphinx.py:44
+msgid ""
+"Cannot register speech recognition: Pocketsphinx plugins not found. See "
+"http://cmusphinx.sourceforge.net/wiki/gstreamer for details."
+msgstr ""
+"Impossible d'activer la reconnaissance de la parole: les modules\n"
+"PocketSphinx ne sont pas présents. Voir\n"
+"http://cmusphinx.sourceforge.net/wiki/gstreamer pour plus d'informations."
 
-#: ../lib/advene/gui/main.py:1415
-msgid "Select an annotation to loop on it"
-msgstr "Sélectionnez l'annotation sur laquelle boucler"
+#: ../lib/advene/plugins/pocketsphinx.py:48
+msgid "Speech recognition (PocketSphinx)"
+msgstr "Reconnaissance vocale (PocketSphinx)"
 
-#: ../lib/advene/gui/main.py:1417
-#, python-format
-msgid "Looping on %s"
-msgstr "Boucler sur %s"
+#: ../lib/advene/plugins/pocketsphinx.py:68
+msgid "Filtering noise level [0..1]."
+msgstr "Niveau de filtrage du bruit [0..1]"
 
-#: ../lib/advene/gui/main.py:1476 ../lib/advene/gui/main.py:2367
-msgid "No active dynamic view"
-msgstr "Aucune vue dynamique active"
+#: ../lib/advene/plugins/pocketsphinx.py:72
+msgid ""
+"Minimum amount (in milliseconds) of silence required to terminate the "
+"current annotation and start a new one. Decreasing this length will result "
+"in a large amount of short annotations and increasing this length will "
+"result in a small amount of long annotations."
+msgstr ""
+"Temps minimum (en millisecondes) de silence requis pour terminer\n"
+"l'annotation et en commencer une nouvelle. Diminuer cette durée\n"
+"produira beaucoup de petites annotations, l'augmenter donnera quelques\n"
+"longues annotations."
 
-#: ../lib/advene/gui/main.py:1487
-msgid "Create a new dynamic view."
-msgstr "Créer une nouvelle vue dynamique."
+#: ../lib/advene/plugins/pocketsphinx.py:76
+msgid "Use default acoustic and language models."
+msgstr "Utiliser les modèles acoustiques et de langage standard."
 
-#: ../lib/advene/gui/main.py:1506
-msgid "Edit the current dynamic view."
-msgstr "Éditer la vue dynamique courante"
+#: ../lib/advene/plugins/pocketsphinx.py:80
+msgid "Acoustic model (directory)"
+msgstr "Modèle acoustique (répertoire)"
 
-#: ../lib/advene/gui/main.py:1518
-msgid "No dynamic view"
-msgstr "Pas de vue dynamique"
+#: ../lib/advene/plugins/pocketsphinx.py:84
+msgid "Phonetic dictionary (.dic file)"
+msgstr "Dictionnaire phonétique (fichier .dic)"
+
+#: ../lib/advene/plugins/pocketsphinx.py:88
+msgid "Language model (.DMP file)"
+msgstr "Modèle de langage (fichier .dmp)"
 
-#: ../lib/advene/gui/main.py:1550
-msgid "Playing rate"
-msgstr "Vitesse de lecture"
+#: ../lib/advene/plugins/pocketsphinx.py:107
+#: ../lib/advene/plugins/soundenveloppe.py:88
+#: ../lib/advene/plugins/barcode.py:62
+msgid "Generating annotations"
+msgstr "Création des annotations"
 
-#: ../lib/advene/gui/main.py:1698
-msgid "History"
-msgstr "Historique"
+#: ../lib/advene/plugins/pocketsphinx.py:146
+#: ../lib/advene/plugins/barcode.py:87
+#, python-format
+msgid "%(count)d utterances until %(time)s"
+msgstr "%(count)d paroles jusqu'à %(time)s"
 
-#: ../lib/advene/gui/main.py:1705
-msgid "Popups"
-msgstr "Popups"
+#: ../lib/advene/plugins/pocketsphinx.py:155
+msgid "Speech"
+msgstr "Parole"
 
-#: ../lib/advene/gui/main.py:1709
-msgid ""
-"You can drag and drop view icons (timeline, treeview, transcription...) in "
-"notebooks to embed various views."
-msgstr ""
-"Vous pouvez glisser-déposer les icônes des vues (ligne de temps,\n"
-"arbre, etc) dans les zones d'onglets pour les y intégrer."
+#: ../lib/advene/plugins/pocketsphinx.py:157
+msgid "Recognized speech"
+msgstr "Parole reconnue"
 
-#: ../lib/advene/gui/main.py:1709
-msgid "Information"
-msgstr "Information"
+#: ../lib/advene/plugins/pocketsphinx.py:186
+msgid "Recognizing speech"
+msgstr "Reconnaissance en cours"
 
-#: ../lib/advene/gui/main.py:2004
-msgid "Cannot create annotation. There is no schema to put it in."
-msgstr ""
-"Impossible de créer l'annotation : il n'y a pas de schéma pour la contenir."
+#: ../lib/advene/plugins/brltty.py:64
+msgid "Input from the braille table."
+msgstr "Entrée depuis la plage Braille"
 
-#: ../lib/advene/gui/main.py:2013
-msgid "Default annotation type"
-msgstr "Type d'annotation par défaut"
+#: ../lib/advene/plugins/brltty.py:68
+msgid "BrlTTY not installed. There will be no braille support."
+msgstr "BrlTTY n'est pas installé. Il n'y aura pas de support Braille."
 
-#: ../lib/advene/gui/main.py:2025
-msgid "Annotation created"
-msgstr "Annotation créée"
+#: ../lib/advene/plugins/brltty.py:80
+msgid "Could not initialize BrlTTY. No braille support."
+msgstr "Impossible d'initialiser BrlTTY. Il n'y aura pas de support Braille."
 
-#: ../lib/advene/gui/main.py:2057
-msgid "Play/Pause [Control-Tab / Control-Space]"
-msgstr "Lecture/Pause [Contrôle-Tab / Contrôle-Espace]"
+#: ../lib/advene/plugins/brltty.py:86
+msgid "Display a message in Braille"
+msgstr "Afficher un message en Braille"
 
-#: ../lib/advene/gui/main.py:2058
-#, python-format
-msgid "Rewind (%.02f s) [Control-Left]"
-msgstr "Reculer (%.02f s) [Contrôle-gauche]"
+#: ../lib/advene/plugins/brltty.py:87
+msgid "Message to display."
+msgstr "Message à afficher"
 
-#: ../lib/advene/gui/main.py:2059
+#: ../lib/advene/plugins/brltty.py:258
 #, python-format
-msgid "Forward (%.02f s) [Control-Right]"
-msgstr "Avancer (%.02f s) [Contrôle-droite]"
-
-#: ../lib/advene/gui/main.py:2060
-msgid "Previous frame [Control-Down]"
-msgstr "Image précédente [Contrôle-bas]"
+msgid "BrlTTY connection error: %s"
+msgstr "BrlTTY - erreur de connexion: %s"
 
-#: ../lib/advene/gui/main.py:2061
-msgid "Next frame [Control-Up]"
-msgstr "Image suivante [Contrôle-haut]"
+#: ../lib/advene/plugins/brltty.py:275
+msgid "Braille display: "
+msgstr "Affichage braille :"
 
-#: ../lib/advene/gui/main.py:2062
-msgid "Fullscreen"
-msgstr "Plein écran"
+#: ../lib/advene/plugins/brltty.py:281
+msgid "No message"
+msgstr "Pas de message"
 
-#: ../lib/advene/gui/main.py:2214
-#, python-format
-msgid "Screenshot saved to %s"
-msgstr "Capture sauvegardée dans %s"
+#: ../lib/advene/plugins/transcript.py:34
+msgid "Youtube XML importer"
+msgstr "Importateur d'annotations Youtube"
 
-#: ../lib/advene/gui/main.py:2216
-#, python-format
-msgid ""
-"Screenshot saved in\n"
-" %s"
-msgstr ""
-"Capture sauvegardée dans\n"
-" %s"
+#: ../lib/advene/plugins/transcript.py:71
+msgid "Importing transcript"
+msgstr "Importer une transcription"
 
-#: ../lib/advene/gui/main.py:2218
-#, python-format
-msgid ""
-"Could not save screenshot:\n"
-" %s"
-msgstr ""
-"Impossible de sauvegarder la capture:\n"
-" %s"
+#: ../lib/advene/plugins/aeidon_import.py:50
+msgid "Aeidon (subtitles) importer"
+msgstr "Importateur sous-titres (Aeidon)"
 
-#: ../lib/advene/gui/main.py:2226
-msgid "Save screenshot to..."
-msgstr "Sauver la capture d'écran sous..."
+#: ../lib/advene/plugins/anvil.py:38
+msgid "Anvil importer"
+msgstr "Importateur Anvil"
 
-#: ../lib/advene/gui/main.py:2244
-msgid "Could not take snapshot with enough precision"
-msgstr "Impossible de faire une capture avec suffisamment de précision"
+#: ../lib/advene/plugins/fcp.py:35
+msgid "Final Cut Pro XML importer"
+msgstr "Importateur Final Cut Pro XML"
 
-#: ../lib/advene/gui/main.py:2282
-msgid "Export package data"
-msgstr "Exporter les données du recueil"
+#: ../lib/advene/plugins/fcp.py:57
+msgid "FCP clipitem"
+msgstr "FCP clipitem"
 
-#: ../lib/advene/gui/main.py:2284
-#, python-format
-msgid "Export annotation type %s"
-msgstr "Exporter le type d'annotation %s"
+#: ../lib/advene/plugins/fcp.py:77
+msgid "Importing subtitles"
+msgstr "Import des sous-titres"
 
-#: ../lib/advene/gui/main.py:2286
-#, python-format
-msgid "Export element %s"
-msgstr "Exporter l'élément %s"
+#: ../lib/advene/plugins/fcp.py:92
+msgid "Importing clips"
+msgstr "Import des clips"
 
-#: ../lib/advene/gui/main.py:2312
-msgid "Export format"
-msgstr "Format d'export"
+#: ../lib/advene/plugins/fcp.py:95
+msgid "No clip"
+msgstr "Pas de clip"
 
-#: ../lib/advene/gui/main.py:2349
-msgid " (modified)"
-msgstr " (modifié)"
+#: ../lib/advene/plugins/hpi.py:43
+msgid "HPI concept extraction"
+msgstr "Extraction de concept HPI"
 
-#: ../lib/advene/gui/main.py:2352
-#, python-format
-msgid "Activate %s"
-msgstr "Activer %s"
+#: ../lib/advene/plugins/hpi.py:109
+msgid "Type of annotation to analyze"
+msgstr "Type d'annotation à analyser"
 
-#: ../lib/advene/gui/main.py:2523
-msgid "Saved workspace"
-msgstr "Environnement sauvegardé"
+#: ../lib/advene/plugins/hpi.py:114
+msgid "URL of the webservice"
+msgstr "URL du service web"
 
-#: ../lib/advene/gui/main.py:2575
-msgid "Restoring workspace..."
-msgstr "Restauration de l'environnement"
+#: ../lib/advene/plugins/hpi.py:119
+msgid "Minimum confidence level (between 0.0 and 1.0)"
+msgstr "Niveau de confiance minimum (entre 0.0 et 1.0)"
 
-#: ../lib/advene/gui/main.py:2581
-#, python-format
-msgid "Do you wish to restore the %s workspace ?"
-msgstr "Voulez-vous restaurer l'environnement %s ?"
+#: ../lib/advene/plugins/hpi.py:124
+msgid "Use detected position for created annotations"
+msgstr "Utiliser les positions détectées pour créer les annotations"
 
-#: ../lib/advene/gui/main.py:2586
-msgid "Clear the current workspace"
-msgstr "Vider l'environnement courant"
+#: ../lib/advene/plugins/hpi.py:129
+msgid "Split by entity type"
+msgstr "Diviser par type d'entité"
 
-#: ../lib/advene/gui/main.py:2607
-#, python-format
-msgid "View %s is not an adhoc view"
-msgstr "La vue %s n'est pas une vue adhoc"
+#: ../lib/advene/plugins/hpi.py:134
+msgid "Model to be used for detection"
+msgstr "Modèle à utiliser pour la détection"
 
-#: ../lib/advene/gui/main.py:2618
-#, python-format
-msgid "Cannot identify the adhoc view %s"
-msgstr "Impossible de trouver la vue adhoc %s"
+#: ../lib/advene/plugins/hpi.py:139
+msgid "Create relations between the original annotations and the new ones"
+msgstr "Créer des relations entre les annotations originales et les nouvelles"
 
-#: ../lib/advene/gui/main.py:2632
-msgid "Choose the annotation type to display as transcription."
+#: ../lib/advene/plugins/hpi.py:167
+msgid "Cannot connect to VCD server. Check that it is running and accessible."
 msgstr ""
-"Choisissez le type d'annotation\n"
-"à afficher sous forme de transcription."
+"Impossible de se connecter au serveur VCD. Vérifiez qu'il est disponible et "
+"accessible."
 
-#: ../lib/advene/gui/main.py:2667
+#: ../lib/advene/plugins/hpi.py:179
 #, python-format
-msgid ""
-"Error: unable to find an edit popup for %(element)s:\n"
-"%(error)s"
-msgstr ""
-"Erreur : impossible d'ouvrir une fenêtre d'édition pour %(element)s:\n"
-"%(error)s"
+msgid "%d / %d screenshots are missing. Wait for extraction to complete."
+msgstr "%d / %d images manquantes. Attendez que l'extraction soit terminée."
 
-#: ../lib/advene/gui/main.py:2675
+#: ../lib/advene/plugins/hpi.py:196
 #, python-format
-msgid "Editing %s"
-msgstr "Édition de %s"
+msgid "Concepts for %s"
+msgstr "Concepts pour %s"
 
-#: ../lib/advene/gui/main.py:2687
+#: ../lib/advene/plugins/hpi.py:264
 #, python-format
-msgid "Comment view (%s)"
-msgstr "Vue de commentaire (%s)"
+msgid "Server error: %s"
+msgstr "Erreur serveur: %s"
 
-#: ../lib/advene/gui/main.py:2754
-#, python-format
-msgid "Package %(uri)s saved: %(annotations)s and %(relations)s."
-msgstr "Recueil %(uri)s sauvé. %(annotations)s et %(relations)s."
+#: ../lib/advene/plugins/hpi.py:264
+msgid "Server transmission error."
+msgstr "Erreur de transmission du server."
 
-#: ../lib/advene/gui/main.py:2765
+#: ../lib/advene/plugins/hpi.py:272
 #, python-format
-msgid "Activating package %s"
-msgstr "Activation du recueil %s"
+msgid "Parsing %d results"
+msgstr "Traitement de %d résultats"
 
-#: ../lib/advene/gui/main.py:2793
+#: ../lib/advene/plugins/hpi.py:289
 #, python-format
-msgid "Package %(uri)s loaded: %(annotations)s and %(relations)s."
-msgstr "Recueil %(uri)s chargé. %(annotations)s et %(relations)s."
+msgid "%s concept"
+msgstr "Concept %s"
 
-#: ../lib/advene/gui/main.py:2826
-msgid "Do you want to restore the saved workspace ?"
-msgstr "Voulez-vous restaurer l'environnement sauvegardé ?"
+#: ../lib/advene/plugins/goodshotdetector.py:45
+msgid "Shot detection (Delakis version)"
+msgstr "Détection de plans (version Delakis)"
 
-#: ../lib/advene/gui/main.py:2833
-msgid "Advene"
-msgstr "Advene"
+#: ../lib/advene/plugins/goodshotdetector.py:60
+msgid "Cache histogram alongside video files."
+msgstr "Stocker l'histogramme à côté du fichier vidéo"
+
+#: ../lib/advene/plugins/goodshotdetector.py:63
+msgid ""
+"Parameter profile: safe will detect less cuts, aggressive will detect more "
+"cuts (but more false ones too). default is a compromise."
+msgstr ""
+"Profil de configuration: \"safe\" détectera moins de coupures,\n"
+"\"aggressive\" en détectera plus (mais plus d'incorrects\n"
+"également). \"default\" est un compromis."
 
-#: ../lib/advene/gui/main.py:3038
+#: ../lib/advene/plugins/goodshotdetector.py:77
 #, python-format
-msgid "Got exception %s. Trying to continue."
-msgstr "Reçu l'exception %s. On continue tout de même."
+msgid "Shot (%s profile)"
+msgstr "Plan (profil %s)"
 
-#: ../lib/advene/gui/main.py:3062 ../lib/advene/gui/main.py:3083
-#: ../lib/advene/gui/main.py:4033
-msgid "Unknown"
-msgstr "Inconnu"
+#: ../lib/advene/plugins/goodshotdetector.py:78
+#: ../lib/advene/plugins/shotdetectapp.py:84
+msgid "Detected shots"
+msgstr "Plans détectés"
 
-#: ../lib/advene/gui/main.py:3153
-#, python-format
-msgid ""
-"The package(s) %s are modified.\n"
-"Save them now?"
-msgstr ""
-"Le(s) recueil(s) %s a été modifié mais pas sauvegardé.\n"
-"Sauvegarder maintenant ?"
+#: ../lib/advene/plugins/goodshotdetector.py:83
+msgid "Loading histogram"
+msgstr "Chargement de l'histogramme"
 
-#: ../lib/advene/gui/main.py:3203
-msgid "Choose an annotation type."
-msgstr "Choisissez un type d'annotation"
+#: ../lib/advene/plugins/goodshotdetector.py:144
+msgid "Computing hdiff"
+msgstr "Calcul du hdiff"
 
-#: ../lib/advene/gui/main.py:3247
-msgid "No annotation type is defined."
-msgstr "Aucun type d'annotation n'est défini."
+#: ../lib/advene/plugins/goodshotdetector.py:151
+msgid "Detecting cuts"
+msgstr "Détection des plans"
 
-#: ../lib/advene/gui/main.py:3256
-msgid "Creating a new type."
-msgstr "Création d'un nouveau type."
+#: ../lib/advene/plugins/goodshotdetector.py:178
+msgid "Detecting dissolves"
+msgstr "Détection des fondus"
 
-#: ../lib/advene/gui/main.py:3260
-msgid "Title of the new type"
-msgstr "Titre du nouveau type"
+#: ../lib/advene/plugins/goodshotdetector.py:263
+msgid "Extracting histogram"
+msgstr "Extraction de l'histogramme"
 
-#: ../lib/advene/gui/main.py:3261
-msgid ""
-"Id of the new type. It is generated from the title, but you may change it if "
-"necessary."
+#: ../lib/advene/plugins/montagerenderer.py:43
+msgid "Cannot register montage renderer: Gnonlin plugins are not present."
 msgstr ""
-"Identifiant du nouveau type. Il est généré à partir du titre, mais vous "
-"pouvez le changer si nécessaire."
+"Impossible d'initialiser le rendu de montage: les plugins Gnonlin ne sont "
+"pas présents"
 
-#: ../lib/advene/gui/main.py:3265
-msgid "Specify the content-type for the annotation type"
-msgstr "Spécifiez le type de contenu pour le type d'annotation"
+#: ../lib/advene/plugins/transcriber.py:43
+msgid "Transcriber importer"
+msgstr "Importateur Transcriber"
 
-#: ../lib/advene/gui/main.py:3267
-msgid "Content type"
-msgstr "Type de contenu"
+#: ../lib/advene/plugins/transcriber.py:89
+msgid "Parsing section information"
+msgstr "Traitement des informations de section"
 
-#: ../lib/advene/gui/main.py:3274 ../lib/advene/gui/main.py:3383
-msgid "Create a new schema"
-msgstr "Créer un nouveau schéma"
+#: ../lib/advene/plugins/transcriber.py:257 ../lib/advene/util/importer.py:1541
+msgid "Creating package"
+msgstr "Création du recueil"
 
-#: ../lib/advene/gui/main.py:3287
-msgid "Choose an existing schema for the new type, or create a new one"
-msgstr ""
-"Choisissez un schéma existant pour le nouveau type, ou créez un nouveau "
-"schéma."
+#: ../lib/advene/plugins/transcriber.py:263 ../lib/advene/util/importer.py:1548
+msgid "Creating annotation types"
+msgstr "Création des types d'annotation"
 
-#: ../lib/advene/gui/main.py:3290 ../lib/advene/gui/main.py:3398
-msgid "Specify the schema title"
-msgstr "Spécifiez le titre du schéma"
+#: ../lib/advene/plugins/transcriber.py:268 ../lib/advene/util/importer.py:1554
+msgid "Parsing header information"
+msgstr "Traitement de l'entête"
 
-#: ../lib/advene/gui/main.py:3294
-msgid "Title of the new schema"
-msgstr "Titre du nouveau schéma"
+#: ../lib/advene/plugins/transcriber.py:279
+msgid "Parsing topic and speaker tables information"
+msgstr "Traitement des tables de sujet et orateur"
 
-#: ../lib/advene/gui/main.py:3295
-msgid ""
-"Id of the new schema. It is generated from the title, but you may change it "
-"if necessary."
-msgstr ""
-"Identifiant du nouveau schéma. Il est généré à partir du titre, mais vous "
-"pouvez le changer si nécessaire."
+#: ../lib/advene/plugins/tts.py:80
+msgid "Pronounce a text"
+msgstr "Prononcer un texte"
 
-#: ../lib/advene/gui/main.py:3318
-msgid ""
-"You specified a annotation-type identifier that already exists. Aborting."
-msgstr ""
-"Vous avez spécifié un identifiant déjà existant. Annulation de l'opération."
+#: ../lib/advene/plugins/tts.py:81
+msgid "String to pronounce."
+msgstr "Chaîne à prononcer"
 
-#: ../lib/advene/gui/main.py:3336
-msgid "You specified a existing schema identifier. Using the existing schema."
+#: ../lib/advene/plugins/tts.py:159
+msgid "TTS disabled. Cannot find the application 'festival' in PATH"
 msgstr ""
-"Vous avez spécifié un identifiant de schéma déjà existant. Ce dernier sera "
-"utilisé."
+"Synthèse vocale désactivée. Impossible de trouver l'application 'festival'"
 
-#: ../lib/advene/gui/main.py:3338
-msgid ""
-"You specified an existing identifier that does not reference a schema. "
-"Aborting."
+#: ../lib/advene/plugins/tts.py:161
+msgid "TTS disabled. Cannot find the application 'aplay' in PATH"
 msgstr ""
-"Vous avez spécifié un identifiant déjà existant qui ne désigne pas un "
-"schéma. Annulation de l'opération."
+"Synthèse vocale désactivée. Impossible de trouver l'application 'aplay'"
 
-#: ../lib/advene/gui/main.py:3365
-msgid "Choose a schema."
-msgstr "Choisissez un schéma"
+#: ../lib/advene/plugins/soundenveloppe.py:42
+#: ../lib/advene/plugins/soundenveloppe.py:149
+#: ../lib/advene/plugins/soundenveloppe.py:151
+msgid "Sound enveloppe"
+msgstr "Enveloppe sonore"
 
-#: ../lib/advene/gui/main.py:3425
-msgid "You specified an existing identifier. Aborting."
-msgstr ""
-"Vous avez spécifié un identifiant déjà existant. Annulation de l'opération."
+#: ../lib/advene/plugins/soundenveloppe.py:58
+msgid "Interval (in ms) at which to take samples."
+msgstr "Intervalle d'échantillonage (en ms)"
 
-#: ../lib/advene/gui/main.py:3445
-#, python-format
-msgid "Package %s modified"
-msgstr "Recueil %s modifié"
+#: ../lib/advene/plugins/soundenveloppe.py:61
+msgid "Maximum number of samples per annotation."
+msgstr "Nombre maximum d'échantillons par annotation"
 
-#: ../lib/advene/gui/main.py:3446
+#: ../lib/advene/plugins/soundenveloppe.py:121
 #, python-format
-msgid ""
-"The package %s has been modified but not saved.\n"
-"Save it now?"
-msgstr ""
-"Le recueil %s a été modifié mais pas sauvegardé.\n"
-"Sauvegarder maintenant ?"
+msgid "At %s"
+msgstr "À %s"
 
-#: ../lib/advene/gui/main.py:3456
-#, python-format
-msgid "%s snapshots"
-msgstr "%s captures d'écran"
+#: ../lib/advene/plugins/soundenveloppe.py:168
+msgid "Extracting sound enveloppe"
+msgstr "Extraction de l'enveloppe sonore"
 
-#: ../lib/advene/gui/main.py:3457
-#, python-format
-msgid "Do you want to save the snapshots for media %s?"
-msgstr "Voulez-vous sauvegarder les captures d'écran pour la vidéo %s ?"
+#: ../lib/advene/plugins/barcode.py:39
+msgid "Cannot register barcode extraction: zbar plugin not found."
+msgstr "Impossible d'initialiser l'extraction de qrcode"
 
-#: ../lib/advene/gui/main.py:3464 ../lib/advene/gui/main.py:3473
-#: ../lib/advene/gui/main.py:4449
-#, python-format
-msgid "Cannot save imagecache for %(media)s: %(e)s"
-msgstr "Impossible de sauvegarder le cache pour %(media)s : %(e)s"
+#: ../lib/advene/plugins/barcode.py:43
+msgid "Barcode (qr-code) extraction"
+msgstr "Extraction de QR Code"
 
-#: ../lib/advene/gui/main.py:3487
-msgid "first frame"
-msgstr "première image"
+#: ../lib/advene/plugins/barcode.py:99
+msgid "Barcode"
+msgstr "Barcode"
 
-#: ../lib/advene/gui/main.py:3488
-msgid "last frame"
-msgstr "dernière image"
+#: ../lib/advene/plugins/barcode.py:101
+msgid "Extracted barcode information"
+msgstr "Information qrcode"
 
-#: ../lib/advene/gui/main.py:3496
-#, python-format
-msgid "Click on %(bound)s of %(annotation)s"
-msgstr "Cliquer sur %(bound)s de %(annotation)s"
+#: ../lib/advene/plugins/barcode.py:119
+msgid "Extraction barcodes"
+msgstr "Extraction des codes"
+
+#: ../lib/advene/plugins/dcp.py:67
+msgid "DCP importer"
+msgstr "Importateur DCP"
 
-#: ../lib/advene/gui/main.py:3499
+#: ../lib/advene/plugins/dcp.py:122
 #, python-format
-msgid "Update %(bound)s of %(annotation)s"
-msgstr "Éditer %(bound)s de %(annotation)s"
+msgid "Converting #%(num)d / %(count)d"
+msgstr "Conversion #%(num)d / %(count)d"
 
-#: ../lib/advene/gui/main.py:3518
-msgid "Click on the frame corresponding to the timestamp value"
-msgstr "Cliquez sur l'image correspondant au temps désiré"
+#: ../lib/advene/plugins/annotationgraph.py:43
+msgid "AnnotationGraph importer"
+msgstr "Importateur AnnotationGraph"
 
-#: ../lib/advene/gui/main.py:3520
-msgid "Set new timestamp value"
-msgstr "Fixer le nouveau timecode"
+#: ../lib/advene/plugins/shotdetectapp.py:45
+msgid "ShotdetectApp importer"
+msgstr "Importateur ShotdetectApp"
 
-#: ../lib/advene/gui/main.py:3527
+#: ../lib/advene/plugins/shotdetectapp.py:56
 msgid ""
-"<b>Annotation statistics</b>\n"
-"\n"
+"Sensitivity of the algorithm. It should typically be between 50 and 80. If "
+"too many shots are detected, try to increase its value."
 msgstr ""
-"<b>Statistiques d'annotations</b>\n"
-"\n"
+"La sensibilité de l'algorithme devrait typiquement être entre 50 et\n"
+"80. Si trop de plans sont détectés, essayez d'augmenter sa valeur."
 
-#: ../lib/advene/gui/main.py:3599
-msgid "Text annotation"
-msgstr "Annotation textuelle"
+#: ../lib/advene/plugins/shotdetectapp.py:139
+#, python-format
+msgid "Detected shot #%(num)d at %(pos)s "
+msgstr "Plan #%(num)d détecté à %(pos)s "
 
-#: ../lib/advene/gui/main.py:3607 ../lib/advene/gui/main.py:3632
-msgid "Cannot find an appropriate annotation type"
-msgstr "Impossible de trouver un type d'annotation approprié"
+#: ../lib/advene/plugins/mpeg7.py:57
+msgid "MPEG7 importer"
+msgstr "Importateur MPEG7"
 
-#: ../lib/advene/gui/main.py:3625
-msgid "Graphical annotation"
-msgstr "Annotation graphique"
+#: ../lib/advene/plugins/cinelab.py:76
+msgid "Cinelab importer"
+msgstr "Importateur Cinelab"
 
-#: ../lib/advene/gui/main.py:3677
-msgid ""
-"An unsaved template package exists\n"
-"Save it first."
-msgstr ""
-"Un recueil modèle non sauvegardé existe.\n"
-"Sauvegardez-le avant d'essayer d'en créer un nouveau."
+#: ../lib/advene/plugins/cinelab.py:114 ../lib/advene/plugins/cinelab.py:116
+#, python-format
+msgid "File %s is not an Advene2 zip package."
+msgstr "Le fichier %s n'est pas un recueil Advene2 compressé."
 
-#: ../lib/advene/gui/main.py:3686
-msgid "Package modified"
-msgstr "Recueil modifié"
+#: ../lib/advene/plugins/cinelab.py:171
+msgid "Converting annotation types"
+msgstr "Conversion des types d'annotation"
 
-#: ../lib/advene/gui/main.py:3687
-msgid ""
-"The package that you want to close has been modified but not saved.\n"
-"Save it now?"
-msgstr ""
-"Le recueil que vous souhaitez fermer a été modifié mais pas sauvegardé.\n"
-"Sauvegarder maintenant ?"
+#: ../lib/advene/plugins/cinelab.py:212
+msgid "Converting views"
+msgstr "Conversion des vues"
 
-#: ../lib/advene/gui/main.py:3718
-msgid "Load a package"
-msgstr "Charger un recueil"
+#: ../lib/advene/plugins/cinelab.py:244
+msgid "Importing annotations"
+msgstr "Import des annotations"
 
-#: ../lib/advene/gui/main.py:3727
-msgid ""
-"A video file was selected. Pretend that the user selected 'Select a video "
-"file'..."
-msgstr ""
-"Un fichier vidéo a été sélectionné. On fait comme si l'utilisateur est passé "
-"par \"Sélectionner un fichier vidéo...\""
+#: ../lib/advene/plugins/owl_import.py:43
+msgid "OWL (schema) importer"
+msgstr "Importateur OWL (schéma)"
 
-#: ../lib/advene/gui/main.py:3732
+#: ../lib/advene/plugins/owl_import.py:62 ../lib/advene/util/importer.py:398
 #, python-format
-msgid ""
-"The file %s does not look like a valid Advene package. It should have a .azp "
-"or .xml extension. Try to open anyway?"
-msgstr ""
-"Le fichier %s ne ressemble pas à un recueil Advene valide. Il devrait avoir "
-"une extension .azp ou .xml. Voulez-vous essayer tout de même de l'ouvrir ?"
+msgid "Converted from %s"
+msgstr "Converti depuis %s"
 
-#: ../lib/advene/gui/main.py:3741
-msgid ""
-"You are trying to load a session file, but there are unsaved packages. "
-"Proceed anyway?"
+#: ../lib/advene/player/gstreamer.py:344
+msgid "Problem when seeking into media"
+msgstr "Problème lors du déplacement dans la vidéo"
+
+#: ../lib/advene/player/gstreamer.py:385
+msgid "Cannot capture full-resolution snapshot, another capture is ongoing."
 msgstr ""
-"Vous essayez de charger un fichier de session, mais il existe des recueil "
-"non sauvegardés. Continuer tout de même ?"
+"Impossible de faire la capture en pleine résolution, une autre capture\n"
+"est en cours."
 
-#: ../lib/advene/gui/main.py:3769 ../lib/advene/gui/main.py:3825
-msgid "Do you want to save the current workspace ?"
-msgstr "Voulez-vous sauvegarder l'environnement en cours ?"
+#: ../lib/advene/rules/actions.py:39 ../lib/advene/rules/actions.py:104
+#: ../lib/advene/rules/actions.py:122
+msgid "Message to display"
+msgstr "Message à afficher"
 
-#: ../lib/advene/gui/main.py:3784 ../lib/advene/gui/main.py:3840
-#, python-format
-msgid "Could not save the package: %s"
-msgstr "Impossible de sauvegarder le recueil: %s"
+#: ../lib/advene/rules/actions.py:50
+msgid "Start the player"
+msgstr "Démarrer le lecteur"
 
-#: ../lib/advene/gui/main.py:3797
-#, python-format
-msgid "Save the package %s"
-msgstr "Sauvegarde du recueil %s"
+#: ../lib/advene/rules/actions.py:51
+msgid "Start position (in ms)"
+msgstr "Position de début (en ms)"
 
-#: ../lib/advene/gui/main.py:3810
-msgid "Invalid file extension"
-msgstr "Extension de fichier invalide"
+#: ../lib/advene/rules/actions.py:54 ../lib/advene/rules/actions.py:380
+msgid "The movie start"
+msgstr "Le début du film"
 
-#: ../lib/advene/gui/main.py:3811
-#, python-format
-msgid ""
-"Your package contains resources,\n"
-"the filename (%s) should have a .azp extension.\n"
-"Should I put the correct extension?"
-msgstr ""
-"Votre recueil contient des ressources,\n"
-"le nom de fichier (%s) devrait avoir l'extension .azp.\n"
-"Corriger le nom de fichier ?"
+#: ../lib/advene/rules/actions.py:55 ../lib/advene/rules/actions.py:381
+msgid "The annotation begin"
+msgstr "Le début de l'annotation"
 
-#: ../lib/advene/gui/main.py:3815
-msgid "OK, the resources will be lost."
-msgstr "OK, les ressources seront perdues."
+#: ../lib/advene/rules/actions.py:56 ../lib/advene/rules/actions.py:382
+msgid "The annotation end"
+msgstr "La fin de l'annotation"
 
-#: ../lib/advene/gui/main.py:3817
-msgid "Aborting package saving"
-msgstr "Abandon de la sauvegarde"
+#: ../lib/advene/rules/actions.py:66
+msgid "Goto position (in ms)"
+msgstr "Position (en ms)"
 
-#: ../lib/advene/gui/main.py:3851
-msgid "Save the session in..."
-msgstr "Sauver la session dans..."
+#: ../lib/advene/rules/actions.py:75
+msgid "Stop the player"
+msgstr "Arrêter le lecteur"
 
-#: ../lib/advene/gui/main.py:3862
-#, python-format
-msgid "Session saved in %s"
-msgstr "Session sauvegardée dans %s"
+#: ../lib/advene/rules/actions.py:82
+msgid "Pause the player"
+msgstr "Mettre le lecteur en pause"
 
-#: ../lib/advene/gui/main.py:3871
-msgid "Do you confirm the creation of annotations matching the DVD chapters?"
-msgstr ""
-"Confirmez-vous la création d'annotations correspondant aux chapitres du DVD ?"
+#: ../lib/advene/rules/actions.py:89
+msgid "Resume the player"
+msgstr "Relancer le lecteur"
 
-#: ../lib/advene/gui/main.py:3877
-msgid "Cannot import DVD chapters. Did you install the lsdvd software?"
-msgstr ""
-"Impossible d'importer les chapitres du DVD. Avez-vous installé l'application "
-"lsdvd ?"
+#: ../lib/advene/rules/actions.py:96
+msgid "Take a snapshot"
+msgstr "Prendre une capture d'écran"
 
-#: ../lib/advene/gui/main.py:3885
-msgid "The associated media is not a DVD."
-msgstr "Le média associé n'est pas un DVD."
+#: ../lib/advene/rules/actions.py:103
+msgid "Display a caption"
+msgstr "Afficher un sous-titre"
 
-# Traitement de %s
-#: ../lib/advene/gui/main.py:3896
-#, python-format
-msgid "Processing %s video"
-msgstr "Traitement de la vidéo %s"
+#: ../lib/advene/rules/actions.py:105
+msgid "Duration of the caption"
+msgstr "Durée du sous-titre"
 
-#: ../lib/advene/gui/main.py:3899
-msgid "No associated video file"
-msgstr "Aucun fichier vidéo associé"
+#: ../lib/advene/rules/actions.py:133
+msgid "Display a graphical shape"
+msgstr "Afficher une forme graphique"
 
-#: ../lib/advene/gui/main.py:3926
-msgid "Standard RuleSet"
-msgstr "Ensemble de règles standard"
+#: ../lib/advene/rules/actions.py:134
+msgid "Shape (square, circle, triangle)"
+msgstr "Forme (square, circle, triangle)"
 
-#: ../lib/advene/gui/main.py:4042
-#, python-format
-msgid ""
-"Player not active - cached duration   : %(duration)s (%(durationms)d ms)"
-msgstr "Lecteur inactif - Durée cachée   : %(duration)s (%(durationms)d ms)"
+#: ../lib/advene/rules/actions.py:136
+msgid "x-position (percentage of screen)"
+msgstr "Abscisse (pourcentage de l'écran)"
 
-#: ../lib/advene/gui/main.py:4054
-msgid ""
-"GNU General Public License v. 2\n"
-"See http://www.gnu.org/copyleft/gpl.html for more details"
-msgstr ""
-"GNU General Public License v. 2\n"
-"Voir http://www.gnu.org/copyleft/gpl.html pour plus d'informations"
+#: ../lib/advene/rules/actions.py:137
+msgid "y-position (percentage of screen)"
+msgstr "Ordonnée (pourcentage de l'écran)"
+
+#: ../lib/advene/rules/actions.py:138
+msgid "Size (arbitrary units)"
+msgstr "Taille (unité arbitraire)"
+
+#: ../lib/advene/rules/actions.py:139
+msgid "Duration of the display in ms"
+msgstr "Durée de l'affichage en ms"
+
+#: ../lib/advene/rules/actions.py:147
+msgid "A square"
+msgstr "Un carré"
+
+#: ../lib/advene/rules/actions.py:148
+msgid "A circle"
+msgstr "Un cercle"
+
+#: ../lib/advene/rules/actions.py:149
+msgid "A triangle"
+msgstr "Un triangle"
 
-#: ../lib/advene/gui/main.py:4056
-msgid "Visit the Advene web site for examples and documentation."
-msgstr "Consultez le site web d'Advene pour les exemples et la documentation."
+#: ../lib/advene/rules/actions.py:152
+msgid "White"
+msgstr "Blanc"
 
-#: ../lib/advene/gui/main.py:4089 ../lib/advene/gui/main.py:4177
-msgid "Select a movie file"
-msgstr "Choisissez un fichier vidéo"
+# Retour rapide
+#: ../lib/advene/rules/actions.py:153
+msgid "Black"
+msgstr "Noir"
 
-#: ../lib/advene/gui/main.py:4101
-msgid "Title/Chapter selection"
-msgstr "Sélection du titre/chapître"
+#: ../lib/advene/rules/actions.py:154
+msgid "Red"
+msgstr "Rouge"
 
-#: ../lib/advene/gui/main.py:4143
-msgid "Select a video stream"
-msgstr "Choisir un flux vidéo"
+#: ../lib/advene/rules/actions.py:155
+msgid "Green"
+msgstr "Vert"
 
-#: ../lib/advene/gui/main.py:4144
-msgid "Enter the address of a video stream"
-msgstr "Entrer l'adresse d'un flux vidéo"
+#: ../lib/advene/rules/actions.py:156
+msgid "Blue"
+msgstr "Bleu"
 
-#: ../lib/advene/gui/main.py:4148
-#, python-format
-msgid "Successfully extracted the video stream address (%s) from the url.\n"
-msgstr ""
-"L'adresse du flux vidéo (%s) a été extraite avec succès de l'URL donnée.\n"
+#: ../lib/advene/rules/actions.py:157
+msgid "Yellow"
+msgstr "Jaune"
 
-#: ../lib/advene/gui/main.py:4173
-msgid "Package properties"
-msgstr "Proprietes du recueil"
+#: ../lib/advene/rules/actions.py:160
+msgid "At the top of the screen"
+msgstr "En haut de l'écran"
 
-#: ../lib/advene/gui/main.py:4174
-msgid "Author name"
-msgstr "Auteur"
+#: ../lib/advene/rules/actions.py:161 ../lib/advene/rules/actions.py:166
+msgid "In the middle of the screen"
+msgstr "Au milieu de l'écran"
 
-#: ../lib/advene/gui/main.py:4175
-msgid "Package creation date"
-msgstr "Date de création du recueil"
+#: ../lib/advene/rules/actions.py:162
+msgid "At the bottom of the screen"
+msgstr "En bas de l'écran"
 
-#: ../lib/advene/gui/main.py:4176
-msgid "Package title"
-msgstr "Titre du recueil"
+#: ../lib/advene/rules/actions.py:165
+msgid "At the left of the screen"
+msgstr "À gauche de l'écran"
 
-#: ../lib/advene/gui/main.py:4177
-msgid "Associated media"
-msgstr "Media associe"
+#: ../lib/advene/rules/actions.py:183
+msgid "Zero the volume during the annotation"
+msgstr "Couper le son durant l'annotation"
 
-#: ../lib/advene/gui/main.py:4178
-msgid "Media duration in ms"
-msgstr "Durée du média en ms"
+#: ../lib/advene/rules/actions.py:190
+msgid "Zero the volume"
+msgstr "Couper le son"
 
-#: ../lib/advene/gui/main.py:4237
-msgid "Paths"
-msgstr "Chemins"
+#: ../lib/advene/rules/actions.py:197
+msgid "Restore the volume"
+msgstr "Restaurer le son"
 
-#: ../lib/advene/gui/main.py:4239
-msgid "Data"
-msgstr "Contenu"
+#: ../lib/advene/rules/actions.py:205
+msgid "Activate a STBV"
+msgstr "Activer une vue dynamique"
 
-#: ../lib/advene/gui/main.py:4239
-msgid "Standard directory for data files"
-msgstr "Répertoire standard pour les fichiers de données"
+#: ../lib/advene/rules/actions.py:206
+msgid "STBV id"
+msgstr "Identificateur de la vue dynamique"
 
-#: ../lib/advene/gui/main.py:4240
-msgid "Movie path"
-msgstr "Chemin de recherche pour les fichiers vidéo"
+#: ../lib/advene/rules/actions.py:215
+msgid "Send a user event"
+msgstr "Envoyer un événement utilisateur"
 
-#: ../lib/advene/gui/main.py:4240
-#, python-format
-msgid ""
-"List of directories (separated by %s) to search for movie files (_ means "
-"package directory)"
-msgstr ""
-"Liste de répertoires (séparés par %s) où chercher les vidéos (_ signifie le "
-"même répertoire que le recueil)"
+#: ../lib/advene/rules/actions.py:216
+msgid "Identifier"
+msgstr "Identificateur"
 
-#: ../lib/advene/gui/main.py:4241
-msgid "Imagecache"
-msgstr "Cache d'images"
+#: ../lib/advene/rules/actions.py:217
+msgid "Delay in ms before sending the event."
+msgstr "Délai en ms avant l'envoi de l'événement."
 
-#: ../lib/advene/gui/main.py:4241
-msgid "Directory for storing the snapshot cache"
-msgstr "Répertoire où sauvegarder le cache de captures d'écran"
+#: ../lib/advene/rules/actions.py:227
+msgid "Open a URL in the web browser"
+msgstr "Ouvrir une URL dans le navigateur web"
 
-#: ../lib/advene/gui/main.py:4242
-msgid "Player"
-msgstr "Lecteur"
+#: ../lib/advene/rules/actions.py:237
+msgid "Open a static view"
+msgstr "Ouvrir une vue statique"
 
-#: ../lib/advene/gui/main.py:4242
-msgid "Directory of the video player"
-msgstr "Répertoire du lecteur vidéo"
+#: ../lib/advene/rules/actions.py:248
+msgid "Set the audio volume"
+msgstr "Fixer le volume"
 
-#: ../lib/advene/gui/main.py:4243
-msgid "Shotdetect"
-msgstr "Détection de plans"
+#: ../lib/advene/rules/actions.py:249
+msgid "Volume level (from 0 to 100)"
+msgstr "Niveau de volume (0 à 100)"
 
-#: ../lib/advene/gui/main.py:4243
-msgid "Shotdetect application"
-msgstr "Application de détection de plans"
+#: ../lib/advene/rules/actions.py:258
+msgid "Set the playing rate"
+msgstr "Fixer la vitesse"
 
-# Interface
-#: ../lib/advene/gui/main.py:4245
-msgid "GUI"
-msgstr "Interface"
+#: ../lib/advene/rules/actions.py:259
+msgid "Rate (100: normal rate, 200: twice slower)"
+msgstr "Vitesse (100: vitesse normale, 200: deux fois plus lent)"
 
-#: ../lib/advene/gui/main.py:4246
-msgid "Interface language (after restart)"
-msgstr "Langage de l'interface (après redémarrage)"
+#: ../lib/advene/rules/actions.py:268
+msgid "Play a sound resource"
+msgstr "Jouer une ressource son"
 
-#: ../lib/advene/gui/main.py:4246
-msgid ""
-"Language used for the interface (necessitates to restart the application)"
-msgstr ""
-"Langage utilisé pour l'interface (nécessite de redémarrer l'application)"
+#: ../lib/advene/rules/actions.py:269
+msgid "Clip id"
+msgstr "Clip id"
 
-#: ../lib/advene/gui/main.py:4252
-msgid "Record activity trace"
-msgstr "Enregistrer la trace d'activité"
+#: ../lib/advene/rules/actions.py:270 ../lib/advene/rules/actions.py:284
+msgid "Volume (0..100)"
+msgstr "Volume (0 à 100)"
 
-#: ../lib/advene/gui/main.py:4253
-msgid "Expert mode"
-msgstr "Mode expert"
+#: ../lib/advene/rules/actions.py:271 ../lib/advene/rules/actions.py:285
+msgid "Left-right balance: -1 -> full left, 0 -> center, 1 -> full right"
+msgstr "Balance droite-gauche : -1 -> gauche, 0 -> centre, 1 -> droite"
 
-#: ../lib/advene/gui/main.py:4253
-msgid "Offer advanced possibilities"
-msgstr "Afficher les fonctionnalités avancées"
+#: ../lib/advene/rules/actions.py:282
+msgid "Play a sound file"
+msgstr "Jouer un fichier son externe"
 
-#: ../lib/advene/gui/main.py:4254
-msgid "Prefer WYSIWYG"
-msgstr "WYSIWYG préféré"
+#: ../lib/advene/rules/actions.py:283
+msgid "Sound filename"
+msgstr "Nom du fichier son"
 
-#: ../lib/advene/gui/main.py:4254
-msgid "Use WYSIWYG editors when possible (HTML, SVG)"
-msgstr "Utiliser un éditeur WYSIWYG quand c'est possible (HTML, SVG)"
+#: ../lib/advene/rules/actions.py:295
+msgid "Set a state variable"
+msgstr "Définir une variable d'état"
 
-#: ../lib/advene/gui/main.py:4255
-msgid "Player control in edit popups"
-msgstr "Contrôle du lecteur dans les fenêtres d'édition"
+#: ../lib/advene/rules/actions.py:296 ../lib/advene/rules/actions.py:308
+msgid "State variable name"
+msgstr "Nom de la variable d'état"
 
-#: ../lib/advene/gui/main.py:4255
-msgid ""
-"Enable generic player controls in edit windows. This may be undesirable "
-"since it overloads some standard text-edition behaviours (esp. control-left/"
-"right)."
-msgstr ""
-"Activer les raccourcis globaux de contrôle du lecteur dans les\n"
-"fenêtres d'édition. Ce comportement peut être indésirable car il\n"
-"surcharge des raccourcis clavier standard comme contrôle-gauche/droite"
+#: ../lib/advene/rules/actions.py:297
+msgid "State value"
+msgstr "Valeu"
 
-#: ../lib/advene/gui/main.py:4257
-msgid "Open popups"
-msgstr "Ouvrir les vues"
+#: ../lib/advene/rules/actions.py:307
+msgid "Increment a state variable"
+msgstr "Incrémenter une variable d'état"
 
-#: ../lib/advene/gui/main.py:4258
-msgid "Where should we open adhoc views?"
-msgstr "Où doit-on ouvrir les vues adhoc ?"
+#: ../lib/advene/rules/actions.py:317
+msgid "Clear all state variables"
+msgstr "Effacer toutes les variables d'état"
 
-#: ../lib/advene/gui/main.py:4259
-msgid "as a popup window"
-msgstr "dans des fenêtres indépendantes"
+#: ../lib/advene/rules/actions.py:332
+#, python-format
+msgid "Error in the evaluation of the parameter %s:"
+msgstr "Erreur dans l'évaluation du paramètre %s :"
 
-#: ../lib/advene/gui/main.py:4260
-msgid "embedded east of the video"
-msgstr "intégrée à l'est de la vidéo"
+#: ../lib/advene/rules/actions.py:537
+#, python-format
+msgid "Cannot find the stbv %s"
+msgstr "Impossible de trouver la vue dynamique %s"
 
-#: ../lib/advene/gui/main.py:4261
-msgid "embedded west of the video"
-msgstr "intégrée à l'ouest de la vidéo"
+#: ../lib/advene/rules/actions.py:633
+msgid "The set_rate method is unavailable."
+msgstr "La méthode set_rate n'est pas disponible"
 
-#: ../lib/advene/gui/main.py:4262
-msgid "embedded south of the video"
-msgstr "intégrée au sud de la vidéo"
+#: ../lib/advene/rules/actions.py:643
+msgid "No 'soundclips' resource folder in the package"
+msgstr "Pas de ressource 'soundclips' dans ce recueil"
 
-#: ../lib/advene/gui/main.py:4263
-msgid "embedded at the right of the window"
-msgstr "intégrée à droite de la fenêtre"
+#: ../lib/advene/rules/actions.py:668
+msgid "Full volume"
+msgstr "Volume maximum"
 
-#: ../lib/advene/gui/main.py:4266
-msgid "History size"
-msgstr "Taille de l'historique"
+#: ../lib/advene/rules/actions.py:669
+msgid "Left"
+msgstr "Gauche"
 
-#: ../lib/advene/gui/main.py:4266
-msgid "History filelist size limit"
-msgstr "Taille limite de la liste des fichiers"
+#: ../lib/advene/rules/actions.py:671
+msgid "Right"
+msgstr "À droite"
 
-#: ../lib/advene/gui/main.py:4268
-msgid "Remember window size"
-msgstr "Mémoriser les tailles des fenêtres"
+#: ../lib/advene/rules/importer.py:29
+msgid "Event history importer"
+msgstr "Importateur d'historique d'événements"
 
-#: ../lib/advene/gui/main.py:4268
-msgid "Remember the size of opened windows"
-msgstr "Mémoriser la taille des fenêtres"
+#: ../lib/advene/rules/elements.py:144
+msgid "is equal to"
+msgstr "est égal à"
 
-#: ../lib/advene/gui/main.py:4269
-msgid "Bookmark snapshot width"
-msgstr "Largeur des copies d'écran de signets"
+#: ../lib/advene/rules/elements.py:145
+msgid "is different from"
+msgstr "est différent de"
 
-#: ../lib/advene/gui/main.py:4269
-msgid "Width of the snapshots representing bookmarks"
-msgstr "Largeur des captures d'écran représentant les signets"
+#: ../lib/advene/rules/elements.py:146
+msgid "contains"
+msgstr "contient"
 
-#: ../lib/advene/gui/main.py:4270
-msgid "Bookmark snapshot precision"
-msgstr "Précision des captures d'écran pour les signets"
+#: ../lib/advene/rules/elements.py:147
+msgid "is greater than"
+msgstr "est supérieur à"
 
-#: ../lib/advene/gui/main.py:4270
-msgid "Precision (in ms) of the displayed bookmark snapshots."
-msgstr "Précision (en ms) des captures d'écran pour les signets."
+#: ../lib/advene/rules/elements.py:148
+msgid "is lower than"
+msgstr "est inférieur à"
 
-#: ../lib/advene/gui/main.py:4272
-msgid "General"
-msgstr "Générales"
+#: ../lib/advene/rules/elements.py:149
+msgid "matches the regexp"
+msgstr "correspond à l'expression"
 
-#: ../lib/advene/gui/main.py:4273
-msgid "Weekly update check"
-msgstr "Vérification hebdomadaire des mises à jour"
+#: ../lib/advene/rules/elements.py:150
+msgid "is before"
+msgstr "précède"
 
-#: ../lib/advene/gui/main.py:4274
-msgid "On exit,"
-msgstr "À la fin, "
+#: ../lib/advene/rules/elements.py:151
+msgid "meets"
+msgstr "touch"
 
-#: ../lib/advene/gui/main.py:4275
-msgid "How to handle screenshots on exit"
-msgstr "Comment gérer les captures d'écran à la fin de l'application"
+#: ../lib/advene/rules/elements.py:152
+msgid "overlaps"
+msgstr "intersecte"
 
-#: ../lib/advene/gui/main.py:4276
-msgid "never save screenshots"
-msgstr "ne jamais sauvegarder les captures d'écran"
+#: ../lib/advene/rules/elements.py:153
+msgid "during"
+msgstr "est contenue dans"
+
+#: ../lib/advene/rules/elements.py:154
+msgid "starts"
+msgstr "commence avec"
 
-#: ../lib/advene/gui/main.py:4277
-msgid "always save screenshots"
-msgstr "toujours sauvegarder les captures d'écran"
+#: ../lib/advene/rules/elements.py:155
+msgid "finishes"
+msgstr "termine avec"
 
-#: ../lib/advene/gui/main.py:4278
-msgid "ask before saving screenshots"
-msgstr "demander avant de sauvegarder les captures d'écran"
+#: ../lib/advene/rules/elements.py:160
+msgid "is not true"
+msgstr "n'est pas vrai"
 
-#: ../lib/advene/gui/main.py:4280
-msgid "Auto-save"
-msgstr "La sauvegarde automatique"
+#: ../lib/advene/rules/elements.py:161
+msgid "is true"
+msgstr "est vrai"
 
-#: ../lib/advene/gui/main.py:4281
-msgid "Data auto-save functionality"
-msgstr "Sauvegarde automatique des recueils"
+#: ../lib/advene/rules/elements.py:165
+msgid "Basic conditions"
+msgstr "Conditions élémenaires"
 
-#: ../lib/advene/gui/main.py:4282
-msgid "is desactivated"
-msgstr "est désactivée"
+#: ../lib/advene/rules/elements.py:166
+msgid "Allen relations"
+msgstr "Relations de Allen"
 
-#: ../lib/advene/gui/main.py:4283
-msgid "is done automatically"
-msgstr "est activée"
+#: ../lib/advene/rules/elements.py:229 ../lib/advene/rules/elements.py:235
+msgid "Unknown type for overlaps comparison"
+msgstr "Type inconnu pour comparaison de recouvrement"
 
-#: ../lib/advene/gui/main.py:4284
-msgid "is done after confirmation"
-msgstr "est activée avec confirmation"
+#: ../lib/advene/rules/elements.py:243 ../lib/advene/rules/elements.py:249
+msgid "Unknown type for during comparison"
+msgstr "Type inconnu pour comparaison"
 
-#: ../lib/advene/gui/main.py:4286
-msgid "Auto-save interval (in s)"
-msgstr "Intervalle de sauvegarde automatique (en s)"
+#: ../lib/advene/rules/elements.py:518 ../lib/advene/rules/elements.py:524
+#, python-format
+msgid "Unknown action %s"
+msgstr "Action inconnue %s"
 
-#: ../lib/advene/gui/main.py:4286
-msgid "Interval (in seconds) between package auto-saves"
-msgstr "Durée (en secondes) entre deux sauvegardes automatiques"
+#: ../lib/advene/rules/elements.py:525
+#, python-format
+msgid "Unknown parameter %s"
+msgstr "Paramètre inconnu %s"
 
-#: ../lib/advene/gui/main.py:4288
-msgid "Workspace"
-msgstr "Environnement"
+#: ../lib/advene/rules/elements.py:530
+msgid "Unknown actions"
+msgstr "Actions inconnues"
 
-#: ../lib/advene/gui/main.py:4290
-msgid "On package saving,"
-msgstr "Lors de la sauvegarde du recueil,"
+#: ../lib/advene/rules/elements.py:982
+msgid "Start of the editing of an element"
+msgstr "Début de l'édition d'un élément"
 
-#: ../lib/advene/gui/main.py:4291
-msgid "Do you wish to save the default workspace with the package?"
-msgstr "Voulez-vous sauvegarder l'environnement avec le recueil ?"
+#: ../lib/advene/rules/elements.py:983
+msgid "Cancel of the editing of an element"
+msgstr "Abandon de l'édition d'un élément"
 
-#: ../lib/advene/gui/main.py:4292
-msgid "never save the current workspace"
-msgstr "ne jamais sauvegarder l'environnement courant"
+#: ../lib/advene/rules/elements.py:984
+msgid "Destruction of the edit window of an element"
+msgstr "Destruction de la fenêtre d'édition d'un élément"
 
-#: ../lib/advene/gui/main.py:4293
-msgid "always save the current workspace"
-msgstr "toujours sauvegarder l'environnement courant"
+#: ../lib/advene/rules/elements.py:985
+msgid "Validation of the editing of an element"
+msgstr "Validation de l'édition d'un élément"
 
-#: ../lib/advene/gui/main.py:4294
-msgid "ask before saving the current workspace"
-msgstr "demander avant de sauvegarder l'environnement courant"
+#: ../lib/advene/rules/elements.py:986
+msgid "Ending editing of a package"
+msgstr "Fin de l'édition d'un recueil"
 
-#: ../lib/advene/gui/main.py:4296
-msgid "Auto-validation of edited elements"
-msgstr "Validation automatique des éléments"
+#: ../lib/advene/rules/elements.py:987
+msgid "Beginning of an annotation"
+msgstr "Début d'une annotation"
 
-#: ../lib/advene/gui/main.py:4296
-msgid "Automatically validate modified elements when saving the package."
-msgstr "Valider automatiquement les éléments modifiés lors de la sauvegarde."
+#: ../lib/advene/rules/elements.py:988
+msgid "End of an annotation"
+msgstr "Fin d'une annotation"
 
-#: ../lib/advene/gui/main.py:4298
-msgid "On package load,"
-msgstr "Lors du chargement du recueil,"
+#: ../lib/advene/rules/elements.py:989
+msgid "Creation of a new annotation"
+msgstr "Création d'une nouvelle annotation"
 
-#: ../lib/advene/gui/main.py:4299
-msgid "Do you wish to load the workspace saved with the package?"
-msgstr "Voulez-vous restaurer l'environnement sauvegardé avec le recueil ?"
+#: ../lib/advene/rules/elements.py:990
+msgid "Ending editing of an annotation"
+msgstr "Fin de l'édition d'une annotation"
 
-#: ../lib/advene/gui/main.py:4300
-msgid "never load the saved workspace"
-msgstr "ne jamais restaurer l'environnement sauvegardé"
+#: ../lib/advene/rules/elements.py:991
+msgid "Suppression of an annotation"
+msgstr "Suppression d'une annotation"
 
-#: ../lib/advene/gui/main.py:4301
-msgid "always load the saved workspace"
-msgstr "toujours restaurer l'environnement sauvegardé"
+#: ../lib/advene/rules/elements.py:992
+msgid "Activation of an annotation"
+msgstr "Activation d'une annotation"
 
-#: ../lib/advene/gui/main.py:4302
-msgid "ask before loading the saved workspace"
-msgstr "demander avant de restaurer l'environnement sauvegardé"
+#: ../lib/advene/rules/elements.py:993
+msgid "Deactivation of an annotation"
+msgstr "Désactivation d'une annotation"
 
-#: ../lib/advene/gui/main.py:4305
-msgid "Video Player"
-msgstr "Lecteur Vidéo"
+#: ../lib/advene/rules/elements.py:994
+msgid "Merging of two annotations"
+msgstr "Fusion de deux annotations"
 
-#: ../lib/advene/gui/main.py:4306
-msgid "Autostart"
-msgstr "Démarrage automatique"
+#: ../lib/advene/rules/elements.py:995
+msgid "Moving an annotation"
+msgstr "Déplacement d'une annotation"
 
-#: ../lib/advene/gui/main.py:4306
-msgid ""
-"Automatically start the player when loading a media file (either directly or "
-"through a package)"
-msgstr ""
-"Lancer automatiquement le lecteur lors du chargement d'une vidéo (soit "
-"directement, soit via un recueil)"
+#: ../lib/advene/rules/elements.py:996
+msgid "Activation of a relation"
+msgstr "Activation d'une relation"
 
-#: ../lib/advene/gui/main.py:4307
-msgid "Fulscreen timestamp"
-msgstr "Timestamp plein-écran"
+#: ../lib/advene/rules/elements.py:997
+msgid "Deactivation of a relation"
+msgstr "Désactivation d'une relation"
 
-#: ../lib/advene/gui/main.py:4307
-msgid "Display the timestamp over the video when in fullscreen mode"
-msgstr "Afficher le temps sur la vidéo en mode plein écran"
+#: ../lib/advene/rules/elements.py:998
+msgid "Creation of a new relation"
+msgstr "Création d'une nouvelle relation"
 
-#: ../lib/advene/gui/main.py:4308
-msgid "Enable captions"
-msgstr "Activer le sous-titrage externe"
+#: ../lib/advene/rules/elements.py:999
+msgid "Ending editing of a relation"
+msgstr "Fin de l'édition d'une relation"
 
-#: ../lib/advene/gui/main.py:4308
-msgid "Enable captions over the video"
-msgstr ""
-"Activer le sous-titrage par le biais d'un composant d'affichage sous le "
-"lecteur vidéo"
+#: ../lib/advene/rules/elements.py:1000
+msgid "Suppression of a relation"
+msgstr "Suppression d'une relation"
 
-#: ../lib/advene/gui/main.py:4309
-msgid "Caption font"
-msgstr "Police de sous-titrage"
+#: ../lib/advene/rules/elements.py:1001
+msgid "Creation of a new view"
+msgstr "Création d'une nouvelle vue"
 
-#: ../lib/advene/gui/main.py:4309
-msgid "TrueType font for captions"
-msgstr "Police TrueType pour les sous-titres"
+#: ../lib/advene/rules/elements.py:1002
+msgid "Ending editing of a view"
+msgstr "Fin de l'édition d'une Vue"
 
-#: ../lib/advene/gui/main.py:4310
-msgid "Enable SVG"
-msgstr "Activer le SVG"
+#: ../lib/advene/rules/elements.py:1003
+msgid "Suppression of a view"
+msgstr "Suppression d'une vue"
 
-#: ../lib/advene/gui/main.py:4310
-msgid "Enable SVG captions over the video"
-msgstr "Activer l'affichage de graphiques SVG sur la vidéo"
+#: ../lib/advene/rules/elements.py:1004
+msgid "Creation of a new query"
+msgstr "Création d'une nouvelle requête"
 
-#: ../lib/advene/gui/main.py:4312
-msgid "Enable snapshots"
-msgstr "Activer les copies d'écran"
+#: ../lib/advene/rules/elements.py:1005
+msgid "Ending editing of a query"
+msgstr "Fin de l'édition d'une requête"
 
-#: ../lib/advene/gui/main.py:4313
-msgid "Snapshot width"
-msgstr "Largeur des copies d'écran"
+#: ../lib/advene/rules/elements.py:1006
+msgid "Suppression of a query"
+msgstr "Suppression d'une requête"
 
-#: ../lib/advene/gui/main.py:4313
-msgid "Snapshot width in pixels."
-msgstr "Largeur (en pixels) des copies d'écran"
+#: ../lib/advene/rules/elements.py:1007
+msgid "Creation of a new schema"
+msgstr "Création d'un nouveau schéma"
 
-#: ../lib/advene/gui/main.py:4314
-msgid "Verbosity"
-msgstr "Verbosité"
+#: ../lib/advene/rules/elements.py:1008
+msgid "Ending editing of a schema"
+msgstr "Fin de l'édition d'un schéma"
 
-#: ../lib/advene/gui/main.py:4314
-msgid "Verbosity level. -1 for no messages."
-msgstr "Niveau de verbosité. -1 pour pas de messages."
+#: ../lib/advene/rules/elements.py:1009
+msgid "Suppression of a schema"
+msgstr "Suppression d'un schéma"
 
-#: ../lib/advene/gui/main.py:4317
-msgid "Devices"
-msgstr "Périphériques"
+#: ../lib/advene/rules/elements.py:1011
+msgid "Ending editing an annotation type"
+msgstr "Fin de l'édition d'un type d'annotation"
 
-#: ../lib/advene/gui/main.py:4319
-msgid "Standard"
-msgstr "Standard"
+#: ../lib/advene/rules/elements.py:1012
+msgid "Suppression of an annotation type"
+msgstr "Suppression d'un type d'annotation"
 
-#: ../lib/advene/gui/main.py:4321
-msgid "DVD drive"
-msgstr "Lecteur DVD"
+#: ../lib/advene/rules/elements.py:1013
+msgid "Creation of a new relation type"
+msgstr "Création d'un nouveau type de relation"
 
-#: ../lib/advene/gui/main.py:4321
-msgid "Drive letter for the DVD"
-msgstr "Lettre du lecteur DVD"
+#: ../lib/advene/rules/elements.py:1014
+msgid "Ending editing a relation type"
+msgstr "Fin de l'édition d'un type de relation"
 
-#: ../lib/advene/gui/main.py:4322
-msgid "GDI"
-msgstr "GDI"
+#: ../lib/advene/rules/elements.py:1015
+msgid "Suppression of a relation type"
+msgstr "Suppression d'un type de relation"
 
-#: ../lib/advene/gui/main.py:4323
-msgid "Direct X"
-msgstr "Direct X"
+#: ../lib/advene/rules/elements.py:1016
+msgid "Creation of a new resource"
+msgstr "Création d'une nouvelle ressource"
 
-#: ../lib/advene/gui/main.py:4325
-msgid "DVD device"
-msgstr "Périphérique DVD"
+#: ../lib/advene/rules/elements.py:1017
+msgid "Ending editing of a resource"
+msgstr "Fin de l'édition d'une ressource"
 
-#: ../lib/advene/gui/main.py:4325
-msgid "Device for the DVD"
-msgstr "Device du DVD"
+#: ../lib/advene/rules/elements.py:1018
+msgid "Suppression of a resource"
+msgstr "Suppression d'une ressource"
 
-#: ../lib/advene/gui/main.py:4326
-msgid "X11"
-msgstr "X11"
+#: ../lib/advene/rules/elements.py:1019
+msgid "Modification of the tag"
+msgstr "Modification du tag"
 
-#: ../lib/advene/gui/main.py:4327
-msgid "XVideo"
-msgstr "XVideo"
+#: ../lib/advene/rules/elements.py:1020
+msgid "Activating a link"
+msgstr "Activation d'un lien"
 
-#: ../lib/advene/gui/main.py:4328
-msgid "GL"
-msgstr "GL"
+#: ../lib/advene/rules/elements.py:1021
+msgid "Player start"
+msgstr "Lecture"
 
-#: ../lib/advene/gui/main.py:4330
-msgid "Video output"
-msgstr "Sortie vidéo"
+#: ../lib/advene/rules/elements.py:1022
+msgid "Player stop"
+msgstr "Stop"
 
-#: ../lib/advene/gui/main.py:4330
-msgid "Video output module"
-msgstr "Module de sortie vidéo"
+#: ../lib/advene/rules/elements.py:1023
+msgid "Player pause"
+msgstr "Pause"
 
-#: ../lib/advene/gui/main.py:4332
-msgid "Recorder options"
-msgstr "Options d'enregistrement"
+#: ../lib/advene/rules/elements.py:1024
+msgid "Player resume"
+msgstr "Relance"
 
-#: ../lib/advene/gui/main.py:4333
-msgid "Audio input"
-msgstr "Entrée audio"
+#: ../lib/advene/rules/elements.py:1025
+msgid "Going to a given position"
+msgstr "Déplacement à une position donnée"
 
-#: ../lib/advene/gui/main.py:4333
-msgid "Device name for audio input (with gstrecorder plugin)"
-msgstr "Nom du périphérique pour l'entrée audio (pour le plugin gstrecorder)"
+#: ../lib/advene/rules/elements.py:1026
+msgid "Loading a new package"
+msgstr "Chargement d'un nouveau recueil"
 
-#: ../lib/advene/gui/main.py:4334
-msgid "Record video"
-msgstr "Enregistrement vidéo"
+#: ../lib/advene/rules/elements.py:1027
+msgid "Activating a package"
+msgstr "Activation d'un recueil"
 
-#: ../lib/advene/gui/main.py:4334
-msgid "Record both video and audio"
-msgstr "Enregistrer audio et vidéo"
+#: ../lib/advene/rules/elements.py:1028
+msgid "Saving the package"
+msgstr "Sauvegarde du recueil"
 
-#: ../lib/advene/gui/main.py:4337
-msgid "<i>Experimental</i>"
-msgstr "Expérimental"
+#: ../lib/advene/rules/elements.py:1029
+msgid "Start of the dynamic view"
+msgstr "Activation d'une vue dynamique"
 
-#: ../lib/advene/gui/main.py:4338
-msgid "Embed the caption scroller below the video"
-msgstr "Intégrer le dérouleur sous la vidéo"
+#: ../lib/advene/rules/elements.py:1030
+msgid "End of the dynamic view"
+msgstr "Fin d'une vue dynamique"
 
-#: ../lib/advene/gui/main.py:4339
-msgid "Embed the caption view below the video"
-msgstr "Intégrer la visuablisation de sous-titres sous la vidéo"
+#: ../lib/advene/rules/elements.py:1031
+msgid "Start of the application"
+msgstr "Début de l'application"
 
-#: ../lib/advene/gui/main.py:4341
-msgid "Time-related"
-msgstr "Relatives au temps"
+#: ../lib/advene/rules/elements.py:1032
+msgid "End of the application"
+msgstr "Fin de l'application"
 
-#: ../lib/advene/gui/main.py:4342
-msgid "Time format"
-msgstr "Format des temps"
+#: ../lib/advene/rules/elements.py:1033
+msgid "User-defined event"
+msgstr "Événement utilisateur"
 
-#: ../lib/advene/gui/main.py:4342
-msgid "Format used to display timecodes"
-msgstr "Format utilisé pour afficher les timecodes"
+#: ../lib/advene/rules/elements.py:1034
+msgid "Modification of the associated media"
+msgstr "Modification du média associé"
 
-#: ../lib/advene/gui/main.py:4356
-msgid "Default FPS"
-msgstr "FPS par défaut"
+#: ../lib/advene/rules/elements.py:1035
+msgid "Highlight a bookmark"
+msgstr "Surligner un signet"
 
-#: ../lib/advene/gui/main.py:4357
-msgid ""
-"Default FPS (frame-per-second) value, when entering or displaying timestamps "
-"with frame numbers."
-msgstr ""
-"Valeur FPS (image par seconde) par défaut, lors de la saisie ou de\n"
-"l'affichage de timecodes avec des numéros d'image."
+#: ../lib/advene/rules/elements.py:1036
+msgid "Unhighlight a bookmark"
+msgstr "Désurligner un signet"
 
-#: ../lib/advene/gui/main.py:4358
-msgid "Time increment"
-msgstr "Durée pour navigation"
+#: ../lib/advene/rules/elements.py:1037
+msgid "Updating duration of the movie"
+msgstr "Modification de la durée du film"
 
-#: ../lib/advene/gui/main.py:4358
-msgid ""
-"Skip duration, when using control-left/right or forward/rewind buttons (in "
-"ms)."
-msgstr ""
-"Réglage de la durée (en ms) utilisée avec contrôle-flèche ou les boutons "
-"avance/retour rapide"
+#: ../lib/advene/rules/elements.py:1038
+msgid "Displaying a popup"
+msgstr "Affichage d'une popup"
 
-#: ../lib/advene/gui/main.py:4359
-msgid "Second time increment"
-msgstr "Seconde durée pour navigation"
+#: ../lib/advene/rules/elements.py:1039
+msgid "Updating a snapshot"
+msgstr "Mise-à-jour d'une vignette"
 
-#: ../lib/advene/gui/main.py:4359
-msgid "Skip duration, when using control-shift-left/right (in ms)."
-msgstr ""
-"Réglage de la durée (en ms) utilisée avec contrôle-shift-flèche ou les "
-"boutons avance/retour rapide"
+#: ../lib/advene/rules/elements.py:1077
+msgid "Player control"
+msgstr "Contrôle du lecteur"
 
-#: ../lib/advene/gui/main.py:4360
-msgid "Third time increment"
-msgstr "Troisième durée pour navigation"
+#: ../lib/advene/rules/elements.py:1078
+msgid "Audio enrichment"
+msgstr "Enrichissement audio"
 
-#: ../lib/advene/gui/main.py:4360
-msgid "Skip duration, when using control-shift-up/down (in ms)."
-msgstr "Réglage de la durée (en ms) utilisée avec contrôle-shift-haut/bas."
+#: ../lib/advene/rules/elements.py:1079
+msgid "Image enrichment"
+msgstr "Enrichissement image"
 
-#: ../lib/advene/gui/main.py:4361
-msgid "Custom Up/Down"
-msgstr "Haut/Bas personnalisés"
+#: ../lib/advene/rules/elements.py:1080
+msgid "External display control"
+msgstr "Contrôle d'un affichage extérieur"
 
-#: ../lib/advene/gui/main.py:4361
-msgid ""
-"Use third time increment for up/down navigation without having to hold shift."
-msgstr ""
-"Utiliser la troisième durée pour naviguer avec Haut/Bas sans avoir à "
-"utiliser Shift."
+#: ../lib/advene/rules/elements.py:1081
+msgid "Popup"
+msgstr "Popup"
 
-#: ../lib/advene/gui/main.py:4363
-msgid "Scroll increment"
-msgstr "Incrément de temps"
+#: ../lib/advene/rules/elements.py:1083
+msgid "State"
+msgstr "Statut "
 
-#: ../lib/advene/gui/main.py:4363
-msgid ""
-"On most annotations, control+scrollwheel will increment/decrement their "
-"bounds by this value (in ms)."
-msgstr ""
-"Sur les annotations, contrôle + molette permet d'incrémenter/décrémenter "
-"leurs bornes de cette valeur (en ms)."
+#: ../lib/advene/rules/elements.py:1084
+msgid "GUI actions"
+msgstr "Actions sur l'interface"
 
-#: ../lib/advene/gui/main.py:4364
-msgid "Second scroll increment"
-msgstr "Second incrément de scroll"
+#: ../lib/advene/rules/elements.py:1085
+msgid "Expert"
+msgstr "Expert"
 
-#: ../lib/advene/gui/main.py:4364
-msgid ""
-"On most annotations, control+shift+scrollwheel will increment/decrement "
-"their bounds by this value (in ms)."
-msgstr ""
-"Sur les annotations, contrôle + shift + molette permet d'incrémenter/"
-"décrémenter leurs bornes de cette valeur (en ms)."
+#: ../lib/advene/util/helper.py:409
+msgid "Annotation"
+msgstr "Annotation"
 
-#: ../lib/advene/gui/main.py:4366
-msgid "Player sync"
-msgstr "Synchro des lecteurs"
+#: ../lib/advene/util/helper.py:410
+msgid "Relation"
+msgstr "Relation"
 
-#: ../lib/advene/gui/main.py:4366
-msgid ""
-"Interval (in ms) with which we synchronize slave players. Setting a too-low "
-"value could render the application unusable. Use 0 to disable continuous "
-"synchronization."
-msgstr ""
-"Intervalle (en ms) avec lequel on synchronise les lecteurs esclaves. Une "
-"valeur trop basse peut rendre l'application inutilisable. Entrez 0 pour "
-"désactiver la synchronisation continue."
+#: ../lib/advene/util/helper.py:416
+msgid "Resource Folder"
+msgstr "Répertoire de ressources"
 
-#: ../lib/advene/gui/main.py:4367
-msgid "Timeline parameters"
-msgstr "Paramètres de la ligne de temps"
+#: ../lib/advene/util/helper.py:452
+msgid "---- Elements ----"
+msgstr "---- Éléments ----"
 
-#: ../lib/advene/gui/main.py:4368
-msgid "Font size for annotation widgets"
-msgstr "Taille de la police pour les représentations d'annotations"
+#: ../lib/advene/util/helper.py:458
+msgid "---- Attributes ----"
+msgstr "---- Attributs ----"
 
-#: ../lib/advene/gui/main.py:4369
-msgid "Button height"
-msgstr "Hauteur des boutons"
+#: ../lib/advene/util/helper.py:461
+msgid "---- Methods ----"
+msgstr "---- Méthodes ----"
 
-#: ../lib/advene/gui/main.py:4369
-msgid "Height of annotation widgets"
-msgstr "Hauteur des représentations d'annotations"
+#: ../lib/advene/util/helper.py:534
+#, python-format
+msgid "Cannot read %(filename)s: %(error)s"
+msgstr "Impossible de lire %(filename)s : %(error)s"
 
-#: ../lib/advene/gui/main.py:4370
-msgid "Interline height"
-msgstr "Taille des interlignes"
+#: ../lib/advene/util/helper.py:541
+#, python-format
+msgid "File %s is not an Advene zip package - no mimetype."
+msgstr "Le fichier %s n'est pas un recueil Advene compressé - pas de mimetype."
 
-#: ../lib/advene/gui/main.py:4370
-msgid "Height of interlines"
-msgstr "Taille des interlignes"
+#: ../lib/advene/util/helper.py:543
+#, python-format
+msgid "File %(fname)s is not an Advene zip package - wrong mimetype %(type)s."
+msgstr ""
+"Le fichier %s n'est pas un recueil Advene compressé - mauvais mimetype "
+"%(type)s."
 
-#: ../lib/advene/gui/main.py:4372
-msgid "Text content"
-msgstr "Contenu textuel"
+#: ../lib/advene/util/helper.py:559
+#, python-format
+msgid ""
+"Error:\n"
+"%s"
+msgstr ""
+"Erreur :\n"
+"%s"
 
-#: ../lib/advene/gui/main.py:4373
-msgid "Completion mode"
-msgstr "Mode de complétion"
+#: ../lib/advene/util/helper.py:641
+msgid "schema"
+msgstr "schéma"
 
-#: ../lib/advene/gui/main.py:4373
-msgid "Enable dynamic completion mode"
-msgstr "Activer la complétion dynamique"
+#: ../lib/advene/util/helper.py:641
+msgid "schemas"
+msgstr "schémas"
 
-#: ../lib/advene/gui/main.py:4374
-msgid "Abbreviation mode"
-msgstr "Mode abbréviation"
+#: ../lib/advene/util/helper.py:642
+msgid "annotation"
+msgstr "annotation"
 
-#: ../lib/advene/gui/main.py:4374
-msgid "Enable abbreviation mode"
-msgstr "Activer l'expansion des abbréviations"
+#: ../lib/advene/util/helper.py:642
+msgid "annotations"
+msgstr "annotations"
 
-#: ../lib/advene/gui/main.py:4375
-msgid "Abbreviations"
-msgstr "Abbréviations"
+#: ../lib/advene/util/helper.py:643 ../lib/advene/util/helper.py:644
+msgid "annotation type"
+msgstr "type d'annotation"
 
-#: ../lib/advene/gui/main.py:4375
-msgid ""
-"Text abbreviations. 1 entry per line. Each line consists of the abbreviation "
-"followed by its replacement."
-msgstr ""
-"Abbréviations textuelles. Une entrée par ligne. Chaque ligne contient "
-"l'abbréviation suivie par son remplacement."
+#: ../lib/advene/util/helper.py:643 ../lib/advene/util/helper.py:644
+msgid "annotation types"
+msgstr "types d'annotation"
 
-#: ../lib/advene/gui/main.py:4377
-msgid "Text-To-Speech"
-msgstr "Synthèse vocale"
+#: ../lib/advene/util/helper.py:645
+msgid "relation"
+msgstr "relation"
 
-#: ../lib/advene/gui/main.py:4378
-msgid "TTS language"
-msgstr "Langue de la synthèse vocale"
+#: ../lib/advene/util/helper.py:645
+msgid "relations"
+msgstr "relations"
 
-#: ../lib/advene/gui/main.py:4379
-msgid "What language settings should be used for text-to-speech"
-msgstr "Quelle langue doit être utilisée pour la synthèse vocale"
+#: ../lib/advene/util/helper.py:646 ../lib/advene/util/helper.py:647
+msgid "relation type"
+msgstr "type de relation"
 
-#: ../lib/advene/gui/main.py:4380
-msgid "English"
-msgstr "Anglais"
+#: ../lib/advene/util/helper.py:646 ../lib/advene/util/helper.py:647
+msgid "relation types"
+msgstr "types de relation"
+
+#: ../lib/advene/util/helper.py:648
+msgid "query"
+msgstr "requête"
 
-#: ../lib/advene/gui/main.py:4381
-msgid "French"
-msgstr "Français"
+#: ../lib/advene/util/helper.py:648
+msgid "queries"
+msgstr "requêtes"
 
-#: ../lib/advene/gui/main.py:4382
-msgid "Spanish"
-msgstr "Espagnol"
+#: ../lib/advene/util/helper.py:649
+msgid "view"
+msgstr "vue"
 
-#: ../lib/advene/gui/main.py:4384
-msgid "TTS Encoding"
-msgstr "Encodage TTS"
+#: ../lib/advene/util/helper.py:649
+msgid "views"
+msgstr "vues"
 
-#: ../lib/advene/gui/main.py:4385
-msgid "What encoding should be used to communicate with the TTS engine"
-msgstr ""
-"Quel encodage de caractères doit être utilisé pour communiquer avec le "
-"moteur de synthèse vocale"
+#: ../lib/advene/util/helper.py:650
+msgid "package"
+msgstr "recueil"
 
-#: ../lib/advene/gui/main.py:4386
-msgid "TTS Engine"
-msgstr "Moteur de synthèse vocale"
+#: ../lib/advene/util/helper.py:650
+msgid "packages"
+msgstr "recueils"
 
-#: ../lib/advene/gui/main.py:4387
-msgid ""
-"Which TTS engine should be used (modification requires restarting Advene to "
-"take into account)"
-msgstr ""
-"Quel moteur de synthèse vocale doit être utilisé (le changement requiert le "
-"redémarrage de l'application pour être pris en compte)"
+#: ../lib/advene/util/helper.py:662
+#, python-format
+msgid "No %s"
+msgstr "Pas de %s"
 
-#: ../lib/advene/gui/main.py:4388
-msgid "Automatic"
-msgstr "Automatique"
+#: ../lib/advene/util/helper.py:664
+#, python-format
+msgid "1 %s"
+msgstr "1 %s"
 
-#: ../lib/advene/gui/main.py:4389
-msgid "eSpeak"
-msgstr "eSpeak"
+#: ../lib/advene/util/helper.py:666
+#, python-format
+msgid "%(count)d %(plural)s"
+msgstr "%(count)d %(plural)s"
 
-#: ../lib/advene/gui/main.py:4390
-msgid "Custom script with standard input"
-msgstr "Script personnel via l'entrée standard"
+#: ../lib/advene/util/website_export.py:63
+#, python-format
+msgid "%s exists but is not a directory. Cancelling website export"
+msgstr "%s existe mais n'est pas un répertoire. Abandon de l'export."
 
-#: ../lib/advene/gui/main.py:4391
-msgid "Custom script with arguments"
-msgstr "Script personnel via les arguments"
+#: ../lib/advene/util/website_export.py:69
+#, python-format
+msgid "%s does not exist"
+msgstr "%s n'existe pas"
 
-#: ../lib/advene/gui/main.py:4392
-msgid "SAPI"
-msgstr "SAPI"
+#: ../lib/advene/util/website_export.py:423
+msgid "Starting export"
+msgstr "Début de l'export"
 
-#: ../lib/advene/gui/main.py:4393
-msgid "MacOS X say"
-msgstr "Commande \"say\" de MacOS X"
+#: ../lib/advene/util/website_export.py:452
+#, python-format
+msgid "Depth %d"
+msgstr "Profondeur %d"
 
-#: ../lib/advene/gui/main.py:4394
-msgid "Generic (text output)"
-msgstr "Générique (affichage du texte)"
+#: ../lib/advene/util/website_export.py:456
+#, python-format
+msgid "Depth %(depth)d: processing %(url)s"
+msgstr "Profondeur %(depth)d: traitement de %(url)s"
 
-#: ../lib/advene/gui/main.py:4438
-msgid "You should restart Advene to take some options into account."
-msgstr "Vous devez redémarrer Advene pour prendre certaines options en compte."
+#: ../lib/advene/util/website_export.py:478
+msgid "Finalizing"
+msgstr "Finalisation"
 
-#: ../lib/advene/gui/main.py:4447
+#: ../lib/advene/util/website_export.py:512
 #, python-format
-msgid "Imagecache saved to %s"
-msgstr "Cache d'image sauvé dans %s"
+msgid ""
+"<p><strong>You should probably begin at <a href=\"%(href)s\">%(title)s</a>.</"
+"strong></p>"
+msgstr ""
+"<p><strong>Vous devriez probablement commencer à <a href=\"%(href)s\">"
+"%(title)s</a>.</strong></p>"
 
-#: ../lib/advene/gui/main.py:4460
-msgid "Restarting player..."
-msgstr "Redémarrage du lecteur multimédia..."
+#: ../lib/advene/util/website_export.py:555
+msgid "Export complete"
+msgstr "Export terminé"
 
-#: ../lib/advene/gui/main.py:4512
-msgid "Advene log"
-msgstr "Advene log"
+#: ../lib/advene/util/importer.py:134
+msgid "Generic importer"
+msgstr "Importateur générique"
 
-#: ../lib/advene/gui/main.py:4581
-msgid "Select the package to merge"
-msgstr "Sélectionnez le recueil à fusionner"
+#: ../lib/advene/util/importer.py:188
+msgid "Usage: %prog [options] source-file destination-file"
+msgstr "Usage: %prog [options] fichier-source fichier-destination"
 
-#: ../lib/advene/gui/main.py:4602
-msgid "Saving workspace"
-msgstr "Sauvegarde de l'environnement"
+#: ../lib/advene/util/importer.py:192
+msgid "Specify the offset in ms"
+msgstr "Précisez l'offset en ms"
 
-#: ../lib/advene/gui/main.py:4605
-msgid "Enter a view name to save the workspace"
-msgstr "Entrez un nom de vue pour sauvegarder cet environnement"
+#: ../lib/advene/util/importer.py:264
+msgid ""
+"Import filter error. The asynchronous API should be used, please report a "
+"bug."
+msgstr ""
+"Erreur dans le filtre d'import. L'API asynchrone devrait être\n"
+"utilisée, faites un rapport de bug SVP."
 
-#: ../lib/advene/gui/main.py:4606
-msgid "Default workspace"
-msgstr "Environnement standard"
+#: ../lib/advene/util/importer.py:266
+msgid ""
+"Import filter error. No conversion method is defined,  please report a bug."
+msgstr ""
+"Erreur dans le filtre d'import. Aucune méthode de conversion définie, faites "
+"un rapport de bug SVP."
 
-#: ../lib/advene/gui/main.py:4607
-msgid "Open this workspace when opening the package"
-msgstr "Ouvrir cet environnement lors du chargement du recueil"
+#: ../lib/advene/util/importer.py:532
+msgid "ExternalApp importer"
+msgstr "Importateur d'application externe"
 
-#: ../lib/advene/gui/main.py:4641
+#: ../lib/advene/util/importer.py:546
 #, python-format
-msgid "Error: the view %s exists and is not a workspace view."
-msgstr "Erreur : la vue %s existe mais n'est pas une vue d'environnement"
+msgid ""
+"The <b>%s</b> application does not seem to be installed. Please check that "
+"it is present and that its path is correctly specified in preferences."
+msgstr ""
+"L'application <b>%s</b> ne semble pas installée. Merci de vérifier qu'elle "
+"est bien présente et que son chemin est correctement spécifié dans les "
+"préférences."
 
-#: ../lib/advene/gui/main.py:4672
+#: ../lib/advene/util/importer.py:548
 #, python-format
-msgid "Cannot save default workspace: %s"
-msgstr "Impossible de sauvegarder l'environnement par défaut : %s"
+msgid "The file %s does not seem to exist."
+msgstr "Le fichier %s semble ne pas exister."
 
-#: ../lib/advene/gui/main.py:4682
-msgid "Standard workspace has been saved"
-msgstr "L'environnement standard a été sauvé"
+#: ../lib/advene/util/importer.py:570
+#, python-format
+msgid "Could not run %(appname)s: %(msg)s"
+msgstr "Impossible d'exécuter %(appname)s: %(msg)s"
 
-#: ../lib/advene/gui/main.py:4689
-msgid "Website export"
-msgstr "Export de site web"
+# Traitement de %s
+#: ../lib/advene/util/importer.py:572
+#, python-format
+msgid "Processing %s"
+msgstr "Traitement de %s"
 
-#: ../lib/advene/gui/main.py:4690
-msgid "Exporting views to a website"
-msgstr "Exporter les vues vers un site web"
+#: ../lib/advene/util/importer.py:576
+msgid "Cleaning up..."
+msgstr "Nettoyage..."
 
-#: ../lib/advene/gui/main.py:4693
-msgid "Output directory"
-msgstr "Répertoire destination"
+#: ../lib/advene/util/importer.py:687
+msgid "Text importer"
+msgstr "Importateur texte"
 
-#: ../lib/advene/gui/main.py:4702
-msgid "Specify the output directory"
-msgstr "Précisez le répertoire de destination"
+#: ../lib/advene/util/importer.py:700 ../lib/advene/util/importer.py:1225
+msgid "Specify the encoding of the input file (latin1, utf8...)"
+msgstr "Spécifiez l'encodage du fichier d'entrée (latin, utf8...)"
 
-#: ../lib/advene/gui/main.py:4711
-msgid "Maximum recursion depth"
-msgstr "Niveau maximal de récursivité"
+#: ../lib/advene/util/importer.py:703
+msgid "Should the timestamps be encoded relative to the first timestamp?"
+msgstr ""
+"Les timecodes doivent-ils être décalés en considérant le premier à zéro ?"
 
-#: ../lib/advene/gui/main.py:4718
-msgid "Video URL"
-msgstr "URL de la vidéo"
+#: ../lib/advene/util/importer.py:706
+msgid "Unit to consider for integers"
+msgstr "Unité à utiliser pour les entiers"
 
-#: ../lib/advene/gui/main.py:4720
+#: ../lib/advene/util/importer.py:709
 msgid ""
-"URL for the video, if it is available on a sharing website (Only Youtube for "
-"the moment).\n"
-" It can also be a h264/ogg file, which will in this case be handled by the "
-"HTML5 video player."
+"What timestamps are present in a line (only begin, both begin and end, or "
+"automatic recognition)"
 msgstr ""
-"URL pour la vidéo, si elle est disponible en ligne (youtube seulement\n"
-" pour le moment).\n"
-"Ce peut aussi être un fichier h264 ou ogg, qui sera dans ce cas\n"
-" intégré via un player HTML5."
+"Quels timecodes sont présents sur une ligne : uniquement le début\n"
+"(begin), début et fin (both) ou reconnaissance automatique (auto)"
 
-#: ../lib/advene/gui/main.py:4770
-msgid "Could not export data: "
-msgstr "Impossible d'exporter les données : "
+#: ../lib/advene/util/importer.py:852
+msgid "lsdvd importer"
+msgstr "Importateur lsdvd"
 
-#: ../lib/advene/gui/main.py:4772
-#, python-format
-msgid "Website export to %s completed"
-msgstr "Export de site web vers %s terminé"
+#: ../lib/advene/util/importer.py:879
+msgid "Processing data"
+msgstr "Traitement des données"
 
-#: ../lib/advene/gui/main.py:4811
-msgid "This video player is not able to grab specific screenshots"
-msgstr ""
-"Ce lecteur vidéo n'est pas capable de faire des captures d'écran à des "
-"moments précis."
+#: ../lib/advene/util/importer.py:897 ../lib/advene/util/importer.py:957
+msgid "DVD Chapter"
+msgstr "Chapitre DVD"
 
-#: ../lib/advene/gui/main.py:4821
-#, python-format
-msgid "Updating %d snapshots"
-msgstr "Mise-à-jour de %d vignette(s)"
+#: ../lib/advene/util/importer.py:901
+msgid "Launching lsdvd..."
+msgstr "Lancement de lsdvd"
 
-#: ../lib/advene/gui/main.py:4826
-msgid "No snapshot to update"
-msgstr "Aucune capture d'écran à mettre à jour"
+#: ../lib/advene/util/importer.py:913
+msgid "chaplin importer"
+msgstr "Importateur chaplin"
 
-#: ../lib/advene/gui/main.py:4835 ../lib/advene/gui/main.py:4947
-msgid "You first must load a movie into Advene"
-msgstr "Vous devez d'abord charger un fichier vidéo dans Advene"
+#: ../lib/advene/util/importer.py:971
+msgid "Xi importer"
+msgstr "Importateur Xi"
+
+#: ../lib/advene/util/importer.py:1039
+msgid "ELAN importer"
+msgstr "Importateur ELAN"
 
-#: ../lib/advene/gui/main.py:4838 ../lib/advene/gui/main.py:4950
+#: ../lib/advene/util/importer.py:1092
 #, python-format
-msgid "The movie %s does not seem to exist."
-msgstr "Le fichier vidéo %s ne semble pas exister."
+msgid "Converting tier %s"
+msgstr "Conversion du tier %s"
 
-#: ../lib/advene/gui/main.py:4895
-msgid "Generating screenshots"
-msgstr "Génération des vignettes"
+#: ../lib/advene/util/importer.py:1189
+msgid "Processing time slots"
+msgstr "Traitement des bornes temporelles"
 
-#: ../lib/advene/gui/main.py:4900
-msgid ""
-"<b>Screenshot generation</b>\n"
-"\n"
-"Screenshots will be captured approximately every 500ms.\n"
-"\n"
-"If the movie was paused or playing, the capture will begin at the current "
-"position. Else, it will begin at the beginning of the movie.\n"
-"Note that the main interface will not be refreshed as long as this window is "
-"open."
-msgstr ""
-"<b>Génération des vignettes</b>\n"
-"\n"
-"Des vignettes seront capturées environ toutes les 500ms.\n"
-"\n"
-"Si le film est en pause ou en train de jouer, la capture commencera à la "
-"position en cours. Sinon, elle commencera au début du film.\n"
-"Notez que l'interface d'Advene ne sera pas mise à jour tant que cette "
-"fenêtre est ouverte."
+#: ../lib/advene/util/importer.py:1204
+msgid "Fixing forward references"
+msgstr "Correction des références"
 
-#: ../lib/advene/gui/main.py:4941
-msgid ""
-"The <b>shotdetect</b> application does not seem to be installed. Please "
-"check that it is present and that its path is correctly specified in "
-"preferences."
-msgstr ""
-"L'application <b>shotdetect</b> ne semble pas installée. Merci de vérifier "
-"qu'elle est bien présente et que son chemin est correctement spécifié dans "
-"les préférences."
+#: ../lib/advene/util/importer.py:1206
+msgid "Creating relations"
+msgstr "Création des relations"
+
+#: ../lib/advene/util/importer.py:1218
+msgid "Subtitle (SRT) importer"
+msgstr "Importateur sous-titres (SRT)"
+
+#: ../lib/advene/util/importer.py:1276
+#, python-format
+msgid "Subtitles from %s"
+msgstr "Sous-titres de %s"
 
-#: ../lib/advene/gui/main.py:4981
+#: ../lib/advene/util/importer.py:1281
 msgid ""
-"Cannot import shotdetect output. Did you install the shotdetect software?"
+"Cannot decode subtitle file. Try to specify an encoding (latin1 perhaps?)."
 msgstr ""
-"Impossible d'importer le résultat de shotdetect. Avez-vous bien installé le "
-"logiciel shotdetect ?"
+"Impossible de décoder le fichier de sous-titres. Essayez de spécifier un "
+"encodage (latin1 peut-être ?)"
+
+#: ../lib/advene/util/importer.py:1292
+msgid "PRAAT importer"
+msgstr "Importateur PRAAT"
+
+#: ../lib/advene/util/importer.py:1381
+msgid "CMML importer"
+msgstr "Importateur CMML"
+
+#: ../lib/advene/util/importer.py:1444
+msgid "Parsing clip information"
+msgstr "Traitement des informations de clip"
+
+#: ../lib/advene/util/importer.py:1544
+msgid "Creating CMML schema"
+msgstr "Création du schéma CMML"
+
+#: ../lib/advene/util/importer.py:1568
+msgid "Parsing stream information"
+msgstr "Traitement des informations sur le média"
 
-#: ../lib/advene/gui/main.py:4998
-msgid "Incomplete shots"
-msgstr "Plans incomplets"
+#: ../lib/advene/util/importer.py:1602
+msgid "IRI importer"
+msgstr "Importateur IRI"
+
+#: ../lib/advene/util/importer.py:1611
+msgid "Generate one type per view"
+msgstr "Générer un type par vue"
 
-#: ../lib/advene/gui/main.py:5001
+#: ../lib/advene/util/importer.py:1630
 #, python-format
-msgid "Detected %s shots"
-msgstr "Détecté %s plans"
+msgid "Parsing ensemble %s"
+msgstr "Traitement de l'ensemble %s"
 
-#: ../lib/advene/gui/main.py:5103
+#: ../lib/advene/util/importer.py:1641
 #, python-format
-msgid "Could not run shotdetect: %s"
-msgstr "Impossible de lancer shotdetect : %s"
+msgid "Parsing decoupage %s"
+msgstr "Traitement du découpage %s"
 
-#: ../lib/advene/gui/main.py:5107
-#, python-format
-msgid "Detecting shots from %s"
-msgstr "Détection des plans de %s"
+#: ../lib/advene/util/importer.py:1676
+msgid "Parsing views"
+msgstr "Traitement des vues"
 
-#: ../lib/advene/gui/main.py:5160
-msgid "Shot detection"
-msgstr "Détection de plans"
+#: ../lib/advene/util/importer.py:1723 ../lib/advene/util/importer.py:1812
+msgid "Initializing package"
+msgstr "Initialisation du recueil"
 
-#: ../lib/advene/gui/main.py:5166
-msgid ""
-"<b>Shot detection</b>\n"
-"\n"
-"Advene will try to detect shots from the currently loaded movie. The "
-"threshold parameter is used to specify the sensitivity of the algorithm, and "
-"should typically be between 50 and 80. If too many shots are detected, try "
-"to augment its value."
-msgstr ""
-"<b>Détection de plans</b>\n"
-"\n"
-"Advene va essayer de détecter les plans du fichier vidéo en cours. Le "
-"paramètre ci-dessous est utilisé pour spécifier la sensibilité de "
-"l'algorithme, et doit typiquement être entre 50 et 80. Si trop de plans sont "
-"détectés, essayez d'augmenter cette valeur."
+#: ../lib/advene/util/importer.py:1761
+msgid "IRIData importer"
+msgstr "Importateur IRIData"
 
-#: ../lib/advene/gui/main.py:5182
-msgid "Sensitivity"
-msgstr "Sensibilité"
+#: ../lib/advene/util/importer.py:1775
+msgid "Parsing sound values"
+msgstr "Traitement des valeurs d'échantillons de son"
 
-#: ../lib/advene/gui/popup.py:138
-msgid "Choose the file to insert"
-msgstr "Choisissez le fichier à insérer"
+#: ../lib/advene/util/importer.py:1787
+msgid "Creating annotations"
+msgstr "Création des annotations"
 
-#: ../lib/advene/gui/popup.py:146
-msgid "Select a valid identifier"
-msgstr "Sélectionnez un identificateur valide."
+#~ msgid "Got exception. Trying to continue."
+#~ msgstr "Reçu une exception. On continue tout de même."
 
-#: ../lib/advene/gui/popup.py:147
-#, python-format
-msgid ""
-"The filename %s contains invalid characters\n"
-"that have been replaced.\n"
-"You can modify this identifier if necessary:"
-msgstr ""
-"Le nom de fichier %s contient des caractères\n"
-"invalides qui ont été remplacés.\n"
-"Vous pouvez modifier cet identificateur si nécessaire."
+#~ msgid ""
+#~ "Player not active - cached duration   : %(duration)s (%(durationms)d ms)"
+#~ msgstr "Lecteur inactif - Durée cachée   : %(duration)s (%(durationms)d ms)"
 
-#: ../lib/advene/gui/popup.py:158
-msgid "Choose the soundclip to insert"
-msgstr "Choisissez le fichier son à insérer"
+#~ msgid "You first must load a movie into Advene"
+#~ msgstr "Vous devez d'abord charger un fichier vidéo dans Advene"
 
-#: ../lib/advene/gui/popup.py:162
-msgid "Choose the directory to insert"
-msgstr "Choisissez le répertoire à insérer."
+#~ msgid "The movie %s does not seem to exist."
+#~ msgstr "Le fichier vidéo %s ne semble pas exister."
 
-#: ../lib/advene/gui/popup.py:177
-msgid "Named-Entity extraction using NERD"
-msgstr "Reconnaissance d'Entités Nommées avec NERD"
+#~ msgid "Generating screenshots"
+#~ msgstr "Génération des vignettes"
 
-#: ../lib/advene/gui/popup.py:181
-msgid ""
-"Give the offset to use\n"
-"on specified element.\n"
-"It is in ms and can be\n"
-"either positive or negative."
-msgstr ""
-"Indiquez l'offset à ajouter\n"
-"sur l'élément spécifié.\n"
-"La valeur est en ms\n"
-"et peut être positive\n"
-"ou négative."
+#~ msgid ""
+#~ "<b>Screenshot generation</b>\n"
+#~ "\n"
+#~ "Screenshots will be captured approximately every 500ms.\n"
+#~ "\n"
+#~ "If the movie was paused or playing, the capture will begin at the current "
+#~ "position. Else, it will begin at the beginning of the movie.\n"
+#~ "Note that the main interface will not be refreshed as long as this window "
+#~ "is open."
+#~ msgstr ""
+#~ "<b>Génération des vignettes</b>\n"
+#~ "\n"
+#~ "Des vignettes seront capturées environ toutes les 500ms.\n"
+#~ "\n"
+#~ "Si le film est en pause ou en train de jouer, la capture commencera à la "
+#~ "position en cours. Sinon, elle commencera au début du film.\n"
+#~ "Notez que l'interface d'Advene ne sera pas mise à jour tant que cette "
+#~ "fenêtre est ouverte."
 
-#: ../lib/advene/gui/popup.py:225
-#, python-format
-msgid "Replace content in %s"
-msgstr "Remplacer du texte dans %s"
+#~ msgid "Chronological order"
+#~ msgstr "Ordre chronologique"
 
-#: ../lib/advene/gui/popup.py:228
-#, python-format
-msgid "Replace content in annotations of type %s"
-msgstr "Remplacer du texte dans les annotations de type %s"
+#~ msgid "Completeness and chronological order"
+#~ msgstr "Complétude et ordre chronologique"
 
-#: ../lib/advene/gui/popup.py:231
-msgid "Replace content in all annotations"
-msgstr "Remplacer du texte dans toutes les annotations"
+#~ msgid "Reorder active bookmarks"
+#~ msgstr "Réordonner les signets actifs"
 
-#: ../lib/advene/gui/popup.py:324
-#, python-format
-msgid "Copy id %s"
-msgstr "Copier l'id %s"
+#~ msgid "Preview"
+#~ msgstr "Prévisualisation"
 
-#: ../lib/advene/gui/popup.py:358
-#, python-format
-msgid ""
-"<b>Statistics about %s</b>\n"
-"\n"
-msgstr ""
-"<b>Statistiques sur %s</b>\n"
-"\n"
+#~ msgid "<h1>No playlist</h1>"
+#~ msgstr "<h1>Aucun film chargé</h1>"
 
-#: ../lib/advene/gui/popup.py:364
-#, python-format
-msgid "Renumbering annotations of type %s"
-msgstr "Renumérotation des annotations de type %s"
+#~ msgid ""
+#~ "<h1>Current playlist</h1>\n"
+#~ "                <ul>%s</ul>"
+#~ msgstr ""
+#~ "<h1>Films chargés</h1>\n"
+#~ "                <ul>%s</ul>"
 
-#: ../lib/advene/gui/popup.py:371
-msgid ""
-"<b>Renumber all annotations according to their order.</b>\n"
-"\n"
-"<i>Note that this action cannot be undone.</i>\n"
-"Replace the first numeric value of the annotation content with the new "
-"annotation number.\n"
-"If no numeric value is found and the annotation is structured, it will "
-"insert the number.\n"
-"If no numeric value is found and the annotation is of type text/plain, it "
-"will overwrite the annotation content.\n"
-"The offset parameter allows you to renumber from a given annotation."
-msgstr ""
-"<b>Renumérotation des annotations suivant leur ordre.</b>\n"
-"\n"
-"<i>Attention, cette action ne peut pas être annulée.</i>\n"
-"Cette action va remplacer la première valeur numérique de l'annotation par "
-"son numéro d'ordre.\n"
-"Si aucune valeur numérique n'est présente et que l'annotation est "
-"structurée, le numéro sera inséré.\n"
-"Si aucune valeur numérique n'est trouvée et que le type est text/plain, le "
-"contenu de l'annotation sera écrasé.\n"
-"Le paramètre offset permet de commencer la numérotation à partir de "
-"l'annotation offset."
+#~ msgid "Exception (traceback in console):"
+#~ msgstr "Exception (details dans la console)"
 
-#: ../lib/advene/gui/popup.py:377 ../lib/advene/gui/popup.py:484
-msgid "Offset"
-msgstr "Offset"
+#~ msgid "Cannot export to %(fname)s: %(e)s"
+#~ msgstr "Impossible d'exporter vers %(fname)s: %(e)s"
 
-#: ../lib/advene/gui/popup.py:399
-#, python-format
-msgid "Renumbering %d annotations"
-msgstr "Renumérotation de %d annotations"
+#~ msgid "Cannot export to %(host)s:%(port)s %(error)s"
+#~ msgstr "Impossible d'exporter vers %(host)s:%(port)s %(error)s"
 
-#: ../lib/advene/gui/popup.py:408
-#, python-format
-msgid "Annotation #%d"
-msgstr "Annotation #%d"
+#~ msgid "Cannot send data to %(host)s:%(port)s %(error)s"
+#~ msgstr "Impossible d'envoyer des données vers %(host)s:%(port)s %(error)s"
 
-#: ../lib/advene/gui/popup.py:445
-#, python-format
-msgid ""
-"Exporting annotation %(title)s\n"
-"from %(begin)s to %(end)s\n"
-"to %%(filename)s"
-msgstr ""
-"Export de l'annotation %(title)s\n"
-"depuis %(begin)s à %(end)s\n"
-"to %%(filename)s"
+#~ msgid "Cannot send event %(nb)s to %(host)s:%(port)s %(error)s"
+#~ msgstr ""
+#~ "Impossible d'envoyer l'événement %(nb)s vers %(host)s:%(port)s %(error)s"
 
-#: ../lib/advene/gui/popup.py:458
-msgid "Browse"
-msgstr "Explorateur TALES"
+#~ msgid "%(nb)s events sent to %(host)s:%(port)s during session."
+#~ msgstr "%(nb)s événements envoyés à  %(host)s:%(port)s pendant la session."
 
-#: ../lib/advene/gui/popup.py:466 ../lib/advene/gui/popup.py:853
-msgid "Open in web browser"
-msgstr "Afficher dans un navigateur web"
+#~ msgid "Store results as markup in the annotation text"
+#~ msgstr "Stocker les résultats comme marquage dans le texte de l'annotation"
 
-#: ../lib/advene/gui/popup.py:479
-msgid "Search/replace content"
-msgstr "Rechercher/remplacer"
+#~ msgid "All annotations"
+#~ msgstr "Toutes les annotations"
 
-#: ../lib/advene/gui/popup.py:497
-msgid "Desactivate"
-msgstr "Désactiver"
+#~ msgid "Display log file"
+#~ msgstr "Afficher les messages d'information"
 
-#: ../lib/advene/gui/popup.py:514
-msgid "Loop"
-msgstr "Boucler"
+#~ msgid "Advene log"
+#~ msgstr "Advene log"
 
-#: ../lib/advene/gui/popup.py:515
-msgid "Duplicate"
-msgstr "Dupliquer"
+#~ msgid "Named-Entity extraction using NERD"
+#~ msgstr "Reconnaissance d'Entités Nommées avec NERD"
 
-#: ../lib/advene/gui/popup.py:519
-msgid "Save snapshot..."
-msgstr "Prendre une capture d'écran"
+#~ msgid "Extract Named Entities..."
+#~ msgstr "Extraire les entités nommées..."
 
-#: ../lib/advene/gui/popup.py:521
-msgid "Extract video fragment"
-msgstr "Extraire un fragment vidéo"
+#~ msgid "Raised exception in update_status: %s"
+#~ msgstr "Exception dans update_status: %s"
 
-#: ../lib/advene/gui/popup.py:551
-msgid "Incoming"
-msgstr "Entrantes"
+#~ msgid "WebAnnotation importer"
+#~ msgstr "Importateur WebAnnotation"
 
-#: ../lib/advene/gui/popup.py:567
-msgid "Outgoing"
-msgstr "Sortantes"
+#~ msgid "NERD (Named Entity Recognition and Disambiguation)"
+#~ msgstr "NERD (Named Entity Recognition and Disambiguation)"
 
-#: ../lib/advene/gui/popup.py:582
-msgid "Related annotations"
-msgstr "Annotations liées"
+#~ msgid "NERD API key"
+#~ msgstr "NERD API key"
 
-#: ../lib/advene/gui/popup.py:589
-msgid "Incoming relations"
-msgstr "Relations entrantes"
+#~ msgid "NER service to use"
+#~ msgstr "Service NER à utiliser"
 
-#: ../lib/advene/gui/popup.py:596
-msgid "Outgoing relations"
-msgstr "Relations sortantes"
+#~ msgid "Language to analyze"
+#~ msgstr "Langage à analyser"
 
-#: ../lib/advene/gui/popup.py:612
-#, python-format
-msgid "Begin: %s"
-msgstr "Début : %s"
+#~ msgid "NERD applied to %s"
+#~ msgstr "NERD appliqué à %s"
 
-#: ../lib/advene/gui/popup.py:614
-#, python-format
-msgid "End: %s"
-msgstr "Fin : %s"
+#~ msgid "NERD %s"
+#~ msgstr "NERD %s"
 
-#: ../lib/advene/gui/popup.py:615
-#, python-format
-msgid "Duration: %s"
-msgstr "Durée : %s"
+#~ msgid "Detect shots"
+#~ msgstr "Détecter les plans"
 
-#: ../lib/advene/gui/popup.py:622
-msgid "Members:"
-msgstr "Membres:"
+#~ msgid "Automatically detect shots"
+#~ msgstr "Détecter automatiquement les plans"
 
-#: ../lib/advene/gui/popup.py:635
-msgid "Edit package properties..."
-msgstr "Éditer les propriétés du recueil..."
+#~ msgid "Tree view"
+#~ msgstr "Vue en arbre"
 
-#: ../lib/advene/gui/popup.py:636 ../lib/advene/gui/popup.py:756
-#, python-format
-msgid "%d annotations(s) - statistics"
-msgstr "%d annotation(s) - statistiques"
+#~ msgid "Schema editor"
+#~ msgstr "Éditeur de schéma"
 
-#: ../lib/advene/gui/popup.py:638 ../lib/advene/gui/popup.py:864
-msgid "Create a new static view..."
-msgstr "Créer une nouvelle vue statique..."
+#~ msgid "Visualise the activity trace preview"
+#~ msgstr "Prévisualiser la trace d'activité"
 
-#: ../lib/advene/gui/popup.py:639 ../lib/advene/gui/popup.py:865
-msgid "Create a new dynamic view..."
-msgstr "Créer une nouvelle vue dynamique..."
+#~ msgid "Visualise the activity trace as a timeline"
+#~ msgstr "Visualiser la trace d'activité sous forme de ligne de temps"
 
-#: ../lib/advene/gui/popup.py:640 ../lib/advene/gui/popup.py:751
-msgid "Create a new annotation..."
-msgstr "Créer une nouvelle annotation..."
+#~ msgid ""
+#~ "Error: unable to find an edit popup for %(element)s:\n"
+#~ "%(error)s"
+#~ msgstr ""
+#~ "Erreur : impossible d'ouvrir une fenêtre d'édition pour %(element)s:\n"
+#~ "%(error)s"
 
-#: ../lib/advene/gui/popup.py:642 ../lib/advene/gui/popup.py:867
-msgid "Create a new schema..."
-msgstr "Créer un nouveau schéma"
+#~ msgid ""
+#~ "The <b>shotdetect</b> application does not seem to be installed. Please "
+#~ "check that it is present and that its path is correctly specified in "
+#~ "preferences."
+#~ msgstr ""
+#~ "L'application <b>shotdetect</b> ne semble pas installée. Merci de "
+#~ "vérifier qu'elle est bien présente et que son chemin est correctement "
+#~ "spécifié dans les préférences."
 
-#: ../lib/advene/gui/popup.py:643 ../lib/advene/gui/popup.py:862
-msgid "Create a new query..."
-msgstr "Créer une nouvelle requête"
+#~ msgid ""
+#~ "Cannot import shotdetect output. Did you install the shotdetect software?"
+#~ msgstr ""
+#~ "Impossible d'importer le résultat de shotdetect. Avez-vous bien installé "
+#~ "le logiciel shotdetect ?"
 
-#: ../lib/advene/gui/popup.py:651
-msgid "Create a new folder..."
-msgstr "Créer un nouveau répertoire..."
+#~ msgid "Incomplete shots"
+#~ msgstr "Plans incomplets"
 
-#: ../lib/advene/gui/popup.py:652
-msgid "Create a new resource file..."
-msgstr "Créer une nouvelle ressource"
+#~ msgid "Detected %s shots"
+#~ msgstr "Détecté %s plans"
 
-#: ../lib/advene/gui/popup.py:653
-msgid "Insert a new resource file..."
-msgstr "Insérer un nouveau fichier ressource..."
+#~ msgid "Could not run shotdetect: %s"
+#~ msgstr "Impossible de lancer shotdetect : %s"
 
-#: ../lib/advene/gui/popup.py:654
-msgid "Insert a new resource directory..."
-msgstr "Insérer un nouveau répertoire ressource..."
+#~ msgid "Detecting shots from %s"
+#~ msgstr "Détection des plans de %s"
 
-#: ../lib/advene/gui/popup.py:663 ../lib/advene/gui/popup.py:665
-msgid "Insert a soundclip..."
-msgstr "Insérer un fichier son..."
+#~ msgid "Shot detection"
+#~ msgstr "Détection de plans"
 
-#: ../lib/advene/gui/popup.py:676
-msgid "Play sound"
-msgstr "Jouer un son"
+#~ msgid ""
+#~ "<b>Shot detection</b>\n"
+#~ "\n"
+#~ "Advene will try to detect shots from the currently loaded movie. The "
+#~ "threshold parameter is used to specify the sensitivity of the algorithm, "
+#~ "and should typically be between 50 and 80. If too many shots are "
+#~ "detected, try to augment its value."
+#~ msgstr ""
+#~ "<b>Détection de plans</b>\n"
+#~ "\n"
+#~ "Advene va essayer de détecter les plans du fichier vidéo en cours. Le "
+#~ "paramètre ci-dessous est utilisé pour spécifier la sensibilité de "
+#~ "l'algorithme, et doit typiquement être entre 50 et 80. Si trop de plans "
+#~ "sont détectés, essayez d'augmenter cette valeur."
 
-#: ../lib/advene/gui/popup.py:686
-msgid "Create a new annotation type..."
-msgstr "Créer un nouveau type d'annotation..."
+#~ msgid "Sensitivity"
+#~ msgstr "Sensibilité"
 
-#: ../lib/advene/gui/popup.py:688
-msgid "Create a new relation type..."
-msgstr "Créer un nouveau type de relation..."
+#~ msgid "Min duration"
+#~ msgstr "Durée min"
 
-#: ../lib/advene/gui/popup.py:699
-#, python-format
-msgid "A caption dynamic view for %s already seems to exist."
-msgstr "Il semble qu'une vue de sous-titrage pour le type %s existe déjà."
+#~ msgid "Max duration"
+#~ msgstr "Durée max"
 
-#: ../lib/advene/gui/popup.py:708
-#, python-format
-msgid "Caption %s annotations"
-msgstr "Sous-titrer les annotations de type %s"
+#~ msgid "Mean duration"
+#~ msgstr "Durée moyenne"
 
-#: ../lib/advene/gui/popup.py:740
-msgid "Create a comment view"
-msgstr "Créer une nouvelle vue commentaire"
+#~ msgid "Total duration"
+#~ msgstr "Durée totale"
 
-#: ../lib/advene/gui/popup.py:741
-msgid "Generate a caption dynamic view..."
-msgstr "Créer une vue dynamique de sous-titrage..."
+#~ msgid "Schema Editor"
+#~ msgstr "Éditeur de schéma"
 
-#: ../lib/advene/gui/popup.py:742
-msgid "Display as transcription"
-msgstr "Afficher en transcription"
+#~ msgid "Display"
+#~ msgstr "Afficher"
 
-#: ../lib/advene/gui/popup.py:743
-msgid "Display annotations in table"
-msgstr "Afficher les annotations dans un tableau"
+#~ msgid "Remove relation type"
+#~ msgstr "Supprimer le type de relation"
 
-#: ../lib/advene/gui/popup.py:744
-msgid "Export to another format..."
-msgstr "Exporter dans un autre format..."
+#~ msgid "Create HTML view"
+#~ msgstr "Créer une vue HTML"
 
-#: ../lib/advene/gui/popup.py:746
-msgid "Extract Named Entities..."
-msgstr "Extraire les entités nommées..."
+#~ msgid "Remove annotation type"
+#~ msgstr "Supprimer le type d'annotation"
 
-#: ../lib/advene/gui/popup.py:752
-msgid "Delete all annotations"
-msgstr "Supprimer toutes les annotations"
+#~ msgid "Create relation type between this one and..."
+#~ msgstr "Créer un type de relation entre cet élément et ..."
 
-#: ../lib/advene/gui/popup.py:753
-msgid "Renumber annotations..."
-msgstr "Renuméroter les annotations..."
+#~ msgid "New schema"
+#~ msgstr "Nouveau schéma"
 
-#: ../lib/advene/gui/popup.py:754
-msgid "Shot validation view..."
-msgstr "Validation de plans..."
+#~ msgid "New annotation type"
+#~ msgstr "Nouveau type d'annotation"
 
-#: ../lib/advene/gui/popup.py:766
-#, python-format
-msgid "A follow dynamic view for %s already seems to exist."
-msgstr "Il semble qu'une vue de suivi pour le type %s existe déjà."
+#~ msgid "New relation type"
+#~ msgstr "Nouveau type de relation"
 
-#: ../lib/advene/gui/popup.py:775
-#, python-format
-msgid "Follow %s relation-type"
-msgstr "Suivre le type de relation %s"
+#~ msgid "Hide this schema"
+#~ msgstr "Cacher ce schéma"
 
-#: ../lib/advene/gui/popup.py:784
-msgid "Follow the relation"
-msgstr "Suivre la relation"
+#~ msgid "Export drawing to pdf"
+#~ msgstr "Exporter le schéma en pdf"
 
-#: ../lib/advene/gui/popup.py:804
-msgid "Delete all relations..."
-msgstr "Supprimer toutes les relations..."
+#~ msgid "Choose a filename to export the schema as PDF"
+#~ msgstr "Choisissez un nom pour l'export PDF"
 
-#: ../lib/advene/gui/popup.py:805
-msgid "Create montage from related annotations"
-msgstr "Créer un montage suivant les relations"
+#~ msgid "Cannot go back: first item in history"
+#~ msgstr ""
+#~ "Impossible de revenir en arrière : c'est le premier élément de "
+#~ "l'historique"
 
-#: ../lib/advene/gui/popup.py:806
-msgid "Create dynamic view following relations"
-msgstr "Créer une vue dynamique suivant les relations"
+#~ msgid "No children in on_iter_children()!"
+#~ msgstr "Pas de fils dans on_iter_children"
 
-#: ../lib/advene/gui/popup.py:824
-msgid "Apply query on..."
-msgstr "Appliquer la requête sur..."
+#~ msgid "No children in on_iter_nth_child()"
+#~ msgstr "Pas de fils dans on_iter_nth_child"
 
-#: ../lib/advene/gui/popup.py:849
-msgid "Activate view"
-msgstr "Activation d'une vue"
+#~ msgid "Package View"
+#~ msgstr "Vue du recueil"
 
-#: ../lib/advene/gui/popup.py:851
-msgid "Open adhoc view"
-msgstr "Ouvrir une vue adhoc"
+#~ msgid ""
+#~ "GNU General Public License v. 2\n"
+#~ "See http://www.gnu.org/copyleft/gpl.html for more details"
+#~ msgstr ""
+#~ "GNU General Public License v. 2\n"
+#~ "Voir http://www.gnu.org/copyleft/gpl.html pour plus d'informations"
 
 #~ msgid "Adjust annotation bounds..."
 #~ msgstr "Ajuster les bornes des annotations..."
@@ -9520,9 +9724,6 @@ msgstr "Ouvrir une vue adhoc"
 #~ msgid "_MediaInformation"
 #~ msgstr "Informations _Média"
 
-#~ msgid "Display information about the media"
-#~ msgstr "Informations sur le média"
-
 #~ msgid "Capture screenshots"
 #~ msgstr "Capturer les vignettes"
 
@@ -9556,9 +9757,6 @@ msgstr "Ouvrir une vue adhoc"
 #~ msgid "Shot"
 #~ msgstr "Plan"
 
-#~ msgid "Problem when running detection"
-#~ msgstr "Problème lors de la détection"
-
 #~ msgid "Specify the regexp used to parse data"
 #~ msgstr ""
 #~ "Précisez l'expression régulière utilisée pour traiter l'information."
@@ -9818,9 +10016,6 @@ msgstr "Ouvrir une vue adhoc"
 #~ msgid "Exporting "
 #~ msgstr "Export de "
 
-#~ msgid "Copying resources"
-#~ msgstr "Copie des ressources"
-
 #~ msgid "Resource"
 #~ msgstr "Ressource"
 
@@ -10124,9 +10319,6 @@ msgstr "Ouvrir une vue adhoc"
 #~ msgid "Set begin time to %s"
 #~ msgstr "Fixer le temps de début à %s"
 
-#~ msgid "Set end time to %s"
-#~ msgstr "Fixer le temps de fin à %s"
-
 #~ msgid "Cancel"
 #~ msgstr "Abandonner"
 
@@ -10188,9 +10380,6 @@ msgstr "Ouvrir une vue adhoc"
 #~ "résultat, ouvrez les vues désirées dans l'interface et utilisez le menu "
 #~ "Fichier/Sauver l'environnement/...comme environnement standard"
 
-#~ msgid "Error: unable to find an edit popup for %s"
-#~ msgstr "Erreur : impossible d'ouvrir une fenêtre d'édition pour %s"
-
 #~ msgid "Should provide a package name"
 #~ msgstr "Vous devez fournir un nom de recueil"
 
@@ -10858,9 +11047,6 @@ msgstr "Ouvrir une vue adhoc"
 #~ msgid "URL Stack"
 #~ msgstr "Pile d'URL"
 
-#~ msgid "Import _Transcription"
-#~ msgstr "Importer une T_ranscription"
-
 #~ msgid "Currently edited annotation"
 #~ msgstr "Annotation en cours d'edition"
 
diff --git a/po/it.po b/po/it.po
index f324bea..8e2946f 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: advene\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-07-09 17:25+0200\n"
+"POT-Creation-Date: 2017-10-12 22:02+0200\n"
 "PO-Revision-Date: 2008-04-08 18:50+0000\n"
 "Last-Translator: Luca Livraghi <luca.91 at hotmail.it>\n"
 "Language-Team: Italian <it at li.org>\n"
@@ -18,9129 +18,9152 @@ msgstr ""
 "X-Launchpad-Export-Date: 2008-07-04 13:44+0000\n"
 "X-Generator: Launchpad (build Unknown)\n"
 
-#: ../lib/advene/model/zippackage.py:187 ../lib/advene/model/zippackage.py:189
-#: ../lib/advene/util/helper.py:538 ../lib/advene/util/helper.py:540
-#, python-format
-msgid "File %s is not an Advene zip package."
-msgstr ""
-
-#: ../lib/advene/model/zippackage.py:243
-#, python-format
-msgid "Directory %s is not an extracted Advene zip package."
-msgstr ""
-
-#: ../lib/advene/model/bundle.py:296
+#: ../lib/advene/model/bundle.py:292
 #, python-format
 msgid "%s not in bundle"
 msgstr ""
 
-#: ../lib/advene/model/bundle.py:362
+#: ../lib/advene/model/bundle.py:358
 msgid "List of non-typed elements"
 msgstr ""
 
-#: ../lib/advene/model/bundle.py:367
+#: ../lib/advene/model/bundle.py:363
 #, python-format
 msgid "List of %s elements"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:263 ../lib/advene/rules/actions.py:36
-#: ../lib/advene/gui/plugins/actions.py:40
-msgid "Display a message"
+#: ../lib/advene/model/zippackage.py:161 ../lib/advene/model/zippackage.py:163
+#, python-format
+msgid "File %s is not an Advene zip package."
 msgstr ""
 
-#: ../lib/advene/core/controller.py:264
-#: ../lib/advene/gui/plugins/actions.py:41
-#: ../lib/advene/gui/plugins/actions.py:53
-#: ../lib/advene/gui/plugins/actions.py:71
-#: ../lib/advene/gui/plugins/actions.py:86
-#: ../lib/advene/gui/plugins/actions.py:102
-#: ../lib/advene/gui/plugins/actions.py:203
-msgid "String to display."
+#: ../lib/advene/model/zippackage.py:219
+#, python-format
+msgid "Directory %s is not an extracted Advene zip package."
 msgstr ""
 
-#: ../lib/advene/core/controller.py:362
-msgid "Exception (traceback in console):"
-msgstr ""
+#: ../lib/advene/gui/widget.py:295
+#, fuzzy, python-format
+msgid "Set of %s annotations"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/core/controller.py:393
-msgid "No available GUI"
+#: ../lib/advene/gui/widget.py:1006
+#: ../lib/advene/gui/views/transcription.py:459
+#: ../lib/advene/gui/edit/montage.py:60
+msgid "Play"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:412
-msgid "No available event handler"
+#: ../lib/advene/gui/widget.py:1010 ../lib/advene/gui/edit/timeadjustment.py:77
+#, fuzzy
+msgid "Refresh snapshot"
+msgstr "Visualizza %s"
+
+#: ../lib/advene/gui/widget.py:1014
+#, fuzzy
+msgid "Save as..."
+msgstr "Pacchetto %s"
+
+#: ../lib/advene/gui/widget.py:1019
+msgid "Use current player position"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:420
-msgid "No available gui"
+#: ../lib/advene/gui/widget.py:1025
+msgid "Adjust timestamp"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:436
-#, python-format
-msgid "Warning: redefining an existing feature %s"
+#: ../lib/advene/gui/main.py:200 ../lib/advene/gui/main.py:314
+#, fuzzy
+msgid "_Select player"
+msgstr "Seleziona un DVD"
+
+#: ../lib/advene/gui/main.py:202 ../lib/advene/gui/main.py:299
+msgid "_View"
+msgstr "_Visualizza"
+
+#: ../lib/advene/gui/main.py:204 ../lib/advene/gui/main.py:316
+msgid "Packages"
+msgstr "Pacchetti"
+
+#: ../lib/advene/gui/main.py:207 ../lib/advene/gui/main.py:258
+#, fuzzy
+msgid "Open recent"
+msgstr "Apri"
+
+#: ../lib/advene/gui/main.py:252
+msgid "Input from the keyboard (function keys)"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:568
-msgid "All annotations"
-msgstr "Tutte le annotazioni"
+#: ../lib/advene/gui/main.py:255
+msgid "_File"
+msgstr "_File"
 
-#: ../lib/advene/core/controller.py:569 ../lib/advene/gui/edit/rules.py:358
-#, python-format
-msgid "Annotations of type %s"
+#: ../lib/advene/gui/main.py:256
+#, fuzzy
+msgid "_New package"
+msgstr "Nessun pacchetto"
+
+#: ../lib/advene/gui/main.py:256
+msgid "Create a new package"
+msgstr "Crea un nuovo pacchetto"
+
+#: ../lib/advene/gui/main.py:257
+#, fuzzy
+msgid "_Open package"
+msgstr "Apri un file pacchetto"
+
+#: ../lib/advene/gui/main.py:257
+#, fuzzy
+msgid "Open a package"
+msgstr "Apri un file pacchetto"
+
+#: ../lib/advene/gui/main.py:258
+msgid "Show recently opened packages"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:570 ../lib/advene/gui/edit/imports.py:129
-#: ../lib/advene/gui/edit/imports.py:130
-msgid "Views"
-msgstr "Visualizzazioni"
+#: ../lib/advene/gui/main.py:259
+#, fuzzy
+msgid "_Save package"
+msgstr "Nessun pacchetto"
 
-#: ../lib/advene/core/controller.py:570 ../lib/advene/gui/edit/elements.py:521
-msgid "Tags"
-msgstr "Tag"
+#: ../lib/advene/gui/main.py:259
+#, fuzzy
+msgid "Save the package"
+msgstr "Tutte le visualizzazioni del pacchetto"
 
-#: ../lib/advene/core/controller.py:570
-msgid "Ids"
+#: ../lib/advene/gui/main.py:260
+#, fuzzy
+msgid "Save package as..."
+msgstr "Pacchetto %s"
+
+#: ../lib/advene/gui/main.py:260
+#, fuzzy
+msgid "Save the package as..."
+msgstr "Salva il pacchetto attuale"
+
+#: ../lib/advene/gui/main.py:261
+#, fuzzy
+msgid "Close package"
+msgstr "Nessun pacchetto"
+
+#: ../lib/advene/gui/main.py:261
+#, fuzzy
+msgid "Close the package"
+msgstr "Tutte le visualizzazioni del pacchetto"
+
+#: ../lib/advene/gui/main.py:263
+msgid "Save session"
+msgstr "Salva sessione"
+
+#: ../lib/advene/gui/main.py:263
+msgid "Save the current session (list of opened packages)"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:747
-#, python-format
-msgid ""
-"Cannot start the webserver\n"
-"The following processes seem to use the %(port)s port: %(processes)s"
+#: ../lib/advene/gui/main.py:264
+msgid "Save workspace"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:797 ../lib/advene/core/controller.py:808
-#, python-format
-msgid "Loaded %(uri)s as %(alias)s"
+#: ../lib/advene/gui/main.py:265
+msgid "...as package view"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:799 ../lib/advene/core/controller.py:811
-#, python-format
-msgid "Cannot load package from file %(uri)s: %(error)s"
+#: ../lib/advene/gui/main.py:266
+msgid "...as standard workspace"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:850
-msgid "Deactivating web server"
+#: ../lib/advene/gui/main.py:266
+msgid "Use the current layout as standard workspace in the future"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:970
-#, python-format
-msgid "Cannot get audio volume: %s"
+#: ../lib/advene/gui/main.py:268
+#, fuzzy
+msgid "Associate a video _File"
+msgstr "Seleziona un file video"
+
+#: ../lib/advene/gui/main.py:268
+#, fuzzy
+msgid "Associate a video file"
+msgstr "Seleziona un file video"
+
+#: ../lib/advene/gui/main.py:269
+#, fuzzy
+msgid "Associate a _DVD"
+msgstr "Seleziona un capitolo da un DVD"
+
+#: ../lib/advene/gui/main.py:269
+#, fuzzy
+msgid "Associate a chapter from a DVD"
+msgstr "Seleziona un capitolo da un DVD"
+
+#: ../lib/advene/gui/main.py:270
+#, fuzzy
+msgid "Associate a _Video stream"
+msgstr "Seleziona un video stream"
+
+#: ../lib/advene/gui/main.py:270
+msgid "Enter a video stream address"
+msgstr "Inserisci un indirizzo di un video stream"
+
+#: ../lib/advene/gui/main.py:272
+msgid "_Import File"
+msgstr "_Importa file"
+
+#: ../lib/advene/gui/main.py:272
+msgid "Import data from an external source"
+msgstr "Importa dati da una sorgente esterna"
+
+#: ../lib/advene/gui/main.py:273
+#, fuzzy
+msgid "_Process video"
+msgstr "Modifica %s"
+
+#: ../lib/advene/gui/main.py:273
+#, fuzzy
+msgid "Import data from video processing algorithms"
+msgstr "Importa dati da una sorgente esterna"
+
+#: ../lib/advene/gui/main.py:275
+msgid "Merge package"
+msgstr "Unisci pacchetto"
+
+#: ../lib/advene/gui/main.py:275
+msgid "Merge elements from another package"
+msgstr "Unisci elementi da un altro pacchetto"
+
+#: ../lib/advene/gui/main.py:276
+msgid "Import _DVD chapters"
+msgstr "Importa capitoli _DVD"
+
+#: ../lib/advene/gui/main.py:276
+msgid "Create annotations based on DVD chapters"
+msgstr "Crea annotazioni basate sui capitoli DVD"
+
+#: ../lib/advene/gui/main.py:278
+#, fuzzy
+msgid "_Export..."
+msgstr "Importatore"
+
+#: ../lib/advene/gui/main.py:278
+msgid "Export data to another format"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1020
-#, python-format
-msgid "Cannot open Advene URL %s: the webserver is not running."
+#: ../lib/advene/gui/main.py:279
+msgid "_Website export..."
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1128 ../lib/advene/gui/edit/merge.py:272
-msgid "None"
-msgstr "Nessuno"
+#: ../lib/advene/gui/main.py:279
+msgid "Export views to a website"
+msgstr ""
 
-#: ../lib/advene/core/controller.py:1222
-#, python-format
-msgid "Found matching video file in moviepath: %s"
+#: ../lib/advene/gui/main.py:281
+#, fuzzy
+msgid "_Quit"
+msgstr "_Modifica"
+
+#: ../lib/advene/gui/main.py:283
+msgid "_Edit"
+msgstr "_Modifica"
+
+#: ../lib/advene/gui/main.py:284
+msgid "_Undo"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1263 ../lib/advene/core/controller.py:1265
-msgid "Analysis of "
+#: ../lib/advene/gui/main.py:285
+#, fuzzy
+msgid "_Find"
+msgstr "_File"
+
+#: ../lib/advene/gui/main.py:286
+#, fuzzy
+msgid "_Delete"
+msgstr "Elimina"
+
+#: ../lib/advene/gui/main.py:287
+msgid "Create"
+msgstr "Crea"
+
+#: ../lib/advene/gui/main.py:288 ../lib/advene/gui/main.py:3337
+#: ../lib/advene/util/helper.py:411
+msgid "Schema"
+msgstr "Schema"
+
+#: ../lib/advene/gui/main.py:289 ../lib/advene/gui/edit/rules.py:1086
+#: ../lib/advene/rules/actions.py:238 ../lib/advene/util/helper.py:414
+msgid "View"
+msgstr "Visualizza"
+
+#: ../lib/advene/gui/main.py:290 ../lib/advene/gui/popup.py:488
+#: ../lib/advene/util/helper.py:415
+msgid "Query"
+msgstr "Ricerca"
+
+#: ../lib/advene/gui/main.py:291 ../lib/advene/util/helper.py:412
+msgid "Annotation Type"
+msgstr "Tipo di Annotazione"
+
+#: ../lib/advene/gui/main.py:292 ../lib/advene/util/helper.py:413
+msgid "Relation Type"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1465
-msgid "Cannot split the annotation: the given position is outside."
+#: ../lib/advene/gui/main.py:296
+msgid "P_ackage properties"
+msgstr "Proprietà P_acchetto"
+
+#: ../lib/advene/gui/main.py:296
+msgid "Edit package properties"
+msgstr "Modifica proprietà pacchetto"
+
+#: ../lib/advene/gui/main.py:297
+msgid "P_references"
+msgstr "P_referenze"
+
+#: ../lib/advene/gui/main.py:297
+msgid "Interface preferences"
+msgstr "Preference interfaccia"
+
+#: ../lib/advene/gui/main.py:301
+msgid "_Start Web Browser"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1630
-#, python-format
-msgid "Cannot find the template package %(filename)s: %(error)s"
+#: ../lib/advene/gui/main.py:301
+msgid "Start the web browser"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1672
-#, python-format
-msgid "Cannot read the imported package %(uri)s: %(error)s"
+#: ../lib/advene/gui/main.py:303
+msgid "Simplify interface"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1907
-msgid "Package URI has changed. Reloading package with new URI."
+#: ../lib/advene/gui/main.py:303
+#, fuzzy
+msgid "Simplify the application interface (toggle)"
+msgstr "Visualizza cronologia di navigazione"
+
+#: ../lib/advene/gui/main.py:304
+msgid "Evaluator"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1925
-msgid ""
-"Cannot load package: the following annotations do not have Millisecond "
-"fragments:"
+#: ../lib/advene/gui/main.py:304
+msgid "Open python evaluator window"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1952
-#, python-format
-msgid "Cannot handle master attribute, the package %s is not imported."
+#: ../lib/advene/gui/main.py:305 ../lib/advene/gui/main.py:4096
+msgid "Webserver log"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1954
-#, python-format
-msgid "Checking master package %s for not yet imported elements."
+#: ../lib/advene/gui/main.py:307
+msgid "_Player"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1994
-msgid "Standard summary"
+#: ../lib/advene/gui/main.py:308
+msgid "Go to _Time"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:1999
-msgid "Default view"
+#: ../lib/advene/gui/main.py:308
+msgid "Goto a specified time code"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2041
-#, python-format
-msgid ""
-"Infinite loop in STBV %(name)s: the %(imp)s view is invoked multiple times."
+#: ../lib/advene/gui/main.py:309
+msgid "Save _ImageCache"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2131
-#, python-format
-msgid "Got exception %s when stopping player."
+#: ../lib/advene/gui/main.py:309
+msgid "Save the contents of the ImageCache to disk"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2214
-#, python-format
-msgid "Raised exception in update_status: %s"
+#: ../lib/advene/gui/main.py:310
+msgid "Reset ImageCache"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2241
-msgid "Unable to start the player."
+#: ../lib/advene/gui/main.py:310
+msgid "Reset the ImageCache"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2448
-#, fuzzy, python-format
-msgid "Comment on set of %d annotations"
-msgstr "Trascrizione delle annotazioni"
+#: ../lib/advene/gui/main.py:311
+msgid "_Restart player"
+msgstr ""
 
-#: ../lib/advene/core/controller.py:2450
-#, python-format
-msgid "Comment on %s"
+#: ../lib/advene/gui/main.py:311
+msgid "Restart the player"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2454
-#, python-format
-msgid ""
-"<h1>Comment on %(title)s</h1>\n"
-"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
-"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
-"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
-"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
-"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
-"\"%(imgurl)s\" ></img></a></span>"
+#: ../lib/advene/gui/main.py:312
+#, fuzzy
+msgid "Display _Media information"
+msgstr "Visualizza cronologia di navigazione"
+
+#: ../lib/advene/gui/main.py:312
+msgid "Display information about the current media"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2464
-#, fuzzy, python-format
-msgid "List of %s annotations"
+#: ../lib/advene/gui/main.py:313
+#, fuzzy
+msgid "Update annotation screenshots"
 msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/core/controller.py:2499
-#, fuzzy, python-format
-msgid "Cannot export to %(filename)s: %(e)s"
-msgstr "Impossibile salvare il file: %s"
+#: ../lib/advene/gui/main.py:313
+msgid "Update screenshots for annotation bounds"
+msgstr ""
 
-#: ../lib/advene/core/controller.py:2514 ../lib/advene/core/controller.py:2523
-#, python-format
-msgid "Error when exporting: %s"
+#: ../lib/advene/gui/main.py:314
+msgid "Select the player plugin"
 msgstr ""
 
-#: ../lib/advene/core/controller.py:2525 ../lib/advene/gui/views/table.py:406
-#: ../lib/advene/gui/views/table.py:536
-#, python-format
-msgid "Data exported to %s"
+#: ../lib/advene/gui/main.py:317
+msgid "No package"
+msgstr "Nessun pacchetto"
+
+#: ../lib/advene/gui/main.py:319
+msgid "_Help"
+msgstr "_Aiuto"
+
+#: ../lib/advene/gui/main.py:320
+#, fuzzy
+msgid "Help"
+msgstr "_Aiuto"
+
+#: ../lib/advene/gui/main.py:321
+msgid "Get support"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:51
-msgid "The webserver requires version 3.0 of CherryPy at least."
+#: ../lib/advene/gui/main.py:322
+msgid "Check for updates"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:167
-#, python-format
+#: ../lib/advene/gui/main.py:323
+msgid "Display shortcuts"
+msgstr ""
+
+#: ../lib/advene/gui/main.py:324
+#, fuzzy
+msgid "Display logfile"
+msgstr "Visualizza %s"
+
+#: ../lib/advene/gui/main.py:324
+#, fuzzy
+msgid "Display log messages"
+msgstr "Visualizza %s"
+
+#: ../lib/advene/gui/main.py:325
+#, fuzzy
+msgid "Open logfile folder"
+msgstr "Apri un file (C-o)"
+
+#: ../lib/advene/gui/main.py:325
 msgid ""
-"\n"
-"            <p>\n"
-"            <a href=\"/admin\">Server administration</a> |\n"
-"            <a href=\"/media\">Media control</a> |\n"
-"            <a href=\"%(path)s?mode=raw\">Raw view</a>\n"
-"            </p>\n"
-"            Location: %(locationbar)s\n"
-"            <hr>\n"
-"            "
+"Display logfile folder. It can help when sending the advene.log file by e-"
+"mail."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:227
-msgid "Unspecified Error"
-msgstr "Errore non Specificato"
+#: ../lib/advene/gui/main.py:326
+msgid "_About"
+msgstr "_Informazioni"
+
+#: ../lib/advene/gui/main.py:352
+msgid "Open a package file"
+msgstr "Apri un file pacchetto"
+
+#: ../lib/advene/gui/main.py:353
+msgid "Save the current package"
+msgstr "Salva il pacchetto attuale"
+
+#: ../lib/advene/gui/main.py:354
+msgid "Save the package with a new name"
+msgstr "Salva il pacchetto con un nuovo nome"
 
-#: ../lib/advene/core/webcherry.py:228
-#, python-format
-msgid ""
-"\n"
-"        <h1>Error</h1>\n"
-"        <p>An error occurred:</p>\n"
-"        %s\n"
-"        "
+#: ../lib/advene/gui/main.py:355
+msgid "Select movie file..."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:261
-msgid "<h1>No available mediaplayer</h1>"
-msgstr ""
+#: ../lib/advene/gui/main.py:356
+msgid "Select DVD"
+msgstr "Seleziona DVD"
 
-#: ../lib/advene/core/webcherry.py:265
-#, python-format
-msgid ""
-"\n"
-"            <h1>Current STBV: %(currentstbv)s</h1>\n"
-"\n"
-"            <h1>Player status</h1>\n"
-"            <table border=\"1\">\n"
-"            <tr>\n"
-"            <td>Current position</td><td>%(position)s</td>\n"
-"            <td>Duration</td><td>%(duration)s</td>\n"
-"            <td>Player status</td><td>%(status)s</td>\n"
-"            </tr>\n"
-"            </table>\n"
-"            "
+#: ../lib/advene/gui/main.py:358
+#: ../lib/advene/gui/plugins/shotvalidation.py:260
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:810
+#: ../lib/advene/gui/edit/transcribe.py:1178
+msgid "Undo"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:284
-msgid "<h1>No playlist</h1>"
-msgstr "<h1>Nessuna playlist</h1>"
-
-#: ../lib/advene/core/webcherry.py:286
-#, python-format
-msgid ""
-"<h1>Current playlist</h1>\n"
-"                <ul>%s</ul>"
-msgstr ""
+#: ../lib/advene/gui/main.py:360
+#, fuzzy
+msgid "Create a text annotation"
+msgstr "Trascrizione delle annotazioni"
 
-#: ../lib/advene/core/webcherry.py:288
-msgid ""
-"\n"
-"                <form action=\"/media/play\" method=\"GET\">\n"
-"                Starting pos: <input type=\"text\" name=\"position\" value="
-"\"0\">\n"
-"                <input type=\"submit\" value=\"Play\">\n"
-"                </form>\n"
-"                <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
-"\">Pause</a><br>\n"
-"                "
-msgstr ""
+#: ../lib/advene/gui/main.py:361
+#, fuzzy
+msgid "Create a graphical annotation"
+msgstr "Trascrizione delle annotazioni"
 
-#: ../lib/advene/core/webcherry.py:295
-msgid ""
-"<hr />\n"
-"            <form action=\"/media/load\" method=\"GET\">\n"
-"            Add a new file (<em>dvd</em> to play a DVD):\n"
-"            <input type=\"text\" name=\"filename\">\n"
-"            <input type=\"submit\" value=\"Add\">\n"
-"            </form>"
+#: ../lib/advene/gui/main.py:367
+msgid "List recently opened packages"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:301
-msgid ""
-"<h3><a href=\"/media/snapshot\">Access to current packages snapshots</h3>"
+#: ../lib/advene/gui/main.py:397
+msgid "Snapshotter activity"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:310
+#: ../lib/advene/gui/main.py:399
 #, python-format
-msgid "Unknown STBV identifier: %s"
+msgid "%d queued requests"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:385
-msgid "Media information"
+#: ../lib/advene/gui/main.py:400
+msgid "Cancel all requests"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:398
-msgid "File added"
+#: ../lib/advene/gui/main.py:405
+#, fuzzy
+msgid "No snapshotter"
+msgstr "Visualizza %s"
+
+#: ../lib/advene/gui/main.py:427
+msgid "No snapshotting activity"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:399
-#, python-format
-msgid "<p><strong>%s has been added to the playlist</strong></p>"
+#: ../lib/advene/gui/main.py:431
+msgid "Snapshotting"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:410 ../lib/advene/core/webcherry.py:472
-msgid "Access to packages snapshots"
+#: ../lib/advene/gui/main.py:447
+#, fuzzy
+msgid "Display application log messages"
+msgstr "Visualizza %s"
+
+#: ../lib/advene/gui/main.py:488
+msgid "Quicksearch lists"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:420 ../lib/advene/core/webcherry.py:482
-msgid "Unknown package alias"
+#: ../lib/advene/gui/main.py:494
+msgid "Please specify the lists of elements to be searched."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:426
+#: ../lib/advene/gui/main.py:513
 #, python-format
-msgid "Available snapshots for %s"
+msgid ""
+"Searching on %s.\n"
+"Left click to launch the search, right-click to set the quicksearch options"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:432
+#: ../lib/advene/gui/main.py:514
 #, python-format
-msgid ""
-"<p><a href=\"/media/snapshot/%s?mode=inline\">Display with inline images</"
-"a></p>"
+msgid "String to search in %s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:439
-msgid "Done"
+#: ../lib/advene/gui/main.py:527 ../lib/advene/gui/main.py:531
+msgid "Tracing : "
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:441
-msgid "Pending"
+#: ../lib/advene/gui/main.py:527
+msgid "off"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:487
-#, fuzzy, python-format
-msgid "Unknown annotation id: %s"
-msgstr "Tutte le annotazioni"
+#: ../lib/advene/gui/main.py:531
+#, fuzzy
+msgid "on"
+msgstr "Nessuno"
 
-#: ../lib/advene/core/webcherry.py:610 ../lib/advene/core/webcherry.py:728
-#, python-format
-msgid "Cannot activate stbvid %(stbvid)s: %(error)s"
+#: ../lib/advene/gui/main.py:543
+#: ../lib/advene/gui/views/interactivequery.py:410
+msgid "String to search"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:675
-msgid "<p>No GUI is available."
+#: ../lib/advene/gui/main.py:551
+msgid "Launch search"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:677
-#, python-format
-msgid "<p>Opened adhoc views: %s</p>"
+#: ../lib/advene/gui/main.py:556
+msgid "Ignore case"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:678
-msgid "<p>Available adhoc views:</p><ul>"
-msgstr ""
+#: ../lib/advene/gui/main.py:561
+msgid "Searched elements"
+msgstr "Elementi cercati"
 
-#: ../lib/advene/core/webcherry.py:699
-#, python-format
-msgid "<p>Current stbv: %s</p>"
+#: ../lib/advene/gui/main.py:645
+msgid "Playing"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:700
-#, python-format
-msgid "<p>You can activate the following STBV:</p><ul>%s</ul>"
+#: ../lib/advene/gui/main.py:646
+msgid "Pause"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:702
-msgid "Activate and play"
+#: ../lib/advene/gui/main.py:647
+msgid "Init"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:708
-msgid "Application information"
+#: ../lib/advene/gui/main.py:648 ../lib/advene/gui/views/table.py:314
+#: ../lib/advene/gui/edit/elements.py:1809
+msgid "End"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:778
-msgid "Missing element id parameter"
+#: ../lib/advene/gui/main.py:649
+msgid "Undefined"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:782
+#: ../lib/advene/gui/main.py:660
 #, python-format
-msgid "No existing element with id %s"
+msgid ""
+"Wrong player shortcut modifier %s in configuration. Fallback on Control."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:791
-#, python-format
-msgid "<p>The GUI view %s does not exist.</p>"
-msgstr ""
+#: ../lib/advene/gui/main.py:679
+#, fuzzy
+msgid "Exception in update_annotation"
+msgstr "Trascrizione delle annotazioni"
 
-#: ../lib/advene/core/webcherry.py:798
-msgid "Invalid request"
-msgstr ""
+#: ../lib/advene/gui/main.py:707
+#, fuzzy
+msgid "Exception in update_relation"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/core/webcherry.py:803
-msgid "Invalid configuration variable name"
-msgstr ""
+#: ../lib/advene/gui/main.py:729
+#, fuzzy
+msgid "Exception in update_view"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/core/webcherry.py:815
-msgid "Invalid value"
-msgstr ""
+#: ../lib/advene/gui/main.py:758
+#, fuzzy
+msgid "Exception in update_query"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/core/webcherry.py:819
-#, python-format
-msgid "Unsupported method %s"
+#: ../lib/advene/gui/main.py:778
+#, fuzzy
+msgid "Exception in update_resource"
+msgstr "di un tipo di annotazione"
+
+#: ../lib/advene/gui/main.py:798
+#, fuzzy
+msgid "Exception in update_schema"
+msgstr "di un tipo di annotazione"
+
+#: ../lib/advene/gui/main.py:818
+#, fuzzy
+msgid "Exception in update_annotationtype"
+msgstr "di un tipo di annotazione"
+
+#: ../lib/advene/gui/main.py:845
+#, fuzzy
+msgid "Exception in update_relationtype"
+msgstr "di un tipo di annotazione"
+
+#: ../lib/advene/gui/main.py:951
+msgid "Enter the new time value"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:845
+#: ../lib/advene/gui/main.py:975
 #, python-format
-msgid ""
-"\n"
-"        <h1>Authorized hosts</h1>\n"
-"        <table border=\"1\">\n"
-"        <tr><th>Host</th><th>IP Addr</th><th>Action</th></tr>\n"
-"        %s\n"
-"        </table>\n"
-"        <form method=\"GET\">\n"
-"        Add a new hostname to the list :<br>\n"
-"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
-"\"Add\">\n"
-"        </form>\n"
-"        "
+msgid "Replace content in %d elements"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:859
-msgid "Access control"
+#: ../lib/advene/gui/main.py:988
+msgid "Find word"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:864
-msgid "Access control - add a hostname"
+#: ../lib/advene/gui/main.py:995
+msgid "Replace by"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:872 ../lib/advene/core/webcherry.py:886
+#: ../lib/advene/gui/main.py:1023
 #, python-format
-msgid "<strong>Error: %s is an invalid hostname.</strong>"
+msgid "%(search)s has been replaced by %(replace)s in %(count)d element(s)."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:875
+#: ../lib/advene/gui/main.py:1032
+msgid "The video extracting feature is not available."
+msgstr ""
+
+#: ../lib/advene/gui/main.py:1035
+#, fuzzy
+msgid "Video export"
+msgstr "Seleziona un DVD"
+
+#: ../lib/advene/gui/main.py:1037
 #, python-format
-msgid "<p>Added %s to authorized hosts list.</p>"
+msgid "Exporting video montage/fragment to %%(filename)s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:881
-msgid "Access control - delete a hostname"
+#: ../lib/advene/gui/main.py:1039
+msgid "Please choose a destination filename"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:889
-msgid "<strong>Cannot remove the localhost access.</strong>"
+#: ../lib/advene/gui/main.py:1117
+msgid ""
+"No media association is defined in the package. Please use the 'File/"
+"Associate a video file' menu item to associate a media file."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:894
+#: ../lib/advene/gui/main.py:1119
 #, python-format
-msgid "<p>Removed %s from authorized hosts list.</p>"
+msgid ""
+"The associated media %s could not be found. Please use the 'File/Associate a "
+"video file' menu item to associate a media file."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:896
+#: ../lib/advene/gui/main.py:1121
 #, python-format
-msgid "<p>%s is not in authorized hosts list.</p>"
+msgid ""
+"You are now working with the following video:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:945
-msgid "Server Administration"
-msgstr ""
+#: ../lib/advene/gui/main.py:1217
+msgid "Open this view..."
+msgstr "Apri questa vista..."
 
-#: ../lib/advene/core/webcherry.py:953
-#, python-format
-msgid ""
-"\n"
-"        <p><a href=\"/admin/access\">Update the access list</a></p>\n"
-"        <p><a href=\"/admin/methods\">List available TALES methods</a></p>\n"
-"        <p><a href=\"/action\">List available actions</a></p>\n"
-"        <p><a href=\"/admin/reset\">Reset the server</a></p>\n"
-"        <p><a href=\"/media\">Media control</a></p>\n"
-"        <p><a href=\"/application\">Display GUI status</a></p>\n"
-"        <p><a href=\"/admin/list\">List available files</a></p>\n"
-"        <p><a href=\"/packages\">List loaded packages</a> (%(packagelist)s)</"
-"p>\n"
-"        <p>Display mode : %(displaymode)s</p>\n"
-"        <hr>\n"
-"        <p>Load a package :\n"
-"        <form action=\"/admin/load\" method=\"GET\">\n"
-"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
-"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
-"        <input type=\"submit\" value=\"Load\" />\n"
-"        </form>\n"
-"        </body></html>\n"
-"        "
+#: ../lib/advene/gui/main.py:1218 ../lib/advene/gui/plugins/actions.py:286
+#: ../lib/advene/gui/views/viewbook.py:130
+msgid "...in its own window"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:983
-msgid "Available files"
+#: ../lib/advene/gui/main.py:1219 ../lib/advene/gui/plugins/actions.py:287
+#: ../lib/advene/gui/views/viewbook.py:131
+#: ../lib/advene/gui/views/__init__.py:398
+msgid "...embedded east of the video"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1009
-msgid "You should specify an alias"
+#: ../lib/advene/gui/main.py:1220 ../lib/advene/gui/plugins/actions.py:288
+#: ../lib/advene/gui/views/viewbook.py:132
+#: ../lib/advene/gui/views/__init__.py:399
+msgid "...embedded west of the video"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1014
-msgid "You should specify an uri"
+#: ../lib/advene/gui/main.py:1221 ../lib/advene/gui/plugins/actions.py:289
+#: ../lib/advene/gui/views/viewbook.py:133
+#: ../lib/advene/gui/views/__init__.py:400
+msgid "...embedded south of the video"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1020
-#, python-format
-msgid "Package %s loaded"
+#: ../lib/advene/gui/main.py:1222 ../lib/advene/gui/plugins/actions.py:290
+#: ../lib/advene/gui/views/viewbook.py:134
+#: ../lib/advene/gui/views/__init__.py:401
+msgid "...embedded at the right of the window"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1021 ../lib/advene/core/webcherry.py:1057
-#, python-format
-msgid ""
-"<p>Go to the <a href=\"/packages/%(alias)s\">%(alias)s</a> package, or to "
-"the <a href=\"/packages\">package list</a>."
+#: ../lib/advene/gui/main.py:1234
+#, fuzzy
+msgid "_All available views"
+msgstr "Nessun tipo disponibile"
+
+#: ../lib/advene/gui/main.py:1250 ../lib/advene/gui/views/timeline.py:126
+msgid "Timeline"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1024
-#, python-format
-msgid "<p>Cannot load package %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:1251 ../lib/advene/gui/views/finder.py:808
+msgid "Package finder"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1035
-#, python-format
-msgid "Package %s deleted"
-msgstr ""
+#: ../lib/advene/gui/main.py:1252
+msgid "Transcription of annotations"
+msgstr "Trascrizione delle annotazioni"
+
+#: ../lib/advene/gui/main.py:1253
+#, fuzzy
+msgid "Annotation table"
+msgstr "Tipo di Annotazione"
 
-#: ../lib/advene/core/webcherry.py:1036
-msgid "<p>Go to the <a href=\"/packages\">package list</a>."
+#: ../lib/advene/gui/main.py:1256
+msgid "Note-taking editor"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1039
-#, python-format
-msgid "<p>Cannot delete package %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:1257
+msgid "Active bookmarks"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1056
-#, python-format
-msgid "Package %s saved"
-msgstr ""
+#: ../lib/advene/gui/main.py:1260 ../lib/advene/gui/views/tagbag.py:57
+msgid "Bag of tags"
+msgstr "Raccolta di tag"
 
-#: ../lib/advene/core/webcherry.py:1060
-#, python-format
-msgid "<p>Cannot save package %(alias)s : %(error)s</p>"
+#: ../lib/advene/gui/main.py:1261
+msgid "TALES explorer"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1070
-msgid "Server reset"
+#: ../lib/advene/gui/main.py:1262
+msgid "Dynamic montage"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1076
-msgid "Available TALES methods"
-msgstr ""
+#: ../lib/advene/gui/main.py:1263 ../lib/advene/gui/plugins/videoplayer.py:37
+#, fuzzy
+msgid "Video player"
+msgstr "Seleziona un DVD"
 
-#: ../lib/advene/core/webcherry.py:1117
-msgid "Loaded package(s)"
+#: ../lib/advene/gui/main.py:1266
+msgid "Open a comment view in the web browser"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1119
-msgid ""
-"\n"
-"        <h1>Loaded package(s)</h1>\n"
-"        <table border=\"1\" width=\"50%\">\n"
-"        <tr>\n"
-"        <th>Alias</th>\n"
-"        <th>Action</th>\n"
-"        <th>URI</th>\n"
-"        <th>Annotations</th>\n"
-"        </tr>\n"
-"        "
-msgstr ""
+#: ../lib/advene/gui/main.py:1267
+#, fuzzy
+msgid "Create or open a comment view"
+msgstr "Vista statica predefinita"
 
-#: ../lib/advene/core/webcherry.py:1131
-#, python-format
+#: ../lib/advene/gui/main.py:1270
 msgid ""
-"<tr>\n"
-"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
-"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
-"%(uri)s\">Reload</a>|<a href=\"/admin/delete?alias=%(alias)s\">Drop</a>|<a "
-"href=\"/admin/save?alias=%(alias)s\">Save</a></td>\n"
-"            <td>%(uri)s</td>\n"
-"            <td>%(size)d</td>\n"
-"            </tr>\n"
-"            "
+"Edit window placeholder (annotation and relation edit windows will be put "
+"here)"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1204 ../lib/advene/core/webcherry.py:1279
-#: ../lib/advene/core/webcherry.py:1288 ../lib/advene/core/webcherry.py:1296
-#: ../lib/advene/core/webcherry.py:1454 ../lib/advene/core/webcherry.py:1462
-#: ../lib/advene/core/webcherry.py:1470 ../lib/advene/core/webcherry.py:2032
-#: ../lib/advene/core/webcherry.py:2039
-msgid "Error"
+#: ../lib/advene/gui/main.py:1271
+#, fuzzy
+msgid "Display edition history"
+msgstr "Visualizza cronologia di navigazione"
+
+#: ../lib/advene/gui/main.py:1300
+msgid "The webserver could not be started. Static views cannot be accessed."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1205
+#: ../lib/advene/gui/main.py:1381
 #, python-format
-msgid "The TALES expression %s is not valid."
+msgid ""
+"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s has been "
+"released</b> on %(date)s, but you are running version %(current)s.\n"
+"You can download the latest version from the Advene website: http://advene."
+"org/</span>"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1256
-msgid "Content mode not available on non-content data"
+#: ../lib/advene/gui/main.py:1386
+msgid "Go to the website"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1280 ../lib/advene/core/webcherry.py:1289
-#: ../lib/advene/core/webcherry.py:1297 ../lib/advene/core/webcherry.py:1317
-#: ../lib/advene/core/webcherry.py:1321 ../lib/advene/core/webcherry.py:1455
-#: ../lib/advene/core/webcherry.py:1463 ../lib/advene/core/webcherry.py:1471
-#: ../lib/advene/core/webcherry.py:1530 ../lib/advene/core/webcherry.py:1607
-#: ../lib/advene/core/webcherry.py:1727 ../lib/advene/core/webcherry.py:1777
-msgid "<h1>Error</h1>"
+#: ../lib/advene/gui/main.py:1392
+msgid "Advene release"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1281 ../lib/advene/core/webcherry.py:1322
+#: ../lib/advene/gui/main.py:1398
 #, python-format
-msgid ""
-"<p>There was an error in the template code.</p>\n"
-"                <p>Tag name: <strong>%(tagname)s</strong></p>\n"
-"                <p>Error message: <em>%(message)s</em></p>"
+msgid "You are using a up-to-date version of Advene (%(current)s)."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1290
-#, python-format
-msgid ""
-"<p>An invalid character is in the Context:</p>\n"
-"                <p>Error message: <em>%(error)s</em></p><pre>%(message)s</"
-"pre>"
+#: ../lib/advene/gui/main.py:1398
+msgid "Advene is up-to-date"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1298
-#, python-format
-msgid ""
-"<p>There was an error in the TALES expression.</p>\n"
-"                <pre>%s</pre>"
+#: ../lib/advene/gui/main.py:1412
+msgid "Choose a color"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1318
-#, python-format
-msgid ""
-"<p>There was an error.</p>\n"
-"                <pre>%s</pre>"
+#: ../lib/advene/gui/main.py:1444
+msgid "Select an annotation to loop on it"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1342
+#: ../lib/advene/gui/main.py:1446
 #, python-format
-msgid ""
-"\n"
-"            <hr>\n"
-"            <p>\n"
-"            Location: %(location)s<br>\n"
-"            <form name=\"navigation\" method=\"GET\">\n"
-"            <a href=\"%(levelup)s\">Up one level</a> |\n"
-"            Next level :\n"
-"            <select name=\"path\" onchange=\"submit()\">\n"
-"            "
+msgid "Looping on %s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1360
-msgid ""
-"\n"
-"            </select> View: <select name=\"view\" onchange=\"submit()\">\n"
-"            <option selected></option>\n"
-"            "
+#: ../lib/advene/gui/main.py:1516 ../lib/advene/gui/main.py:2443
+msgid "No active dynamic view"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1378
-#, python-format
-msgid ""
-"<hr>\n"
-"            <p>Evaluating expression \"<strong>%(expression)s</strong>\" on "
-"package %(uri)s returns %(value)s</p>\n"
-"            "
+#: ../lib/advene/gui/main.py:1527
+msgid "Create a new dynamic view."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1414
-#, python-format
-msgid "<p>Package <strong>%s</strong> not loaded</p>"
+#: ../lib/advene/gui/main.py:1546
+msgid "Edit the current dynamic view."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1456
-#, python-format
-msgid ""
-"<p>There was an error in the template code.</p>\n"
-"            <p>Tag name: <strong>%(tagname)s</strong></p>\n"
-"            <p>Error message: <em>%(message)s</em></p>"
-msgstr ""
+#: ../lib/advene/gui/main.py:1558
+#, fuzzy
+msgid "No dynamic view"
+msgstr "Vista dinamica"
 
-#: ../lib/advene/core/webcherry.py:1464
-#, python-format
-msgid ""
-"<p>There was an error in the expression.</p>\n"
-"            <pre>%s</pre>"
+#: ../lib/advene/gui/main.py:1589
+msgid "Playing rate"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1472
-#, python-format
-msgid ""
-"<p>Cannot resolve TALES expression %(expr)s on package %(package)s<p><pre>\n"
-"            %(type)s\n"
-"            %(value)s\n"
-"            %(traceback)s</pre>"
+#: ../lib/advene/gui/main.py:1737
+msgid "History"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1531 ../lib/advene/core/webcherry.py:1728
-msgid "<p>Cannot set the value : invalid path</p>"
+#: ../lib/advene/gui/main.py:1744
+msgid "Popups"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1593 ../lib/advene/core/webcherry.py:1846
-#, python-format
+#: ../lib/advene/gui/main.py:1748
 msgid ""
-"<h1>Error</h1><p>When creating resource %(path)s, the resource folder "
-"%(folder)s could not be created.</p>"
+"You can drag and drop view icons (timeline, treeview, transcription...) in "
+"notebooks to embed various views."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1602 ../lib/advene/core/webcherry.py:1856
-msgid "Resource successfuly created/updated"
+#: ../lib/advene/gui/main.py:1748 ../lib/advene/gui/main.py:4123
+msgid "Information"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1611
-msgid "Value successfuly updated"
+#: ../lib/advene/gui/main.py:2034
+msgid "Cannot create annotation. There is no schema to put it in."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1613
-#, python-format
-msgid ""
-"Unable to update the attribute %(attribute)s for element %(element)s: "
-"%(error)s."
-msgstr ""
+#: ../lib/advene/gui/main.py:2043
+#, fuzzy
+msgid "Default annotation type"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/core/webcherry.py:1724
-msgid "<p>Invalid request</p>."
-msgstr ""
+#: ../lib/advene/gui/main.py:2055
+#, fuzzy
+msgid "Annotation created"
+msgstr "Tipo di Annotazione"
 
-#: ../lib/advene/core/webcherry.py:1788 ../lib/advene/core/webcherry.py:1805
-msgid "Value updated"
+#: ../lib/advene/gui/main.py:2088
+msgid "Play/Pause [Control-Tab / Control-Space]"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1789
+#: ../lib/advene/gui/main.py:2092
 #, python-format
-msgid ""
-"\n"
-"                <h1>Value updated</h1>\n"
-"                The value of %(path)s has been updated to\n"
-"                <pre>\n"
-"                %(value)s\n"
-"                </pre>\n"
-"                "
+msgid "Rewind (%.02f s) [Control-Left]"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1806
+#: ../lib/advene/gui/main.py:2096
 #, python-format
-msgid ""
-"\n"
-"                    <h1>Value updated</h1>\n"
-"                    The value of %(path)s has been updated to\n"
-"                    <pre>\n"
-"                    %(value)s\n"
-"                    </pre>\n"
-"                    "
+msgid "Forward (%.02f s) [Control-Right]"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1817
-#, python-format
-msgid ""
-"Malformed request: cannot update the value of %(attribute)s in %(tales)s."
+#: ../lib/advene/gui/main.py:2100
+msgid "Previous frame [Control-Down]"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1860
-msgid "Cannot create an element in something else than a package."
+#: ../lib/advene/gui/main.py:2104
+msgid "Next frame [Control-Up]"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1877
-#, python-format
-msgid "The identifier %s already exists."
+#: ../lib/advene/gui/main.py:2108
+msgid "Fullscreen"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1889
+#: ../lib/advene/gui/main.py:2290
 #, python-format
-msgid "<p>Error while creating view %(id)s</p><pre>%(error)s</pre>"
-msgstr ""
-
-#: ../lib/advene/core/webcherry.py:1895
-msgid "View created"
+msgid "Screenshot saved to %s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1896
+#: ../lib/advene/gui/main.py:2292
 #, python-format
 msgid ""
-"\n"
-"                 <h1>View <em>%(id)s</em> created</h1>\n"
-"                 <p>The view <a href=\"%(url)s\">%(id)s</a> was successfully "
-"created.</p>\n"
-"                 "
+"Screenshot saved in\n"
+" %s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1912
-#, python-format
-msgid "Missing %s parameter"
+#: ../lib/advene/gui/main.py:2294
+#, fuzzy, python-format
+msgid ""
+"Could not save screenshot:\n"
+" %s"
+msgstr "Tutte le annotazioni"
+
+#: ../lib/advene/gui/main.py:2302
+#, fuzzy
+msgid "Save screenshot to..."
+msgstr "Salva contenuto in..."
+
+#: ../lib/advene/gui/main.py:2320
+msgid "Could not take snapshot with enough precision"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1915
-#, python-format
-msgid "Relation type %s does not exist"
+#: ../lib/advene/gui/main.py:2358
+#, fuzzy
+msgid "Export package data"
+msgstr "Nessun pacchetto"
+
+#: ../lib/advene/gui/main.py:2360
+#, fuzzy, python-format
+msgid "Export annotation type %s"
+msgstr "di un tipo di annotazione"
+
+#: ../lib/advene/gui/main.py:2362
+#, fuzzy, python-format
+msgid "Export element %s"
+msgstr "Crea elemento"
+
+#: ../lib/advene/gui/main.py:2388
+msgid "Export format"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1922 ../lib/advene/core/webcherry.py:1925
-#, python-format
-msgid "Annotation %s does not exist"
+#: ../lib/advene/gui/main.py:2425
+msgid " (modified)"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1928
+#: ../lib/advene/gui/main.py:2428
 #, python-format
-msgid ""
-"<p>Cannot create relation between %(member1)s and %(member2)s: invalid type</"
-"p>"
+msgid "Activate %s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1940
-#, python-format
-msgid ""
-"<p>Error while creating relation between %(member1)s and %(member2)s :</"
-"p><pre>%(error)s</pre>"
+#: ../lib/advene/gui/main.py:2598
+msgid "Saved workspace"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1943
-msgid "Relation created"
+#: ../lib/advene/gui/main.py:2651
+msgid "Restoring workspace..."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1944
+#: ../lib/advene/gui/main.py:2657
 #, python-format
-msgid "<h1>Relation <em>%s</em> created</h1>"
+msgid "Do you wish to restore the %s workspace ?"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1954
-#, python-format
-msgid "Annotation type %s does not exist"
+#: ../lib/advene/gui/main.py:2662
+msgid "Clear the current workspace"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1971
+#: ../lib/advene/gui/main.py:2683
 #, python-format
-msgid ""
-"<p>Error while creating annotation of type %(type)s :<pre>\n"
-"                    %(errortype)s\n"
-"                    %(value)s\n"
-"                    %(traceback)s</pre>"
+msgid "View %s is not an adhoc view"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1983
+#: ../lib/advene/gui/main.py:2694
 #, python-format
-msgid "Annotation %s created"
+msgid "Cannot identify the adhoc view %s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1985
-#, python-format
-msgid "Error: Cannot create an object of type %s."
+#: ../lib/advene/gui/main.py:2708
+msgid "Choose the annotation type to display as transcription."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:1988
+#: ../lib/advene/gui/main.py:2743
 #, python-format
-msgid ""
-"Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</"
-"code></p>"
+msgid "Error: unable to find an edit popup for %(element)s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2001
-msgid "Available actions"
-msgstr ""
+#: ../lib/advene/gui/main.py:2750
+#, fuzzy, python-format
+msgid "Editing %s"
+msgstr "Modifica %s"
 
-#: ../lib/advene/core/webcherry.py:2010
+#: ../lib/advene/gui/main.py:2762
 #, python-format
-msgid "<li>%(name)s: %(value)s"
+msgid "Comment view (%s)"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2033
+#: ../lib/advene/gui/main.py:2829
 #, python-format
-msgid "<p>Unknown action</p><pre>Action: %s</pre>"
+msgid "Package %(uri)s saved: %(annotations)s and %(relations)s."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2040
-msgid "Missing parameter(s) :<ul>"
+#: ../lib/advene/gui/main.py:2840
+#, python-format
+msgid "Activating package %s"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2076
-msgid "Advene web resources"
+#: ../lib/advene/gui/main.py:2868
+#, python-format
+msgid "Package %(uri)s loaded: %(annotations)s and %(relations)s."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2082
-msgid "Advene webserver"
+#: ../lib/advene/gui/main.py:2900
+msgid "Do you want to restore the saved workspace ?"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2083
+#: ../lib/advene/gui/main.py:2907
+msgid "Advene"
+msgstr "Advene"
+
+#: ../lib/advene/gui/main.py:2957
+#, fuzzy, python-format
+msgid "Video player error: %s"
+msgstr "Seleziona un DVD"
+
+#: ../lib/advene/gui/main.py:3137 ../lib/advene/gui/main.py:3158
+#, fuzzy
+msgid "Unknown"
+msgstr "Tutte le annotazioni"
+
+#: ../lib/advene/gui/main.py:3228
 #, python-format
 msgid ""
-"<p>Welcome on the <a href=\"http://liris.cnrs.fr/advene/\">Advene</a> "
-"webserver run by %(userid)s on %(serveraddress)s.</p>"
+"The package(s) %s are modified.\n"
+"Save them now?"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2090
-msgid ""
-" <p>No package is loaded. You can access the <a href=\"/admin\">server "
-"administration page</a>.<p>"
+#: ../lib/advene/gui/main.py:3252
+#: ../lib/advene/gui/views/interactivequery.py:376
+msgid "Empty quicksearch string"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2100
+#: ../lib/advene/gui/main.py:3255
+#: ../lib/advene/gui/views/interactivequery.py:281
 #, python-format
-msgid ""
-"the <a href=\"/packages/%(alias)s/view/%(view)s\">loaded package's default "
-"view</a>"
+msgid "'%s'"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2102
-#, python-format
-msgid "the <a href=\"/packages/%s\">loaded package's data</a>"
+#: ../lib/advene/gui/main.py:3270
+msgid "Choose an annotation type."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2104
-msgid "the <a href=\"/packages\">loaded packages' data</a>"
+#: ../lib/advene/gui/main.py:3289 ../lib/advene/gui/views/timeline.py:3035
+#: ../lib/advene/gui/edit/transcribe.py:994
+msgid "Create a new annotation type"
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2105
-#, python-format
-msgid ""
-" <p>You can either access %s or the <a href=\"/admin\">server administration "
-"page</a>.<p>"
+#: ../lib/advene/gui/main.py:3314
+msgid "No annotation type is defined."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2107
-#, python-format
-msgid ""
-"<hr><p align=\"right\"><em>Document generated by <a href=\"http://liris.cnrs."
-"fr/advene/\">Advene</a> v. %s.</em></p>"
+#: ../lib/advene/gui/main.py:3323
+msgid "Creating a new type."
 msgstr ""
 
-#: ../lib/advene/core/webcherry.py:2189 ../lib/advene/core/webcherry.py:2198
-#, python-format
-msgid "Cannot start HTTP server: %s"
+#: ../lib/advene/gui/main.py:3327
+msgid "Title of the new type"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:61
-#, python-format
-msgid "%s exists but is not a directory. Cancelling website export"
+#: ../lib/advene/gui/main.py:3328
+msgid ""
+"Id of the new type. It is generated from the title, but you may change it if "
+"necessary."
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:67
-#, python-format
-msgid "%s does not exist"
+#: ../lib/advene/gui/main.py:3332
+msgid "Specify the content-type for the annotation type"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:422
-msgid "Starting export"
+#: ../lib/advene/gui/main.py:3334
+msgid "Content type"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:451
-#, python-format
-msgid "Depth %d"
+#: ../lib/advene/gui/main.py:3341 ../lib/advene/gui/main.py:3450
+msgid "Create a new schema"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:455
-#, python-format
-msgid "Depth %(depth)d: processing %(url)s"
+#: ../lib/advene/gui/main.py:3354
+msgid "Choose an existing schema for the new type, or create a new one"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:477
-msgid "Finalizing"
+#: ../lib/advene/gui/main.py:3357 ../lib/advene/gui/main.py:3465
+msgid "Specify the schema title"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:511
-#, python-format
-msgid ""
-"<p><strong>You should probably begin at <a href=\"%(href)s\">%(title)s</a>.</"
-"strong></p>"
+#: ../lib/advene/gui/main.py:3361
+msgid "Title of the new schema"
 msgstr ""
 
-#: ../lib/advene/util/website_export.py:554
-msgid "Export complete"
+#: ../lib/advene/gui/main.py:3362
+msgid ""
+"Id of the new schema. It is generated from the title, but you may change it "
+"if necessary."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:134
-msgid "Generic importer"
+#: ../lib/advene/gui/main.py:3385
+msgid ""
+"You specified a annotation-type identifier that already exists. Aborting."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:161
-msgid "Usage: %prog [options] source-file destination-file"
+#: ../lib/advene/gui/main.py:3403
+msgid "You specified a existing schema identifier. Using the existing schema."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:165
-msgid "Specify the offset in ms"
+#: ../lib/advene/gui/main.py:3405
+msgid ""
+"You specified an existing identifier that does not reference a schema. "
+"Aborting."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:210
-msgid ""
-"Import filter error. The asynchronous API should be used, please report a "
-"bug."
+#: ../lib/advene/gui/main.py:3432
+msgid "Choose a schema."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:212
-msgid ""
-"Import filter error. No conversion method is defined,  please report a bug."
+#: ../lib/advene/gui/main.py:3492
+msgid "You specified an existing identifier. Aborting."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:344
+#: ../lib/advene/gui/main.py:3512
 #, python-format
-msgid "Converted from %s"
+msgid "Package %s modified"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:469
-#, fuzzy
-msgid "ExternalApp importer"
-msgstr "Importatore"
-
-#: ../lib/advene/util/importer.py:483
+#: ../lib/advene/gui/main.py:3513
 #, python-format
 msgid ""
-"The <b>%s</b> application does not seem to be installed. Please check that "
-"it is present and that its path is correctly specified in preferences."
+"The package %s has been modified but not saved.\n"
+"Save it now?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:485
+#: ../lib/advene/gui/main.py:3523
 #, python-format
-msgid "The file %s does not seem to exist."
+msgid "%s snapshots"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:507
-#, fuzzy, python-format
-msgid "Could not run %(appname)s: %(msg)s"
-msgstr "Impossibile salvare il file: %s"
+#: ../lib/advene/gui/main.py:3524
+#, python-format
+msgid "Do you want to save the snapshots for media %s?"
+msgstr ""
 
-#: ../lib/advene/util/importer.py:509
+#: ../lib/advene/gui/main.py:3531 ../lib/advene/gui/main.py:3540
+#: ../lib/advene/gui/main.py:4541
 #, fuzzy, python-format
-msgid "Processing %s"
-msgstr "Modifica %s"
+msgid "Cannot save imagecache for %(media)s: %(e)s"
+msgstr "Impossibile salvare il file: %s"
 
-#: ../lib/advene/util/importer.py:513
-msgid "Cleaning up..."
+#: ../lib/advene/gui/main.py:3554
+msgid "first frame"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:633
-msgid "Text importer"
+#: ../lib/advene/gui/main.py:3555
+msgid "last frame"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:646 ../lib/advene/util/importer.py:1176
-msgid "Specify the encoding of the input file (latin1, utf8...)"
-msgstr ""
+#: ../lib/advene/gui/main.py:3563
+#, fuzzy, python-format
+msgid "Click on %(bound)s of %(annotation)s"
+msgstr "Trascrizione delle annotazioni"
 
-#: ../lib/advene/util/importer.py:649
-msgid "Should the timestamps be encoded relative to the first timestamp?"
+#: ../lib/advene/gui/main.py:3566
+#, fuzzy, python-format
+msgid "Update %(bound)s of %(annotation)s"
+msgstr "Trascrizione delle annotazioni"
+
+#: ../lib/advene/gui/main.py:3585
+msgid "Click on the frame corresponding to the timestamp value"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:652
-msgid "Unit to consider for integers"
+#: ../lib/advene/gui/main.py:3587
+msgid "Set new timestamp value"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:655
+#: ../lib/advene/gui/main.py:3594
 msgid ""
-"What timestamps are present in a line (only begin, both begin and end, or "
-"automatic recognition)"
+"<b>Annotation statistics</b>\n"
+"\n"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:798
-msgid "lsdvd importer"
-msgstr ""
+#: ../lib/advene/gui/main.py:3666
+#, fuzzy
+msgid "Text annotation"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/util/importer.py:825
-msgid "Processing data"
+#: ../lib/advene/gui/main.py:3674 ../lib/advene/gui/main.py:3699
+#, fuzzy
+msgid "Cannot find an appropriate annotation type"
+msgstr "di un tipo di annotazione"
+
+#: ../lib/advene/gui/main.py:3676 ../lib/advene/gui/views/bookmarks.py:293
+msgid "Comment here"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:843 ../lib/advene/util/importer.py:903
+#: ../lib/advene/gui/main.py:3692
 #, fuzzy
-msgid "DVD Chapter"
-msgstr "Capitolo"
+msgid "Graphical annotation"
+msgstr "Trascrizione delle annotazioni"
 
-#: ../lib/advene/util/importer.py:847
-msgid "Launching lsdvd..."
+#: ../lib/advene/gui/main.py:3744
+msgid ""
+"An unsaved template package exists\n"
+"Save it first."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:859
-msgid "chaplin importer"
+#: ../lib/advene/gui/main.py:3753
+msgid "Package modified"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:917
-msgid "Xi importer"
+#: ../lib/advene/gui/main.py:3754
+msgid ""
+"The package that you want to close has been modified but not saved.\n"
+"Save it now?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:986
-msgid "ELAN importer"
+#: ../lib/advene/gui/main.py:3787
+msgid "Load a package"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1039
+#: ../lib/advene/gui/main.py:3800
+msgid ""
+"A video file was selected. Pretend that the user selected 'Select a video "
+"file'..."
+msgstr ""
+
+#: ../lib/advene/gui/main.py:3805
 #, python-format
-msgid "Converting tier %s"
+msgid ""
+"The file %s does not look like a valid Advene package. It should have a .azp "
+"or .xml extension. Try to open anyway?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1140
-msgid "Processing time slots"
+#: ../lib/advene/gui/main.py:3814
+msgid ""
+"You are trying to load a session file, but there are unsaved packages. "
+"Proceed anyway?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1155
-msgid "Fixing forward references"
+#: ../lib/advene/gui/main.py:3823
+#, python-format
+msgid ""
+"Cannot load package %(filename)s:\n"
+"%(error)s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1157
-msgid "Creating relations"
+#: ../lib/advene/gui/main.py:3843 ../lib/advene/gui/main.py:3899
+msgid "Do you want to save the current workspace ?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1169
-msgid "Subtitle (SRT) importer"
+#: ../lib/advene/gui/main.py:3858 ../lib/advene/gui/main.py:3914
+#, python-format
+msgid "Could not save the package: %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1238
+#: ../lib/advene/gui/main.py:3871
 #, python-format
-msgid "Subtitles from %s"
+msgid "Save the package %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1251
-msgid "PRAAT importer"
+#: ../lib/advene/gui/main.py:3884
+msgid "Invalid file extension"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1341
-msgid "CMML importer"
+#: ../lib/advene/gui/main.py:3885
+#, python-format
+msgid ""
+"Your package contains resources,\n"
+"the filename (%s) should have a .azp extension.\n"
+"Should I put the correct extension?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1404
-msgid "Parsing clip information"
+#: ../lib/advene/gui/main.py:3889
+msgid "OK, the resources will be lost."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1501
-#: ../lib/advene/plugins/transcriber.py:254
-msgid "Creating package"
+#: ../lib/advene/gui/main.py:3891
+msgid "Aborting package saving"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1504
-msgid "Creating CMML schema"
+#: ../lib/advene/gui/main.py:3925
+msgid "Save the session in..."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1508
-#: ../lib/advene/plugins/transcriber.py:260
-msgid "Creating annotation types"
+#: ../lib/advene/gui/main.py:3936
+#, python-format
+msgid "Session saved in %s"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1514
-#: ../lib/advene/plugins/transcriber.py:265
-msgid "Parsing header information"
+#: ../lib/advene/gui/main.py:3945
+msgid "Do you confirm the creation of annotations matching the DVD chapters?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1528
-msgid "Parsing stream information"
+#: ../lib/advene/gui/main.py:3951
+msgid "Cannot import DVD chapters. Did you install the lsdvd software?"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1562
-msgid "IRI importer"
+#: ../lib/advene/gui/main.py:3959
+msgid "The associated media is not a DVD."
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1571
-msgid "Generate one type per view"
+#: ../lib/advene/gui/main.py:3970
+#, fuzzy, python-format
+msgid "Processing %s video"
+msgstr "Modifica %s"
+
+#: ../lib/advene/gui/main.py:3973
+#, fuzzy
+msgid "No associated video file"
+msgstr "Seleziona un file video"
+
+#: ../lib/advene/gui/main.py:4000
+msgid "Standard RuleSet"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1591
+#: ../lib/advene/gui/main.py:4112
 #, python-format
-msgid "Parsing ensemble %s"
+msgid ""
+"Media information\n"
+"\n"
+"URI: %(uri)s\n"
+"Framerate: %(framerate_denom)d / %(framerate_num)d (%(framerate).02f )\n"
+"Duration: %(duration_formatted)s (%(duration)d ms) (cached: "
+"%(cached_duration_formatted)s)\n"
+"Current position: %(position_formatted)s (%(position)d ms)\n"
+"\n"
+"Original image size: %(width)d x %(height)d\n"
+"\n"
+"Image cache information: %(imagecache)s\n"
+msgstr ""
+
+#: ../lib/advene/gui/main.py:4137
+msgid "Visit the Advene web site for examples and documentation."
+msgstr ""
+
+#: ../lib/advene/gui/main.py:4170 ../lib/advene/gui/main.py:4258
+msgid "Select a movie file"
+msgstr ""
+
+#: ../lib/advene/gui/main.py:4182
+msgid "Title/Chapter selection"
+msgstr ""
+
+#: ../lib/advene/gui/main.py:4224
+msgid "Select a video stream"
+msgstr "Seleziona un video stream"
+
+#: ../lib/advene/gui/main.py:4225
+msgid "Enter the address of a video stream"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1602
+#: ../lib/advene/gui/main.py:4229
 #, python-format
-msgid "Parsing decoupage %s"
+msgid "Successfully extracted the video stream address (%s) from the url.\n"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1638
-msgid "Parsing views"
+#: ../lib/advene/gui/main.py:4254
+msgid "Package properties"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1686 ../lib/advene/util/importer.py:1775
-msgid "Initializing package"
-msgstr ""
+#: ../lib/advene/gui/main.py:4255 ../lib/advene/gui/edit/elements.py:516
+#: ../lib/advene/gui/edit/elements.py:565
+#: ../lib/advene/gui/edit/elements.py:652
+#: ../lib/advene/gui/edit/elements.py:732
+#: ../lib/advene/gui/edit/elements.py:789
+#: ../lib/advene/gui/edit/elements.py:881
+#: ../lib/advene/gui/edit/elements.py:950
+#: ../lib/advene/gui/edit/elements.py:1062
+#: ../lib/advene/gui/edit/elements.py:1124
+msgid "Author"
+msgstr "Autore"
 
-#: ../lib/advene/util/importer.py:1724
-msgid "IRIData importer"
+#: ../lib/advene/gui/main.py:4255
+msgid "Author name"
 msgstr ""
 
-#: ../lib/advene/util/importer.py:1738
-msgid "Parsing sound values"
-msgstr ""
+#: ../lib/advene/gui/main.py:4256 ../lib/advene/gui/edit/elements.py:517
+#: ../lib/advene/gui/edit/elements.py:566
+#: ../lib/advene/gui/edit/elements.py:653
+#: ../lib/advene/gui/edit/elements.py:733
+#: ../lib/advene/gui/edit/elements.py:790
+#: ../lib/advene/gui/edit/elements.py:882
+#: ../lib/advene/gui/edit/elements.py:951
+#: ../lib/advene/gui/edit/elements.py:1063
+#: ../lib/advene/gui/edit/elements.py:1125
+msgid "Date"
+msgstr "Data"
 
-#: ../lib/advene/util/importer.py:1750
-msgid "Creating annotations"
+#: ../lib/advene/gui/main.py:4256
+msgid "Package creation date"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:402
-msgid "Package"
+#: ../lib/advene/gui/main.py:4257 ../lib/advene/gui/views/table.py:681
+#: ../lib/advene/gui/util/dialog.py:391 ../lib/advene/gui/edit/imports.py:334
+#: ../lib/advene/gui/edit/dvdselect.py:75
+#: ../lib/advene/gui/edit/transcribe.py:1022
+msgid "Title"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:403
-msgid "Annotation"
+#: ../lib/advene/gui/main.py:4257
+msgid "Package title"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:404
-msgid "Relation"
+#: ../lib/advene/gui/main.py:4258
+msgid "Associated media"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:405 ../lib/advene/gui/edit/schemaeditor.py:111
-#: ../lib/advene/gui/main.py:276 ../lib/advene/gui/main.py:3270
-msgid "Schema"
-msgstr "Schema"
-
-#: ../lib/advene/util/helper.py:406 ../lib/advene/gui/main.py:279
-msgid "Annotation Type"
-msgstr "Tipo di Annotazione"
-
-#: ../lib/advene/util/helper.py:407 ../lib/advene/gui/main.py:280
-msgid "Relation Type"
+#: ../lib/advene/gui/main.py:4259 ../lib/advene/gui/views/table.py:315
+msgid "Duration"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:408 ../lib/advene/rules/actions.py:236
-#: ../lib/advene/gui/edit/rules.py:1087 ../lib/advene/gui/main.py:277
-msgid "View"
-msgstr "Visualizza"
-
-#: ../lib/advene/util/helper.py:409 ../lib/advene/gui/main.py:278
-#: ../lib/advene/gui/popup.py:459
-msgid "Query"
-msgstr "Ricerca"
-
-#: ../lib/advene/util/helper.py:410
-msgid "Resource Folder"
+#: ../lib/advene/gui/main.py:4259
+msgid "Media duration in ms"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:411 ../lib/advene/gui/edit/create.py:122
-msgid "Resource File"
+#: ../lib/advene/gui/main.py:4259
+#: ../lib/advene/gui/plugins/eventaccumulator.py:143
+msgid "Reset"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:446
-msgid "---- Elements ----"
+#: ../lib/advene/gui/main.py:4320 ../lib/advene/gui/views/timeline.py:3522
+#: ../lib/advene/gui/views/timeline.py:3677
+#: ../lib/advene/gui/views/tagbag.py:64
+#: ../lib/advene/gui/edit/properties.py:181
+#: ../lib/advene/gui/edit/transcribe.py:148
+#: ../lib/advene/gui/edit/transcribe.py:1162
+msgid "Preferences"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:452
-msgid "---- Attributes ----"
+#: ../lib/advene/gui/main.py:4322
+msgid "Paths"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:455
-msgid "---- Methods ----"
+#: ../lib/advene/gui/main.py:4324
+msgid "Data"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:531
-#, python-format
-msgid "Cannot read %(filename)s: %(error)s"
+#: ../lib/advene/gui/main.py:4324
+msgid "Standard directory for data files"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:555
-#, python-format
-msgid ""
-"Error:\n"
-"%s"
+#: ../lib/advene/gui/main.py:4325
+msgid "Movie path"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:565
+#: ../lib/advene/gui/main.py:4325
 #, python-format
 msgid ""
-"Package %(title)s:\n"
-"%(schema)s\n"
-"%(annotation)s in %(annotation_type)s\n"
-"%(relation)s in %(relation_type)s\n"
-"%(query)s\n"
-"%(view)s\n"
-"\n"
-"Description:\n"
-"%(description)s\n"
+"List of directories (separated by %s) to search for movie files (_ means "
+"package directory)"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:592
-msgid "Min duration"
+#: ../lib/advene/gui/main.py:4326
+msgid "Imagecache"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:593
-msgid "Max duration"
+#: ../lib/advene/gui/main.py:4326
+msgid "Directory for storing the snapshot cache"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:594
-#, fuzzy
-msgid "Mean duration"
-msgstr "Seleziona un'azione"
-
-#: ../lib/advene/util/helper.py:595
-msgid "Total duration"
+#: ../lib/advene/gui/main.py:4327
+msgid "Player"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:601
-msgid "schema"
+#: ../lib/advene/gui/main.py:4327
+msgid "Directory of the video player"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:601
-msgid "schemas"
+#: ../lib/advene/gui/main.py:4328
+msgid "Shotdetect"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:602
-msgid "annotation"
-msgstr ""
+#: ../lib/advene/gui/main.py:4328
+#, fuzzy
+msgid "Shotdetect application"
+msgstr "Seleziona un'azione"
 
-#: ../lib/advene/util/helper.py:602
-msgid "annotations"
+#: ../lib/advene/gui/main.py:4330
+msgid "GUI"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:603 ../lib/advene/util/helper.py:604
-msgid "annotation type"
+#: ../lib/advene/gui/main.py:4331
+msgid "Interface language (after restart)"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:603 ../lib/advene/util/helper.py:604
-msgid "annotation types"
+#: ../lib/advene/gui/main.py:4331
+msgid ""
+"Language used for the interface (necessitates to restart the application)"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:605
-msgid "relation"
+#: ../lib/advene/gui/main.py:4332 ../lib/advene/gui/util/initialconfig.py:88
+msgid "System default"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:605
-msgid "relations"
+#: ../lib/advene/gui/main.py:4337
+msgid "Record activity trace"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:606 ../lib/advene/util/helper.py:607
-msgid "relation type"
+#: ../lib/advene/gui/main.py:4338
+msgid "Expert mode"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:606 ../lib/advene/util/helper.py:607
-msgid "relation types"
+#: ../lib/advene/gui/main.py:4338
+msgid "Offer advanced possibilities"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:608
-msgid "query"
+#: ../lib/advene/gui/main.py:4339
+msgid "Prefer WYSIWYG"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:608
-msgid "queries"
+#: ../lib/advene/gui/main.py:4339
+msgid "Use WYSIWYG editors when possible (HTML, SVG)"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:609
-msgid "view"
+#: ../lib/advene/gui/main.py:4340
+msgid "Player control modifier"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:609
-msgid "views"
+#: ../lib/advene/gui/main.py:4340
+msgid ""
+"Generic player control modifier: key used in combination with arrows/space/"
+"tab to control the player. Click the button and press key+space to choose "
+"the modifier."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:610
-msgid "package"
+#: ../lib/advene/gui/main.py:4341
+msgid "Player control in edit popups"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:610
-msgid "packages"
+#: ../lib/advene/gui/main.py:4341
+msgid ""
+"Enable generic player controls in edit windows. This may be undesirable "
+"since it overloads some standard text-edition behaviours (esp. control-left/"
+"right)."
 msgstr ""
 
-#: ../lib/advene/util/helper.py:622
-#, python-format
-msgid "No %s"
+#: ../lib/advene/gui/main.py:4342
+msgid "Open popups"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:624
-#, python-format
-msgid "1 %s"
+#: ../lib/advene/gui/main.py:4343
+msgid "Where should we open adhoc views?"
 msgstr ""
 
-#: ../lib/advene/util/helper.py:626
-#, python-format
-msgid "%(count)d %(plural)s"
+#: ../lib/advene/gui/main.py:4344
+msgid "as a popup window"
 msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:76
-#, fuzzy
-msgid "Cinelab importer"
-msgstr "Importatore"
-
-#: ../lib/advene/plugins/cinelab.py:119 ../lib/advene/plugins/cinelab.py:121
-#, python-format
-msgid "File %s is not an Advene2 zip package."
+#: ../lib/advene/gui/main.py:4345
+msgid "embedded east of the video"
 msgstr ""
 
-#: ../lib/advene/plugins/cinelab.py:176
-#, fuzzy
-msgid "Converting annotation types"
-msgstr "di un tipo di annotazione"
-
-#: ../lib/advene/plugins/cinelab.py:217
-#, fuzzy
-msgid "Converting views"
-msgstr "Vista statica predefinita"
-
-#: ../lib/advene/plugins/cinelab.py:249
-#: ../lib/advene/plugins/youtubeannotations.py:72
-#, fuzzy
-msgid "Importing annotations"
-msgstr "Tutte le annotazioni"
-
-#: ../lib/advene/plugins/shotdetectapp.py:41
-#, fuzzy
-msgid "ShotdetectApp importer"
-msgstr "Importatore"
-
-#: ../lib/advene/plugins/shotdetectapp.py:52
-msgid ""
-"Sensitivity of the algorithm. It should typically be between 50 and 80. If "
-"too many shots are detected, try to increase its value."
+#: ../lib/advene/gui/main.py:4346
+msgid "embedded west of the video"
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:80
-#: ../lib/advene/plugins/goodshotdetector.py:78
-msgid "Detected shots"
+#: ../lib/advene/gui/main.py:4347
+msgid "embedded south of the video"
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetectapp.py:140 ../lib/advene/gui/main.py:5130
-#, python-format
-msgid "Detected shot #%(num)d at %(pos)s "
+#: ../lib/advene/gui/main.py:4348
+msgid "embedded at the right of the window"
 msgstr ""
 
-#: ../lib/advene/plugins/youtubeannotations.py:33
-msgid "Youtube XML annotations importer"
+#: ../lib/advene/gui/main.py:4351
+msgid "History size"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:62
-msgid "Input from the braille table."
+#: ../lib/advene/gui/main.py:4351
+msgid "History filelist size limit"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:66
-msgid "BrlTTY not installed. There will be no braille support."
+#: ../lib/advene/gui/main.py:4353
+msgid "Remember window size"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:78
-msgid "Could not initialize BrlTTY. No braille support."
+#: ../lib/advene/gui/main.py:4353
+msgid "Remember the size of opened windows"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:84
-msgid "Display a message in Braille"
+#: ../lib/advene/gui/main.py:4354
+msgid "Bookmark snapshot width"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:85
-msgid "Message to display."
+#: ../lib/advene/gui/main.py:4354
+msgid "Width of the snapshots representing bookmarks"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:88 ../lib/advene/plugins/tts.py:81
-#: ../lib/advene/rules/actions.py:40 ../lib/advene/rules/actions.py:107
-#: ../lib/advene/rules/actions.py:123 ../lib/advene/gui/plugins/actions.py:44
-#: ../lib/advene/gui/plugins/actions.py:58
-#: ../lib/advene/gui/plugins/actions.py:110
-#: ../lib/advene/gui/plugins/actions.py:399
-#: ../lib/advene/gui/plugins/actions.py:527
-#: ../lib/advene/gui/edit/rules.py:766
-msgid "The annotation content"
+#: ../lib/advene/gui/main.py:4355
+msgid "Bookmark snapshot precision"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:240 ../lib/advene/plugins/tts.py:110
-#: ../lib/advene/gui/plugins/actions.py:234
-msgid "Unknown rule"
+#: ../lib/advene/gui/main.py:4355
+msgid "Precision (in ms) of the displayed bookmark snapshots."
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:241 ../lib/advene/plugins/tts.py:111
-#: ../lib/advene/gui/plugins/actions.py:235
-#, python-format
-msgid ""
-"Rule %(rulename)s: Error in the evaluation of the parameter "
-"%(parametername)s:"
+#: ../lib/advene/gui/main.py:4357
+msgid "Frame selector (shotvalidation...)"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:256
-#, python-format
-msgid "BrlTTY connection error: %s"
+#: ../lib/advene/gui/main.py:4358
+msgid "Frameselector snapshot width"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:273
-msgid "Braille display: "
+#: ../lib/advene/gui/main.py:4358
+msgid "Width of the snapshots in frameselector"
 msgstr ""
 
-#: ../lib/advene/plugins/brltty.py:279
-msgid "No message"
+#: ../lib/advene/gui/main.py:4359
+msgid "Frameselector count"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:45
-msgid "Shot detection (Delakis version)"
+#: ../lib/advene/gui/main.py:4359
+msgid "Number of frames displayed in frameselector."
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:60
-msgid "Cache histogram alongside video files."
+#: ../lib/advene/gui/main.py:4361
+msgid "General"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:63
-msgid ""
-"Parameter profile: safe will detect less cuts, aggressive will detect more "
-"cuts (but more false ones too). default is a compromise."
+#: ../lib/advene/gui/main.py:4362
+msgid "Weekly update check"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:77
-#, python-format
-msgid "Shot (%s profile)"
+#: ../lib/advene/gui/main.py:4362 ../lib/advene/gui/util/initialconfig.py:90
+msgid "Weekly check for updates on the Advene website"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:83
-msgid "Loading histogram"
+#: ../lib/advene/gui/main.py:4363
+msgid "On exit,"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:146
-#, fuzzy
-msgid "Computing hdiff"
-msgstr "Relazioni"
-
-#: ../lib/advene/plugins/goodshotdetector.py:153
-msgid "Detecting cuts"
+#: ../lib/advene/gui/main.py:4364
+msgid "How to handle screenshots on exit"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:180
-msgid "Detecting dissolves"
+#: ../lib/advene/gui/main.py:4365
+msgid "never save screenshots"
 msgstr ""
 
-#: ../lib/advene/plugins/goodshotdetector.py:265
-#, fuzzy
-msgid "Extracting histogram"
-msgstr "Modifica %s"
+#: ../lib/advene/gui/main.py:4366
+msgid "always save screenshots"
+msgstr ""
 
-#: ../lib/advene/plugins/anvil.py:35
-msgid "Anvil importer"
+#: ../lib/advene/gui/main.py:4367
+msgid "ask before saving screenshots"
 msgstr ""
 
-#: ../lib/advene/plugins/annotationgraph.py:40
-msgid "AnnotationGraph importer"
+#: ../lib/advene/gui/main.py:4369
+msgid "Auto-save"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:33
-msgid "Final Cut Pro XML importer"
+#: ../lib/advene/gui/main.py:4370
+msgid "Data auto-save functionality"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:55
-msgid "FCP clipitem"
+#: ../lib/advene/gui/main.py:4371
+msgid "is desactivated"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:75
-#, fuzzy
-msgid "Importing subtitles"
-msgstr "_Importa file"
-
-#: ../lib/advene/plugins/fcp.py:90
-msgid "Importing clips"
+#: ../lib/advene/gui/main.py:4372
+msgid "is done automatically"
 msgstr ""
 
-#: ../lib/advene/plugins/fcp.py:93
-msgid "No clip"
+#: ../lib/advene/gui/main.py:4373
+msgid "is done after confirmation"
 msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:219
-#, python-format
-msgid "Cannot export to %(fname)s: %(e)s"
+#: ../lib/advene/gui/main.py:4375
+msgid "Auto-save interval (in s)"
 msgstr ""
 
-#: ../lib/advene/plugins/tracebuilder.py:1129
-#: ../lib/advene/plugins/tracebuilder.py:1168
-#, fuzzy, python-format
-msgid "Cannot export to %(host)s:%(port)s %(error)s"
-msgstr "Impossibile salvare il file: %s"
-
-#: ../lib/advene/plugins/tracebuilder.py:1143
-#, fuzzy, python-format
-msgid "Cannot send data to %(host)s:%(port)s %(error)s"
-msgstr "Impossibile salvare il file: %s"
-
-#: ../lib/advene/plugins/tracebuilder.py:1191
-#, fuzzy, python-format
-msgid "Cannot send event %(nb)s to %(host)s:%(port)s %(error)s"
-msgstr "Impossibile salvare il file: %s"
-
-#: ../lib/advene/plugins/tracebuilder.py:1197
-#, python-format
-msgid "%(nb)s events sent to %(host)s:%(port)s during session."
+#: ../lib/advene/gui/main.py:4375
+msgid "Interval (in seconds) between package auto-saves"
 msgstr ""
 
-#: ../lib/advene/plugins/dcp.py:65
+#: ../lib/advene/gui/main.py:4377
 #, fuzzy
-msgid "DCP importer"
-msgstr "Importatore"
+msgid "Workspace"
+msgstr "Vista statica predefinita"
 
-#: ../lib/advene/plugins/dcp.py:120
-#, python-format
-msgid "Converting #%(num)d / %(count)d"
+#: ../lib/advene/gui/main.py:4379
+msgid "On package saving,"
 msgstr ""
 
-#: ../lib/advene/plugins/ttl.py:41
-#, fuzzy
-msgid "TurTLe (RDF) importer"
-msgstr "Importatore"
-
-#: ../lib/advene/plugins/aeidon_import.py:48
-msgid "Aeidon (subtitles) importer"
+#: ../lib/advene/gui/main.py:4380
+msgid "Do you wish to save the default workspace with the package?"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:47
-#: ../lib/advene/plugins/soundenveloppe.py:143
-#: ../lib/advene/plugins/soundenveloppe.py:145
-msgid "Sound enveloppe"
+#: ../lib/advene/gui/main.py:4381
+msgid "never save the current workspace"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:60
-msgid "Interval (in ms) at which to take samples."
+#: ../lib/advene/gui/main.py:4382
+msgid "always save the current workspace"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:63
-msgid "Maximum number of samples per annotation."
+#: ../lib/advene/gui/main.py:4383
+msgid "ask before saving the current workspace"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:66
-#: ../lib/advene/plugins/cutter.py:56
-msgid "Channel selection."
+#: ../lib/advene/gui/main.py:4385
+msgid "Auto-validation of edited elements"
 msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:90
-#: ../lib/advene/plugins/pocketsphinx.py:119
-#: ../lib/advene/plugins/barcode.py:58
-#, fuzzy
-msgid "Generating annotations"
-msgstr "Tutte le annotazioni"
-
-#: ../lib/advene/plugins/soundenveloppe.py:115
-#, fuzzy, python-format
-msgid "At %s"
-msgstr "Modifica %s"
+#: ../lib/advene/gui/main.py:4385
+msgid "Automatically validate modified elements when saving the package."
+msgstr ""
 
-#: ../lib/advene/plugins/soundenveloppe.py:162
+#: ../lib/advene/gui/main.py:4387
 #, fuzzy
-msgid "Extracting sound enveloppe"
-msgstr "Modifica %s"
+msgid "On package load,"
+msgstr "Apri un file pacchetto"
 
-#: ../lib/advene/plugins/cutter.py:39
-msgid "Audio segmentation"
+#: ../lib/advene/gui/main.py:4388
+msgid "Do you wish to load the workspace saved with the package?"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:53
-msgid "Volume threshold (in dB, can be negative) before trigger."
+#: ../lib/advene/gui/main.py:4389
+msgid "never load the saved workspace"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:101
-#, python-format
-msgid "Detected %(count)d segments until %(time)s"
+#: ../lib/advene/gui/main.py:4390
+msgid "always load the saved workspace"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:119
-msgid "Sound segment"
+#: ../lib/advene/gui/main.py:4391
+msgid "ask before loading the saved workspace"
 msgstr ""
 
-#: ../lib/advene/plugins/cutter.py:120
-#, python-format
-msgid ""
-"Sound segmentation with a threshold of %(threshold)d dB - channel: "
-"%(channel)s"
-msgstr ""
+#: ../lib/advene/gui/main.py:4394
+#, fuzzy
+msgid "Video Player"
+msgstr "Seleziona un DVD"
 
-#: ../lib/advene/plugins/cutter.py:138
-msgid "Starting silence detection"
-msgstr ""
+#: ../lib/advene/gui/main.py:4395
+#, fuzzy
+msgid "Autostart"
+msgstr "Autore"
 
-#: ../lib/advene/plugins/montagerenderer.py:43
-msgid "Cannot register montage renderer: Gnonlin plugins are not present."
+#: ../lib/advene/gui/main.py:4395
+msgid ""
+"Automatically start the player when loading a media file (either directly or "
+"through a package)"
 msgstr ""
 
-#: ../lib/advene/plugins/mpeg7.py:54
-msgid "MPEG7 importer"
+#: ../lib/advene/gui/main.py:4396
+msgid "Fulscreen timestamp"
 msgstr ""
 
-#: ../lib/advene/plugins/transcriber.py:40
-msgid "Transcriber importer"
+#: ../lib/advene/gui/main.py:4396
+msgid "Display the timestamp over the video when in fullscreen mode"
 msgstr ""
 
-#: ../lib/advene/plugins/transcriber.py:86
-msgid "Parsing section information"
-msgstr ""
+#: ../lib/advene/gui/main.py:4397
+#, fuzzy
+msgid "Enable captions"
+msgstr "Relazioni"
 
-#: ../lib/advene/plugins/transcriber.py:276
-msgid "Parsing topic and speaker tables information"
+#: ../lib/advene/gui/main.py:4397
+msgid "Enable captions over the video"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:42
-msgid "Feature detection (face...)"
+#: ../lib/advene/gui/main.py:4398
+msgid "Caption font"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:57
-msgid "Sensitivity level."
+#: ../lib/advene/gui/main.py:4398
+msgid "TrueType font for captions"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:60
-msgid ""
-"Scale. Original image size will be divided by this factor, in order to speed "
-"up detection."
+#: ../lib/advene/gui/main.py:4399
+msgid "Enable SVG"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:63
-#, fuzzy
-msgid "Classifier"
-msgstr "Classe"
-
-#: ../lib/advene/plugins/featuredetect.py:77
-#, python-format
-msgid "Feature %s"
+#: ../lib/advene/gui/main.py:4399
+msgid "Enable SVG captions over the video"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:79
-#, python-format
-msgid "Detected %s"
+#: ../lib/advene/gui/main.py:4401
+msgid "Enable snapshots"
 msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:81
-#, fuzzy
-msgid "Detection started"
-msgstr "Tempo di reazione"
+#: ../lib/advene/gui/main.py:4402
+msgid "Snapshot width"
+msgstr ""
 
-#: ../lib/advene/plugins/featuredetect.py:171
-#, python-format
-msgid "Detected %(count)d feature(s) until %(time)s"
+#: ../lib/advene/gui/main.py:4402
+msgid "Snapshot width in pixels."
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:37
-msgid ""
-"Cannot register speech recognition: Pocketsphinx plugins not found. See "
-"http://cmusphinx.sourceforge.net/wiki/gstreamer for details."
+#: ../lib/advene/gui/main.py:4403
+msgid "Verbosity"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:41
-msgid "Speech recognition (PocketSphinx)"
+#: ../lib/advene/gui/main.py:4403
+msgid "Verbosity level. -1 for no messages."
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:61
-msgid "Filtering noise level [0..1]."
+#: ../lib/advene/gui/main.py:4406
+msgid "Devices"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:65
-msgid ""
-"Minimum amount (in milliseconds) of silence required to terminate the "
-"current annotation and start a new one. Decreasing this length will result "
-"in a large amount of short annotations and increasing this length will "
-"result in a small amount of long annotations."
+#: ../lib/advene/gui/main.py:4408
+msgid "Standard"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:69
-msgid "Use default acoustic and language models."
+#: ../lib/advene/gui/main.py:4410
+msgid "DVD drive"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:73
-msgid "Acoustic model (directory)"
+#: ../lib/advene/gui/main.py:4410
+msgid "Drive letter for the DVD"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:77
-msgid "Phonetic dictionary (.dic file)"
+#: ../lib/advene/gui/main.py:4411
+msgid "GDI"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:81
-msgid "Language model (.DMP file)"
+#: ../lib/advene/gui/main.py:4412
+msgid "Direct X"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:144
-#: ../lib/advene/plugins/barcode.py:83
-#, python-format
-msgid "%(count)d utterances until %(time)s"
+#: ../lib/advene/gui/main.py:4414
+msgid "DVD device"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:153
-msgid "Speech"
+#: ../lib/advene/gui/main.py:4414
+msgid "Device for the DVD"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:155
-msgid "Recognized speech"
+#: ../lib/advene/gui/main.py:4415
+msgid "X11"
 msgstr ""
 
-#: ../lib/advene/plugins/pocketsphinx.py:191
-msgid "Recognizing speech"
+#: ../lib/advene/gui/main.py:4416
+msgid "XVideo"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:36
-msgid "Cannot register barcode extraction: zbar plugin not found."
+#: ../lib/advene/gui/main.py:4417
+msgid "GL"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:40
-msgid "Barcode (qr-code) extraction"
+#: ../lib/advene/gui/main.py:4419
+msgid "Video output"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:95
-msgid "Barcode"
+#: ../lib/advene/gui/main.py:4419
+msgid "Video output module"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:97
-msgid "Extracted barcode information"
+#: ../lib/advene/gui/main.py:4421
+msgid "Recorder options"
 msgstr ""
 
-#: ../lib/advene/plugins/barcode.py:115
+#: ../lib/advene/gui/main.py:4422
 #, fuzzy
-msgid "Extraction barcodes"
-msgstr "Modifica %s"
+msgid "Audio input"
+msgstr "Aggiungi file..."
 
-#: ../lib/advene/plugins/nerd_plugin.py:47
-msgid "NERD (Named Entity Recognition and Disambiguation)"
+#: ../lib/advene/gui/main.py:4422
+msgid "Device name for audio input (with gstrecorder plugin)"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:68
-msgid "NERD API key"
+#: ../lib/advene/gui/main.py:4423
+msgid "Record video"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:82
-msgid "NER service to use"
+#: ../lib/advene/gui/main.py:4423
+msgid "Record both video and audio"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:88
-#, fuzzy
-msgid "Type of annotation to analyze"
-msgstr "di un tipo di annotazione"
+#: ../lib/advene/gui/main.py:4426
+msgid "<i>Experimental</i>"
+msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:93
-msgid "Language to analyze"
+#: ../lib/advene/gui/main.py:4427 ../lib/advene/gui/views/scroller.py:30
+msgid "Scroller"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:98
-msgid "Minimum confidence level (between 0.0 and 1.0)"
+#: ../lib/advene/gui/main.py:4427
+msgid "Embed the caption scroller below the video"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:103
-#, fuzzy
-msgid "Interpolate position of annotations"
-msgstr "Trascrizione delle annotazioni"
+#: ../lib/advene/gui/main.py:4428 ../lib/advene/gui/views/caption.py:29
+msgid "Caption"
+msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:108
-msgid "Split by entity type"
+#: ../lib/advene/gui/main.py:4428
+msgid "Embed the caption view below the video"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:113
-msgid "Store results as markup in the annotation text"
+#: ../lib/advene/gui/main.py:4430
+msgid "Time-related"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:118
-msgid "Create relations between the original annotations and the new ones"
+#: ../lib/advene/gui/main.py:4431
+msgid "Time format"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:150
-#, python-format
-msgid "NERD applied to %s"
+#: ../lib/advene/gui/main.py:4431
+msgid "Format used to display timecodes"
 msgstr ""
 
-#: ../lib/advene/plugins/nerd_plugin.py:208
-#, python-format
-msgid "NERD %s"
+#: ../lib/advene/gui/main.py:4445
+msgid "Default FPS"
 msgstr ""
 
-#: ../lib/advene/plugins/ted.py:39
-#, fuzzy
-msgid "TED importer"
-msgstr "Importatore"
+#: ../lib/advene/gui/main.py:4446
+msgid ""
+"Default FPS (frame-per-second) value, when the information cannot be read "
+"from the media."
+msgstr ""
 
-#: ../lib/advene/plugins/shotdetect.py:35
-msgid "Shotdetect importer"
+#: ../lib/advene/gui/main.py:4447
+msgid "Time increment"
 msgstr ""
 
-#: ../lib/advene/plugins/shotdetect.py:79
-msgid "No shots"
+#: ../lib/advene/gui/main.py:4447
+msgid ""
+"Skip duration, when using control-left/right or forward/rewind buttons (in "
+"ms)."
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:77
-msgid "Pronounce a text"
+#: ../lib/advene/gui/main.py:4448
+msgid "Second time increment"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:78
-msgid "String to pronounce."
+#: ../lib/advene/gui/main.py:4448
+msgid "Skip duration, when using control-shift-left/right (in ms)."
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:131 ../lib/advene/gui/plugins/actions.py:259
-#: ../lib/advene/gui/plugins/actions.py:340
-#: ../lib/advene/gui/plugins/actions.py:358
-msgid "No message..."
+#: ../lib/advene/gui/main.py:4449
+msgid "Third time increment"
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:156
-msgid "TTS disabled. Cannot find the application 'festival' in PATH"
+#: ../lib/advene/gui/main.py:4449
+msgid "Skip duration, when using control-shift-up/down (in ms)."
 msgstr ""
 
-#: ../lib/advene/plugins/tts.py:158
-msgid "TTS disabled. Cannot find the application 'aplay' in PATH"
+#: ../lib/advene/gui/main.py:4450
+msgid "Custom Up/Down"
 msgstr ""
 
-#: ../lib/advene/player/gstreamer.py:434
-msgid "Cannot capture full-resolution snapshot, another capture is ongoing."
+#: ../lib/advene/gui/main.py:4450
+msgid ""
+"Use third time increment for up/down navigation without having to hold shift."
 msgstr ""
 
-#: ../lib/advene/rules/importer.py:29
-msgid "Event history importer"
+#: ../lib/advene/gui/main.py:4452
+msgid "Scroll increment"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:37 ../lib/advene/rules/actions.py:102
-#: ../lib/advene/rules/actions.py:120
-msgid "Message to display"
+#: ../lib/advene/gui/main.py:4452
+msgid ""
+"On most annotations, control+scrollwheel will increment/decrement their "
+"bounds by this value (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:48
-msgid "Start the player"
+#: ../lib/advene/gui/main.py:4453
+msgid "Second scroll increment"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:49
-msgid "Start position (in ms)"
+#: ../lib/advene/gui/main.py:4453
+msgid ""
+"On most annotations, control+shift+scrollwheel will increment/decrement "
+"their bounds by this value (in ms)."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:52 ../lib/advene/rules/actions.py:384
-msgid "The movie start"
+#: ../lib/advene/gui/main.py:4455
+msgid "Player sync"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:53 ../lib/advene/rules/actions.py:385
-msgid "The annotation begin"
+#: ../lib/advene/gui/main.py:4455
+msgid ""
+"Interval (in ms) with which we synchronize slave players. Setting a too-low "
+"value could render the application unusable. Use 0 to disable continuous "
+"synchronization."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:54 ../lib/advene/rules/actions.py:386
-msgid "The annotation end"
+#: ../lib/advene/gui/main.py:4456
+msgid "Timeline parameters"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:63 ../lib/advene/gui/views/logwindow.py:129
-msgid "Go to the given position"
+#: ../lib/advene/gui/main.py:4457 ../lib/advene/gui/edit/transcribe.py:156
+msgid "Font size"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:64
-msgid "Goto position (in ms)"
+#: ../lib/advene/gui/main.py:4457
+msgid "Font size for annotation widgets"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:73
-msgid "Stop the player"
+#: ../lib/advene/gui/main.py:4458
+msgid "Button height"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:80
-msgid "Pause the player"
+#: ../lib/advene/gui/main.py:4458
+msgid "Height of annotation widgets"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:87
-msgid "Resume the player"
+#: ../lib/advene/gui/main.py:4459
+msgid "Interline height"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:94
-msgid "Take a snapshot"
+#: ../lib/advene/gui/main.py:4459
+msgid "Height of interlines"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:101
-msgid "Display a caption"
-msgstr ""
+#: ../lib/advene/gui/main.py:4461
+#, fuzzy
+msgid "Text content"
+msgstr "template HTML"
 
-#: ../lib/advene/rules/actions.py:103
-msgid "Duration of the caption"
-msgstr ""
+#: ../lib/advene/gui/main.py:4462
+#, fuzzy
+msgid "Completion mode"
+msgstr "Relazioni"
 
-#: ../lib/advene/rules/actions.py:110 ../lib/advene/rules/actions.py:172
-#: ../lib/advene/gui/plugins/actions.py:61
-#: ../lib/advene/gui/plugins/actions.py:121
-#: ../lib/advene/gui/plugins/actions.py:403
-#: ../lib/advene/gui/plugins/actions.py:538
-msgid "1 second"
-msgstr ""
+#: ../lib/advene/gui/main.py:4462
+#, fuzzy
+msgid "Enable dynamic completion mode"
+msgstr "Relazioni"
 
-#: ../lib/advene/rules/actions.py:111 ../lib/advene/rules/actions.py:173
-#: ../lib/advene/gui/plugins/actions.py:62
-#: ../lib/advene/gui/plugins/actions.py:122
-#: ../lib/advene/gui/plugins/actions.py:404
-#: ../lib/advene/gui/plugins/actions.py:539
-#: ../lib/advene/gui/edit/rules.py:773
-msgid "The annotation duration"
+#: ../lib/advene/gui/main.py:4463
+msgid "Predefined terms only"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:119 ../lib/advene/gui/popup.py:718
-msgid "Caption the annotation"
+#: ../lib/advene/gui/main.py:4463
+msgid "If completion is enabled, complete only with predefined terms."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:131
+#: ../lib/advene/gui/main.py:4464
 #, fuzzy
-msgid "Display a graphical shape"
-msgstr "Visualizza %s"
+msgid "Abbreviation mode"
+msgstr "Tempo di reazione"
 
-#: ../lib/advene/rules/actions.py:132
-msgid "Shape (square, circle, triangle)"
-msgstr ""
+#: ../lib/advene/gui/main.py:4464
+#, fuzzy
+msgid "Enable abbreviation mode"
+msgstr "Relazioni"
 
-#: ../lib/advene/rules/actions.py:133
-#: ../lib/advene/gui/edit/shapewidget.py:342
-#: ../lib/advene/gui/edit/elements.py:891
-#: ../lib/advene/gui/edit/elements.py:971
-#: ../lib/advene/gui/edit/elements.py:1085
-#: ../lib/advene/gui/views/tagbag.py:138
-msgid "Color"
-msgstr "Colore"
+#: ../lib/advene/gui/main.py:4465
+#, fuzzy
+msgid "Abbreviations"
+msgstr "Relazioni"
 
-#: ../lib/advene/rules/actions.py:134
-msgid "x-position (percentage of screen)"
+#: ../lib/advene/gui/main.py:4465
+msgid ""
+"Text abbreviations. 1 entry per line. Each line consists of the abbreviation "
+"followed by its replacement."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:135
-msgid "y-position (percentage of screen)"
+#: ../lib/advene/gui/main.py:4467
+msgid "Text-To-Speech"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:136
-msgid "Size (arbitrary units)"
+#: ../lib/advene/gui/main.py:4468
+msgid "TTS language"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:137
-msgid "Duration of the display in ms"
+#: ../lib/advene/gui/main.py:4469
+msgid "What language settings should be used for text-to-speech"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:145
-msgid "A square"
+#: ../lib/advene/gui/main.py:4470
+msgid "English"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:146
-msgid "A circle"
+#: ../lib/advene/gui/main.py:4471
+msgid "French"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:147
-msgid "A triangle"
+#: ../lib/advene/gui/main.py:4472
+msgid "Spanish"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:150
-msgid "White"
+#: ../lib/advene/gui/main.py:4474
+msgid "TTS Encoding"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:151
-msgid "Black"
+#: ../lib/advene/gui/main.py:4475
+msgid "What encoding should be used to communicate with the TTS engine"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:152
-msgid "Red"
+#: ../lib/advene/gui/main.py:4476
+msgid "TTS Engine"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:153
-msgid "Green"
+#: ../lib/advene/gui/main.py:4477
+msgid ""
+"Which TTS engine should be used (modification requires restarting Advene to "
+"take into account)"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:154
-msgid "Blue"
-msgstr ""
+#: ../lib/advene/gui/main.py:4478
+#, fuzzy
+msgid "Automatic"
+msgstr "Autore"
 
-#: ../lib/advene/rules/actions.py:155
-msgid "Yellow"
+#: ../lib/advene/gui/main.py:4479
+msgid "eSpeak"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:158
-msgid "At the top of the screen"
+#: ../lib/advene/gui/main.py:4480
+msgid "Custom script with standard input"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:159 ../lib/advene/rules/actions.py:164
-msgid "In the middle of the screen"
+#: ../lib/advene/gui/main.py:4481
+msgid "Custom script with arguments"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:160
-msgid "At the bottom of the screen"
+#: ../lib/advene/gui/main.py:4482
+msgid "SAPI"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:163
-msgid "At the left of the screen"
+#: ../lib/advene/gui/main.py:4483
+msgid "MacOS X say"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:167
-#: ../lib/advene/gui/edit/transcribe.py:1164
-#: ../lib/advene/gui/views/activebookmarks.py:547
-msgid "Small"
+#: ../lib/advene/gui/main.py:4484
+msgid "Generic (text output)"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:168
-#: ../lib/advene/gui/edit/transcribe.py:1165
-#: ../lib/advene/gui/views/activebookmarks.py:548
-msgid "Normal"
+#: ../lib/advene/gui/main.py:4530
+msgid "You should restart Advene to take some options into account."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:169
-#: ../lib/advene/gui/edit/transcribe.py:1166
-#: ../lib/advene/gui/views/activebookmarks.py:549
-msgid "Large"
+#: ../lib/advene/gui/main.py:4539
+#, python-format
+msgid "Imagecache saved to %s"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:181
-msgid "Zero the volume during the annotation"
+#: ../lib/advene/gui/main.py:4552
+msgid "Restarting player..."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:188
-msgid "Zero the volume"
+#: ../lib/advene/gui/main.py:4647 ../lib/advene/gui/views/timeline.py:1121
+#: ../lib/advene/rules/elements.py:1010
+msgid "Creation of a new annotation type"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:195
-msgid "Restore the volume"
+#: ../lib/advene/gui/main.py:4655 ../lib/advene/gui/views/timeline.py:1150
+msgid ""
+"Select the schema where you want to\n"
+"create the new relation type."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:203
-msgid "Activate a STBV"
+#: ../lib/advene/gui/main.py:4673
+msgid "Select the package to merge"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:204
-msgid "STBV id"
+#: ../lib/advene/gui/main.py:4694
+msgid "Saving workspace"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:213
-msgid "Send a user event"
+#: ../lib/advene/gui/main.py:4697
+msgid "Enter a view name to save the workspace"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:214
-msgid "Identifier"
-msgstr ""
+#: ../lib/advene/gui/main.py:4698
+#, fuzzy
+msgid "Default workspace"
+msgstr "Vista statica predefinita"
 
-#: ../lib/advene/rules/actions.py:215
-msgid "Delay in ms before sending the event."
+#: ../lib/advene/gui/main.py:4699
+msgid "Open this workspace when opening the package"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:225
-msgid "Open a URL in the web browser"
+#: ../lib/advene/gui/main.py:4722 ../lib/advene/gui/views/__init__.py:305
+#, python-format
+msgid "Error: the identifier %s contains invalid characters."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:226 ../lib/advene/gui/plugins/actions.py:103
-#: ../lib/advene/gui/views/logwindow.py:159
-msgid "URL"
+#: ../lib/advene/gui/main.py:4733
+#, python-format
+msgid "Error: the view %s exists and is not a workspace view."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:235
-msgid "Open a static view"
+#: ../lib/advene/gui/main.py:4764
+#, python-format
+msgid "Cannot save default workspace: %s"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:246
-msgid "Set the audio volume"
+#: ../lib/advene/gui/main.py:4774
+msgid "Standard workspace has been saved"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:247
-msgid "Volume level (from 0 to 100)"
+#: ../lib/advene/gui/main.py:4781
+msgid "Website export"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:256
-msgid "Set the playing rate"
+#: ../lib/advene/gui/main.py:4782
+msgid "Exporting views to a website"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:257
-msgid "Rate (100: normal rate, 200: twice slower)"
-msgstr ""
+#: ../lib/advene/gui/main.py:4785
+#, fuzzy
+msgid "Output directory"
+msgstr "Cartella"
 
-#: ../lib/advene/rules/actions.py:266
-msgid "Play a sound resource"
+#: ../lib/advene/gui/main.py:4794
+msgid "Specify the output directory"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:267
-msgid "Clip id"
+#: ../lib/advene/gui/main.py:4803
+msgid "Maximum recursion depth"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:268 ../lib/advene/rules/actions.py:282
-msgid "Volume (0..100)"
+#: ../lib/advene/gui/main.py:4810
+msgid "Video URL"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:269 ../lib/advene/rules/actions.py:283
-msgid "Left-right balance: -1 -> full left, 0 -> center, 1 -> full right"
+#: ../lib/advene/gui/main.py:4812
+msgid ""
+"URL for the video, if it is available on a sharing website (Only Youtube for "
+"the moment).\n"
+" It can also be a h264/ogg file, which will in this case be handled by the "
+"HTML5 video player."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:280
+#: ../lib/advene/gui/main.py:4862
 #, fuzzy
-msgid "Play a sound file"
-msgstr "Visualizza %s"
+msgid "Could not export data: "
+msgstr "Impossibile salvare il file: %s"
 
-#: ../lib/advene/rules/actions.py:281
-msgid "Sound filename"
+#: ../lib/advene/gui/main.py:4864
+#, python-format
+msgid "Website export to %s completed"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:293
-msgid "Set a state variable"
+#: ../lib/advene/gui/main.py:4903
+msgid "This video player is not able to grab specific screenshots"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:294 ../lib/advene/rules/actions.py:306
-msgid "State variable name"
+#: ../lib/advene/gui/main.py:4909
+#, python-format
+msgid "Updating %d snapshots"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:295
-msgid "State value"
+#: ../lib/advene/gui/main.py:4914
+msgid "No snapshot to update"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:305
-msgid "Increment a state variable"
-msgstr ""
+#: ../lib/advene/gui/plugins/shotvalidation.py:37
+#, fuzzy
+msgid "Shot validation view"
+msgstr "Seleziona un'azione"
 
-#: ../lib/advene/rules/actions.py:315
-msgid "Clear all state variables"
-msgstr ""
+#: ../lib/advene/gui/plugins/shotvalidation.py:39
+#, fuzzy
+msgid "Display shot validation interface"
+msgstr "Visualizza cronologia di navigazione"
 
-#: ../lib/advene/rules/actions.py:330
+#: ../lib/advene/gui/plugins/shotvalidation.py:115
 #, python-format
-msgid "Error in the evaluation of the parameter %s:"
+msgid "Merged #%(first)d-#%(second)d into #%(first)d"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:389 ../lib/advene/gui/plugins/actions.py:247
-#, python-format
-msgid "The %s-related outgoing annotation"
+#: ../lib/advene/gui/plugins/shotvalidation.py:145
+msgid "Last action undone"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:391 ../lib/advene/gui/plugins/actions.py:249
+#: ../lib/advene/gui/plugins/shotvalidation.py:163
 #, python-format
-msgid "The %s-related incoming annotation"
+msgid "Split annotation #%(current)d into #%(current)d and #%(next)d"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:551
+#: ../lib/advene/gui/plugins/shotvalidation.py:168
 #, python-format
-msgid "Cannot find the stbv %s"
+msgid "Cannot split annotation #%(current)d: out of bounds."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:615 ../lib/advene/gui/views/viewbook.py:263
+#: ../lib/advene/gui/plugins/shotvalidation.py:188
 #, python-format
-msgid "Cannot find the view %s"
+msgid "Changed cut between #%(first)d and %(second)d"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:647
-msgid "The set_rate method is unavailable."
+#: ../lib/advene/gui/plugins/shotvalidation.py:191
+msgid "Changed begin time for first annotation"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:657
-msgid "No 'soundclips' resource folder in the package"
+#: ../lib/advene/gui/plugins/shotvalidation.py:197
+#, fuzzy
+msgid "No annotations to adjust"
+msgstr "di un tipo di annotazione"
+
+#: ../lib/advene/gui/plugins/shotvalidation.py:204
+msgid ""
+"Click on the frame just after the cut to adjust the cut time.\n"
+"Control-click on a frame to indicate a missing cut."
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:683
-msgid "Full volume"
+#: ../lib/advene/gui/plugins/shotvalidation.py:212
+#, python-format
+msgid "Begin of #%(index)d (title: %(content)s)"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:684
-msgid "Left"
+#: ../lib/advene/gui/plugins/shotvalidation.py:226
+msgid "< Previous cut"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:685
-#: ../lib/advene/gui/edit/transcribe.py:1196
-msgid "Center"
+#: ../lib/advene/gui/plugins/shotvalidation.py:227
+#, fuzzy
+msgid "Display previous cut"
+msgstr "Tutte le annotazioni"
+
+#: ../lib/advene/gui/plugins/shotvalidation.py:234
+msgid "Next cut >"
 msgstr ""
 
-#: ../lib/advene/rules/actions.py:686
-msgid "Right"
+#: ../lib/advene/gui/plugins/shotvalidation.py:235
+#, fuzzy
+msgid "Display next cut"
+msgstr "Tutte le annotazioni"
+
+#: ../lib/advene/gui/plugins/shotvalidation.py:250
+#: ../lib/advene/gui/views/annotationdisplay.py:92
+#: ../lib/advene/gui/views/timeline.py:86
+msgid "Current time"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:141
-msgid "is equal to"
+#: ../lib/advene/gui/plugins/shotvalidation.py:251
+#, fuzzy
+msgid "Go to annotation containing current player time."
+msgstr "di un tipo di annotazione"
+
+#: ../lib/advene/gui/plugins/shotvalidation.py:255
+#: ../lib/advene/gui/edit/frameselector.py:200
+#, fuzzy
+msgid "Refresh snapshots"
+msgstr "Visualizza %s"
+
+#: ../lib/advene/gui/plugins/shotvalidation.py:256
+#: ../lib/advene/gui/edit/frameselector.py:201
+msgid "Refresh missing snapshots"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:142
-msgid "is different from"
+#: ../lib/advene/gui/plugins/shotvalidation.py:261
+msgid "Undo last modification"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:143
-msgid "contains"
+#: ../lib/advene/gui/plugins/shotvalidation.py:267
+msgid "Merge with previous"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:144
-msgid "is greater than"
+#: ../lib/advene/gui/plugins/shotvalidation.py:268
+msgid "Merge with previous annotation, i.e. remove this bound."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:145
-msgid "is lower than"
-msgstr ""
+#: ../lib/advene/gui/plugins/shotvalidation.py:273
+#, fuzzy
+msgid "Close view."
+msgstr "Scegliere un file"
 
-#: ../lib/advene/rules/elements.py:146
-msgid "matches the regexp"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:44
+msgid "Activity trace"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:147
-msgid "is before"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:74
+#: ../lib/advene/gui/plugins/eventaccumulator.py:75
+#: ../lib/advene/gui/plugins/tracetimeline.py:65
+#: ../lib/advene/gui/plugins/tracetimeline.py:66
+#: ../lib/advene/gui/plugins/tracepreview.py:72
+#: ../lib/advene/gui/plugins/tracepreview.py:73
+msgid "Beginning edition"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:148
-msgid "meets"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:76
+#: ../lib/advene/gui/plugins/eventaccumulator.py:77
+#: ../lib/advene/gui/plugins/eventaccumulator.py:78
+#: ../lib/advene/gui/plugins/tracetimeline.py:67
+#: ../lib/advene/gui/plugins/tracetimeline.py:68
+#: ../lib/advene/gui/plugins/tracetimeline.py:69
+#: ../lib/advene/gui/plugins/tracepreview.py:74
+#: ../lib/advene/gui/plugins/tracepreview.py:75
+#: ../lib/advene/gui/plugins/tracepreview.py:76
+msgid "Canceling edition"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:149
-msgid "overlaps"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:79
+#: ../lib/advene/gui/plugins/tracetimeline.py:70
+#: ../lib/advene/gui/plugins/tracepreview.py:77
+msgid "Ending edition"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:150
-msgid "during"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:135
+msgid " Trace : "
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:151
-msgid "starts"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:139
+#, fuzzy
+msgid " Filters"
+msgstr "_File"
 
-#: ../lib/advene/rules/elements.py:152
-msgid "finishes"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:168
+msgid " Time : "
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:157
-msgid "is not true"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:178
+msgid " Max. : "
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:158
-msgid "is true"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:187
+#, fuzzy
+msgid "Export"
+msgstr "Importatore"
 
-#: ../lib/advene/rules/elements.py:162
-msgid "Basic conditions"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:203
+#: ../lib/advene/gui/plugins/tracetimeline.py:665
+msgid "Exporting traces"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:163
-msgid "Allen relations"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:208
+#: ../lib/advene/gui/plugins/tracetimeline.py:670
+#, python-format
+msgid ""
+"Export done to\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:226 ../lib/advene/rules/elements.py:232
-msgid "Unknown type for overlaps comparison"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:254
+#, fuzzy
+msgid "Defining Filters"
+msgstr "_File"
 
-#: ../lib/advene/rules/elements.py:240 ../lib/advene/rules/elements.py:246
-msgid "Unknown type for during comparison"
-msgstr ""
+#: ../lib/advene/gui/plugins/eventaccumulator.py:560
+#: ../lib/advene/gui/plugins/eventaccumulator.py:615
+#: ../lib/advene/gui/plugins/tracepreview.py:214
+#, fuzzy, python-format
+msgid "of an annotation (%s)"
+msgstr "Tutte le annotazioni"
+
+#: ../lib/advene/gui/plugins/eventaccumulator.py:562
+#: ../lib/advene/gui/plugins/eventaccumulator.py:617
+#: ../lib/advene/gui/plugins/tracepreview.py:216
+#, fuzzy, python-format
+msgid "of a relation (%s)"
+msgstr "Relazioni"
+
+#: ../lib/advene/gui/plugins/eventaccumulator.py:564
+#: ../lib/advene/gui/plugins/eventaccumulator.py:619
+#: ../lib/advene/gui/plugins/tracepreview.py:218
+#, fuzzy, python-format
+msgid "of an annotation type (%s)"
+msgstr "di un tipo di annotazione"
+
+#: ../lib/advene/gui/plugins/eventaccumulator.py:566
+#: ../lib/advene/gui/plugins/eventaccumulator.py:621
+#: ../lib/advene/gui/plugins/tracepreview.py:220
+#, fuzzy, python-format
+msgid "of a relation type (%s)"
+msgstr "Tipo di Annotazione"
+
+#: ../lib/advene/gui/plugins/eventaccumulator.py:568
+#: ../lib/advene/gui/plugins/eventaccumulator.py:623
+#: ../lib/advene/gui/plugins/tracepreview.py:222
+#, fuzzy, python-format
+msgid "of a schema (%s)"
+msgstr "Schemi"
 
-#: ../lib/advene/rules/elements.py:515 ../lib/advene/rules/elements.py:521
+#: ../lib/advene/gui/plugins/eventaccumulator.py:570
+#: ../lib/advene/gui/plugins/eventaccumulator.py:625
+#: ../lib/advene/gui/plugins/tracepreview.py:224
 #, python-format
-msgid "Unknown action %s"
+msgid "of a view (%s)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:522
+#: ../lib/advene/gui/plugins/eventaccumulator.py:572
+#: ../lib/advene/gui/plugins/eventaccumulator.py:627
+#: ../lib/advene/gui/plugins/tracepreview.py:226
 #, fuzzy, python-format
-msgid "Unknown parameter %s"
-msgstr "Parametro %s"
+msgid "of a package (%s)"
+msgstr "Pacchetto %s"
 
-#: ../lib/advene/rules/elements.py:527
-#, fuzzy
-msgid "Unknown actions"
-msgstr "Tutte le annotazioni"
+#: ../lib/advene/gui/plugins/eventaccumulator.py:574
+#: ../lib/advene/gui/plugins/eventaccumulator.py:629
+#: ../lib/advene/gui/plugins/tracepreview.py:228
+#, fuzzy, python-format
+msgid "of an unknown item (%s)"
+msgstr "Parametro %s"
 
-#: ../lib/advene/rules/elements.py:972
-msgid "Start of the editing of an element"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:382
+#, python-format
+msgid "Rendering type %(type)s as %(presentation)s"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:973
-msgid "Cancel of the editing of an element"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:527
+msgid "Snapshot only"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:974
-msgid "Destruction of the edit window of an element"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:528
+msgid "Overlayed snapshot only"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:975
-msgid "Validation of the editing of an element"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:529
+msgid "Timestamp only"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:976
-msgid "Ending editing of a package"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:530
+msgid "Snapshot+timestamp"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:977
-msgid "Beginning of an annotation"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:531
+#, fuzzy
+msgid "Annotation content"
+msgstr "Tipo di Annotazione"
 
-#: ../lib/advene/rules/elements.py:978
-msgid "End of an annotation"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:546
+msgid "as a list"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:979
-msgid "Creation of a new annotation"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:547
+msgid "as a grid"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:980
-msgid "Ending editing of an annotation"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:548
+msgid "as a table"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:981
-msgid "Suppression of an annotation"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:549
+#: ../lib/advene/gui/views/viewbook.py:394
+msgid "as a transcription"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:982
-msgid "Activation of an annotation"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:667
+#: ../lib/advene/gui/views/transcription.py:448
+#, python-format
+msgid "Annotation %s"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:983
-msgid "Deactivation of an annotation"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:668
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:687
+msgid "Play video"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:984
-msgid "Merging of two annotations"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:669
+msgid "Show timestamp only"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:985
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:670
 #, fuzzy
-msgid "Moving an annotation"
-msgstr "di un tipo di annotazione"
+msgid "Show content only"
+msgstr "Salva contenuto in..."
 
-#: ../lib/advene/rules/elements.py:986
-msgid "Activation of a relation"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:671
+msgid "Show snapshot only"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:987
-msgid "Deactivation of a relation"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:673
+msgid "Show overlayed timestamp"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:988
-msgid "Creation of a new relation"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:674
+#, fuzzy
+msgid "Show overlayed content"
+msgstr "Elementi cercati"
 
-#: ../lib/advene/rules/elements.py:989
-msgid "Ending editing of a relation"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:676
+#, fuzzy, python-format
+msgid "Annotation type %s"
+msgstr "Tipo di Annotazione"
 
-#: ../lib/advene/rules/elements.py:990
-msgid "Suppression of a relation"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:677
+#, fuzzy
+msgid "display as list"
+msgstr "Visualizza cronologia di navigazione"
 
-#: ../lib/advene/rules/elements.py:991
-msgid "Creation of a new view"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:678
+#, fuzzy
+msgid "display as grid"
+msgstr "Visualizza cronologia di navigazione"
 
-#: ../lib/advene/rules/elements.py:992
-msgid "Ending editing of a view"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:679
+#, fuzzy
+msgid "display as table"
+msgstr "Visualizza %s"
 
-#: ../lib/advene/rules/elements.py:993
-msgid "Suppression of a view"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:680
+#, fuzzy
+msgid "display as transcription"
+msgstr "Visualizza le annotazione come una trascrizione"
 
-#: ../lib/advene/rules/elements.py:994
-msgid "Creation of a new query"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:689
+#, fuzzy
+msgid "Open link"
+msgstr "Apri"
 
-#: ../lib/advene/rules/elements.py:995
-msgid "Ending editing of a query"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:745
+#, python-format
+msgid "HTML editor: cannot parse content (%s)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:996
-msgid "Suppression of a query"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:776
+#, fuzzy, python-format
+msgid "Heading %d"
+msgstr "Modifica %s"
 
-#: ../lib/advene/rules/elements.py:997
-msgid "Creation of a new schema"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:787
+msgid "Bold"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:998
-msgid "Ending editing of a schema"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:788
+msgid "Italic"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:999
-msgid "Suppression of a schema"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:789
+msgid "Header"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1000
-#: ../lib/advene/gui/views/timeline.py:1029 ../lib/advene/gui/main.py:4555
-msgid "Creation of a new annotation type"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:791
+msgid "Copy"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1001
-msgid "Ending editing an annotation type"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:792
+msgid "Cut"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1002
-msgid "Suppression of an annotation type"
-msgstr ""
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:793
+#, fuzzy
+msgid "Paste"
+msgstr "Data"
 
-#: ../lib/advene/rules/elements.py:1003
-msgid "Creation of a new relation type"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:795
+#: ../lib/advene/gui/views/timeline.py:139
+msgid "Refresh"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1004
-msgid "Ending editing a relation type"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:851
+msgid "WYSIWYG editor"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1005
-msgid "Suppression of a relation type"
+#: ../lib/advene/gui/plugins/htmlcontenhandler.py:861
+#, fuzzy
+msgid "Edit HTML source"
+msgstr "Modifica %s"
+
+#: ../lib/advene/gui/plugins/tracetimeline.py:71
+#: ../lib/advene/gui/plugins/tracepreview.py:78
+#, fuzzy
+msgid "Moving to"
+msgstr "di un tipo di annotazione"
+
+#: ../lib/advene/gui/plugins/tracetimeline.py:87
+#, fuzzy
+msgid "Traces"
+msgstr "Tag"
+
+#: ../lib/advene/gui/plugins/tracetimeline.py:213
+#, python-format
+msgid "%(name)s (%(index)d)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1006
-msgid "Creation of a new resource"
+#: ../lib/advene/gui/plugins/tracetimeline.py:241
+msgid "Search"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1007
-msgid "Ending editing of a resource"
+#: ../lib/advene/gui/plugins/tracetimeline.py:254
+#: ../lib/advene/gui/plugins/tracetimeline.py:1214
+#, python-format
+msgid "%(name)s (%(index)s)"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1008
-msgid "Suppression of a resource"
+#: ../lib/advene/gui/plugins/tracetimeline.py:426
+#: ../lib/advene/gui/views/timeline.py:3484
+#: ../lib/advene/gui/edit/montage.py:449
+msgid "Zoom out"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1009
-msgid "Modification of the tag"
+#: ../lib/advene/gui/plugins/tracetimeline.py:431
+#: ../lib/advene/gui/views/timeline.py:3489
+#: ../lib/advene/gui/edit/montage.py:454
+msgid "Zoom in"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1010
-msgid "Activating a link"
+#: ../lib/advene/gui/plugins/tracetimeline.py:436
+msgid "Zoom 100%"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1011
-msgid "Player start"
+#: ../lib/advene/gui/plugins/tracetimeline.py:440
+msgid "Toggle links lock"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1012
-msgid "Player stop"
+#: ../lib/advene/gui/plugins/tracetimeline.py:448
+msgid "Toggle link mode"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1013
-msgid "Player pause"
-msgstr ""
+#: ../lib/advene/gui/plugins/tracetimeline.py:455
+#, fuzzy
+msgid "Open a trace file"
+msgstr "Apri un file pacchetto"
 
-#: ../lib/advene/rules/elements.py:1014
-msgid "Player resume"
+#: ../lib/advene/gui/plugins/tracetimeline.py:470
+msgid "Toggle auto refresh"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1015
-msgid "Going to a given position"
-msgstr ""
+#: ../lib/advene/gui/plugins/tracetimeline.py:481
+#, fuzzy
+msgid "Open an existing trace"
+msgstr "Apri un file pacchetto"
 
-#: ../lib/advene/rules/elements.py:1016
-msgid "Loading a new package"
+#: ../lib/advene/gui/plugins/tracetimeline.py:487
+msgid "Save trace"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1017
-msgid "Activating a package"
+#: ../lib/advene/gui/plugins/tracetimeline.py:492
+msgid "Configuration"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1018
-msgid "Saving the package"
+#: ../lib/advene/gui/plugins/tracetimeline.py:941
+msgid "Zoom and center on linked items"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1019
-msgid "Start of the dynamic view"
-msgstr ""
+#: ../lib/advene/gui/plugins/tracetimeline.py:950
+#, fuzzy
+msgid "Edit item"
+msgstr "_Modifica"
 
-#: ../lib/advene/rules/elements.py:1020
-msgid "End of the dynamic view"
+#: ../lib/advene/gui/plugins/tracetimeline.py:954
+msgid "Recreate item"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1021
-msgid "Start of the application"
+#: ../lib/advene/gui/plugins/tracetimeline.py:970
+#: ../lib/advene/gui/plugins/tracetimeline.py:991
+#: ../lib/advene/gui/views/timeline.py:2595 ../lib/advene/gui/popup.py:542
+#: ../lib/advene/gui/edit/transcribe.py:495
+msgid "Go to..."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1022
-msgid "End of the application"
-msgstr ""
+#: ../lib/advene/gui/plugins/tracetimeline.py:974
+#, fuzzy
+msgid "Zoom on action"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/rules/elements.py:1023
-msgid "User-defined event"
+#: ../lib/advene/gui/plugins/tracetimeline.py:2018
+#: ../lib/advene/gui/views/timeline.py:3362
+#: ../lib/advene/gui/edit/montage.py:544
+msgid "Inspector"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1024
-msgid "Modification of the associated media"
+#: ../lib/advene/gui/plugins/tracetimeline.py:2023
+msgid "Item Id"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1025
-msgid "Highlight a bookmark"
+#: ../lib/advene/gui/plugins/tracetimeline.py:2026
+msgid "Item name or class"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1026
-msgid "Unhighlight a bookmark"
-msgstr ""
+#: ../lib/advene/gui/plugins/tracetimeline.py:2030
+#, fuzzy
+msgid "Type or schema"
+msgstr "Schema"
 
-#: ../lib/advene/rules/elements.py:1027
-msgid "Updating duration of the movie"
-msgstr ""
+#: ../lib/advene/gui/plugins/tracetimeline.py:2033
+#, fuzzy
+msgid "Operations"
+msgstr "Relazioni"
 
-#: ../lib/advene/rules/elements.py:1028
-msgid "Displaying a popup"
+#: ../lib/advene/gui/plugins/tracetimeline.py:2076
+msgid "Comment"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1029
-msgid "Updating a snapshot"
-msgstr ""
+#: ../lib/advene/gui/plugins/tracetimeline.py:2108
+#: ../lib/advene/gui/edit/merge.py:191
+msgid "Action"
+msgstr "Azione"
 
-#: ../lib/advene/rules/elements.py:1067
-msgid "Player control"
+#: ../lib/advene/gui/plugins/logmessages.py:35
+msgid "Log Messages"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1068
-msgid "Audio enrichment"
+#: ../lib/advene/gui/plugins/actions.py:40 ../lib/advene/core/controller.py:307
+#: ../lib/advene/rules/actions.py:38
+msgid "Display a message"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1069
-msgid "Image enrichment"
+#: ../lib/advene/gui/plugins/actions.py:41
+#: ../lib/advene/gui/plugins/actions.py:53
+#: ../lib/advene/gui/plugins/actions.py:71
+#: ../lib/advene/gui/plugins/actions.py:86
+#: ../lib/advene/gui/plugins/actions.py:102
+#: ../lib/advene/gui/plugins/actions.py:203
+#: ../lib/advene/core/controller.py:308
+msgid "String to display."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1070
-msgid "External display control"
+#: ../lib/advene/gui/plugins/actions.py:44
+#: ../lib/advene/gui/plugins/actions.py:58
+#: ../lib/advene/gui/plugins/actions.py:110
+#: ../lib/advene/gui/plugins/actions.py:399
+#: ../lib/advene/gui/plugins/actions.py:527 ../lib/advene/gui/edit/rules.py:766
+#: ../lib/advene/plugins/brltty.py:90 ../lib/advene/plugins/tts.py:84
+#: ../lib/advene/rules/actions.py:42 ../lib/advene/rules/actions.py:109
+#: ../lib/advene/rules/actions.py:125
+msgid "The annotation content"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1071
-msgid "Popup"
+#: ../lib/advene/gui/plugins/actions.py:52
+msgid "Display a popup"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1073
-msgid "State"
+#: ../lib/advene/gui/plugins/actions.py:54
+#: ../lib/advene/gui/plugins/actions.py:73
+#: ../lib/advene/gui/plugins/actions.py:88
+#: ../lib/advene/gui/plugins/actions.py:104
+#: ../lib/advene/gui/plugins/actions.py:160
+#: ../lib/advene/gui/plugins/actions.py:184
+msgid "Display duration in ms. Ignored if empty."
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1074
-msgid "GUI actions"
+#: ../lib/advene/gui/plugins/actions.py:61
+#: ../lib/advene/gui/plugins/actions.py:121
+#: ../lib/advene/gui/plugins/actions.py:403
+#: ../lib/advene/gui/plugins/actions.py:538 ../lib/advene/rules/actions.py:112
+#: ../lib/advene/rules/actions.py:174
+msgid "1 second"
 msgstr ""
 
-#: ../lib/advene/rules/elements.py:1075
-#, fuzzy
-msgid "Expert"
-msgstr "Relazioni"
-
-#: ../lib/advene/gui/util/initialconfig.py:82
-msgid "Initial Advene configuration"
+#: ../lib/advene/gui/plugins/actions.py:62
+#: ../lib/advene/gui/plugins/actions.py:122
+#: ../lib/advene/gui/plugins/actions.py:404
+#: ../lib/advene/gui/plugins/actions.py:539 ../lib/advene/gui/edit/rules.py:773
+#: ../lib/advene/rules/actions.py:113 ../lib/advene/rules/actions.py:175
+msgid "The annotation duration"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:83
-msgid ""
-"<span size='large'><b>Welcome in Advene</b>\n"
-"This is the first time that you run Advene. Please answer some basic "
-"configuration questions. You will be able to modify these choices from the "
-"Advene interface, in the Edit/Preferences menu.</span>"
+#: ../lib/advene/gui/plugins/actions.py:70
+msgid "Popup an entry box"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:84
-msgid "Interface language"
+#: ../lib/advene/gui/plugins/actions.py:72
+msgid "Object where to store the answer (should have a content)"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:84
-msgid "Language used for the interface"
+#: ../lib/advene/gui/plugins/actions.py:84
+msgid "Display a popup to go to another position"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:88 ../lib/advene/gui/main.py:4247
-msgid "System default"
+#: ../lib/advene/gui/plugins/actions.py:85
+#: ../lib/advene/gui/plugins/actions.py:101
+#: ../lib/advene/gui/plugins/actions.py:155
+#: ../lib/advene/gui/plugins/actions.py:177
+msgid "General description"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:90
-msgid "Weekly check for Advene updates on the Advene website"
+#: ../lib/advene/gui/plugins/actions.py:87
+msgid "New position"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:90 ../lib/advene/gui/main.py:4273
-msgid "Weekly check for updates on the Advene website"
+#: ../lib/advene/gui/plugins/actions.py:90
+#: ../lib/advene/gui/plugins/actions.py:191
+msgid "Go to related annotation"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:92
-msgid "Preferred directory for data files"
+#: ../lib/advene/gui/plugins/actions.py:100
+msgid "Display a popup linking to an URL"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:92
-msgid "Preferred directory for storing data files (Advene packages)"
+#: ../lib/advene/gui/plugins/actions.py:103
+#: ../lib/advene/gui/views/logwindow.py:159 ../lib/advene/rules/actions.py:228
+msgid "URL"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:94
-msgid "Directories to search for movies"
+#: ../lib/advene/gui/plugins/actions.py:106
+msgid "string:Display annotation in web browser"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:94
-#, python-format
-msgid ""
-"List of directories (separated by %(pathsep)s) to search for movie files."
+#: ../lib/advene/gui/plugins/actions.py:113
+#: ../lib/advene/gui/views/logwindow.py:160
+#: ../lib/advene/gui/views/logwindow.py:163
+msgid "See the Advene website"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:95
-msgid "First look for movie file in the same directory as the package"
+#: ../lib/advene/gui/plugins/actions.py:114
+#: ../lib/advene/gui/views/logwindow.py:164
+msgid "See the annotation"
 msgstr ""
 
-#: ../lib/advene/gui/util/initialconfig.py:95
-msgid ""
-"If checked, the movie file will be searched for in the same directory as the "
-"referencing package."
+#: ../lib/advene/gui/plugins/actions.py:117
+#: ../lib/advene/gui/views/logwindow.py:167
+msgid "The Advene website"
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:39
-#: ../lib/advene/gui/edit/schemaeditor.py:1081
-#: ../lib/advene/gui/edit/schemaeditor.py:1202
-#: ../lib/advene/gui/edit/create.py:106
-msgid "Plain text content"
+#: ../lib/advene/gui/plugins/actions.py:118
+#: ../lib/advene/gui/views/logwindow.py:168
+msgid "The annotation URL"
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:40
+#: ../lib/advene/gui/plugins/actions.py:130
 #, fuzzy
-msgid "HTML content"
-msgstr "template HTML"
+msgid "Open an interface view"
+msgstr "Apri un file pacchetto"
 
-#: ../lib/advene/gui/util/__init__.py:41
-#: ../lib/advene/gui/edit/schemaeditor.py:1082
-#: ../lib/advene/gui/edit/schemaeditor.py:1203
-#: ../lib/advene/gui/edit/create.py:107
-msgid "Simple-structured content"
+#: ../lib/advene/gui/plugins/actions.py:131
+msgid ""
+"View name (timeline, tree, transcription, browser, webbrowser, transcribe)"
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:42
-msgid "List of numeric values"
+#: ../lib/advene/gui/plugins/actions.py:132
+msgid "Destination: popup, south, east"
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:43
-#: ../lib/advene/gui/edit/schemaeditor.py:1083
-#: ../lib/advene/gui/edit/schemaeditor.py:1204
-#: ../lib/advene/gui/edit/create.py:108
-msgid "SVG graphics content"
+#: ../lib/advene/gui/plugins/actions.py:144
+#: ../lib/advene/gui/views/viewbook.py:313
+msgid "Open a saved view"
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:459
-#, python-format
-msgid ""
-"Annotation Type %(title)s:\n"
-"%(count)s"
+#: ../lib/advene/gui/plugins/actions.py:145
+msgid "Identifier of the saved view"
 msgstr ""
 
-#: ../lib/advene/gui/util/__init__.py:465
-#, python-format
-msgid ""
-"Relation Type %(title)s:\n"
-"%(count)s"
+#: ../lib/advene/gui/plugins/actions.py:154
+msgid "Display a popup with 2 options"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:376 ../lib/advene/gui/edit/dvdselect.py:95
-#: ../lib/advene/gui/edit/imports.py:331
-#: ../lib/advene/gui/edit/transcribe.py:1055
-#: ../lib/advene/gui/views/table.py:557 ../lib/advene/gui/main.py:4176
-msgid "Title"
+#: ../lib/advene/gui/plugins/actions.py:156
+#: ../lib/advene/gui/plugins/actions.py:178
+msgid "First option description"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:385 ../lib/advene/gui/edit/rules.py:1092
-#: ../lib/advene/gui/edit/imports.py:325
-#: ../lib/advene/gui/edit/elements.py:507
-#: ../lib/advene/gui/edit/elements.py:556
-#: ../lib/advene/gui/edit/elements.py:644
-#: ../lib/advene/gui/edit/elements.py:724
-#: ../lib/advene/gui/edit/elements.py:873
-#: ../lib/advene/gui/edit/elements.py:942
-#: ../lib/advene/gui/edit/elements.py:1054
-#: ../lib/advene/gui/edit/elements.py:1115
-#: ../lib/advene/gui/views/table.py:255 ../lib/advene/gui/views/table.py:559
-msgid "Id"
+#: ../lib/advene/gui/plugins/actions.py:157
+#: ../lib/advene/gui/plugins/actions.py:179
+msgid "First position"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:404 ../lib/advene/gui/util/dialog.py:443
-msgid "Name the element"
+#: ../lib/advene/gui/plugins/actions.py:158
+#: ../lib/advene/gui/plugins/actions.py:180
+msgid "Second option description"
+msgstr ""
+
+#: ../lib/advene/gui/plugins/actions.py:159
+#: ../lib/advene/gui/plugins/actions.py:181
+msgid "Second position"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:407 ../lib/advene/gui/util/dialog.py:444
-msgid "Choose a name for the element"
+#: ../lib/advene/gui/plugins/actions.py:163
+#: ../lib/advene/gui/plugins/actions.py:187
+msgid "Go to the beginning"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:482
-msgid "Open a file"
+#: ../lib/advene/gui/plugins/actions.py:165
+#: ../lib/advene/gui/plugins/actions.py:189
+msgid "Go to the end"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:507 ../lib/advene/gui/util/dialog.py:543
-msgid "N/C"
+#: ../lib/advene/gui/plugins/actions.py:176
+msgid "Display a popup with 3 options"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:512
-msgid "Alias"
+#: ../lib/advene/gui/plugins/actions.py:182
+msgid "Third option description"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:532
-msgid ""
-"Press to\n"
-"display\n"
-"information"
+#: ../lib/advene/gui/plugins/actions.py:183
+msgid "Third position"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:551
-msgid "Wait..."
+#: ../lib/advene/gui/plugins/actions.py:202
+msgid "Display a popup to navigate to related annotations"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:555
-#, python-format
-msgid "Error: %s"
+#: ../lib/advene/gui/plugins/actions.py:204
+#: ../lib/advene/gui/plugins/actions.py:559
+msgid "Choose the related annotation you want to visualise."
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:575
-msgid "Any type of file"
+#: ../lib/advene/gui/plugins/actions.py:211
+msgid "Create a bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:577
-msgid "Advene files (.xml, .azp, .apl)"
+#: ../lib/advene/gui/plugins/actions.py:212
+msgid "Bookmark position (in ms)"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:579
-msgid "Advene session (.apl)"
+#: ../lib/advene/gui/plugins/actions.py:213
+msgid "Bookmark content."
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:580
-#, fuzzy
-msgid "Audio files"
-msgstr "Aggiungi file..."
-
-#: ../lib/advene/gui/util/dialog.py:581
-msgid "Video files"
+#: ../lib/advene/gui/plugins/actions.py:214
+msgid "Bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/util/dialog.py:626
-#: ../lib/advene/gui/edit/properties.py:418
-msgid "Choose a directory"
-msgstr "Scegliere una cartella"
-
-#: ../lib/advene/gui/util/dialog.py:679
-msgid "Select an element"
+#: ../lib/advene/gui/plugins/actions.py:234 ../lib/advene/plugins/brltty.py:242
+#: ../lib/advene/plugins/tts.py:113
+msgid "Unknown rule"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:32
-#, fuzzy
-msgid "Shot validation view"
-msgstr "Seleziona un'azione"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:34
-#, fuzzy
-msgid "Display shot validation interface"
-msgstr "Visualizza cronologia di navigazione"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:111
+#: ../lib/advene/gui/plugins/actions.py:235 ../lib/advene/plugins/brltty.py:243
+#: ../lib/advene/plugins/tts.py:114
 #, python-format
-msgid "Merged #%(first)d-#%(second)d into #%(first)d"
+msgid ""
+"Rule %(rulename)s: Error in the evaluation of the parameter "
+"%(parametername)s:"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:136
-msgid "Last action undone"
+#: ../lib/advene/gui/plugins/actions.py:247 ../lib/advene/rules/actions.py:385
+#, python-format
+msgid "The %s-related outgoing annotation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:154
+#: ../lib/advene/gui/plugins/actions.py:249 ../lib/advene/rules/actions.py:387
 #, python-format
-msgid "Split annotation #%(current)d into #%(current)d and #%(next)d"
+msgid "The %s-related incoming annotation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:159
-#, python-format
-msgid "Cannot split annotation #%(current)d: out of bounds."
+#: ../lib/advene/gui/plugins/actions.py:259
+#: ../lib/advene/gui/plugins/actions.py:340
+#: ../lib/advene/gui/plugins/actions.py:358 ../lib/advene/plugins/tts.py:134
+msgid "No message..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:179
+#: ../lib/advene/gui/plugins/actions.py:276
 #, python-format
-msgid "Changed cut between #%(first)d and %(second)d"
+msgid "Error: undefined GUI view %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:182
-msgid "Changed begin time for first annotation"
+#: ../lib/advene/gui/plugins/actions.py:322
+#, python-format
+msgid "Element %s does not look like a view"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:188
-#, fuzzy
-msgid "No annotations to adjust"
-msgstr "di un tipo di annotazione"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:195
-msgid ""
-"Click on the frame just after the cut to adjust the cut time.\n"
-"Control-click on a frame to indicate a missing cut."
+#: ../lib/advene/gui/plugins/actions.py:350
+msgid "Information popup"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:203
+#: ../lib/advene/gui/plugins/actions.py:364
 #, python-format
-msgid "Begin of #%(index)d (title: %(content)s)"
+msgid "Empty destination for entry popup: %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:217
-msgid "< Previous cut"
+#: ../lib/advene/gui/plugins/actions.py:367
+#, python-format
+msgid "Destination does not have a content: %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:218
-#, fuzzy
-msgid "Display previous cut"
-msgstr "Tutte le annotazioni"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:225
-msgid "Next cut >"
+#: ../lib/advene/gui/plugins/actions.py:394
+msgid "Entry popup"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:226
-#, fuzzy
-msgid "Display next cut"
-msgstr "Tutte le annotazioni"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:251
-#: ../lib/advene/gui/views/timeline.py:81
-#: ../lib/advene/gui/views/annotationdisplay.py:90
-msgid "Current time"
+#: ../lib/advene/gui/plugins/actions.py:419
+msgid "Follow a link"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:252
-#, fuzzy
-msgid "Go to annotation containing current player time."
-msgstr "di un tipo di annotazione"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:256
-#: ../lib/advene/gui/edit/frameselector.py:193
-#, fuzzy
-msgid "Refresh snapshots"
-msgstr "Visualizza %s"
-
-#: ../lib/advene/gui/plugins/shotvalidation.py:257
-#: ../lib/advene/gui/edit/frameselector.py:194
-msgid "Refresh missing snapshots"
+#: ../lib/advene/gui/plugins/actions.py:423
+msgid "Click to open the URL"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:261
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:806
-#: ../lib/advene/gui/edit/transcribe.py:1211 ../lib/advene/gui/main.py:350
-msgid "Undo"
+#: ../lib/advene/gui/plugins/actions.py:441
+msgid "URL popup"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:262
-msgid "Undo last modification"
+#: ../lib/advene/gui/plugins/actions.py:454
+#: ../lib/advene/gui/plugins/actions.py:491
+msgid "Make a choice"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:268
-msgid "Merge with previous"
+#: ../lib/advene/gui/plugins/actions.py:458
+msgid "Click to go to another position"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:269
-msgid "Merge with previous annotation, i.e. remove this bound."
+#: ../lib/advene/gui/plugins/actions.py:477
+#: ../lib/advene/gui/plugins/actions.py:515
+#: ../lib/advene/gui/views/singletonpopup.py:98
+msgid "Navigation popup"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/shotvalidation.py:274
-#, fuzzy
-msgid "Close view."
-msgstr "Scegliere un file"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:60
-#: ../lib/advene/gui/plugins/tracetimeline.py:61
-#: ../lib/advene/gui/plugins/eventaccumulator.py:73
-#: ../lib/advene/gui/plugins/eventaccumulator.py:74
-#: ../lib/advene/gui/plugins/tracepreview.py:72
-#: ../lib/advene/gui/plugins/tracepreview.py:73
-msgid "Beginning edition"
+#: ../lib/advene/gui/plugins/actions.py:500
+#, python-format
+msgid "Choice %d"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:62
-#: ../lib/advene/gui/plugins/tracetimeline.py:63
-#: ../lib/advene/gui/plugins/tracetimeline.py:64
-#: ../lib/advene/gui/plugins/eventaccumulator.py:75
-#: ../lib/advene/gui/plugins/eventaccumulator.py:76
-#: ../lib/advene/gui/plugins/eventaccumulator.py:77
-#: ../lib/advene/gui/plugins/tracepreview.py:74
-#: ../lib/advene/gui/plugins/tracepreview.py:75
-#: ../lib/advene/gui/plugins/tracepreview.py:76
-msgid "Canceling edition"
+#: ../lib/advene/gui/plugins/actions.py:521
+msgid "The beginning of the annotation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:65
-#: ../lib/advene/gui/plugins/eventaccumulator.py:78
-#: ../lib/advene/gui/plugins/tracepreview.py:77
-msgid "Ending edition"
+#: ../lib/advene/gui/plugins/actions.py:522
+msgid "The end of the annotation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:66
-#: ../lib/advene/gui/plugins/tracepreview.py:78
+#: ../lib/advene/gui/plugins/actions.py:523
 #, fuzzy
-msgid "Moving to"
+msgid "The next annotation of the same type"
 msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:82
-#, fuzzy
-msgid "Traces"
-msgstr "Tag"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:208
-#, python-format
-msgid "%(name)s (%(index)d)"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:236
-msgid "Search"
+#: ../lib/advene/gui/plugins/actions.py:524
+msgid "The previous annotation of the same type"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:249
-#: ../lib/advene/gui/plugins/tracetimeline.py:1224
+#: ../lib/advene/gui/plugins/actions.py:573
 #, python-format
-msgid "%(name)s (%(index)s)"
+msgid ""
+"Through %(title)s%(relation_content)s:\n"
+"%(annotation_content)s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:421
-#: ../lib/advene/gui/edit/montage.py:439
-#: ../lib/advene/gui/views/timeline.py:3444
-msgid "Zoom out"
+#: ../lib/advene/gui/plugins/actions.py:581
+msgid "Relation navigation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:426
-#: ../lib/advene/gui/edit/montage.py:444
-#: ../lib/advene/gui/views/timeline.py:3449
-msgid "Zoom in"
+#: ../lib/advene/gui/plugins/actions.py:591
+msgid "New bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:431
-msgid "Zoom 100%"
+#: ../lib/advene/gui/plugins/kinect.py:38
+msgid "Kinect Controller"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:435
-msgid "Toggle links lock"
+#: ../lib/advene/gui/plugins/kinect.py:40
+msgid "Kinect control interface"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:443
-msgid "Toggle link mode"
+#: ../lib/advene/gui/plugins/contenthandlers.py:127
+msgid "Label"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:450
-#, fuzzy
-msgid "Open a trace file"
-msgstr "Apri un file pacchetto"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:465
-msgid "Toggle auto refresh"
+#: ../lib/advene/gui/plugins/contenthandlers.py:177
+#, python-format
+msgid ""
+"Error while parsing SVG content:\n"
+"\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:476
-#, fuzzy
-msgid "Open an existing trace"
-msgstr "Apri un file pacchetto"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:482
-msgid "Save trace"
+#: ../lib/advene/gui/plugins/contenthandlers.py:252
+msgid " created from "
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:487
-msgid "Configuration"
+#: ../lib/advene/gui/plugins/contenthandlers.py:329
+msgid "Graphical editor"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:668
-#: ../lib/advene/gui/plugins/eventaccumulator.py:202
-msgid "Exporting traces"
+#: ../lib/advene/gui/plugins/contenthandlers.py:340
+msgid "Edit XML"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:673
-#: ../lib/advene/gui/plugins/eventaccumulator.py:207
+#: ../lib/advene/gui/plugins/contenthandlers.py:392
+#: ../lib/advene/gui/plugins/contenthandlers.py:448
+#: ../lib/advene/gui/edit/rules.py:188
 #, python-format
 msgid ""
-"Export done to\n"
+"The following items seem to be\n"
+"invalid TALES expressions:\n"
+"\n"
 "%s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:951
-msgid "Zoom and center on linked items"
-msgstr ""
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:960
+#: ../lib/advene/gui/plugins/tracepreview.py:61
 #, fuzzy
-msgid "Edit item"
-msgstr "_Modifica"
+msgid "Trace preview"
+msgstr "Anteprima"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:964
-msgid "Recreate item"
+#: ../lib/advene/gui/plugins/tracepreview.py:99
+msgid "Full trace"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:980
-#: ../lib/advene/gui/plugins/tracetimeline.py:1001
-#: ../lib/advene/gui/edit/transcribe.py:502
-#: ../lib/advene/gui/views/timeline.py:2556 ../lib/advene/gui/popup.py:513
-msgid "Go to..."
+#: ../lib/advene/gui/plugins/tracepreview.py:100
+msgid "Open the trace timeline view fareast"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:984
-#, fuzzy
-msgid "Zoom on action"
-msgstr "Tutte le annotazioni"
-
-#: ../lib/advene/gui/plugins/tracetimeline.py:2030
-#: ../lib/advene/gui/edit/montage.py:535
-#: ../lib/advene/gui/views/timeline.py:3318
-msgid "Inspector"
+#: ../lib/advene/gui/plugins/videoplayer.py:39
+msgid "Complementary video player"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2035
-msgid "Item Id"
+#: ../lib/advene/gui/plugins/videoplayer.py:45
+#: ../lib/advene/gui/views/bookmarks.py:246
+#: ../lib/advene/gui/views/transcription.py:59
+#: ../lib/advene/gui/views/timeline.py:140 ../lib/advene/gui/edit/montage.py:58
+#: ../lib/advene/gui/edit/transcribe.py:88
+msgid "Save view"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2038
-msgid "Item name or class"
+#: ../lib/advene/gui/plugins/videoplayer.py:46
+#: ../lib/advene/gui/views/transcription.py:60
+#: ../lib/advene/gui/views/timeline.py:141 ../lib/advene/gui/views/tagbag.py:65
+#: ../lib/advene/gui/views/interactivequery.py:61
+#: ../lib/advene/gui/edit/transcribe.py:89
+msgid "Save default options"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2042
+#: ../lib/advene/gui/plugins/videoplayer.py:47
+#, fuzzy
+msgid "Select video file"
+msgstr "Seleziona un video stream"
+
+#: ../lib/advene/gui/plugins/videoplayer.py:128
 #, fuzzy
-msgid "Type or schema"
-msgstr "Schema"
+msgid "Select a video file"
+msgstr "Seleziona un video stream"
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2045
-#, fuzzy
-msgid "Operations"
-msgstr "Relazioni"
+#: ../lib/advene/gui/plugins/videoplayer.py:250
+msgid "Synchronize"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2087
-msgid "Comment"
+#: ../lib/advene/gui/plugins/videoplayer.py:268
+msgid "Offset in ms"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracetimeline.py:2119
-#: ../lib/advene/gui/edit/merge.py:191
-msgid "Action"
-msgstr "Azione"
+#: ../lib/advene/gui/plugins/videoplayer.py:276
+#, fuzzy
+msgid "Drag and drop to get player time"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/plugins/kinect.py:41
-msgid "Kinect Controller"
+#: ../lib/advene/gui/views/singletonpopup.py:32
+msgid "SingletonPopup"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/kinect.py:43
-msgid "Kinect control interface"
+#: ../lib/advene/gui/views/caption.py:31
+msgid "Display a text caption below the video output"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:52
-msgid "Display a popup"
+#: ../lib/advene/gui/views/html.py:90
+#, python-format
+msgid "%s%% loaded"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:54
-#: ../lib/advene/gui/plugins/actions.py:73
-#: ../lib/advene/gui/plugins/actions.py:88
-#: ../lib/advene/gui/plugins/actions.py:104
-#: ../lib/advene/gui/plugins/actions.py:160
-#: ../lib/advene/gui/plugins/actions.py:184
-msgid "Display duration in ms. Ignored if empty."
-msgstr ""
+#: ../lib/advene/gui/views/html.py:93
+#, fuzzy, python-format
+msgid "Title %s"
+msgstr "Modifica %s"
 
-#: ../lib/advene/gui/plugins/actions.py:70
-msgid "Popup an entry box"
+#: ../lib/advene/gui/views/html.py:157
+msgid "HTML Viewer"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:72
-msgid "Object where to store the answer (should have a content)"
+#: ../lib/advene/gui/views/html.py:159
+msgid "Embedded HTML widget"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:84
-msgid "Display a popup to go to another position"
+#: ../lib/advene/gui/views/html.py:187
+msgid "No available HTML rendering component"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:85
-#: ../lib/advene/gui/plugins/actions.py:101
-#: ../lib/advene/gui/plugins/actions.py:155
-#: ../lib/advene/gui/plugins/actions.py:177
-msgid "General description"
+#: ../lib/advene/gui/views/annotationdisplay.py:43
+msgid "AnnotationDisplay"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:87
-msgid "New position"
+#: ../lib/advene/gui/views/annotationdisplay.py:45
+msgid "Display the contents of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:90
-#: ../lib/advene/gui/plugins/actions.py:191
-msgid "Go to related annotation"
+#: ../lib/advene/gui/views/annotationdisplay.py:86
+#: ../lib/advene/util/helper.py:610
+msgid "No annotation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:100
-msgid "Display a popup linking to an URL"
+#: ../lib/advene/gui/views/annotationdisplay.py:112
+#, python-format
+msgid ""
+"Schema %(schema)s (id %(id)s)\n"
+"%(description)s\n"
+"%(stats)s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:106
-msgid "string:Display annotation in web browser"
+#: ../lib/advene/gui/views/annotationdisplay.py:233
+msgid "Screenshot"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:113
-#: ../lib/advene/gui/views/logwindow.py:160
-#: ../lib/advene/gui/views/logwindow.py:163
-msgid "See the Advene website"
+#: ../lib/advene/gui/views/annotationdisplay.py:255
+#: ../lib/advene/gui/views/relationdisplay.py:104
+msgid "Contents"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:114
-#: ../lib/advene/gui/views/logwindow.py:164
-msgid "See the annotation"
+#: ../lib/advene/gui/views/annotationdisplay.py:258
+#: ../lib/advene/gui/views/editaccumulator.py:74
+msgid "Validate"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:117
-#: ../lib/advene/gui/views/logwindow.py:167
-msgid "The Advene website"
+#: ../lib/advene/gui/views/relationdisplay.py:34
+msgid "RelationDisplay"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:118
-#: ../lib/advene/gui/views/logwindow.py:168
-msgid "The annotation URL"
+#: ../lib/advene/gui/views/relationdisplay.py:36
+msgid "Display the contents of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:130
-#, fuzzy
-msgid "Open an interface view"
-msgstr "Apri un file pacchetto"
-
-#: ../lib/advene/gui/plugins/actions.py:131
-msgid ""
-"View name (timeline, tree, transcription, browser, webbrowser, transcribe)"
+#: ../lib/advene/gui/views/relationdisplay.py:79
+msgid "No relation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:132
-msgid "Destination: popup, south, east"
-msgstr ""
+#: ../lib/advene/gui/views/relationdisplay.py:113
+#: ../lib/advene/gui/edit/elements.py:588
+#: ../lib/advene/gui/edit/elements.py:1071
+msgid "Members"
+msgstr "Membri"
 
-#: ../lib/advene/gui/plugins/actions.py:144
-#: ../lib/advene/gui/views/viewbook.py:308
-msgid "Open a saved view"
+#: ../lib/advene/gui/views/viewplugin.py:60
+msgid "Generic view plugin"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:145
-msgid "Identifier of the saved view"
+#: ../lib/advene/gui/views/viewplugin.py:62
+msgid "You should not ever see this tooltip..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:154
-msgid "Display a popup with 2 options"
+#: ../lib/advene/gui/views/checker.py:37
+msgid "Checker"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:156
-#: ../lib/advene/gui/plugins/actions.py:178
-msgid "First option description"
-msgstr ""
+#: ../lib/advene/gui/views/checker.py:39
+#, fuzzy
+msgid "Check various package properties"
+msgstr "Modifica proprietà pacchetto"
 
-#: ../lib/advene/gui/plugins/actions.py:157
-#: ../lib/advene/gui/plugins/actions.py:179
-msgid "First position"
-msgstr ""
+#: ../lib/advene/gui/views/checker.py:89
+#, fuzzy
+msgid "List of possible issues in the current package"
+msgstr "Salva il pacchetto attuale"
 
-#: ../lib/advene/gui/plugins/actions.py:158
-#: ../lib/advene/gui/plugins/actions.py:180
-msgid "Second option description"
+#: ../lib/advene/gui/views/checker.py:107
+msgid "Overlapping"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:159
-#: ../lib/advene/gui/plugins/actions.py:181
-msgid "Second position"
+#: ../lib/advene/gui/views/table.py:61
+msgid "Annotation table view"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:163
-#: ../lib/advene/gui/plugins/actions.py:187
-msgid "Go to the beginning"
+#: ../lib/advene/gui/views/table.py:63
+msgid "Display annotations in a table"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:165
-#: ../lib/advene/gui/plugins/actions.py:189
-msgid "Go to the end"
-msgstr ""
+#: ../lib/advene/gui/views/table.py:74
+#, fuzzy
+msgid "Export as CSV"
+msgstr "Importatore"
 
-#: ../lib/advene/gui/plugins/actions.py:176
-msgid "Display a popup with 3 options"
+#: ../lib/advene/gui/views/table.py:268 ../lib/advene/gui/views/table.py:550
+msgid "Snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:182
-msgid "Third option description"
+#: ../lib/advene/gui/views/table.py:281
+#: ../lib/advene/gui/views/timeline.py:1745
+msgid "Cannot update the annotation, its representation is too complex"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:183
-msgid "Third position"
+#: ../lib/advene/gui/views/table.py:311 ../lib/advene/gui/edit/elements.py:606
+#: ../lib/advene/gui/edit/elements.py:683
+#: ../lib/advene/gui/edit/elements.py:743
+#: ../lib/advene/gui/edit/elements.py:1134
+msgid "Content"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:202
-msgid "Display a popup to navigate to related annotations"
+#: ../lib/advene/gui/views/table.py:312 ../lib/advene/gui/views/table.py:682
+#: ../lib/advene/gui/views/browser.py:368 ../lib/advene/gui/edit/create.py:94
+#: ../lib/advene/gui/edit/elements.py:514
+#: ../lib/advene/gui/edit/elements.py:563
+#: ../lib/advene/gui/edit/elements.py:665
+msgid "Type"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:204
-#: ../lib/advene/gui/plugins/actions.py:559
-msgid "Choose the related annotation you want to visualise."
+#: ../lib/advene/gui/views/table.py:313 ../lib/advene/gui/edit/elements.py:1800
+msgid "Begin"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:211
-msgid "Create a bookmark"
+#: ../lib/advene/gui/views/table.py:316 ../lib/advene/gui/views/table.py:683
+#: ../lib/advene/gui/util/dialog.py:400 ../lib/advene/gui/edit/rules.py:1091
+#: ../lib/advene/gui/edit/imports.py:328 ../lib/advene/gui/edit/elements.py:513
+#: ../lib/advene/gui/edit/elements.py:562
+#: ../lib/advene/gui/edit/elements.py:650
+#: ../lib/advene/gui/edit/elements.py:730
+#: ../lib/advene/gui/edit/elements.py:879
+#: ../lib/advene/gui/edit/elements.py:948
+#: ../lib/advene/gui/edit/elements.py:1060
+#: ../lib/advene/gui/edit/elements.py:1121
+msgid "Id"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:212
-msgid "Bookmark position (in ms)"
+#: ../lib/advene/gui/views/table.py:317 ../lib/advene/gui/views/finder.py:105
+#: ../lib/advene/util/helper.py:408
+msgid "Package"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:213
-msgid "Bookmark content."
+#: ../lib/advene/gui/views/table.py:455 ../lib/advene/gui/views/table.py:633
+msgid "Export data to file..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:214
-msgid "Bookmark"
+#: ../lib/advene/gui/views/table.py:464 ../lib/advene/gui/views/table.py:642
+#, python-format
+msgid "Error while exporting data to %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:276
-#, python-format
-msgid "Error: undefined GUI view %s"
+#: ../lib/advene/gui/views/table.py:475
+msgid "id"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:286
-#: ../lib/advene/gui/views/viewbook.py:124 ../lib/advene/gui/main.py:1189
-msgid "...in its own window"
+#: ../lib/advene/gui/views/table.py:475
+msgid "type"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:287
-#: ../lib/advene/gui/views/viewbook.py:125
-#: ../lib/advene/gui/views/__init__.py:381 ../lib/advene/gui/main.py:1190
-msgid "...embedded east of the video"
+#: ../lib/advene/gui/views/table.py:475
+msgid "begin"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:288
-#: ../lib/advene/gui/views/viewbook.py:126
-#: ../lib/advene/gui/views/__init__.py:382 ../lib/advene/gui/main.py:1191
-msgid "...embedded west of the video"
+#: ../lib/advene/gui/views/table.py:475
+msgid "end"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:289
-#: ../lib/advene/gui/views/viewbook.py:127
-#: ../lib/advene/gui/views/__init__.py:383 ../lib/advene/gui/main.py:1192
-msgid "...embedded south of the video"
+#: ../lib/advene/gui/views/table.py:475
+msgid "content"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:290
-#: ../lib/advene/gui/views/viewbook.py:128
-#: ../lib/advene/gui/views/__init__.py:384 ../lib/advene/gui/main.py:1193
-msgid "...embedded at the right of the window"
+#: ../lib/advene/gui/views/table.py:479 ../lib/advene/gui/views/table.py:658
+#: ../lib/advene/core/controller.py:2646
+#, python-format
+msgid "Data exported to %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:322
+#: ../lib/advene/gui/views/table.py:499
 #, python-format
-msgid "Element %s does not look like a view"
+msgid "Set %(attr)s time to %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:350
-msgid "Information popup"
+#: ../lib/advene/gui/views/table.py:558
+msgid "Generic table view"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:364
-#, python-format
-msgid "Empty destination for entry popup: %s"
+#: ../lib/advene/gui/views/table.py:560
+msgid "Display Advene elements in a table."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:367
+#: ../lib/advene/gui/views/table.py:583
 #, python-format
-msgid "Destination does not have a content: %s"
+msgid "Error in source evaluation %(source)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:394
-msgid "Entry popup"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element title"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:419
-msgid "Follow a link"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element type"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:423
-msgid "Click to open the URL"
+#: ../lib/advene/gui/views/table.py:654
+msgid "Element id"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:441
-msgid "URL popup"
+#: ../lib/advene/gui/views/accumulatorpopup.py:51
+msgid "PopupAccumulator"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:454
-#: ../lib/advene/gui/plugins/actions.py:491
-msgid "Make a choice"
+#: ../lib/advene/gui/views/bookmarks.py:51
+msgid "Bookmarks importer"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:458
-msgid "Click to go to another position"
+#: ../lib/advene/gui/views/bookmarks.py:72
+msgid "Bookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:477
-#: ../lib/advene/gui/plugins/actions.py:515
-#: ../lib/advene/gui/views/singletonpopup.py:98
-msgid "Navigation popup"
+#: ../lib/advene/gui/views/bookmarks.py:74
+msgid "Bookmark timecodes with their corresponding screenshots"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:500
-#, python-format
-msgid "Choice %d"
+#: ../lib/advene/gui/views/bookmarks.py:80 ../lib/advene/gui/views/tagbag.py:63
+#: ../lib/advene/gui/views/activebookmarks.py:62
+#: ../lib/advene/gui/views/logwindow.py:50 ../lib/advene/gui/edit/montage.py:59
+msgid "Clear"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:521
-msgid "The beginning of the annotation"
+#: ../lib/advene/gui/views/bookmarks.py:145
+msgid "Select the annotation type to generate"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:522
-msgid "The end of the annotation"
+#: ../lib/advene/gui/views/bookmarks.py:150
+msgid "Choose a duration"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:523
-#, fuzzy
-msgid "The next annotation of the same type"
-msgstr "di un tipo di annotazione"
+#: ../lib/advene/gui/views/bookmarks.py:151
+msgid "Enter the standard duration (in ms) of created annotations."
+msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:524
-msgid "The previous annotation of the same type"
+#: ../lib/advene/gui/views/bookmarks.py:168
+msgid "Converted from bookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:573
+#: ../lib/advene/gui/views/bookmarks.py:172
+#: ../lib/advene/gui/edit/transcribe.py:1114
 #, python-format
 msgid ""
-"Through %(title)s%(relation_content)s:\n"
-"%(annotation_content)s"
+"Conversion completed.\n"
+"%s annotations generated."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:581
-msgid "Relation navigation"
+#: ../lib/advene/gui/views/bookmarks.py:226
+msgid "Drop a position here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/actions.py:591
-msgid "New bookmark"
+#: ../lib/advene/gui/views/bookmarks.py:244
+#: ../lib/advene/gui/views/activebookmarks.py:496
+msgid "Insert a bookmark for the current video time"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:43
-msgid "Activity trace"
+#: ../lib/advene/gui/views/bookmarks.py:245
+msgid "Convert bookmarks to annotations"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:134
-msgid " Trace : "
+#: ../lib/advene/gui/views/viewbook.py:39
+msgid "ViewBook"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:138
-#, fuzzy
-msgid " Filters"
-msgstr "_File"
+#: ../lib/advene/gui/views/viewbook.py:60
+#: ../lib/advene/gui/views/viewbook.py:67
+msgid "Cannot remove this widget, it is essential."
+msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:142
-#: ../lib/advene/gui/main.py:4178
-msgid "Reset"
+#: ../lib/advene/gui/views/viewbook.py:141
+msgid "Detach"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:167
-msgid " Time : "
+#: ../lib/advene/gui/views/viewbook.py:145
+#: ../lib/advene/gui/views/editaccumulator.py:80
+msgid "Close"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:177
-msgid " Max. : "
+#: ../lib/advene/gui/views/viewbook.py:162
+msgid "Rename the view"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:186
-#, fuzzy
-msgid "Export"
-msgstr "Importatore"
+#: ../lib/advene/gui/views/viewbook.py:163
+msgid "Please enter the new name of the view"
+msgstr ""
+
+#: ../lib/advene/gui/views/viewbook.py:202
+msgid "Detach view in its own window, or drag-and-drop to another zone"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:253
+#: ../lib/advene/gui/views/viewbook.py:216
 #, fuzzy
-msgid "Defining Filters"
-msgstr "_File"
+msgid "Close view"
+msgstr "Scegliere un file"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:559
-#: ../lib/advene/gui/plugins/eventaccumulator.py:614
-#: ../lib/advene/gui/plugins/tracepreview.py:214
-#, fuzzy, python-format
-msgid "of an annotation (%s)"
-msgstr "Tutte le annotazioni"
+#: ../lib/advene/gui/views/viewbook.py:239
+#: ../lib/advene/gui/views/viewbook.py:245
+#: ../lib/advene/gui/edit/elements.py:336
+#, python-format
+msgid "Edit %s"
+msgstr "Modifica %s"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:561
-#: ../lib/advene/gui/plugins/eventaccumulator.py:616
-#: ../lib/advene/gui/plugins/tracepreview.py:216
-#, fuzzy, python-format
-msgid "of a relation (%s)"
-msgstr "Relazioni"
+#: ../lib/advene/gui/views/viewbook.py:268 ../lib/advene/rules/actions.py:601
+#, python-format
+msgid "Cannot find the view %s"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:563
-#: ../lib/advene/gui/plugins/eventaccumulator.py:618
-#: ../lib/advene/gui/plugins/tracepreview.py:218
-#, fuzzy, python-format
-msgid "of an annotation type (%s)"
-msgstr "di un tipo di annotazione"
+#: ../lib/advene/gui/views/viewbook.py:291
+#, python-format
+msgid "Open a new %s for..."
+msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:565
-#: ../lib/advene/gui/plugins/eventaccumulator.py:620
-#: ../lib/advene/gui/plugins/tracepreview.py:220
-#, fuzzy, python-format
-msgid "of a relation type (%s)"
-msgstr "Tipo di Annotazione"
+#: ../lib/advene/gui/views/viewbook.py:303
+#, fuzzy
+msgid "Create a new comment view"
+msgstr "Vista statica predefinita"
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:567
-#: ../lib/advene/gui/plugins/eventaccumulator.py:622
-#: ../lib/advene/gui/plugins/tracepreview.py:222
-#, fuzzy, python-format
-msgid "of a schema (%s)"
-msgstr "Schemi"
+#: ../lib/advene/gui/views/viewbook.py:305
+msgid "Open a new view"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:569
-#: ../lib/advene/gui/plugins/eventaccumulator.py:624
-#: ../lib/advene/gui/plugins/tracepreview.py:224
+#: ../lib/advene/gui/views/viewbook.py:388
 #, python-format
-msgid "of a view (%s)"
+msgid "Use annotation-type %s :"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:571
-#: ../lib/advene/gui/plugins/eventaccumulator.py:626
-#: ../lib/advene/gui/plugins/tracepreview.py:226
-#, fuzzy, python-format
-msgid "of a package (%s)"
-msgstr "Pacchetto %s"
+#: ../lib/advene/gui/views/viewbook.py:392
+#: ../lib/advene/gui/views/viewbook.py:418
+msgid "to edit it"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/eventaccumulator.py:573
-#: ../lib/advene/gui/plugins/eventaccumulator.py:628
-#: ../lib/advene/gui/plugins/tracepreview.py:228
-#, fuzzy, python-format
-msgid "of an unknown item (%s)"
-msgstr "Parametro %s"
+#: ../lib/advene/gui/views/viewbook.py:393
+#: ../lib/advene/gui/views/viewbook.py:419
+#: ../lib/advene/gui/views/viewbook.py:451
+#, fuzzy
+msgid "to create a new static view"
+msgstr "Vista statica predefinita"
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:122
-msgid "Label"
+#: ../lib/advene/gui/views/viewbook.py:395
+msgid "in a timeline"
+msgstr ""
+
+#: ../lib/advene/gui/views/viewbook.py:396
+msgid "as a montage"
+msgstr ""
+
+#: ../lib/advene/gui/views/viewbook.py:397
+#: ../lib/advene/gui/views/viewbook.py:450
+msgid "in a table"
+msgstr ""
+
+#: ../lib/advene/gui/views/viewbook.py:398
+#: ../lib/advene/gui/views/viewbook.py:420
+msgid "in a query"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:172
+#: ../lib/advene/gui/views/viewbook.py:398
+#: ../lib/advene/gui/views/viewbook.py:420
 #, python-format
-msgid ""
-"Error while parsing SVG content:\n"
-"\n"
-"%s"
+msgid "Query %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:247
-msgid " created from "
+#: ../lib/advene/gui/views/viewbook.py:399
+#: ../lib/advene/gui/views/viewbook.py:421
+msgid "in the TALES browser"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:315
-msgid "Graphical editor"
+#: ../lib/advene/gui/views/viewbook.py:399
+#, python-format
+msgid "Browsing %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:326
-msgid "Edit XML"
+#: ../lib/advene/gui/views/viewbook.py:415
+#, python-format
+msgid "Use annotation %s :"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/contenthandlers.py:378
-#: ../lib/advene/gui/plugins/contenthandlers.py:434
-#: ../lib/advene/gui/edit/rules.py:186
+#: ../lib/advene/gui/views/viewbook.py:421
 #, python-format
-msgid ""
-"The following items seem to be\n"
-"invalid TALES expressions:\n"
-"\n"
-"%s"
+msgid "Browse %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:36 ../lib/advene/gui/main.py:1235
-#, fuzzy
-msgid "Video player"
-msgstr "Seleziona un DVD"
+#: ../lib/advene/gui/views/viewbook.py:422
+msgid "to display its contents"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:38
-msgid "Complementary video player"
+#: ../lib/advene/gui/views/viewbook.py:422
+#, python-format
+msgid "%s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:44
-#: ../lib/advene/gui/edit/montage.py:54
-#: ../lib/advene/gui/edit/transcribe.py:85
-#: ../lib/advene/gui/views/transcription.py:56
-#: ../lib/advene/gui/views/bookmarks.py:245
-#: ../lib/advene/gui/views/timeline.py:135
-msgid "Save view"
+#: ../lib/advene/gui/views/viewbook.py:423
+msgid "as a bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:45
-#: ../lib/advene/gui/edit/transcribe.py:86
-#: ../lib/advene/gui/views/tagbag.py:62
-#: ../lib/advene/gui/views/transcription.py:57
-#: ../lib/advene/gui/views/interactivequery.py:60
-#: ../lib/advene/gui/views/timeline.py:136
-msgid "Save default options"
+#: ../lib/advene/gui/views/viewbook.py:441
+msgid "as the context for the query..."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:46
+#: ../lib/advene/gui/views/viewbook.py:445
 #, fuzzy
-msgid "Select video file"
-msgstr "Seleziona un video stream"
+msgid "Set of annotations"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:127
+#: ../lib/advene/gui/views/viewbook.py:446
 #, fuzzy
-msgid "Select a video file"
-msgstr "Seleziona un video stream"
+msgid "Use annotations:"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/gui/plugins/videoplayer.py:250
-msgid "Synchronize"
+#: ../lib/advene/gui/views/viewbook.py:449
+msgid "to edit them"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:266
-msgid "Offset in ms"
+#: ../lib/advene/gui/views/viewbook.py:452
+msgid "as bookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/videoplayer.py:274
-#, fuzzy
-msgid "Drag and drop to get player time"
-msgstr "di un tipo di annotazione"
+#: ../lib/advene/gui/views/transcription.py:51
+msgid "Transcription"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/tracepreview.py:61
+#: ../lib/advene/gui/views/transcription.py:53
 #, fuzzy
-msgid "Trace preview"
-msgstr "Anteprima"
+msgid "Display annotations as a text transcription"
+msgstr "Visualizza le annotazione come una trascrizione"
 
-#: ../lib/advene/gui/plugins/tracepreview.py:99
-msgid "Full trace"
+#: ../lib/advene/gui/views/transcription.py:158
+msgid "Transcription options"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/tracepreview.py:100
-msgid "Open the trace timeline view fareast"
+#: ../lib/advene/gui/views/transcription.py:159
+msgid "Default representation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:376
-#, python-format
-msgid "Rendering type %(type)s as %(presentation)s"
+#: ../lib/advene/gui/views/transcription.py:159
+msgid "Use the default representation for annotations"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:521
-msgid "Snapshot only"
+#: ../lib/advene/gui/views/transcription.py:160
+#: ../lib/advene/gui/edit/elements.py:988
+msgid "Representation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:522
-msgid "Overlayed snapshot only"
+#: ../lib/advene/gui/views/transcription.py:160
+msgid ""
+"If default representation is unchecked,\n"
+"this TALES expression that will be used to format the annotations."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:523
-msgid "Timestamp only"
+#: ../lib/advene/gui/views/transcription.py:161
+msgid "Separator"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:524
-msgid "Snapshot+timestamp"
+#: ../lib/advene/gui/views/transcription.py:162
+msgid "This separator will be inserted between the annotations."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:525
-#, fuzzy
-msgid "Annotation content"
-msgstr "Tipo di Annotazione"
-
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:540
-msgid "as a list"
+#: ../lib/advene/gui/views/transcription.py:163
+msgid "Whitespace"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:541
-msgid "as a grid"
+#: ../lib/advene/gui/views/transcription.py:164
+msgid "Newline"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:542
-msgid "as a table"
+#: ../lib/advene/gui/views/transcription.py:165
+msgid "Tabulation"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:543
-#: ../lib/advene/gui/views/viewbook.py:380
-msgid "as a transcription"
+#: ../lib/advene/gui/views/transcription.py:166
+msgid "Dash"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:661
-#: ../lib/advene/gui/views/transcription.py:461
-#, python-format
-msgid "Annotation %s"
+#: ../lib/advene/gui/views/transcription.py:167
+msgid "User defined"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:662
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:681
-msgid "Play video"
+#: ../lib/advene/gui/views/transcription.py:169
+msgid "User-defined separator"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:663
-msgid "Show timestamp only"
+#: ../lib/advene/gui/views/transcription.py:169
+msgid ""
+"Separator used if user-defined is selected.Use \\n for a newline and \\t for "
+"a tabulation."
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:664
-#, fuzzy
-msgid "Show content only"
-msgstr "Salva contenuto in..."
-
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:665
-msgid "Show snapshot only"
+#: ../lib/advene/gui/views/transcription.py:170
+msgid "Display timestamps"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:667
-msgid "Show overlayed timestamp"
+#: ../lib/advene/gui/views/transcription.py:170
+msgid "Insert timestsamp values"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:668
-#, fuzzy
-msgid "Show overlayed content"
-msgstr "Elementi cercati"
-
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:670
-#, fuzzy, python-format
-msgid "Annotation type %s"
-msgstr "Tipo di Annotazione"
+#: ../lib/advene/gui/views/transcription.py:171
+msgid "Display annotation bounds"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:671
-#, fuzzy
-msgid "display as list"
-msgstr "Visualizza cronologia di navigazione"
+#: ../lib/advene/gui/views/transcription.py:231
+#, python-format
+msgid ""
+"Cannot convert the following annotations,\n"
+"the representation pattern is too complex.\n"
+"%s"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:672
-#, fuzzy
-msgid "display as grid"
-msgstr "Visualizza cronologia di navigazione"
+#: ../lib/advene/gui/views/transcription.py:242
+msgid ""
+"Cannot validate the update.\n"
+"The representation pattern is too complex."
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:673
-#, fuzzy
-msgid "display as table"
-msgstr "Visualizza %s"
+#: ../lib/advene/gui/views/transcription.py:268
+msgid "Save transcription to a text file"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:674
-#, fuzzy
-msgid "display as transcription"
-msgstr "Visualizza le annotazione come una trascrizione"
+#: ../lib/advene/gui/views/transcription.py:269
+msgid "Apply the modifications"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:683
-#, fuzzy
-msgid "Open link"
-msgstr "Apri"
+#: ../lib/advene/gui/views/transcription.py:270
+msgid "Find text"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:739
-#, python-format
-msgid "HTML editor: cannot parse content (%s)"
+#: ../lib/advene/gui/views/transcription.py:271
+msgid "Quickly switch display options"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:772
-#, fuzzy, python-format
-msgid "Heading %d"
-msgstr "Modifica %s"
+#: ../lib/advene/gui/views/transcription.py:272
+msgid "Refresh the transcription"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:783
-msgid "Bold"
+#: ../lib/advene/gui/views/transcription.py:273
+msgid "Edit preferences"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:784
-msgid "Italic"
+#: ../lib/advene/gui/views/transcription.py:692
+#, python-format
+msgid "Cannot write to %(filename)s: %(error)s:"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:785
-msgid "Header"
+#: ../lib/advene/gui/views/transcription.py:698
+#: ../lib/advene/gui/edit/transcribe.py:859
+#, python-format
+msgid "Transcription saved to %s"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:787
-msgid "Copy"
+#: ../lib/advene/gui/views/browser.py:169
+#: ../lib/advene/gui/views/browser.py:171
+msgid "TALES browser"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:788
-msgid "Cut"
+#: ../lib/advene/gui/views/browser.py:176
+msgid "Display result in table"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:789
-#, fuzzy
-msgid "Paste"
-msgstr "Data"
+#: ../lib/advene/gui/views/browser.py:199
+msgid "Insert path"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:791
-#: ../lib/advene/gui/edit/schemaeditor.py:64
-#: ../lib/advene/gui/views/timeline.py:134 ../lib/advene/gui/views/tree.py:428
-msgid "Refresh"
+#: ../lib/advene/gui/views/browser.py:200
+msgid "Insert value"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:847
-msgid "WYSIWYG editor"
+#: ../lib/advene/gui/views/browser.py:255
+msgid "Expression returned None (there was an exception)"
 msgstr ""
 
-#: ../lib/advene/gui/plugins/htmlcontenhandler.py:857
-#, fuzzy
-msgid "Edit HTML source"
-msgstr "Modifica %s"
+#: ../lib/advene/gui/views/browser.py:308
+msgid "Result is not a list"
+msgstr ""
 
-#: ../lib/advene/gui/plugins/logmessages.py:35
-msgid "Log Messages"
+#: ../lib/advene/gui/views/browser.py:365
+#: ../lib/advene/gui/edit/shapewidget.py:944
+msgid "Path"
 msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:73
-#: ../lib/advene/gui/edit/importer.py:143
-msgid "Stop"
-msgstr "Stop"
+#: ../lib/advene/gui/views/browser.py:372
+#: ../lib/advene/gui/edit/elements.py:2163
+msgid "Value"
+msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:82
-#: ../lib/advene/gui/edit/dvdselect.py:112
-msgid "Preview"
-msgstr "Anteprima"
+#: ../lib/advene/gui/views/timeline.py:128
+msgid "Display annotations on a timeline"
+msgstr ""
 
-#: ../lib/advene/gui/edit/dvdselect.py:91
-msgid ""
-"Select the correct\n"
-"title and chapter\n"
-"of the DVD"
+#: ../lib/advene/gui/views/timeline.py:142
+msgid "Limit display to current area"
 msgstr ""
-"Seleziona il capitolo \n"
-"e il titolo corretto\n"
-"del DVD"
 
-#: ../lib/advene/gui/edit/dvdselect.py:104
-msgid "Chapter"
-msgstr "Capitolo"
+#: ../lib/advene/gui/views/timeline.py:143
+#: ../lib/advene/gui/views/timeline.py:3307
+msgid "Display whole movie"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:33
-msgid "Create element"
-msgstr "Crea elemento"
+#: ../lib/advene/gui/views/timeline.py:173
+#, python-format
+msgid "Cannot find annotation type %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:34
-msgid "Create annotation (duplicate id)"
+#: ../lib/advene/gui/views/timeline.py:234
+msgid "No scrolling"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:35
-msgid "Create relation (duplicate id)"
+#: ../lib/advene/gui/views/timeline.py:235
+msgid "Continuous scrolling"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:36
-msgid "Update the color"
-msgstr "Aggiorna il colore"
+#: ../lib/advene/gui/views/timeline.py:236
+msgid "Discrete scrolling"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:37
-msgid "Update the representation"
-msgstr "Aggiorna la rappresentazione"
+#: ../lib/advene/gui/views/timeline.py:237
+#, fuzzy
+msgid "Annotation scrolling"
+msgstr "Tipo di Annotazione"
 
-#: ../lib/advene/gui/edit/merge.py:38
-msgid "Update the description"
-msgstr "Aggiorna la descrizione"
+#: ../lib/advene/gui/views/timeline.py:582
+#, fuzzy, python-format
+msgid "%d annotations"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/gui/edit/merge.py:39
-msgid "Update the title"
-msgstr "Aggiorna il titolo"
+#: ../lib/advene/gui/views/timeline.py:585
+#, fuzzy
+msgid "Display all types"
+msgstr "Visualizza %s"
 
-#: ../lib/advene/gui/edit/merge.py:40
-msgid "Update the mimetype"
+#: ../lib/advene/gui/views/timeline.py:587
+#, python-format
+msgid ""
+"There are %d annotations.\n"
+"The current timeline may take a long time to display them, so only the first "
+"two annotation types are displayed. Use the annotation type selector (second "
+"button in the timeline) to select other annotations types to display, or "
+"click on the 'Display all types' button below."
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:41
-msgid "Update the begin time"
-msgstr "Aggiorna il tempo di inizio"
+#: ../lib/advene/gui/views/timeline.py:1055
+msgid "Split at current player position"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:42
-msgid "Update the end time"
-msgstr "Aggiorna il tempo di fine"
+#: ../lib/advene/gui/views/timeline.py:1059
+msgid "Center and zoom"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:43
-msgid "Update the content"
-msgstr "Aggiorna il contenuto"
+#: ../lib/advene/gui/views/timeline.py:1163
+msgid "Create a relation"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:44
-msgid "Update the matchFilter"
+#: ../lib/advene/gui/views/timeline.py:1173
+msgid "Create a new relation-type."
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:45
-msgid "Update the member types"
+#: ../lib/advene/gui/views/timeline.py:1199
+msgid "Merge with this annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:46
-msgid "Update tags"
-msgstr "Aggiorna tag"
+#: ../lib/advene/gui/views/timeline.py:1208
+msgid "Align both begin times"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:90
-msgid "Difference between original and merged elements"
+#: ../lib/advene/gui/views/timeline.py:1209
+msgid "Align both end times"
 msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:136
-msgid "Current element"
-msgstr "Elemento attuale"
+#: ../lib/advene/gui/views/timeline.py:1210
+msgid "Align end time to selected begin time"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:141
-msgid "Updated element"
-msgstr "Elemento aggiornato"
+#: ../lib/advene/gui/views/timeline.py:1211
+msgid "Align begin time to selected end time"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:147
-msgid "Show diff"
-msgstr "Mostra diff"
+#: ../lib/advene/gui/views/timeline.py:1212
+msgid "Align all times"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:180
-msgid "Merge?"
-msgstr "Unire?"
+#: ../lib/advene/gui/views/timeline.py:1250
+msgid "Cannot delete the annotation : it has relations."
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:197
-msgid "Element"
-msgstr "Elemento"
+#: ../lib/advene/gui/views/timeline.py:1325
+msgid "Select the appropriate relation type"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:230 ../lib/advene/gui/edit/imports.py:406
+#: ../lib/advene/gui/views/timeline.py:1344
 #, python-format
-msgid "Package %s"
-msgstr "Pacchetto %s"
+msgid "Duplicate selection to type %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/merge.py:230 ../lib/advene/gui/edit/imports.py:406
-msgid "No title"
-msgstr "Nessun titolo"
+#: ../lib/advene/gui/views/timeline.py:1347
+#, fuzzy, python-format
+msgid "Move selection to type %s"
+msgstr "Tipo di Annotazione"
 
-#: ../lib/advene/gui/edit/merge.py:267
-msgid "All"
-msgstr "Tutto"
+#: ../lib/advene/gui/views/timeline.py:1356
+#, python-format
+msgid "Duplicate annotation to type %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/properties.py:32
-#: ../lib/advene/gui/edit/shapewidget.py:1588
-msgid "Properties"
-msgstr "Proprietà"
+#: ../lib/advene/gui/views/timeline.py:1360
+#, python-format
+msgid "Move annotation to type %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/properties.py:46
-#: ../lib/advene/gui/edit/transcribe.py:147
-#: ../lib/advene/gui/edit/transcribe.py:1195
-#: ../lib/advene/gui/views/tagbag.py:61
-#: ../lib/advene/gui/views/timeline.py:3483
-#: ../lib/advene/gui/views/timeline.py:3624 ../lib/advene/gui/main.py:4235
-msgid "Preferences"
+#: ../lib/advene/gui/views/timeline.py:1367
+#, python-format
+msgid "Duplicate to type %(type)s at %(position)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/properties.py:371
-msgid "Choose a file"
-msgstr "Scegliere un file"
+#: ../lib/advene/gui/views/timeline.py:1373
+#, python-format
+msgid "Move to type %(type)s at %(position)s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:45
-msgid "Importer"
-msgstr "Importatore"
+#: ../lib/advene/gui/views/timeline.py:1383
+msgid "Duplicate and create a relation"
+msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:101
-#: ../lib/advene/gui/edit/importer.py:111
-#, fuzzy
-msgid "Advene package importer"
-msgstr "Modifica proprietà pacchetto"
+#: ../lib/advene/gui/views/timeline.py:1394
+#, python-format
+msgid "Duplicate at %s and create a relation"
+msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:115
-msgid "Not likely"
+#: ../lib/advene/gui/views/timeline.py:1425
+msgid "Annotation filter"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:137
-#, python-format
-msgid "Completed conversion: %(statistics)s"
+#: ../lib/advene/gui/views/timeline.py:1426
+msgid "Enter the searched string"
 msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:253
-msgid "Choose the file to import"
-msgstr "Scegli un file da importare"
+#: ../lib/advene/gui/views/timeline.py:1534
+#, python-format
+msgid "Duplicate all annotations to type %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:272
-#, fuzzy
-msgid "Filter"
-msgstr "_File"
+#: ../lib/advene/gui/views/timeline.py:1536
+#, python-format
+msgid "Move all annotations to type %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:276
-#, fuzzy
-msgid "Options"
-msgstr "Relazioni"
+#: ../lib/advene/gui/views/timeline.py:1538
+#, python-format
+msgid "Duplicate all annotations matching a string to type %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/importer.py:287
-msgid "Start"
+#: ../lib/advene/gui/views/timeline.py:1540
+#, python-format
+msgid "Move all annotations matching a string to type %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:57
-msgid "Schema Editor"
+#: ../lib/advene/gui/views/timeline.py:1542
+#, python-format
+msgid "Align all annotation time codes using %s as reference."
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:132
-#, fuzzy
-msgid "Display"
-msgstr "Visualizza %s"
+#: ../lib/advene/gui/views/timeline.py:1544
+#, python-format
+msgid "Align all annotation contents using %s as reference"
+msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:155
-#: ../lib/advene/gui/edit/shapewidget.py:1587 ../lib/advene/gui/popup.py:472
-#: ../lib/advene/gui/popup.py:476
-msgid "Delete"
-msgstr "Elimina"
+#: ../lib/advene/gui/views/timeline.py:2038
+#: ../lib/advene/gui/views/timeline.py:2060
+#, fuzzy, python-format
+msgid "Displaying %(count)d / %(total)d annotations..."
+msgstr "Trascrizione delle annotazioni"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:762
+#: ../lib/advene/gui/views/timeline.py:2049
 #, fuzzy
-msgid "Remove relation type"
-msgstr "Tipo di Annotazione"
+msgid "Displaying done."
+msgstr "Visualizza %s"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:765
-#: ../lib/advene/gui/edit/schemaeditor.py:997
-msgid "Create HTML view"
+#: ../lib/advene/gui/views/timeline.py:2478
+msgid "Create a new annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:831
+#: ../lib/advene/gui/views/timeline.py:2479
 #, fuzzy
-msgid "Remove annotation type"
-msgstr "di un tipo di annotazione"
+msgid "Zoom on region"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:834
-msgid "Create relation type between this one and..."
+#: ../lib/advene/gui/views/timeline.py:2480
+msgid "Restrict display to region"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:969
-#, fuzzy
-msgid "New schema"
-msgstr "Schema"
-
-#: ../lib/advene/gui/edit/schemaeditor.py:985 ../lib/advene/gui/popup.py:690
-#: ../lib/advene/gui/popup.py:750 ../lib/advene/gui/popup.py:803
-msgid "Select a color"
+#: ../lib/advene/gui/views/timeline.py:2589
+#: ../lib/advene/gui/edit/transcribe.py:489
+#, python-format
+msgid "Position %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:988
+#: ../lib/advene/gui/views/timeline.py:2599
 #, fuzzy
-msgid "New annotation type"
+msgid "New annotation at player time"
 msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:991
+#: ../lib/advene/gui/views/timeline.py:2603
 #, fuzzy
-msgid "New relation type"
-msgstr "Tipo di Annotazione"
+msgid "New annotation at mouse position"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/edit/schemaeditor.py:994
-msgid "Hide this schema"
+#: ../lib/advene/gui/views/timeline.py:2607
+msgid "Selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:1000
-msgid "Export drawing to pdf"
+#: ../lib/advene/gui/views/timeline.py:2728
+#, python-format
+msgid "Cannot zoom more %f"
 msgstr ""
 
-#: ../lib/advene/gui/edit/schemaeditor.py:1042
-msgid "Choose a filename to export the schema as PDF"
+#: ../lib/advene/gui/views/timeline.py:2940
+#, python-format
+msgid "From schema %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:84 ../lib/advene/gui/edit/rules.py:86
-#: ../lib/advene/gui/edit/create.py:252
-msgid "Rule"
+#: ../lib/advene/gui/views/timeline.py:3003
+msgid "Restrict playing to this annotation-type"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:95 ../lib/advene/gui/edit/create.py:242
-msgid "Subviews"
+#: ../lib/advene/gui/views/timeline.py:3010
+msgid "Goto previous annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:122
-msgid "Add a new rule"
+#: ../lib/advene/gui/views/timeline.py:3021
+msgid "Goto next annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:126
-msgid "Subview"
+#: ../lib/advene/gui/views/timeline.py:3032
+msgid "+"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:129
-msgid "Add a subview list"
+#: ../lib/advene/gui/views/timeline.py:3091
+msgid "Open an annotation display view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:135
-msgid "Remove the current rule"
+#: ../lib/advene/gui/views/timeline.py:3098
+msgid "Open a slave montage view (coordinated zoom level)"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:275
-msgid "Source expression"
+#: ../lib/advene/gui/views/timeline.py:3133
+msgid ""
+"<b>Statistics about current selection</b>\n"
+"\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:277
-msgid "Return expression"
+#: ../lib/advene/gui/views/timeline.py:3156
+msgid "No selected annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:351
-msgid "For all elements in "
-msgstr "Per tutti gli elementi in "
-
-#: ../lib/advene/gui/edit/rules.py:352
-msgid "All annotations of the package"
+#: ../lib/advene/gui/views/timeline.py:3160
+#, python-format
+msgid "%d selected annotation(s)"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:353
-msgid "All views of the package"
-msgstr "Tutte le visualizzazioni del pacchetto"
-
-#: ../lib/advene/gui/edit/rules.py:354 ../lib/advene/gui/edit/rules.py:798
-msgid "The context annotations"
+#: ../lib/advene/gui/views/timeline.py:3167
+msgid "Unselect all annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:355 ../lib/advene/gui/edit/rules.py:799
-msgid "The annotations of the context type"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3168
+#, fuzzy
+msgid "Create a static view"
+msgstr "Vista statica predefinita"
 
-#: ../lib/advene/gui/edit/rules.py:370
-msgid "Return "
+#: ../lib/advene/gui/views/timeline.py:3169
+msgid "Highlight selection in other views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:372 ../lib/advene/gui/edit/rules.py:787
-msgid "The element"
-msgstr "L'elemento"
-
-#: ../lib/advene/gui/edit/rules.py:373 ../lib/advene/gui/edit/rules.py:788
-msgid "The element's content"
-msgstr "Il contenuto dell'elemento"
-
-#: ../lib/advene/gui/edit/rules.py:388
-msgid "If the element matches "
+#: ../lib/advene/gui/views/timeline.py:3170
+#: ../lib/advene/gui/views/timeline.py:3766
+msgid "Tag selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:390
-msgid "Return the element if it matches "
+#: ../lib/advene/gui/views/timeline.py:3171
+msgid "Delete selected annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:408 ../lib/advene/gui/edit/rules.py:617
-msgid "All conditions must be met"
+#: ../lib/advene/gui/views/timeline.py:3172
+msgid "Display selection in a table"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:409 ../lib/advene/gui/edit/rules.py:618
-msgid "Any condition can be met"
+#: ../lib/advene/gui/views/timeline.py:3173
+msgid "Center and zoom on selection"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:493 ../lib/advene/gui/edit/rules.py:563
-#, python-format
-msgid "Rule <b>%s</b>"
+#: ../lib/advene/gui/views/timeline.py:3174
+msgid "Edit selected annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:574
-msgid "Rule name"
-msgstr "Nome della regola"
-
-#: ../lib/advene/gui/edit/rules.py:591
-msgid "Event"
-msgstr "Evento"
-
-#: ../lib/advene/gui/edit/rules.py:599
-msgid "If"
-msgstr "Se"
-
-#: ../lib/advene/gui/edit/rules.py:638
-msgid "Then"
-msgstr "Quindi"
-
-#: ../lib/advene/gui/edit/rules.py:683
-msgid "When the "
-msgstr "Quando il "
-
-#: ../lib/advene/gui/edit/rules.py:696
-msgid " occurs,"
-msgstr " succede,"
-
-#: ../lib/advene/gui/edit/rules.py:723 ../lib/advene/gui/edit/rules.py:726
-#, python-format
-msgid "Condition expression: %s"
+#: ../lib/advene/gui/views/timeline.py:3175
+msgid "Merge annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:765
+#: ../lib/advene/gui/views/timeline.py:3176
 #, fuzzy
-msgid "The annotation type"
+msgid "Display statistics"
+msgstr "Visualizza %s"
+
+#: ../lib/advene/gui/views/timeline.py:3183
+#, fuzzy
+msgid "Select all annotations of the same type in this time range"
 msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/edit/rules.py:768
-#, python-format
-msgid "The value of the %s attribute"
-msgstr ""
+#: ../lib/advene/gui/views/timeline.py:3186
+#, fuzzy
+msgid "Select all annotations in this time range"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/gui/edit/rules.py:770
-msgid "The annotation fragment"
+#: ../lib/advene/gui/views/timeline.py:3300
+msgid "Goto previous page"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:771
-msgid "The annotation begin time"
+#: ../lib/advene/gui/views/timeline.py:3312
+msgid "Goto next page"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:772
-msgid "The annotation end time"
+#: ../lib/advene/gui/views/timeline.py:3368
+msgid "Inspector locked. Click here or in the timeline background to unlock."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:774
-msgid "The annotation MIME-type"
+#: ../lib/advene/gui/views/timeline.py:3395
+msgid ""
+"Delete the selected annotations or drop an annotation here to delete it."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:775
-msgid "The annotation's incoming relations"
+#: ../lib/advene/gui/views/timeline.py:3418
+msgid ""
+"Drag an annotation type here to remove it from display.\n"
+"Click to edit all displayed types"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:776
-msgid "The annotation's outgoing relations"
+#: ../lib/advene/gui/views/timeline.py:3430
+msgid "Selection actions"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:779
-#, python-format
-msgid "The %s-related incoming annotations"
+#: ../lib/advene/gui/views/timeline.py:3441
+msgid "Display relations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:783
-#, python-format
-msgid "The %s-related outgoing annotations"
+#: ../lib/advene/gui/views/timeline.py:3447
+#, fuzzy
+msgid "Display all relations"
+msgstr "Visualizza cronologia di navigazione"
+
+#: ../lib/advene/gui/views/timeline.py:3523
+msgid "Center on current player position."
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:789
-msgid "The element fragment"
+#: ../lib/advene/gui/views/timeline.py:3539
+msgid "Automatically activate loop when clicking on an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:790
-msgid "The element begin time"
+#: ../lib/advene/gui/views/timeline.py:3563
+msgid "Displayed"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:791
-msgid "The element end time"
+#: ../lib/advene/gui/views/timeline.py:3571
+msgid "Not displayed"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:792
-msgid "The element duration"
+#: ../lib/advene/gui/views/timeline.py:3620
+msgid "< All <"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:793
-#, fuzzy
-msgid "The element type"
-msgstr "L'elemento"
+#: ../lib/advene/gui/views/timeline.py:3624
+msgid "> All >"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:794
-msgid "The element's incoming relations"
+#: ../lib/advene/gui/views/timeline.py:3648
+msgid "Displayed annotation types"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:795
-msgid "The element's outgoing relations"
+#: ../lib/advene/gui/views/timeline.py:3678
+msgid "Relation type"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:796
-msgid "The context"
+#: ../lib/advene/gui/views/timeline.py:3678
+msgid "Display relation types"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:797
-msgid "The context fragment"
+#: ../lib/advene/gui/views/timeline.py:3679
+msgid "Relation content"
 msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:809
-#, fuzzy, python-format
-msgid "annotation-type %s"
-msgstr "Tipo di Annotazione"
+#: ../lib/advene/gui/views/timeline.py:3679
+msgid "Display relation content"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:812
-#, fuzzy, python-format
-msgid "relation-type %s"
-msgstr "Tipo di Annotazione"
+#: ../lib/advene/gui/views/timeline.py:3680 ../lib/advene/gui/popup.py:545
+msgid "Highlight"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:834
-msgid "Select a condition"
-msgstr "Seleziona una condizione"
+#: ../lib/advene/gui/views/timeline.py:3680
+msgid "Highlight active annotations"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:878
-#, python-format
-msgid "Parameter %s"
-msgstr "Parametro %s"
+#: ../lib/advene/gui/views/timeline.py:3767
+msgid "Enter the tag for the selection"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:992
-msgid "Select an action"
-msgstr "Seleziona un'azione"
+#: ../lib/advene/gui/views/timeline.py:3773
+#: ../lib/advene/gui/views/tagbag.py:165
+msgid "The tag contains invalid characters"
+msgstr ""
 
-#: ../lib/advene/gui/edit/rules.py:1083
-msgid "Activate?"
+#: ../lib/advene/gui/views/relation.py:71
+msgid "Relations view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:83
-msgid "Generic shape"
-msgstr "Forma generica"
+#: ../lib/advene/gui/views/editionhistory.py:40
+#, fuzzy
+msgid "Edition History"
+msgstr "_Cronologia di Navigazione"
 
-#: ../lib/advene/gui/edit/shapewidget.py:234
-#: ../lib/advene/gui/edit/shapewidget.py:741
-#, python-format
-msgid "Link to %s"
+#: ../lib/advene/gui/views/editionhistory.py:42
+msgid "Access last edited/created elements"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:321
-#: ../lib/advene/gui/views/tagbag.py:132
-msgid "Name"
-msgstr "Nome"
+#: ../lib/advene/gui/views/editionhistory.py:102
+#, fuzzy
+msgid "Created"
+msgstr "Crea"
 
-#: ../lib/advene/gui/edit/shapewidget.py:326
-#: ../lib/advene/gui/edit/shapewidget.py:1299
-msgid "Link"
-msgstr ""
+#: ../lib/advene/gui/views/editionhistory.py:103
+#, fuzzy
+msgid "Edited"
+msgstr "_Modifica"
 
-#: ../lib/advene/gui/edit/shapewidget.py:331
-msgid "Link label"
+#: ../lib/advene/gui/views/tagbag.py:55
+msgid "Tag Bag"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:349
-msgid "Linewidth"
-msgstr "LarghezzaLinea"
-
-#: ../lib/advene/gui/edit/shapewidget.py:354
-msgid "Filled"
-msgstr "Riempito"
+#: ../lib/advene/gui/views/tagbag.py:62
+msgid "New tag"
+msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:362
-msgid "Opacity"
+#: ../lib/advene/gui/views/tagbag.py:125
+msgid "New tag name"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:404
-#, python-format
-msgid "Properties of %s"
-msgstr "Proprietà di %s"
+#: ../lib/advene/gui/views/tagbag.py:131
+msgid "Enter a new tag name and select its color."
+msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:451
-msgid "Rectangle"
-msgstr "Rettangolo"
+#: ../lib/advene/gui/views/tagbag.py:135
+#: ../lib/advene/gui/edit/shapewidget.py:343
+msgid "Name"
+msgstr "Nome"
 
-#: ../lib/advene/gui/edit/shapewidget.py:532
-#: ../lib/advene/gui/edit/shapewidget.py:652
-msgid "Text"
-msgstr "Testo"
+#: ../lib/advene/gui/views/tagbag.py:141
+#: ../lib/advene/gui/edit/shapewidget.py:364
+#: ../lib/advene/gui/edit/elements.py:897
+#: ../lib/advene/gui/edit/elements.py:977
+#: ../lib/advene/gui/edit/elements.py:1091 ../lib/advene/rules/actions.py:135
+msgid "Color"
+msgstr "Colore"
 
-#: ../lib/advene/gui/edit/shapewidget.py:663
-msgid "Textsize"
+#: ../lib/advene/gui/views/tagbag.py:178
+msgid "Tag bag options"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:677
-msgid "Image"
+#: ../lib/advene/gui/views/tagbag.py:179
+msgid "Update with new tags"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:761
-msgid "Href"
+#: ../lib/advene/gui/views/tagbag.py:179
+msgid "Automatically display new defined tags"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:771
-msgid "Line"
-msgstr "Linea"
+#: ../lib/advene/gui/views/tagbag.py:228
+#, python-format
+msgid "Choose the color for tag %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:872
-msgid "Draw an arrow"
+#: ../lib/advene/gui/views/tagbag.py:252
+msgid "Set color"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:883
-msgid "Arrow size"
+#: ../lib/advene/gui/views/tagbag.py:253
+msgid "Remove"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:935
-#: ../lib/advene/gui/views/browser.py:359
-msgid "Path"
+#: ../lib/advene/gui/views/tagbag.py:326
+msgid "Drop a tag here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:1102
+#: ../lib/advene/gui/views/tagbag.py:336
 #, fuzzy
-msgid "Close path"
-msgstr "Nessun pacchetto"
-
-#: ../lib/advene/gui/edit/shapewidget.py:1181
-msgid "Circle"
-msgstr "Cerchio"
+msgid "Save as adhoc view"
+msgstr "Vista statica predefinita"
 
-#: ../lib/advene/gui/edit/shapewidget.py:1239
-msgid "Ellipse"
+#: ../lib/advene/gui/views/tagbag.py:337
+msgid "Add a new tag"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:1589
-msgid "SVG"
-msgstr "SVG"
+#: ../lib/advene/gui/views/tagbag.py:338
+msgid "Display all defined tags"
+msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:2172
-msgid "Load SVG"
+#: ../lib/advene/gui/views/__init__.py:197
+msgid "Invalid view id"
 msgstr ""
 
-#: ../lib/advene/gui/edit/shapewidget.py:2178
-#, fuzzy
-msgid "Save SVG"
-msgstr "Salva"
+#: ../lib/advene/gui/views/__init__.py:243
+#, python-format
+msgid "Cannot save default options: %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:74
-#: ../lib/advene/gui/widget.py:1063
-#, fuzzy
-msgid "Refresh snapshot"
-msgstr "Visualizza %s"
+#: ../lib/advene/gui/views/__init__.py:254
+#, python-format
+msgid "Default options saved for view %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:102
+#: ../lib/advene/gui/views/__init__.py:282
 #, python-format
-msgid "Decrement value by %.2f s"
+msgid "Error in source evaluation %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:104
+#: ../lib/advene/gui/views/__init__.py:299
 #, python-format
-msgid "Increment value by %.2f s"
+msgid "Saving %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:130
-msgid ""
-"Click to play\n"
-"Control+click to set to current time\n"
-"Scroll to modify value (with control/shift)\n"
-"Right-click to invalidate screenshot"
+#: ../lib/advene/gui/views/__init__.py:302
+msgid "Enter a view name to save this parametered view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:145
-msgid ""
-"Enter a timecode.\n"
-"An integer value will be considered as milliseconds.\n"
-"A float value (12.2) will be considered as seconds.\n"
-"HH:MM:SS.sss values are possible."
+#: ../lib/advene/gui/views/__init__.py:320
+#, python-format
+msgid "Error: the view %s is not an adhoc view."
 msgstr ""
 
-#: ../lib/advene/gui/edit/timeadjustment.py:159
-msgid "Set to current player position"
+#: ../lib/advene/gui/views/__init__.py:345
+msgid "HTML export"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:81
-#, python-format
-msgid "%s creation"
+#: ../lib/advene/gui/views/__init__.py:346
+msgid "Specify a name for the export view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:82
+#: ../lib/advene/gui/views/__init__.py:365
 #, python-format
 msgid ""
-"To create a new element of type %s,\n"
-"you must give the following information."
+"View successfully exported as %s.\n"
+"Open it in the web browser ?"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:92 ../lib/advene/gui/edit/elements.py:508
-#: ../lib/advene/gui/edit/elements.py:557
-#: ../lib/advene/gui/edit/elements.py:659
-#: ../lib/advene/gui/views/browser.py:362 ../lib/advene/gui/views/table.py:251
-#: ../lib/advene/gui/views/table.py:558
-msgid "Type"
+#: ../lib/advene/gui/views/__init__.py:444
+msgid "Actions"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:111
-msgid "Dynamic view"
-msgstr "Vista dinamica"
-
-#: ../lib/advene/gui/edit/create.py:112
-msgid "HTML template"
-msgstr "template HTML"
+#: ../lib/advene/gui/views/__init__.py:469
+msgid "Click or drag-and-drop to reattach view"
+msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:113
-msgid "Plain XML"
+#: ../lib/advene/gui/views/finder.py:106
+msgid "List of views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:114
-msgid "SVG template"
-msgstr "template SVG"
+#: ../lib/advene/gui/views/finder.py:107
+msgid "Static views"
+msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:115
-msgid "Plain text template"
+#: ../lib/advene/gui/views/finder.py:108
+msgid "Dynamic views"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:118
-msgid "Simple query"
-msgstr "Ricerca semplice"
+#: ../lib/advene/gui/views/finder.py:109
+msgid "Admin views"
+msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:120
-msgid "Directory"
-msgstr "Cartella"
+#: ../lib/advene/gui/views/finder.py:110
+msgid "Adhoc views"
+msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:128
-msgid "No available type."
-msgstr "Nessun tipo disponibile"
+#: ../lib/advene/gui/views/finder.py:174
+#, fuzzy
+msgid "No resources"
+msgstr "Modifica %s"
 
-#: ../lib/advene/gui/edit/create.py:172
+#: ../lib/advene/gui/views/finder.py:551
 #, python-format
 msgid ""
-"The identifier %s is not valid.\n"
-"It must be composed of non-accentuated alphabetic characters\n"
-"Underscore is allowed."
+"View <b>%(title)s</b>\n"
+"Id: %(id)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/create.py:177
-#, python-format
-msgid "The identifier %s is already defined."
-msgstr "L'identificatore %s è già stato definito"
-
-#: ../lib/advene/gui/edit/create.py:310
-msgid "New resource data"
+#: ../lib/advene/gui/views/finder.py:558
+msgid "Open in webbrowser"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:143 ../lib/advene/gui/edit/imports.py:144
-msgid "Schemas"
-msgstr "Schemi"
-
-#: ../lib/advene/gui/edit/imports.py:181 ../lib/advene/gui/edit/imports.py:182
-#: ../lib/advene/gui/views/interactivequery.py:464
-msgid "Annotations"
+#: ../lib/advene/gui/views/finder.py:559
+#, python-format
+msgid "View applied to %s\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/imports.py:195 ../lib/advene/gui/edit/imports.py:196
-#: ../lib/advene/gui/edit/elements.py:517
-msgid "Relations"
-msgstr "Relazioni"
-
-#: ../lib/advene/gui/edit/imports.py:209 ../lib/advene/gui/edit/imports.py:210
-msgid "Queries"
-msgstr "Ricerche"
-
-#: ../lib/advene/gui/edit/imports.py:320
-msgid "Imported?"
-msgstr "Importato?"
-
-#: ../lib/advene/gui/edit/imports.py:337
-#: ../lib/advene/gui/edit/elements.py:509
-#: ../lib/advene/gui/edit/elements.py:558
-#: ../lib/advene/gui/edit/elements.py:645
-#: ../lib/advene/gui/edit/elements.py:725
-#: ../lib/advene/gui/edit/elements.py:782
-#: ../lib/advene/gui/edit/elements.py:874
-#: ../lib/advene/gui/edit/elements.py:943
-#: ../lib/advene/gui/edit/elements.py:1055
-#: ../lib/advene/gui/edit/elements.py:1117
-msgid "URI"
-msgstr "URI"
-
-#: ../lib/advene/gui/edit/imports.py:359
-msgid "Choose the package to import, and its alias"
-msgstr "Scegli il pacchetto da importare, e il suo alias"
-
-#: ../lib/advene/gui/edit/montage.py:47
-msgid "Montage"
+#: ../lib/advene/gui/views/finder.py:564 ../lib/advene/gui/popup.py:525
+msgid "Activate"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:49
-msgid "Dynamic montage of annotations"
+#: ../lib/advene/gui/views/finder.py:567
+msgid "Open in GUI"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:55
-#: ../lib/advene/gui/views/logwindow.py:50
-#: ../lib/advene/gui/views/tagbag.py:60
-#: ../lib/advene/gui/views/activebookmarks.py:59
-#: ../lib/advene/gui/views/bookmarks.py:77
-msgid "Clear"
+#: ../lib/advene/gui/views/finder.py:569
+msgid "Unknown type of view??"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:56
-#: ../lib/advene/gui/views/transcription.py:472
-#: ../lib/advene/gui/widget.py:1059
-msgid "Play"
+#: ../lib/advene/gui/views/finder.py:597
+msgid "Edit view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:57
-msgid "Render"
+#: ../lib/advene/gui/views/finder.py:606
+msgid "Open view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:171
-msgid "Remove from montage"
+#: ../lib/advene/gui/views/finder.py:646 ../lib/advene/gui/views/finder.py:710
+#, python-format
+msgid ""
+"%(type)s <b>%(title)s</b>\n"
+"Id: %(id)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:303 ../lib/advene/gui/popup.py:444
-#, fuzzy, python-format
-msgid "Extracting %s"
-msgstr "Modifica %s"
+#: ../lib/advene/gui/views/finder.py:661
+#: ../lib/advene/gui/views/interactivequery.py:401
+msgid "Edit query"
+msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:304
-#, python-format
-msgid ""
-"Exporting montage %(title)s\n"
-"to %%(filename)s"
+#: ../lib/advene/gui/views/finder.py:669
+msgid "Try to apply the query on..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:396
-msgid "Drop an annotation here to remove it from the list"
+#: ../lib/advene/gui/views/finder.py:687 ../lib/advene/gui/popup.py:860
+msgid "the package"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:407
-msgid "Play the montage"
+#: ../lib/advene/gui/views/finder.py:688 ../lib/advene/gui/popup.py:861
+msgid "all annotations of the package"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:412
-#, fuzzy
-msgid "Save the view in the package"
-msgstr "Salva il pacchetto attuale"
+#: ../lib/advene/gui/views/finder.py:689 ../lib/advene/gui/popup.py:862
+msgid "the first annotation of the package"
+msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:460
-msgid "Set zoom level"
+#: ../lib/advene/gui/views/finder.py:734
+msgid "Edit resource"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:465
-msgid "Set 100% zoom"
+#: ../lib/advene/gui/views/finder.py:769 ../lib/advene/util/helper.py:569
+#, python-format
+msgid ""
+"Package %(title)s:\n"
+"%(schema)s\n"
+"%(annotation)s in %(annotation_type)s\n"
+"%(relation)s in %(relation_type)s\n"
+"%(query)s\n"
+"%(view)s\n"
+"\n"
+"Description:\n"
+"%(description)s\n"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:471
-#: ../lib/advene/gui/views/interactivequery.py:439
-msgid "Unhighlight annotations"
+#: ../lib/advene/gui/views/finder.py:790
+#, python-format
+msgid "%(type)s %(title)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:475 ../lib/advene/gui/edit/montage.py:484
-#: ../lib/advene/gui/views/interactivequery.py:443
-#: ../lib/advene/gui/views/interactivequery.py:480
-msgid "Highlight annotations"
+#: ../lib/advene/gui/views/finder.py:793 ../lib/advene/gui/edit/elements.py:519
+#: ../lib/advene/gui/edit/elements.py:568
+#: ../lib/advene/gui/edit/elements.py:655
+#: ../lib/advene/gui/edit/elements.py:735
+#: ../lib/advene/gui/edit/elements.py:793
+#: ../lib/advene/gui/edit/elements.py:884
+#: ../lib/advene/gui/edit/elements.py:954
+#: ../lib/advene/gui/edit/elements.py:1066
+msgid "Metadata"
 msgstr ""
 
-#: ../lib/advene/gui/edit/montage.py:545
-msgid "Total duration:"
+#: ../lib/advene/gui/views/finder.py:810
+msgid "Column-based package finder"
 msgstr ""
 
-#: ../lib/advene/gui/edit/frameselector.py:43
-msgid "Click on a frame to select its time."
+#: ../lib/advene/gui/views/editaccumulator.py:46
+msgid "EditAccumulator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/frameselector.py:177
-msgid "Select the appropriate snapshot"
+#: ../lib/advene/gui/views/activebookmarks.py:55
+#: ../lib/advene/gui/views/activebookmarks.py:57
+msgid "ActiveBookmarks"
 msgstr ""
 
-#: ../lib/advene/gui/edit/frameselector.py:230
-#: ../lib/advene/gui/edit/frameselector.py:283
-msgid "Click to see more frames or scroll with the mouse wheel"
+#: ../lib/advene/gui/views/activebookmarks.py:63
+msgid "Export as static view"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:67
-msgid "Transcription importer"
+#: ../lib/advene/gui/views/activebookmarks.py:434
+msgid "Bookmark duration"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:78
-msgid "Note taking"
+#: ../lib/advene/gui/views/activebookmarks.py:435
+msgid "Enter the duration (in ms) to convert bookmarks into annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:80
-msgid "Take notes on the fly as a timestamped transcription"
+#: ../lib/advene/gui/views/activebookmarks.py:457
+msgid "User-specified duration"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:87
-#: ../lib/advene/gui/views/activebookmarks.py:60
-msgid "Export as static view"
+#: ../lib/advene/gui/views/activebookmarks.py:458
+msgid "2s duration"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:148
-msgid "Timestamp"
+#: ../lib/advene/gui/views/activebookmarks.py:459
+msgid "Complete coverage"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:148
-msgid "Click inserts timestamp marks"
+#: ../lib/advene/gui/views/activebookmarks.py:477
+msgid "Drop a bookmark here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:149
-msgid "Insert on single-click"
+#: ../lib/advene/gui/views/activebookmarks.py:504
+msgid "Type of the annotations that will be created"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:149
-msgid "A single click will insert the mark (else a double click is needed)"
+#: ../lib/advene/gui/views/activebookmarks.py:522
+#: ../lib/advene/gui/edit/transcribe.py:1130
+msgid "Smallish"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:150
-msgid "Play on scroll"
+#: ../lib/advene/gui/views/activebookmarks.py:523
+#: ../lib/advene/gui/edit/transcribe.py:1131 ../lib/advene/rules/actions.py:169
+msgid "Small"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:150
-msgid "Play the new position upon timestamp modification"
+#: ../lib/advene/gui/views/activebookmarks.py:524
+#: ../lib/advene/gui/edit/transcribe.py:1132 ../lib/advene/rules/actions.py:170
+msgid "Normal"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:151
-msgid "Generate empty annotations"
+#: ../lib/advene/gui/views/activebookmarks.py:525
+#: ../lib/advene/gui/edit/transcribe.py:1133 ../lib/advene/rules/actions.py:171
+msgid "Large"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:151
-msgid "If checked, generate annotations for empty text"
+#: ../lib/advene/gui/views/activebookmarks.py:526
+#: ../lib/advene/gui/edit/transcribe.py:1134
+msgid "Larger"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:152
-msgid "Reaction time"
-msgstr "Tempo di reazione"
+#: ../lib/advene/gui/views/activebookmarks.py:527
+#: ../lib/advene/gui/edit/transcribe.py:1135
+msgid "Huge"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:152
-msgid ""
-"Reaction time (substracted from current player time, except when paused.)"
+#: ../lib/advene/gui/views/activebookmarks.py:537
+msgid "Complete bookmarks into annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:153
-msgid "Auto-insert"
+#: ../lib/advene/gui/views/activebookmarks.py:538
+msgid "Save the current state"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:153
-msgid "Automatic timestamp mark insertion"
+#: ../lib/advene/gui/views/activebookmarks.py:539
+#: ../lib/advene/gui/edit/transcribe.py:1165
+msgid "Set the size of snaphots"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:154
-msgid "Automatic insertion delay"
+#: ../lib/advene/gui/views/activebookmarks.py:806
+msgid "Remove end timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:154
+#: ../lib/advene/gui/views/activebookmarks.py:1014
 msgid ""
-"If autoinsert is active, timestamp marks will be automatically inserted when "
-"text is entered after no interaction since this delay (in ms).\n"
-"1000 is typically a good value."
+"Error: cannot find an appropriate schema to create the Active-bookmark type."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:155 ../lib/advene/gui/main.py:4368
-msgid "Font size"
+#: ../lib/advene/gui/views/activebookmarks.py:1019
+msgid "Active bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:155
-msgid "Font size for text (0 for standard size)"
+#: ../lib/advene/gui/views/activebookmarks.py:1057
+msgid "Validate the annotation"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:215
-#: ../lib/advene/gui/edit/transcribe.py:219
-#: ../lib/advene/gui/edit/transcribe.py:379
-#: ../lib/advene/gui/edit/transcribe.py:383
-msgid "Invalid timestamp mark"
+#: ../lib/advene/gui/views/activebookmarks.py:1201
+msgid "Duplicate bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:496
-#: ../lib/advene/gui/views/timeline.py:2550
-#, python-format
-msgid "Position %s"
+#: ../lib/advene/gui/views/activebookmarks.py:1202
+msgid "Remove bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:506 ../lib/advene/gui/popup.py:456
-msgid "Edit"
+#: ../lib/advene/gui/views/activebookmarks.py:1211
+msgid "Remove begin timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:510
-msgid "Ignore the following text (toggle)"
+#: ../lib/advene/gui/views/activebookmarks.py:1218
+msgid "Complete bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:514
-msgid "Remove mark"
-msgstr "Rimuovi marchio"
+#: ../lib/advene/gui/views/activebookmarks.py:1222
+msgid "Change type to"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:518
-msgid "Reaction-time offset"
+#: ../lib/advene/gui/views/logwindow.py:43
+msgid "Links"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:522
-msgid "-1 sec"
-msgstr "-1 sec"
+#: ../lib/advene/gui/views/logwindow.py:45
+msgid "URL stack"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:525
-msgid "-0.5 sec"
-msgstr "-0.5 sec"
+#: ../lib/advene/gui/views/logwindow.py:123
+#, python-format
+msgid "Go to %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:528
-msgid "-0.1 sec"
-msgstr "-0.1 sec"
+#: ../lib/advene/gui/views/logwindow.py:129 ../lib/advene/rules/actions.py:65
+msgid "Go to the given position"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:532
-msgid "+1 sec"
-msgstr "+1 sec"
+#: ../lib/advene/gui/views/logwindow.py:157
+msgid "Push a URL on the stack"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:535
-msgid "+0.5 sec"
-msgstr "+0.5 sec"
+#: ../lib/advene/gui/views/logwindow.py:158
+msgid "Description of the URL"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:538
-msgid "+0.1 sec"
-msgstr "+0.1 sec"
+#: ../lib/advene/gui/views/interactivequery.py:52
+#: ../lib/advene/gui/views/interactivequery.py:100
+msgid "Interactive query"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:629
-msgid "Invalid timestamp"
+#: ../lib/advene/gui/views/interactivequery.py:54
+msgid "Interactive query dialog"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:762
-#, python-format
-msgid "Invalid timestamp mark in conversion: %s"
+#: ../lib/advene/gui/views/interactivequery.py:60
+#: ../lib/advene/gui/views/interactivequery.py:257
+msgid "Save query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:879
+#: ../lib/advene/gui/views/interactivequery.py:123
+#: ../lib/advene/gui/views/interactivequery.py:173
 #, python-format
-msgid "Cannot save the file: %s"
-msgstr "Impossibile salvare il file: %s"
+msgid ""
+"Invalid query.\n"
+"The following fields have an invalid value:\n"
+"%s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:884
-#: ../lib/advene/gui/views/transcription.py:703
-#, python-format
-msgid "Transcription saved to %s"
+#: ../lib/advene/gui/views/interactivequery.py:137
+#: ../lib/advene/gui/views/interactivequery.py:297
+msgid "Saving the query..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:890
-#: ../lib/advene/gui/edit/transcribe.py:980
-msgid "This will overwrite the current textual content. Are you sure?"
+#: ../lib/advene/gui/views/interactivequery.py:138
+#: ../lib/advene/gui/views/interactivequery.py:298
+msgid "Give a title and identifier for saving the query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:893
-msgid "Select transcription file to load"
+#: ../lib/advene/gui/views/interactivequery.py:181
+msgid "Expert search"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:910
+#: ../lib/advene/gui/views/interactivequery.py:187
 #, python-format
-msgid "Cannot open %(filename)s: %(error)s"
+msgid ""
+"TALES error in interactive expression:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:965
-msgid "Cannot import annotations: no existing interface"
+#: ../lib/advene/gui/views/interactivequery.py:248
+msgid "Interactive result"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:967
-msgid "Select the annotation type to import"
+#: ../lib/advene/gui/views/interactivequery.py:250
+msgid "Interactive result display"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:976
-#, fuzzy, python-format
-msgid "There are no annotations of type %s"
-msgstr "di un tipo di annotazione"
-
-#: ../lib/advene/gui/edit/transcribe.py:1005
-msgid "Cannot convert the data: no associated package"
-msgstr "Impossibile convertire il dato: nessun pacchetto associato"
-
-#: ../lib/advene/gui/edit/transcribe.py:1008
-msgid "Converting transcription"
+#: ../lib/advene/gui/views/interactivequery.py:275
+msgid "Result of interactive query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1014
-msgid "Choose the annotation-type where to create annotations.\n"
+#: ../lib/advene/gui/views/interactivequery.py:279
+msgid "Result of a query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1022
-msgid "Delete existing annotations in this type"
-msgstr ""
+#: ../lib/advene/gui/views/interactivequery.py:334
+#, fuzzy, python-format
+msgid "Comment on annotations containing %s"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/gui/edit/transcribe.py:1027
-#: ../lib/advene/gui/views/timeline.py:3009 ../lib/advene/gui/main.py:3222
-msgid "Create a new annotation type"
+#: ../lib/advene/gui/views/interactivequery.py:353
+msgid "Choose the annotation type where annotations will be created."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1045
-msgid "Select type"
+#: ../lib/advene/gui/views/interactivequery.py:357
+#, python-format
+msgid "Copied result of the '%s' query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1049
-msgid "You want to create a new type. Please specify its schema and title."
-msgstr ""
+#: ../lib/advene/gui/views/interactivequery.py:369
+#, fuzzy, python-format
+msgid "Search/replace content in %d elements"
+msgstr "Elementi cercati"
 
-#: ../lib/advene/gui/edit/transcribe.py:1061
-msgid "Containing schema"
+#: ../lib/advene/gui/views/interactivequery.py:397
+msgid "Edit query again"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1074
-msgid "Export options"
+#: ../lib/advene/gui/views/interactivequery.py:411
+msgid "Search again"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1079
-msgid "Generate annotations for empty contents"
+#: ../lib/advene/gui/views/interactivequery.py:417
+msgid "Empty result"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1104
+#: ../lib/advene/gui/views/interactivequery.py:426
 #, python-format
-msgid "The %s identifier already exists. Choose another one."
-msgstr ""
-
-#: ../lib/advene/gui/edit/transcribe.py:1143
-msgid "Notes converted"
+msgid "Result is a list of %d annotations."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1147
-#: ../lib/advene/gui/views/bookmarks.py:169
+#: ../lib/advene/gui/views/interactivequery.py:428
 #, python-format
-msgid ""
-"Conversion completed.\n"
-"%s annotations generated."
+msgid "Result is a list of  %(number)d elements with %(elements)s."
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1163
-#: ../lib/advene/gui/views/activebookmarks.py:546
-msgid "Smallish"
+#: ../lib/advene/gui/views/interactivequery.py:440
+#: ../lib/advene/gui/edit/montage.py:481
+msgid "Unhighlight annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1167
-#: ../lib/advene/gui/views/activebookmarks.py:550
-msgid "Larger"
+#: ../lib/advene/gui/views/interactivequery.py:444
+#: ../lib/advene/gui/views/interactivequery.py:481
+#: ../lib/advene/gui/edit/montage.py:485 ../lib/advene/gui/edit/montage.py:494
+msgid "Highlight annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1168
-#: ../lib/advene/gui/views/activebookmarks.py:551
-msgid "Huge"
+#: ../lib/advene/gui/views/interactivequery.py:465
+#: ../lib/advene/gui/edit/imports.py:184 ../lib/advene/gui/edit/imports.py:185
+msgid "Annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1190
-msgid "Open"
-msgstr "Apri"
-
-#: ../lib/advene/gui/edit/transcribe.py:1191
-msgid "Save"
-msgstr "Salva"
-
-#: ../lib/advene/gui/edit/transcribe.py:1192
-msgid "Save As"
-msgstr "Salva con Nome"
-
-#: ../lib/advene/gui/edit/transcribe.py:1193
-msgid "Import"
-msgstr "Importa"
+#: ../lib/advene/gui/views/interactivequery.py:471
+msgid "Other elements"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1193
-msgid "Import from annotations"
+#: ../lib/advene/gui/views/interactivequery.py:475
+msgid "Display annotations in timeline"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1194
-msgid "Convert"
-msgstr "Converti"
+#: ../lib/advene/gui/views/interactivequery.py:476
+msgid "Display annotations as transcription"
+msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1194
-msgid "Convert to annotations"
+#: ../lib/advene/gui/views/interactivequery.py:482
+#: ../lib/advene/gui/views/interactivequery.py:504
+msgid "Export table"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1196
-msgid "Center on the current mark"
+#: ../lib/advene/gui/views/interactivequery.py:483
+msgid "Create annotations from the result"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1197
-msgid "Find"
+#: ../lib/advene/gui/views/interactivequery.py:484
+msgid "Define a montage with the result"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1197
-msgid "Search a string"
+#: ../lib/advene/gui/views/interactivequery.py:485
+#, fuzzy
+msgid "Create a comment view with the result"
+msgstr "Vista statica predefinita"
+
+#: ../lib/advene/gui/views/interactivequery.py:486
+msgid "Search and replace strings in the annotations content"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1198
-msgid "Scale"
+#: ../lib/advene/gui/views/interactivequery.py:511
+msgid "Edit elements"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1198
-#: ../lib/advene/gui/views/activebookmarks.py:564
-msgid "Set the size of snaphots"
+#: ../lib/advene/gui/views/interactivequery.py:517
+msgid "Open in python evaluator"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1221
-msgid "Automatically scroll to the mark position when playing"
+#: ../lib/advene/gui/views/interactivequery.py:520
+#, python-format
+msgid ""
+"Result:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1223
-msgid "Autoscroll"
+#: ../lib/advene/gui/views/interactivequery.py:562
+msgid "Results of _interactive query"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1230
-msgid "Autoinsert"
+#: ../lib/advene/gui/popup.py:135
+msgid "Choose the file to insert"
 msgstr ""
 
-#: ../lib/advene/gui/edit/transcribe.py:1232
-msgid "Automatically insert marks"
+#: ../lib/advene/gui/popup.py:143
+msgid "Select a valid identifier"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:74
+#: ../lib/advene/gui/popup.py:144
 #, python-format
-msgid "No edit popup available for element %s"
+msgid ""
+"The filename %s contains invalid characters\n"
+"that have been replaced.\n"
+"You can modify this identifier if necessary:"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:95
-msgid "Edit Window"
-msgstr "Modifica Finestra"
+#: ../lib/advene/gui/popup.py:155
+#, fuzzy
+msgid "Choose the soundclip to insert"
+msgstr "Scegli un elemento da inserire."
 
-#: ../lib/advene/gui/edit/elements.py:134
-msgid "Apply changes and close the edit window"
+#: ../lib/advene/gui/popup.py:159
+msgid "Choose the directory to insert"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:139
-msgid "Apply changes"
-msgstr ""
+#: ../lib/advene/gui/popup.py:171
+#, fuzzy, python-format
+msgid "Apply %s"
+msgstr "Visualizza %s"
 
-#: ../lib/advene/gui/edit/elements.py:273
-msgid "Content has been modified. Close anyway and lose data?"
+#: ../lib/advene/gui/popup.py:175
+msgid ""
+"Give the offset to use\n"
+"on specified element.\n"
+"It is in ms and can be\n"
+"either positive or negative."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:331
-#: ../lib/advene/gui/views/viewbook.py:234
-#: ../lib/advene/gui/views/viewbook.py:240
+#: ../lib/advene/gui/popup.py:219
 #, python-format
-msgid "Edit %s"
-msgstr "Modifica %s"
+msgid "Replace content in %s"
+msgstr ""
+
+#: ../lib/advene/gui/popup.py:222
+#, fuzzy, python-format
+msgid "Replace content in annotations of type %s"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/edit/elements.py:333
+#: ../lib/advene/gui/popup.py:225
+#, fuzzy
+msgid "Replace content in all annotations"
+msgstr "Tutte le annotazioni"
+
+#: ../lib/advene/gui/popup.py:318
 #, python-format
-msgid "View %s (read-only)"
-msgstr "Visualizza %s (sola-lettura)"
+msgid "Copy id %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:369
+#: ../lib/advene/gui/popup.py:352
 #, python-format
-msgid "Display %s"
-msgstr "Visualizza %s"
+msgid ""
+"<b>Statistics about %s</b>\n"
+"\n"
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:453
-#, fuzzy
-msgid "Apply changes and edit previous annotation of same type"
-msgstr "di un tipo di annotazione"
+#: ../lib/advene/gui/popup.py:358
+#, python-format
+msgid "Renumbering annotations of type %s"
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:457
-#, fuzzy
-msgid "Apply changes and edit next annotation of same type"
-msgstr "di un tipo di annotazione"
+#: ../lib/advene/gui/popup.py:365
+msgid ""
+"<b>Renumber all annotations according to their order.</b>\n"
+"\n"
+"<i>Note that this action cannot be undone.</i>\n"
+"Replace the first numeric value of the annotation content with the new "
+"annotation number.\n"
+"If no numeric value is found and the annotation is structured, it will "
+"insert the number.\n"
+"If no numeric value is found and the annotation is of type text/plain, it "
+"will overwrite the annotation content.\n"
+"The offset parameter allows you to renumber from a given annotation."
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:463
-msgid "Unhighlight annotation"
+#: ../lib/advene/gui/popup.py:371 ../lib/advene/gui/popup.py:513
+msgid "Offset"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:467
-msgid "Highlight annotation"
+#: ../lib/advene/gui/popup.py:393
+#, fuzzy, python-format
+msgid "Renumbering %d annotations"
+msgstr "Tutte le annotazioni"
+
+#: ../lib/advene/gui/popup.py:402
+#, fuzzy, python-format
+msgid "Annotation #%d"
+msgstr "Tipo di Annotazione"
+
+#: ../lib/advene/gui/popup.py:433
+#, python-format
+msgid "Splitting package according to %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:498
-msgid "Fragment"
+#: ../lib/advene/gui/popup.py:436
+#, python-format
+msgid ""
+"For each of the %(count)d annotations in %(atype)s, create a package named "
+"after the source package and the annotation content, copying only "
+"annotations contained in the reference annotation."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:510
-#: ../lib/advene/gui/edit/elements.py:559
-#: ../lib/advene/gui/edit/elements.py:646
-#: ../lib/advene/gui/edit/elements.py:726
-#: ../lib/advene/gui/edit/elements.py:783
-#: ../lib/advene/gui/edit/elements.py:875
-#: ../lib/advene/gui/edit/elements.py:944
-#: ../lib/advene/gui/edit/elements.py:1056
-#: ../lib/advene/gui/edit/elements.py:1118 ../lib/advene/gui/main.py:4174
-msgid "Author"
-msgstr "Autore"
+#: ../lib/advene/gui/popup.py:456
+#, fuzzy
+msgid "Created %(name)s - %(n) annotations"
+msgstr "Trascrizione delle annotazioni"
 
-#: ../lib/advene/gui/edit/elements.py:511
-#: ../lib/advene/gui/edit/elements.py:560
-#: ../lib/advene/gui/edit/elements.py:647
-#: ../lib/advene/gui/edit/elements.py:727
-#: ../lib/advene/gui/edit/elements.py:784
-#: ../lib/advene/gui/edit/elements.py:876
-#: ../lib/advene/gui/edit/elements.py:945
-#: ../lib/advene/gui/edit/elements.py:1057
-#: ../lib/advene/gui/edit/elements.py:1119 ../lib/advene/gui/main.py:4175
-msgid "Date"
-msgstr "Data"
+#: ../lib/advene/gui/popup.py:473 ../lib/advene/gui/edit/montage.py:309
+#, fuzzy, python-format
+msgid "Extracting %s"
+msgstr "Modifica %s"
 
-#: ../lib/advene/gui/edit/elements.py:513
-#: ../lib/advene/gui/edit/elements.py:562
-#: ../lib/advene/gui/edit/elements.py:649
-#: ../lib/advene/gui/edit/elements.py:729
-#: ../lib/advene/gui/edit/elements.py:787
-#: ../lib/advene/gui/edit/elements.py:878
-#: ../lib/advene/gui/edit/elements.py:948
-#: ../lib/advene/gui/edit/elements.py:1060
-msgid "Metadata"
+#: ../lib/advene/gui/popup.py:474
+#, python-format
+msgid ""
+"Exporting annotation %(title)s\n"
+"from %(begin)s to %(end)s\n"
+"to %%(filename)s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:582
-#: ../lib/advene/gui/edit/elements.py:1065
-#: ../lib/advene/gui/views/relationdisplay.py:113
-msgid "Members"
-msgstr "Membri"
-
-#: ../lib/advene/gui/edit/elements.py:600
-#: ../lib/advene/gui/edit/elements.py:677
-#: ../lib/advene/gui/edit/elements.py:737
-#: ../lib/advene/gui/edit/elements.py:1128
-#: ../lib/advene/gui/views/table.py:250
-msgid "Content"
+#: ../lib/advene/gui/popup.py:485 ../lib/advene/gui/edit/transcribe.py:499
+msgid "Edit"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:617
-msgid "Apply changes and visualise in web browser"
+#: ../lib/advene/gui/popup.py:487
+msgid "Browse"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:622
-msgid "Apply changes and activate the view"
+#: ../lib/advene/gui/popup.py:495 ../lib/advene/gui/popup.py:884
+msgid "Open in web browser"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:630
-#: ../lib/advene/gui/edit/elements.py:711
-#: ../lib/advene/gui/edit/elements.py:768
-#: ../lib/advene/gui/edit/elements.py:859
-#: ../lib/advene/gui/edit/elements.py:928
-#: ../lib/advene/gui/edit/elements.py:1030
+#: ../lib/advene/gui/popup.py:501 ../lib/advene/gui/popup.py:505
+#: ../lib/advene/gui/edit/shapewidget.py:1601
+msgid "Delete"
+msgstr "Elimina"
+
+#: ../lib/advene/gui/popup.py:508
 #, fuzzy
-msgid "Title (name)"
-msgstr "Nome file"
+msgid "Search/replace content"
+msgstr "Elementi cercati"
 
-#: ../lib/advene/gui/edit/elements.py:634
-msgid "Name of the view"
+#: ../lib/advene/gui/popup.py:526
+msgid "Desactivate"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:658
-msgid "Class"
-msgstr "Classe"
-
-#: ../lib/advene/gui/edit/elements.py:661
-msgid "Match Filter"
+#: ../lib/advene/gui/popup.py:543
+msgid "Loop"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:699 ../lib/advene/gui/popup.py:821
-#, python-format
-msgid "Exception in query: %s"
+#: ../lib/advene/gui/popup.py:544
+msgid "Duplicate"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:704
+#: ../lib/advene/gui/popup.py:548
 #, fuzzy
-msgid "Validate and run query on package"
-msgstr "Crea un nuovo pacchetto"
-
-#: ../lib/advene/gui/edit/elements.py:715
-msgid "Name of the query"
-msgstr ""
+msgid "Save snapshot..."
+msgstr "Visualizza %s"
 
-#: ../lib/advene/gui/edit/elements.py:772
+#: ../lib/advene/gui/popup.py:550
 #, fuzzy
-msgid "Name of the package"
-msgstr "Tutte le visualizzazioni del pacchetto"
-
-#: ../lib/advene/gui/edit/elements.py:790
-#: ../lib/advene/gui/edit/elements.py:881
-#: ../lib/advene/gui/edit/elements.py:960
-#: ../lib/advene/gui/edit/elements.py:1074
-msgid "Description"
-msgstr "Descrizione"
-
-#: ../lib/advene/gui/edit/elements.py:794
-#: ../lib/advene/gui/edit/elements.py:885
-#: ../lib/advene/gui/edit/elements.py:964
-#: ../lib/advene/gui/edit/elements.py:1078
-msgid "Textual description of the package"
-msgstr "Descrizione testuale del pacchetto"
-
-#: ../lib/advene/gui/edit/elements.py:799
-msgid "Default dynamic view"
-msgstr "Vista dinamica predefinita"
-
-#: ../lib/advene/gui/edit/elements.py:803
-msgid "Dynamic view to activate on package load"
-msgstr ""
-
-#: ../lib/advene/gui/edit/elements.py:808
-msgid "Default static view"
-msgstr "Vista statica predefinita"
+msgid "Extract video fragment"
+msgstr "Inserisci un indirizzo di un video stream"
 
-#: ../lib/advene/gui/edit/elements.py:812
-msgid "Static view to open on package load"
+#: ../lib/advene/gui/popup.py:580
+msgid "Incoming"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:817
-msgid "Default adhoc view"
+#: ../lib/advene/gui/popup.py:596
+msgid "Outgoing"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:821
-msgid "Adhoc view to open on package load"
+#: ../lib/advene/gui/popup.py:611
+msgid "Related annotations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:826
-msgid "Cached duration"
+#: ../lib/advene/gui/popup.py:618
+msgid "Incoming relations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:830
-msgid "Cached duration in ms"
+#: ../lib/advene/gui/popup.py:625
+msgid "Outgoing relations"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:835
-msgid "Mediafile"
+#: ../lib/advene/gui/popup.py:642
+#, python-format
+msgid "Begin: %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:839
-msgid "Location of associated media file"
+#: ../lib/advene/gui/popup.py:644
+#, python-format
+msgid "End: %s"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:863
-#, fuzzy
-msgid "Name of the schema"
-msgstr "Schema"
+#: ../lib/advene/gui/popup.py:645
+#, fuzzy, python-format
+msgid "Duration: %s"
+msgstr "Relazioni"
 
-#: ../lib/advene/gui/edit/elements.py:895
-#: ../lib/advene/gui/edit/elements.py:975
-msgid "TALES expression returning a color for the element"
+#: ../lib/advene/gui/popup.py:652
+msgid "Members:"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:902
-#: ../lib/advene/gui/edit/elements.py:993
-msgid "Item color"
-msgstr "Colore oggetto"
-
-#: ../lib/advene/gui/edit/elements.py:906
-#: ../lib/advene/gui/edit/elements.py:997
-msgid ""
-"TALES expression returning a color for the items contained by the element"
+#: ../lib/advene/gui/popup.py:665
+msgid "Edit package properties..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:932
-#: ../lib/advene/gui/edit/elements.py:1034
-msgid "Name of the type"
+#: ../lib/advene/gui/popup.py:666 ../lib/advene/gui/popup.py:787
+#, python-format
+msgid "%d annotations(s) - statistics"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:950
-#: ../lib/advene/gui/edit/elements.py:1039
-#: ../lib/advene/gui/edit/elements.py:1308
-msgid "MIME Type"
-msgstr "Tipo MIME"
+#: ../lib/advene/gui/popup.py:668 ../lib/advene/gui/popup.py:895
+msgid "Create a new static view..."
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:954
-#: ../lib/advene/gui/edit/elements.py:1043
-#, fuzzy
-msgid "MIMEType of the content"
-msgstr "Aggiorna il contenuto"
+#: ../lib/advene/gui/popup.py:669 ../lib/advene/gui/popup.py:896
+msgid "Create a new dynamic view..."
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:982
-#: ../lib/advene/gui/views/transcription.py:165
-msgid "Representation"
+#: ../lib/advene/gui/popup.py:670 ../lib/advene/gui/popup.py:782
+msgid "Create a new annotation..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:986
-msgid ""
-"TALES expression used to get a compact representation of the annotations"
+#: ../lib/advene/gui/popup.py:672 ../lib/advene/gui/popup.py:898
+msgid "Create a new schema..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:987
-#, fuzzy, python-format
-msgid "Display %s key"
-msgstr "Visualizza %s"
+#: ../lib/advene/gui/popup.py:673 ../lib/advene/gui/popup.py:893
+msgid "Create a new query..."
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1003
-#, fuzzy
-msgid "Completions"
-msgstr "Relazioni"
+#: ../lib/advene/gui/popup.py:681
+msgid "Create a new folder..."
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1007
-msgid "Space-separated list of words used for content completion"
+#: ../lib/advene/gui/popup.py:682
+msgid "Create a new resource file..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1013
-#, fuzzy
-msgid "Advanced"
-msgstr "Advene"
+#: ../lib/advene/gui/popup.py:683
+msgid "Insert a new resource file..."
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1063
-msgid "Any annotation type"
+#: ../lib/advene/gui/popup.py:684
+msgid "Insert a new resource directory..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1089
-msgid "TALES expression specifying a color"
+#: ../lib/advene/gui/popup.py:693 ../lib/advene/gui/popup.py:695
+msgid "Insert a soundclip..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1116
-msgid "MIMEType"
-msgstr "TipoMIME"
+#: ../lib/advene/gui/popup.py:706
+msgid "Play sound"
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1341
-#, python-format
-msgid "Error: cannot find a content handler for %s"
+#: ../lib/advene/gui/popup.py:716
+msgid "Create a new annotation type..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1457
-#: ../lib/advene/gui/edit/elements.py:1682
-#, python-format
-msgid ""
-"Cannot read the data:\n"
-"%s"
+#: ../lib/advene/gui/popup.py:718
+msgid "Create a new relation type..."
 msgstr ""
-"Impossibile leggere il dato:\n"
-"%s"
 
-#: ../lib/advene/gui/edit/elements.py:1481
-#: ../lib/advene/gui/edit/elements.py:1707
-msgid "Save content to..."
-msgstr "Salva contenuto in..."
+#: ../lib/advene/gui/popup.py:720 ../lib/advene/gui/popup.py:781
+#: ../lib/advene/gui/popup.py:834
+msgid "Select a color"
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1492
-#: ../lib/advene/gui/edit/elements.py:1720
+#: ../lib/advene/gui/popup.py:729
 #, python-format
-msgid ""
-"Cannot save the data:\n"
-"%s"
+msgid "A caption dynamic view for %s already seems to exist."
 msgstr ""
-"Impossibile salvare il dato:\n"
-"%s"
 
-#: ../lib/advene/gui/edit/elements.py:1511
-#: ../lib/advene/gui/edit/elements.py:1734
-msgid "Open a file (C-o)"
-msgstr "Apri un file (C-o)"
-
-#: ../lib/advene/gui/edit/elements.py:1516
-#: ../lib/advene/gui/edit/elements.py:1739
-msgid "Save to a file (C-s)"
-msgstr "Salva in un file (C-s)"
+#: ../lib/advene/gui/popup.py:738
+#, fuzzy, python-format
+msgid "Caption %s annotations"
+msgstr "Trascrizione delle annotazioni"
 
-#: ../lib/advene/gui/edit/elements.py:1521
-#: ../lib/advene/gui/edit/elements.py:1744
-msgid "Reload the file (C-r)"
-msgstr "Ricarica il file (C-r)"
+#: ../lib/advene/gui/popup.py:748 ../lib/advene/rules/actions.py:121
+msgid "Caption the annotation"
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1527
-msgid "Insert a value from the browser (C-i)"
-msgstr "Inserisci un valore dal browser (C-i)"
+#: ../lib/advene/gui/popup.py:770
+#, fuzzy
+msgid "Create a comment view"
+msgstr "Vista statica predefinita"
 
-#: ../lib/advene/gui/edit/elements.py:1773
-msgid "Begin time is greater than end time"
-msgstr "Il tempo di inizio è più grande di quello finale"
+#: ../lib/advene/gui/popup.py:771
+#, fuzzy
+msgid "Generate a caption dynamic view..."
+msgstr "Vista dinamica predefinita"
 
-#: ../lib/advene/gui/edit/elements.py:1803
-#: ../lib/advene/gui/views/table.py:252
-msgid "Begin"
+#: ../lib/advene/gui/popup.py:772
+msgid "Display as transcription"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:1812
-#: ../lib/advene/gui/views/table.py:253 ../lib/advene/gui/main.py:628
-msgid "End"
+#: ../lib/advene/gui/popup.py:773
+msgid "Display annotations in table"
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2044
-msgid "Expecting an integer."
+#: ../lib/advene/gui/popup.py:774
+msgid "Export to another format..."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2076
-#, python-format
-msgid ""
-"The %(attribute)s attribute could not be updated:\n"
-"\n"
-"%(error)s\n"
-"\n"
-"Resetting to the original value."
-msgstr ""
+#: ../lib/advene/gui/popup.py:775
+#, fuzzy
+msgid "Split according to annotations"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/gui/edit/elements.py:2103
+#: ../lib/advene/gui/popup.py:777
 #, python-format
-msgid ""
-"The following attributes cannot be updated:\n"
-"\n"
-"%s"
+msgid "Apply %s..."
 msgstr ""
-"I seguenti attributi non possono essere aggiornati:\n"
-"\n"
-"%s"
 
-#: ../lib/advene/gui/edit/elements.py:2143
-#, python-format
-msgid ""
-"The following attributes could not be updated:\n"
-"\n"
-"%s"
-msgstr ""
-"I seguenti attributi potrebbero non essere aggiornati:\n"
-"\n"
-"%s"
+#: ../lib/advene/gui/popup.py:783
+#, fuzzy
+msgid "Delete all annotations"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/gui/edit/elements.py:2160
-msgid "Attribute"
-msgstr "Attributo"
+#: ../lib/advene/gui/popup.py:784
+#, fuzzy
+msgid "Renumber annotations..."
+msgstr "Tutte le annotazioni"
+
+#: ../lib/advene/gui/popup.py:785
+#, fuzzy
+msgid "Shot validation view..."
+msgstr "Seleziona un'azione"
 
-#: ../lib/advene/gui/edit/elements.py:2168
-#: ../lib/advene/gui/views/browser.py:366
-msgid "Value"
+#: ../lib/advene/gui/popup.py:797
+#, python-format
+msgid "A follow dynamic view for %s already seems to exist."
 msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2259
-msgid "Insert an element"
-msgstr "Inserisci un elemento"
-
-#: ../lib/advene/gui/edit/elements.py:2260
-msgid "Choose the element to insert."
-msgstr "Scegli un elemento da inserire."
+#: ../lib/advene/gui/popup.py:806
+#, fuzzy, python-format
+msgid "Follow %s relation-type"
+msgstr "Tipo di Annotazione"
 
-#: ../lib/advene/gui/edit/elements.py:2330
-#: ../lib/advene/gui/edit/elements.py:2373
-#, python-format
-msgid "Some tags contain invalid characters: %s"
-msgstr "Qualche tag contiene caratteri invalidi: %s"
+#: ../lib/advene/gui/popup.py:815
+msgid "Follow the relation"
+msgstr ""
 
-#: ../lib/advene/gui/edit/elements.py:2353
-msgid "Tags:"
+#: ../lib/advene/gui/popup.py:835
+msgid "Delete all relations..."
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:163
-#: ../lib/advene/gui/views/browser.py:165
-msgid "TALES browser"
+#: ../lib/advene/gui/popup.py:836
+#, fuzzy
+msgid "Create montage from related annotations"
+msgstr "Trascrizione delle annotazioni"
+
+#: ../lib/advene/gui/popup.py:837
+msgid "Create dynamic view following relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:170
-msgid "Display result in table"
+#: ../lib/advene/gui/popup.py:852 ../lib/advene/gui/edit/elements.py:705
+#, python-format
+msgid "Exception in query: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:193
-msgid "Insert path"
+#: ../lib/advene/gui/popup.py:855
+msgid "Apply query on..."
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:194
-msgid "Insert value"
+#: ../lib/advene/gui/popup.py:880
+msgid "Activate view"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:249
-msgid "Expression returned None (there was an exception)"
+#: ../lib/advene/gui/popup.py:882
+msgid "Open adhoc view"
 msgstr ""
 
-#: ../lib/advene/gui/views/browser.py:302
-msgid "Result is not a list"
+#: ../lib/advene/gui/util/initialconfig.py:82
+msgid "Initial Advene configuration"
 msgstr ""
 
-#: ../lib/advene/gui/views/accumulatorpopup.py:49
-msgid "PopupAccumulator"
+#: ../lib/advene/gui/util/initialconfig.py:83
+msgid ""
+"<span size='large'><b>Welcome in Advene</b>\n"
+"This is the first time that you run Advene. Please answer some basic "
+"configuration questions. You will be able to modify these choices from the "
+"Advene interface, in the Edit/Preferences menu.</span>"
 msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:40
-#, fuzzy
-msgid "Edition History"
-msgstr "_Cronologia di Navigazione"
+#: ../lib/advene/gui/util/initialconfig.py:84
+msgid "Interface language"
+msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:42
-msgid "Access last edited/created elements"
+#: ../lib/advene/gui/util/initialconfig.py:84
+msgid "Language used for the interface"
 msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:102
-#, fuzzy
-msgid "Created"
-msgstr "Crea"
+#: ../lib/advene/gui/util/initialconfig.py:90
+msgid "Weekly check for Advene updates on the Advene website"
+msgstr ""
 
-#: ../lib/advene/gui/views/editionhistory.py:103
-#, fuzzy
-msgid "Edited"
-msgstr "_Modifica"
+#: ../lib/advene/gui/util/initialconfig.py:92
+msgid "Preferred directory for data files"
+msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:43
-msgid "Links"
+#: ../lib/advene/gui/util/initialconfig.py:92
+msgid "Preferred directory for storing data files (Advene packages)"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:45
-msgid "URL stack"
+#: ../lib/advene/gui/util/initialconfig.py:94
+msgid "Directories to search for movies"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:123
+#: ../lib/advene/gui/util/initialconfig.py:94
 #, python-format
-msgid "Go to %s"
+msgid ""
+"List of directories (separated by %(pathsep)s) to search for movie files."
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:157
-msgid "Push a URL on the stack"
+#: ../lib/advene/gui/util/initialconfig.py:95
+msgid "First look for movie file in the same directory as the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/logwindow.py:158
-msgid "Description of the URL"
+#: ../lib/advene/gui/util/initialconfig.py:95
+msgid ""
+"If checked, the movie file will be searched for in the same directory as the "
+"referencing package."
 msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:37
-msgid "Checker"
+#: ../lib/advene/gui/util/__init__.py:44 ../lib/advene/gui/edit/create.py:108
+msgid "Plain text content"
 msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:39
+#: ../lib/advene/gui/util/__init__.py:45
 #, fuzzy
-msgid "Check various package properties"
-msgstr "Modifica proprietà pacchetto"
+msgid "HTML content"
+msgstr "template HTML"
 
-#: ../lib/advene/gui/views/checker.py:90
-#, fuzzy
-msgid "List of possible issues in the current package"
-msgstr "Salva il pacchetto attuale"
+#: ../lib/advene/gui/util/__init__.py:46 ../lib/advene/gui/edit/create.py:109
+msgid "Simple-structured content"
+msgstr ""
 
-#: ../lib/advene/gui/views/checker.py:108
-msgid "Overlapping"
+#: ../lib/advene/gui/util/__init__.py:47
+msgid "List of numeric values"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:52
-msgid "Tag Bag"
+#: ../lib/advene/gui/util/__init__.py:48 ../lib/advene/gui/edit/create.py:110
+msgid "SVG graphics content"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:54 ../lib/advene/gui/main.py:1232
-msgid "Bag of tags"
-msgstr "Raccolta di tag"
+#: ../lib/advene/gui/util/__init__.py:387
+#, python-format
+msgid ""
+"Annotation Type %(title)s:\n"
+"%(count)s"
+msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:59
-msgid "New tag"
+#: ../lib/advene/gui/util/__init__.py:393
+#, python-format
+msgid ""
+"Relation Type %(title)s:\n"
+"%(count)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:122
-msgid "New tag name"
+#: ../lib/advene/gui/util/dialog.py:419 ../lib/advene/gui/util/dialog.py:458
+msgid "Name the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:128
-msgid "Enter a new tag name and select its color."
+#: ../lib/advene/gui/util/dialog.py:422 ../lib/advene/gui/util/dialog.py:459
+msgid "Choose a name for the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:162
-#: ../lib/advene/gui/views/timeline.py:3720
-msgid "The tag contains invalid characters"
+#: ../lib/advene/gui/util/dialog.py:497
+msgid "Open a file"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:175
-msgid "Tag bag options"
+#: ../lib/advene/gui/util/dialog.py:522 ../lib/advene/gui/util/dialog.py:560
+msgid "N/C"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:176
-msgid "Update with new tags"
+#: ../lib/advene/gui/util/dialog.py:527
+msgid "Alias"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:176
-msgid "Automatically display new defined tags"
+#: ../lib/advene/gui/util/dialog.py:545
+msgid ""
+"Press to\n"
+"display\n"
+"information"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:225
+#: ../lib/advene/gui/util/dialog.py:568
+msgid "Wait..."
+msgstr ""
+
+#: ../lib/advene/gui/util/dialog.py:572
 #, python-format
-msgid "Choose the color for tag %s"
+msgid "Error: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:249
-msgid "Set color"
+#: ../lib/advene/gui/util/dialog.py:592
+msgid "Any type of file"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:250
-msgid "Remove"
+#: ../lib/advene/gui/util/dialog.py:594
+msgid "Advene files (.xml, .azp, .apl)"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:324
-msgid "Drop a tag here to remove it from the list"
+#: ../lib/advene/gui/util/dialog.py:596
+msgid "Advene session (.apl)"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:333
+#: ../lib/advene/gui/util/dialog.py:597
 #, fuzzy
-msgid "Save as adhoc view"
-msgstr "Vista statica predefinita"
+msgid "Audio files"
+msgstr "Aggiungi file..."
 
-#: ../lib/advene/gui/views/tagbag.py:334
-msgid "Add a new tag"
+#: ../lib/advene/gui/util/dialog.py:598
+msgid "Video files"
 msgstr ""
 
-#: ../lib/advene/gui/views/tagbag.py:335
-msgid "Display all defined tags"
+#: ../lib/advene/gui/util/dialog.py:637
+#: ../lib/advene/gui/edit/properties.py:578
+msgid "Choose a directory"
+msgstr "Scegliere una cartella"
+
+#: ../lib/advene/gui/util/dialog.py:690
+msgid "Select an element"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:48
-msgid "Transcription"
+#: ../lib/advene/gui/edit/rules.py:88 ../lib/advene/gui/edit/rules.py:90
+#: ../lib/advene/gui/edit/create.py:254
+msgid "Rule"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:50
-#, fuzzy
-msgid "Display annotations as a text transcription"
-msgstr "Visualizza le annotazione come una trascrizione"
+#: ../lib/advene/gui/edit/rules.py:99 ../lib/advene/gui/edit/create.py:244
+msgid "Subviews"
+msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:146
-#, python-format
-msgid "Error in source evaluation %(source)s: %(error)s"
+#: ../lib/advene/gui/edit/rules.py:126
+msgid "Add a new rule"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:163
-msgid "Transcription options"
+#: ../lib/advene/gui/edit/rules.py:130
+msgid "Subview"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:164
-msgid "Default representation"
+#: ../lib/advene/gui/edit/rules.py:133
+msgid "Add a subview list"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:164
-msgid "Use the default representation for annotations"
+#: ../lib/advene/gui/edit/rules.py:139
+msgid "Remove the current rule"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:165
-msgid ""
-"If default representation is unchecked,\n"
-"this TALES expression that will be used to format the annotations."
+#: ../lib/advene/gui/edit/rules.py:275
+msgid "Source expression"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:166
-msgid "Separator"
+#: ../lib/advene/gui/edit/rules.py:277
+msgid "Return expression"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:167
-msgid "This separator will be inserted between the annotations."
+#: ../lib/advene/gui/edit/rules.py:351
+msgid "For all elements in "
+msgstr "Per tutti gli elementi in "
+
+#: ../lib/advene/gui/edit/rules.py:352
+msgid "All annotations of the package"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:168
-msgid "Whitespace"
+#: ../lib/advene/gui/edit/rules.py:353
+msgid "All views of the package"
+msgstr "Tutte le visualizzazioni del pacchetto"
+
+#: ../lib/advene/gui/edit/rules.py:354 ../lib/advene/gui/edit/rules.py:798
+msgid "The context annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:169
-msgid "Newline"
+#: ../lib/advene/gui/edit/rules.py:355 ../lib/advene/gui/edit/rules.py:799
+msgid "The annotations of the context type"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:170
-msgid "Tabulation"
+#: ../lib/advene/gui/edit/rules.py:358 ../lib/advene/core/controller.py:610
+#, python-format
+msgid "Annotations of type %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:171
-msgid "Dash"
+#: ../lib/advene/gui/edit/rules.py:370
+msgid "Return "
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:172
-msgid "User defined"
+#: ../lib/advene/gui/edit/rules.py:372 ../lib/advene/gui/edit/rules.py:787
+msgid "The element"
+msgstr "L'elemento"
+
+#: ../lib/advene/gui/edit/rules.py:373 ../lib/advene/gui/edit/rules.py:788
+msgid "The element's content"
+msgstr "Il contenuto dell'elemento"
+
+#: ../lib/advene/gui/edit/rules.py:388
+msgid "If the element matches "
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:174
-msgid "User-defined separator"
+#: ../lib/advene/gui/edit/rules.py:390
+msgid "Return the element if it matches "
+msgstr ""
+
+#: ../lib/advene/gui/edit/rules.py:408 ../lib/advene/gui/edit/rules.py:617
+msgid "All conditions must be met"
+msgstr ""
+
+#: ../lib/advene/gui/edit/rules.py:409 ../lib/advene/gui/edit/rules.py:618
+msgid "Any condition can be met"
+msgstr ""
+
+#: ../lib/advene/gui/edit/rules.py:493 ../lib/advene/gui/edit/rules.py:563
+#, python-format
+msgid "Rule <b>%s</b>"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:174
-msgid ""
-"Separator used if user-defined is selected.Use \\n for a newline and \\t for "
-"a tabulation."
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:574
+msgid "Rule name"
+msgstr "Nome della regola"
+
+#: ../lib/advene/gui/edit/rules.py:591
+msgid "Event"
+msgstr "Evento"
+
+#: ../lib/advene/gui/edit/rules.py:599
+msgid "If"
+msgstr "Se"
+
+#: ../lib/advene/gui/edit/rules.py:638
+msgid "Then"
+msgstr "Quindi"
+
+#: ../lib/advene/gui/edit/rules.py:683
+msgid "When the "
+msgstr "Quando il "
 
-#: ../lib/advene/gui/views/transcription.py:175
-msgid "Display timestamps"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:696
+msgid " occurs,"
+msgstr " succede,"
 
-#: ../lib/advene/gui/views/transcription.py:175
-msgid "Insert timestsamp values"
+#: ../lib/advene/gui/edit/rules.py:723 ../lib/advene/gui/edit/rules.py:726
+#, python-format
+msgid "Condition expression: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:176
-msgid "Display annotation bounds"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:765
+#, fuzzy
+msgid "The annotation type"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/views/transcription.py:236
+#: ../lib/advene/gui/edit/rules.py:768
 #, python-format
-msgid ""
-"Cannot convert the following annotations,\n"
-"the representation pattern is too complex.\n"
-"%s"
+msgid "The value of the %s attribute"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:247
-msgid ""
-"Cannot validate the update.\n"
-"The representation pattern is too complex."
+#: ../lib/advene/gui/edit/rules.py:770
+msgid "The annotation fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:273
-msgid "Save transcription to a text file"
+#: ../lib/advene/gui/edit/rules.py:771
+msgid "The annotation begin time"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:274
-msgid "Apply the modifications"
+#: ../lib/advene/gui/edit/rules.py:772
+msgid "The annotation end time"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:275
-msgid "Find text"
+#: ../lib/advene/gui/edit/rules.py:774
+msgid "The annotation MIME-type"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:276
-msgid "Quickly switch display options"
+#: ../lib/advene/gui/edit/rules.py:775
+msgid "The annotation's incoming relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:277
-msgid "Refresh the transcription"
+#: ../lib/advene/gui/edit/rules.py:776
+msgid "The annotation's outgoing relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:278
-msgid "Edit preferences"
+#: ../lib/advene/gui/edit/rules.py:779
+#, python-format
+msgid "The %s-related incoming annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/transcription.py:697
+#: ../lib/advene/gui/edit/rules.py:783
 #, python-format
-msgid "Cannot write to %(filename)s: %(error)s:"
+msgid "The %s-related outgoing annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:52
-#: ../lib/advene/gui/views/activebookmarks.py:54
-msgid "ActiveBookmarks"
+#: ../lib/advene/gui/edit/rules.py:789
+msgid "The element fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:441
-msgid "Chronological order"
+#: ../lib/advene/gui/edit/rules.py:790
+msgid "The element begin time"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:442
-msgid "Completeness and chronological order"
+#: ../lib/advene/gui/edit/rules.py:791
+msgid "The element end time"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:458
-msgid "Bookmark duration"
+#: ../lib/advene/gui/edit/rules.py:792
+msgid "The element duration"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:459
-msgid "Enter the duration (in ms) to convert bookmarks into annotations"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:793
+#, fuzzy
+msgid "The element type"
+msgstr "L'elemento"
 
-#: ../lib/advene/gui/views/activebookmarks.py:481
-msgid "User-specified duration"
+#: ../lib/advene/gui/edit/rules.py:794
+msgid "The element's incoming relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:482
-msgid "2s duration"
+#: ../lib/advene/gui/edit/rules.py:795
+msgid "The element's outgoing relations"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:483
-msgid "Complete coverage"
+#: ../lib/advene/gui/edit/rules.py:796
+msgid "The context"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:501
-msgid "Drop a bookmark here to remove it from the list"
+#: ../lib/advene/gui/edit/rules.py:797
+msgid "The context fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:520
-#: ../lib/advene/gui/views/bookmarks.py:243
-msgid "Insert a bookmark for the current video time"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:809
+#, fuzzy, python-format
+msgid "annotation-type %s"
+msgstr "Tipo di Annotazione"
 
-#: ../lib/advene/gui/views/activebookmarks.py:528
-msgid "Type of the annotations that will be created"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:812
+#, fuzzy, python-format
+msgid "relation-type %s"
+msgstr "Tipo di Annotazione"
 
-#: ../lib/advene/gui/views/activebookmarks.py:561
-msgid "Reorder active bookmarks"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:834
+msgid "Select a condition"
+msgstr "Seleziona una condizione"
 
-#: ../lib/advene/gui/views/activebookmarks.py:562
-msgid "Complete bookmarks into annotations"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:878
+#, python-format
+msgid "Parameter %s"
+msgstr "Parametro %s"
 
-#: ../lib/advene/gui/views/activebookmarks.py:563
-msgid "Save the current state"
-msgstr ""
+#: ../lib/advene/gui/edit/rules.py:991
+msgid "Select an action"
+msgstr "Seleziona un'azione"
 
-#: ../lib/advene/gui/views/activebookmarks.py:863
-msgid "Remove end timestamp"
+#: ../lib/advene/gui/edit/rules.py:1082
+msgid "Activate?"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1071
-msgid ""
-"Error: cannot find an appropriate schema to create the Active-bookmark type."
+#: ../lib/advene/gui/edit/properties.py:110
+msgid "Please press the new key combination"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1076
-msgid "Active bookmark"
+#: ../lib/advene/gui/edit/properties.py:161
+msgid "Disabled"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1114
-msgid "Validate the annotation"
-msgstr ""
+#: ../lib/advene/gui/edit/properties.py:167
+#: ../lib/advene/gui/edit/shapewidget.py:1602
+msgid "Properties"
+msgstr "Proprietà"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1260
-msgid "Duplicate bookmark"
-msgstr ""
+#: ../lib/advene/gui/edit/properties.py:531
+msgid "Choose a file"
+msgstr "Scegliere un file"
 
-#: ../lib/advene/gui/views/activebookmarks.py:1261
-msgid "Remove bookmark"
+#: ../lib/advene/gui/edit/frameselector.py:46
+msgid "Click on a frame to select its time."
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1270
-msgid "Remove begin timestamp"
+#: ../lib/advene/gui/edit/frameselector.py:184
+msgid "Select the appropriate snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1277
-msgid "Complete bookmark"
+#: ../lib/advene/gui/edit/frameselector.py:237
+#: ../lib/advene/gui/edit/frameselector.py:268
+msgid "Click to see more frames or scroll with the mouse wheel"
 msgstr ""
 
-#: ../lib/advene/gui/views/activebookmarks.py:1281
-msgid "Change type to"
+#: ../lib/advene/gui/edit/create.py:83
+#, python-format
+msgid "%s creation"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:48
-msgid "Bookmarks importer"
+#: ../lib/advene/gui/edit/create.py:84
+#, python-format
+msgid ""
+"To create a new element of type %s,\n"
+"you must give the following information."
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:69
-msgid "Bookmarks"
-msgstr ""
+#: ../lib/advene/gui/edit/create.py:113
+msgid "Dynamic view"
+msgstr "Vista dinamica"
 
-#: ../lib/advene/gui/views/bookmarks.py:71
-msgid "Bookmark timecodes with their corresponding screenshots"
-msgstr ""
+#: ../lib/advene/gui/edit/create.py:114
+msgid "HTML template"
+msgstr "template HTML"
 
-#: ../lib/advene/gui/views/bookmarks.py:142
-msgid "Select the annotation type to generate"
+#: ../lib/advene/gui/edit/create.py:115
+msgid "Plain XML"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:147
-msgid "Choose a duration"
-msgstr ""
+#: ../lib/advene/gui/edit/create.py:116
+msgid "SVG template"
+msgstr "template SVG"
 
-#: ../lib/advene/gui/views/bookmarks.py:148
-msgid "Enter the standard duration (in ms) of created annotations."
+#: ../lib/advene/gui/edit/create.py:117
+msgid "Plain text template"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:165
-msgid "Converted from bookmarks"
-msgstr ""
+#: ../lib/advene/gui/edit/create.py:120
+msgid "Simple query"
+msgstr "Ricerca semplice"
 
-#: ../lib/advene/gui/views/bookmarks.py:223
-msgid "Drop a position here to remove it from the list"
-msgstr ""
+#: ../lib/advene/gui/edit/create.py:122
+msgid "Directory"
+msgstr "Cartella"
 
-#: ../lib/advene/gui/views/bookmarks.py:244
-msgid "Convert bookmarks to annotations"
+#: ../lib/advene/gui/edit/create.py:124 ../lib/advene/util/helper.py:417
+msgid "Resource File"
 msgstr ""
 
-#: ../lib/advene/gui/views/bookmarks.py:292 ../lib/advene/gui/main.py:3609
-msgid "Comment here"
-msgstr ""
+#: ../lib/advene/gui/edit/create.py:130
+msgid "No available type."
+msgstr "Nessun tipo disponibile"
 
-#: ../lib/advene/gui/views/viewplugin.py:60
-msgid "Generic view plugin"
+#: ../lib/advene/gui/edit/create.py:174
+#, python-format
+msgid ""
+"The identifier %s is not valid.\n"
+"It must be composed of non-accentuated alphabetic characters\n"
+"Underscore is allowed."
 msgstr ""
 
-#: ../lib/advene/gui/views/viewplugin.py:62
-msgid "You should not ever see this tooltip..."
-msgstr ""
+#: ../lib/advene/gui/edit/create.py:179
+#, python-format
+msgid "The identifier %s is already defined."
+msgstr "L'identificatore %s è già stato definito"
 
-#: ../lib/advene/gui/views/interactivequery.py:51
-#: ../lib/advene/gui/views/interactivequery.py:99
-msgid "Interactive query"
+#: ../lib/advene/gui/edit/create.py:312
+msgid "New resource data"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:53
-msgid "Interactive query dialog"
-msgstr ""
+#: ../lib/advene/gui/edit/imports.py:132 ../lib/advene/gui/edit/imports.py:133
+#: ../lib/advene/core/controller.py:611
+msgid "Views"
+msgstr "Visualizzazioni"
 
-#: ../lib/advene/gui/views/interactivequery.py:59
-#: ../lib/advene/gui/views/interactivequery.py:256
-msgid "Save query"
-msgstr ""
+#: ../lib/advene/gui/edit/imports.py:146 ../lib/advene/gui/edit/imports.py:147
+msgid "Schemas"
+msgstr "Schemi"
 
-#: ../lib/advene/gui/views/interactivequery.py:122
-#: ../lib/advene/gui/views/interactivequery.py:172
-#, python-format
-msgid ""
-"Invalid query.\n"
-"The following fields have an invalid value:\n"
-"%s"
-msgstr ""
+#: ../lib/advene/gui/edit/imports.py:198 ../lib/advene/gui/edit/imports.py:199
+#: ../lib/advene/gui/edit/elements.py:523
+msgid "Relations"
+msgstr "Relazioni"
 
-#: ../lib/advene/gui/views/interactivequery.py:136
-#: ../lib/advene/gui/views/interactivequery.py:296
-msgid "Saving the query..."
-msgstr ""
+#: ../lib/advene/gui/edit/imports.py:212 ../lib/advene/gui/edit/imports.py:213
+msgid "Queries"
+msgstr "Ricerche"
 
-#: ../lib/advene/gui/views/interactivequery.py:137
-#: ../lib/advene/gui/views/interactivequery.py:297
-msgid "Give a title and identifier for saving the query"
-msgstr ""
+#: ../lib/advene/gui/edit/imports.py:323
+msgid "Imported?"
+msgstr "Importato?"
 
-#: ../lib/advene/gui/views/interactivequery.py:180
-msgid "Expert search"
-msgstr ""
+#: ../lib/advene/gui/edit/imports.py:340 ../lib/advene/gui/edit/elements.py:515
+#: ../lib/advene/gui/edit/elements.py:564
+#: ../lib/advene/gui/edit/elements.py:651
+#: ../lib/advene/gui/edit/elements.py:731
+#: ../lib/advene/gui/edit/elements.py:788
+#: ../lib/advene/gui/edit/elements.py:880
+#: ../lib/advene/gui/edit/elements.py:949
+#: ../lib/advene/gui/edit/elements.py:1061
+#: ../lib/advene/gui/edit/elements.py:1123
+msgid "URI"
+msgstr "URI"
+
+#: ../lib/advene/gui/edit/imports.py:362
+msgid "Choose the package to import, and its alias"
+msgstr "Scegli il pacchetto da importare, e il suo alias"
 
-#: ../lib/advene/gui/views/interactivequery.py:186
+#: ../lib/advene/gui/edit/imports.py:408 ../lib/advene/gui/edit/merge.py:230
 #, python-format
-msgid ""
-"TALES error in interactive expression:\n"
-"%s"
-msgstr ""
+msgid "Package %s"
+msgstr "Pacchetto %s"
 
-#: ../lib/advene/gui/views/interactivequery.py:247
-msgid "Interactive result"
-msgstr ""
+#: ../lib/advene/gui/edit/imports.py:408 ../lib/advene/gui/edit/merge.py:230
+msgid "No title"
+msgstr "Nessun titolo"
 
-#: ../lib/advene/gui/views/interactivequery.py:249
-msgid "Interactive result display"
-msgstr ""
+#: ../lib/advene/gui/edit/shapewidget.py:91
+msgid "Generic shape"
+msgstr "Forma generica"
 
-#: ../lib/advene/gui/views/interactivequery.py:274
-msgid "Result of interactive query"
+#: ../lib/advene/gui/edit/shapewidget.py:256
+#: ../lib/advene/gui/edit/shapewidget.py:755
+#, python-format
+msgid "Link to %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:278
-msgid "Result of a query"
+#: ../lib/advene/gui/edit/shapewidget.py:348
+#: ../lib/advene/gui/edit/shapewidget.py:1304
+msgid "Link"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:280
-#: ../lib/advene/gui/main.py:3188
-#, python-format
-msgid "'%s'"
+#: ../lib/advene/gui/edit/shapewidget.py:353
+msgid "Link label"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:333
-#, fuzzy, python-format
-msgid "Comment on annotations containing %s"
-msgstr "Tutte le annotazioni"
+#: ../lib/advene/gui/edit/shapewidget.py:371
+msgid "Linewidth"
+msgstr "LarghezzaLinea"
 
-#: ../lib/advene/gui/views/interactivequery.py:352
-msgid "Choose the annotation type where annotations will be created."
+#: ../lib/advene/gui/edit/shapewidget.py:376
+msgid "Filled"
+msgstr "Riempito"
+
+#: ../lib/advene/gui/edit/shapewidget.py:384
+msgid "Opacity"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:356
+#: ../lib/advene/gui/edit/shapewidget.py:426
 #, python-format
-msgid "Copied result of the '%s' query"
-msgstr ""
+msgid "Properties of %s"
+msgstr "Proprietà di %s"
 
-#: ../lib/advene/gui/views/interactivequery.py:368
-#, fuzzy, python-format
-msgid "Search/replace content in %d elements"
-msgstr "Elementi cercati"
+#: ../lib/advene/gui/edit/shapewidget.py:473
+msgid "Rectangle"
+msgstr "Rettangolo"
 
-#: ../lib/advene/gui/views/interactivequery.py:375
-#: ../lib/advene/gui/main.py:3185
-msgid "Empty quicksearch string"
-msgstr ""
+#: ../lib/advene/gui/edit/shapewidget.py:553
+#: ../lib/advene/gui/edit/shapewidget.py:666
+msgid "Text"
+msgstr "Testo"
 
-#: ../lib/advene/gui/views/interactivequery.py:396
-msgid "Edit query again"
+#: ../lib/advene/gui/edit/shapewidget.py:677
+msgid "Textsize"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:400
-#: ../lib/advene/gui/views/finder.py:436
-msgid "Edit query"
+#: ../lib/advene/gui/edit/shapewidget.py:691
+msgid "Image"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:409
-#: ../lib/advene/gui/main.py:537
-msgid "String to search"
+#: ../lib/advene/gui/edit/shapewidget.py:775
+msgid "Href"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:410
-msgid "Search again"
-msgstr ""
+#: ../lib/advene/gui/edit/shapewidget.py:785
+msgid "Line"
+msgstr "Linea"
 
-#: ../lib/advene/gui/views/interactivequery.py:416
-msgid "Empty result"
+#: ../lib/advene/gui/edit/shapewidget.py:881
+msgid "Draw an arrow"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:425
-#, python-format
-msgid "Result is a list of %d annotations."
+#: ../lib/advene/gui/edit/shapewidget.py:892
+msgid "Arrow size"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:427
-#, python-format
-msgid "Result is a list of  %(number)d elements with %(elements)s."
-msgstr ""
+#: ../lib/advene/gui/edit/shapewidget.py:1107
+#, fuzzy
+msgid "Close path"
+msgstr "Nessun pacchetto"
 
-#: ../lib/advene/gui/views/interactivequery.py:470
-msgid "Other elements"
-msgstr ""
+#: ../lib/advene/gui/edit/shapewidget.py:1186
+msgid "Circle"
+msgstr "Cerchio"
 
-#: ../lib/advene/gui/views/interactivequery.py:474
-msgid "Display annotations in timeline"
+#: ../lib/advene/gui/edit/shapewidget.py:1241
+msgid "Ellipse"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:475
-msgid "Display annotations as transcription"
-msgstr ""
+#: ../lib/advene/gui/edit/shapewidget.py:1603
+msgid "SVG"
+msgstr "SVG"
 
-#: ../lib/advene/gui/views/interactivequery.py:481
-#: ../lib/advene/gui/views/interactivequery.py:503
-msgid "Export table"
+#: ../lib/advene/gui/edit/shapewidget.py:2162
+msgid "Load SVG"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:482
-msgid "Create annotations from the result"
-msgstr ""
+#: ../lib/advene/gui/edit/shapewidget.py:2168
+#, fuzzy
+msgid "Save SVG"
+msgstr "Salva"
 
-#: ../lib/advene/gui/views/interactivequery.py:483
-msgid "Define a montage with the result"
-msgstr ""
+#: ../lib/advene/gui/edit/importer.py:49
+msgid "Importer"
+msgstr "Importatore"
 
-#: ../lib/advene/gui/views/interactivequery.py:484
+#: ../lib/advene/gui/edit/importer.py:108
+#: ../lib/advene/gui/edit/importer.py:118
 #, fuzzy
-msgid "Create a comment view with the result"
-msgstr "Vista statica predefinita"
+msgid "Advene package importer"
+msgstr "Modifica proprietà pacchetto"
 
-#: ../lib/advene/gui/views/interactivequery.py:485
-msgid "Search and replace strings in the annotations content"
+#: ../lib/advene/gui/edit/importer.py:122
+msgid "Not likely"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:510
-msgid "Edit elements"
+#: ../lib/advene/gui/edit/importer.py:144
+#, python-format
+msgid ""
+"Completed conversion: %(message)s\n"
+"%(statistics)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:516
-msgid "Open in python evaluator"
-msgstr ""
+#: ../lib/advene/gui/edit/importer.py:151
+msgid "Stop"
+msgstr "Stop"
 
-#: ../lib/advene/gui/views/interactivequery.py:519
+#: ../lib/advene/gui/edit/importer.py:190
 #, python-format
 msgid ""
-"Result:\n"
+"The filter is not ready.\n"
 "%s"
 msgstr ""
 
-#: ../lib/advene/gui/views/interactivequery.py:561
-msgid "Results of _interactive query"
-msgstr ""
-
-#: ../lib/advene/gui/views/relationdisplay.py:34
-msgid "RelationDisplay"
-msgstr ""
-
-#: ../lib/advene/gui/views/relationdisplay.py:36
-msgid "Display the contents of a relation"
-msgstr ""
+#: ../lib/advene/gui/edit/importer.py:279
+msgid "Choose the file to import"
+msgstr "Scegli un file da importare"
 
-#: ../lib/advene/gui/views/relationdisplay.py:79
-msgid "No relation"
-msgstr ""
+#: ../lib/advene/gui/edit/importer.py:299
+#, fuzzy
+msgid "Filter"
+msgstr "_File"
 
-#: ../lib/advene/gui/views/relationdisplay.py:104
-#: ../lib/advene/gui/views/annotationdisplay.py:253
-msgid "Contents"
-msgstr ""
+#: ../lib/advene/gui/edit/importer.py:308
+#, fuzzy
+msgid "Options"
+msgstr "Relazioni"
 
-#: ../lib/advene/gui/views/html.py:62
-msgid "Cannot go back: first item in history"
+#: ../lib/advene/gui/edit/importer.py:318
+msgid "Start"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:220
-#, python-format
-msgid "%s%% loaded"
+#: ../lib/advene/gui/edit/dvdselect.py:71
+msgid ""
+"Select the correct\n"
+"title and chapter\n"
+"of the DVD"
 msgstr ""
+"Seleziona il capitolo \n"
+"e il titolo corretto\n"
+"del DVD"
 
-#: ../lib/advene/gui/views/html.py:223
-#, fuzzy, python-format
-msgid "Title %s"
-msgstr "Modifica %s"
+#: ../lib/advene/gui/edit/dvdselect.py:84
+msgid "Chapter"
+msgstr "Capitolo"
 
-#: ../lib/advene/gui/views/html.py:287
-msgid "HTML Viewer"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:33
+msgid "Create element"
+msgstr "Crea elemento"
 
-#: ../lib/advene/gui/views/html.py:289
-msgid "Embedded HTML widget"
+#: ../lib/advene/gui/edit/merge.py:34
+msgid "Create annotation (duplicate id)"
 msgstr ""
 
-#: ../lib/advene/gui/views/html.py:319
-msgid "No available HTML rendering component"
+#: ../lib/advene/gui/edit/merge.py:35
+msgid "Create relation (duplicate id)"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:36
-msgid "ViewBook"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:36
+msgid "Update the color"
+msgstr "Aggiorna il colore"
 
-#: ../lib/advene/gui/views/viewbook.py:57
-#: ../lib/advene/gui/views/viewbook.py:64
-msgid "Cannot remove this widget, it is essential."
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:37
+msgid "Update the representation"
+msgstr "Aggiorna la rappresentazione"
 
-#: ../lib/advene/gui/views/viewbook.py:135
-msgid "Detach"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:38
+msgid "Update the description"
+msgstr "Aggiorna la descrizione"
 
-#: ../lib/advene/gui/views/viewbook.py:139
-#: ../lib/advene/gui/views/editaccumulator.py:76
-msgid "Close"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:39
+msgid "Update the title"
+msgstr "Aggiorna il titolo"
 
-#: ../lib/advene/gui/views/viewbook.py:157
-msgid "Rename the view"
+#: ../lib/advene/gui/edit/merge.py:40
+msgid "Update the mimetype"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:158
-msgid "Please enter the new name of the view"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:41
+msgid "Update the begin time"
+msgstr "Aggiorna il tempo di inizio"
 
-#: ../lib/advene/gui/views/viewbook.py:197
-msgid "Detach view in its own window, or drag-and-drop to another zone"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:42
+msgid "Update the end time"
+msgstr "Aggiorna il tempo di fine"
 
-#: ../lib/advene/gui/views/viewbook.py:211
-#, fuzzy
-msgid "Close view"
-msgstr "Scegliere un file"
+#: ../lib/advene/gui/edit/merge.py:43
+msgid "Update the content"
+msgstr "Aggiorna il contenuto"
 
-#: ../lib/advene/gui/views/viewbook.py:286
-msgid "Open a new transcription for..."
+#: ../lib/advene/gui/edit/merge.py:44
+msgid "Update the matchFilter"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:298
-#, fuzzy
-msgid "Create a new comment view"
-msgstr "Vista statica predefinita"
-
-#: ../lib/advene/gui/views/viewbook.py:300
-msgid "Open a new view"
+#: ../lib/advene/gui/edit/merge.py:45
+msgid "Update the member types"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:375
-#, python-format
-msgid "Use annotation-type %s :"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:46
+msgid "Update tags"
+msgstr "Aggiorna tag"
 
-#: ../lib/advene/gui/views/viewbook.py:378
-#: ../lib/advene/gui/views/viewbook.py:404
-msgid "to edit it"
+#: ../lib/advene/gui/edit/merge.py:90
+msgid "Difference between original and merged elements"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:379
-#: ../lib/advene/gui/views/viewbook.py:405
-#: ../lib/advene/gui/views/viewbook.py:437
-#, fuzzy
-msgid "to create a new static view"
-msgstr "Vista statica predefinita"
+#: ../lib/advene/gui/edit/merge.py:136
+msgid "Current element"
+msgstr "Elemento attuale"
 
-#: ../lib/advene/gui/views/viewbook.py:381
-msgid "in a timeline"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:141
+msgid "Updated element"
+msgstr "Elemento aggiornato"
 
-#: ../lib/advene/gui/views/viewbook.py:382
-msgid "as a montage"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:147
+msgid "Show diff"
+msgstr "Mostra diff"
 
-#: ../lib/advene/gui/views/viewbook.py:383
-#: ../lib/advene/gui/views/viewbook.py:436
-msgid "in a table"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:180
+msgid "Merge?"
+msgstr "Unire?"
 
-#: ../lib/advene/gui/views/viewbook.py:384
-#: ../lib/advene/gui/views/viewbook.py:406
-msgid "in a query"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:197
+msgid "Element"
+msgstr "Elemento"
 
-#: ../lib/advene/gui/views/viewbook.py:384
-#: ../lib/advene/gui/views/viewbook.py:406
-#, python-format
-msgid "Query %s"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:215
+#, fuzzy, python-format
+msgid "Merge elements from %(source)s into %(dest)s"
+msgstr "Unisci elementi da un altro pacchetto"
 
-#: ../lib/advene/gui/views/viewbook.py:385
-#: ../lib/advene/gui/views/viewbook.py:407
-msgid "in the TALES browser"
-msgstr ""
+#: ../lib/advene/gui/edit/merge.py:266
+msgid "All"
+msgstr "Tutto"
 
-#: ../lib/advene/gui/views/viewbook.py:385
-#, python-format
-msgid "Browsing %s"
+#: ../lib/advene/gui/edit/merge.py:271 ../lib/advene/core/controller.py:1097
+msgid "None"
+msgstr "Nessuno"
+
+#: ../lib/advene/gui/edit/montage.py:51
+msgid "Montage"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:401
-#, python-format
-msgid "Use annotation %s :"
+#: ../lib/advene/gui/edit/montage.py:53
+msgid "Dynamic montage of annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:407
-#, python-format
-msgid "Browse %s"
+#: ../lib/advene/gui/edit/montage.py:61
+msgid "Render"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:408
-msgid "to display its contents"
+#: ../lib/advene/gui/edit/montage.py:176
+msgid "Remove from montage"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:408
+#: ../lib/advene/gui/edit/montage.py:310
 #, python-format
-msgid "%s"
+msgid ""
+"Exporting montage %(title)s\n"
+"to %%(filename)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:409
-msgid "as a bookmark"
+#: ../lib/advene/gui/edit/montage.py:405
+msgid "Drop an annotation here to remove it from the list"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:427
-msgid "as the context for the query..."
+#: ../lib/advene/gui/edit/montage.py:417
+msgid "Play the montage"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:431
+#: ../lib/advene/gui/edit/montage.py:422
 #, fuzzy
-msgid "Set of annotations"
-msgstr "Tutte le annotazioni"
+msgid "Save the view in the package"
+msgstr "Salva il pacchetto attuale"
 
-#: ../lib/advene/gui/views/viewbook.py:432
-#, fuzzy
-msgid "Use annotations:"
-msgstr "Tutte le annotazioni"
+#: ../lib/advene/gui/edit/montage.py:470
+msgid "Set zoom level"
+msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:435
-msgid "to edit them"
+#: ../lib/advene/gui/edit/montage.py:475
+msgid "Set 100% zoom"
 msgstr ""
 
-#: ../lib/advene/gui/views/viewbook.py:438
-msgid "as bookmarks"
+#: ../lib/advene/gui/edit/montage.py:554
+msgid "Total duration:"
 msgstr ""
 
-#: ../lib/advene/gui/views/singletonpopup.py:32
-msgid "SingletonPopup"
+#: ../lib/advene/gui/edit/timeadjustment.py:97
+#, python-format
+msgid "Decrement value by %.2f s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:121 ../lib/advene/gui/main.py:1221
-msgid "Timeline"
+#: ../lib/advene/gui/edit/timeadjustment.py:99
+#, python-format
+msgid "Increment value by %.2f s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:123
-msgid "Display annotations on a timeline"
+#: ../lib/advene/gui/edit/timeadjustment.py:128
+msgid ""
+"Click to play\n"
+"Control+click to set to current time\n"
+"Scroll to modify value (with control/shift)\n"
+"Right-click to invalidate screenshot"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:137
-msgid "Limit display to current area"
+#: ../lib/advene/gui/edit/timeadjustment.py:143
+msgid ""
+"Enter a timecode.\n"
+"An integer value will be considered as milliseconds.\n"
+"A float value (12.2) will be considered as seconds.\n"
+"HH:MM:SS.sss values are possible."
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:138
-#: ../lib/advene/gui/views/timeline.py:3265
-msgid "Display whole movie"
+#: ../lib/advene/gui/edit/timeadjustment.py:157
+msgid "Set to current player position"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:168
+#: ../lib/advene/gui/edit/elements.py:80
 #, python-format
-msgid "Cannot find annotation type %s"
+msgid "No edit popup available for element %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:218
-msgid "No scrolling"
+#: ../lib/advene/gui/edit/elements.py:100
+msgid "Edit Window"
+msgstr "Modifica Finestra"
+
+#: ../lib/advene/gui/edit/elements.py:139
+msgid "Apply changes and close the edit window"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:219
-msgid "Continuous scrolling"
+#: ../lib/advene/gui/edit/elements.py:144
+msgid "Apply changes"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:220
-msgid "Discrete scrolling"
+#: ../lib/advene/gui/edit/elements.py:278
+msgid "Content has been modified. Close anyway and lose data?"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:221
-#, fuzzy
-msgid "Annotation scrolling"
-msgstr "Tipo di Annotazione"
+#: ../lib/advene/gui/edit/elements.py:338
+#, python-format
+msgid "View %s (read-only)"
+msgstr "Visualizza %s (sola-lettura)"
 
-#: ../lib/advene/gui/views/timeline.py:483
-#, fuzzy, python-format
-msgid "%d annotations"
-msgstr "Tutte le annotazioni"
+#: ../lib/advene/gui/edit/elements.py:374
+#, python-format
+msgid "Display %s"
+msgstr "Visualizza %s"
 
-#: ../lib/advene/gui/views/timeline.py:486
+#: ../lib/advene/gui/edit/elements.py:459
 #, fuzzy
-msgid "Display all types"
-msgstr "Visualizza %s"
+msgid "Apply changes and edit previous annotation of same type"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/views/timeline.py:488
-#, python-format
-msgid ""
-"There are %d annotations.\n"
-"The current timeline may take a long time to display them, so only the first "
-"two annotation types are displayed. Use the annotation type selector (second "
-"button in the timeline) to select other annotations types to display, or "
-"click on the 'Display all types' button below."
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:463
+#, fuzzy
+msgid "Apply changes and edit next annotation of same type"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/views/timeline.py:963
-msgid "Split at current player position"
+#: ../lib/advene/gui/edit/elements.py:469
+msgid "Unhighlight annotation"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:967
-msgid "Center and zoom"
+#: ../lib/advene/gui/edit/elements.py:473
+msgid "Highlight annotation"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1058
-#: ../lib/advene/gui/views/tree.py:808 ../lib/advene/gui/main.py:4563
-msgid ""
-"Select the schema where you want to\n"
-"create the new relation type."
+#: ../lib/advene/gui/edit/elements.py:504
+msgid "Fragment"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1071
-#: ../lib/advene/gui/views/tree.py:821
-msgid "Create a relation"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:527 ../lib/advene/core/controller.py:611
+msgid "Tags"
+msgstr "Tag"
 
-#: ../lib/advene/gui/views/timeline.py:1081
-#: ../lib/advene/gui/views/tree.py:831
-msgid "Create a new relation-type."
+#: ../lib/advene/gui/edit/elements.py:623
+msgid "Apply changes and visualise in web browser"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1107
-msgid "Merge with this annotation"
+#: ../lib/advene/gui/edit/elements.py:628
+msgid "Apply changes and activate the view"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1116
-msgid "Align both begin times"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:636
+#: ../lib/advene/gui/edit/elements.py:717
+#: ../lib/advene/gui/edit/elements.py:774
+#: ../lib/advene/gui/edit/elements.py:865
+#: ../lib/advene/gui/edit/elements.py:934
+#: ../lib/advene/gui/edit/elements.py:1036
+#, fuzzy
+msgid "Title (name)"
+msgstr "Nome file"
 
-#: ../lib/advene/gui/views/timeline.py:1117
-msgid "Align both end times"
+#: ../lib/advene/gui/edit/elements.py:640
+msgid "Name of the view"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1118
-msgid "Align end time to selected begin time"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:664
+msgid "Class"
+msgstr "Classe"
 
-#: ../lib/advene/gui/views/timeline.py:1119
-msgid "Align begin time to selected end time"
+#: ../lib/advene/gui/edit/elements.py:667
+msgid "Match Filter"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1120
-msgid "Align all times"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:710
+#, fuzzy
+msgid "Validate and run query on package"
+msgstr "Crea un nuovo pacchetto"
 
-#: ../lib/advene/gui/views/timeline.py:1158
-#: ../lib/advene/gui/views/tree.py:700
-msgid "Cannot delete the annotation : it has relations."
+#: ../lib/advene/gui/edit/elements.py:721
+msgid "Name of the query"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1233
-msgid "Select the appropriate relation type"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:778
+#, fuzzy
+msgid "Name of the package"
+msgstr "Tutte le visualizzazioni del pacchetto"
 
-#: ../lib/advene/gui/views/timeline.py:1252
-#: ../lib/advene/gui/views/tree.py:757
-#, python-format
-msgid "Duplicate selection to type %s"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:796
+#: ../lib/advene/gui/edit/elements.py:887
+#: ../lib/advene/gui/edit/elements.py:966
+#: ../lib/advene/gui/edit/elements.py:1080
+msgid "Description"
+msgstr "Descrizione"
 
-#: ../lib/advene/gui/views/timeline.py:1255
-#: ../lib/advene/gui/views/tree.py:760
-#, fuzzy, python-format
-msgid "Move selection to type %s"
-msgstr "Tipo di Annotazione"
+#: ../lib/advene/gui/edit/elements.py:800
+#: ../lib/advene/gui/edit/elements.py:891
+#: ../lib/advene/gui/edit/elements.py:970
+#: ../lib/advene/gui/edit/elements.py:1084
+msgid "Textual description of the package"
+msgstr "Descrizione testuale del pacchetto"
 
-#: ../lib/advene/gui/views/timeline.py:1264
-#: ../lib/advene/gui/views/tree.py:769
-#, python-format
-msgid "Duplicate annotation to type %s"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:805
+msgid "Default dynamic view"
+msgstr "Vista dinamica predefinita"
 
-#: ../lib/advene/gui/views/timeline.py:1268
-#: ../lib/advene/gui/views/tree.py:773
-#, python-format
-msgid "Move annotation to type %s"
+#: ../lib/advene/gui/edit/elements.py:809
+msgid "Dynamic view to activate on package load"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1275
-#, python-format
-msgid "Duplicate to type %(type)s at %(position)s"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:814
+msgid "Default static view"
+msgstr "Vista statica predefinita"
 
-#: ../lib/advene/gui/views/timeline.py:1281
-#, python-format
-msgid "Move to type %(type)s at %(position)s"
+#: ../lib/advene/gui/edit/elements.py:818
+msgid "Static view to open on package load"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1291
-#: ../lib/advene/gui/views/tree.py:784
-msgid "Duplicate and create a relation"
+#: ../lib/advene/gui/edit/elements.py:823
+msgid "Default adhoc view"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1302
-#, python-format
-msgid "Duplicate at %s and create a relation"
+#: ../lib/advene/gui/edit/elements.py:827
+msgid "Adhoc view to open on package load"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1333
-msgid "Annotation filter"
+#: ../lib/advene/gui/edit/elements.py:832
+msgid "Cached duration"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1334
-msgid "Enter the searched string"
+#: ../lib/advene/gui/edit/elements.py:836
+msgid "Cached duration in ms"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1442
-#, python-format
-msgid "Duplicate all annotations to type %s"
+#: ../lib/advene/gui/edit/elements.py:841
+msgid "Mediafile"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1444
-#, python-format
-msgid "Move all annotations to type %s"
+#: ../lib/advene/gui/edit/elements.py:845
+msgid "Location of associated media file"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1446
-#, python-format
-msgid "Duplicate all annotations matching a string to type %s"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:869
+#, fuzzy
+msgid "Name of the schema"
+msgstr "Schema"
 
-#: ../lib/advene/gui/views/timeline.py:1448
-#, python-format
-msgid "Move all annotations matching a string to type %s"
+#: ../lib/advene/gui/edit/elements.py:901
+#: ../lib/advene/gui/edit/elements.py:981
+msgid "TALES expression returning a color for the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1450
-#, python-format
-msgid "Align all annotation time codes using %s as reference."
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:908
+#: ../lib/advene/gui/edit/elements.py:999
+msgid "Item color"
+msgstr "Colore oggetto"
 
-#: ../lib/advene/gui/views/timeline.py:1452
-#, python-format
-msgid "Align all annotation contents using %s as reference"
+#: ../lib/advene/gui/edit/elements.py:912
+#: ../lib/advene/gui/edit/elements.py:1003
+msgid ""
+"TALES expression returning a color for the items contained by the element"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1642
-#: ../lib/advene/gui/views/table.py:240
-msgid "Cannot update the annotation, its representation is too complex"
+#: ../lib/advene/gui/edit/elements.py:938
+#: ../lib/advene/gui/edit/elements.py:1040
+msgid "Name of the type"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:1936
-#: ../lib/advene/gui/views/timeline.py:1965
-#, fuzzy, python-format
-msgid "Displaying %(count)d / %(total)d annotations..."
-msgstr "Trascrizione delle annotazioni"
+#: ../lib/advene/gui/edit/elements.py:956
+#: ../lib/advene/gui/edit/elements.py:1045
+#: ../lib/advene/gui/edit/elements.py:1314
+msgid "MIME Type"
+msgstr "Tipo MIME"
 
-#: ../lib/advene/gui/views/timeline.py:1947
+#: ../lib/advene/gui/edit/elements.py:960
+#: ../lib/advene/gui/edit/elements.py:1049
 #, fuzzy
-msgid "Displaying done."
-msgstr "Visualizza %s"
+msgid "MIMEType of the content"
+msgstr "Aggiorna il contenuto"
 
-#: ../lib/advene/gui/views/timeline.py:2439
-msgid "Create a new annotation"
+#: ../lib/advene/gui/edit/elements.py:992
+msgid ""
+"TALES expression used to get a compact representation of the annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2440
+#: ../lib/advene/gui/edit/elements.py:993
+#, fuzzy, python-format
+msgid "Display %s key"
+msgstr "Visualizza %s"
+
+#: ../lib/advene/gui/edit/elements.py:1009
 #, fuzzy
-msgid "Zoom on region"
-msgstr "Tutte le annotazioni"
+msgid "Completions"
+msgstr "Relazioni"
 
-#: ../lib/advene/gui/views/timeline.py:2441
-msgid "Restrict display to region"
+#: ../lib/advene/gui/edit/elements.py:1013
+msgid "Space-separated list of words used for content completion"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2560
-#, fuzzy
-msgid "New annotation at player time"
-msgstr "di un tipo di annotazione"
-
-#: ../lib/advene/gui/views/timeline.py:2564
+#: ../lib/advene/gui/edit/elements.py:1019
 #, fuzzy
-msgid "New annotation at mouse position"
-msgstr "di un tipo di annotazione"
+msgid "Advanced"
+msgstr "Advene"
 
-#: ../lib/advene/gui/views/timeline.py:2568
-msgid "Selection"
+#: ../lib/advene/gui/edit/elements.py:1069
+msgid "Any annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2694
-msgid "Cannot zoom more"
+#: ../lib/advene/gui/edit/elements.py:1095
+msgid "TALES expression specifying a color"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2915
+#: ../lib/advene/gui/edit/elements.py:1122
+msgid "MIMEType"
+msgstr "TipoMIME"
+
+#: ../lib/advene/gui/edit/elements.py:1347
 #, python-format
-msgid "From schema %s"
+msgid "Error: cannot find a content handler for %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:2977
-msgid "Restrict playing to this annotation-type"
+#: ../lib/advene/gui/edit/elements.py:1466
+#: ../lib/advene/gui/edit/elements.py:1679
+#, python-format
+msgid ""
+"Cannot read the data:\n"
+"%s"
 msgstr ""
+"Impossibile leggere il dato:\n"
+"%s"
 
-#: ../lib/advene/gui/views/timeline.py:2984
-msgid "Goto previous annotation"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:1479
+#: ../lib/advene/gui/edit/elements.py:1704
+msgid "Save content to..."
+msgstr "Salva contenuto in..."
 
-#: ../lib/advene/gui/views/timeline.py:2995
-msgid "Goto next annotation"
+#: ../lib/advene/gui/edit/elements.py:1493
+#: ../lib/advene/gui/edit/elements.py:1717
+#, python-format
+msgid ""
+"Cannot save the data:\n"
+"%s"
 msgstr ""
+"Impossibile salvare il dato:\n"
+"%s"
 
-#: ../lib/advene/gui/views/timeline.py:3006
-msgid "+"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:1508
+#: ../lib/advene/gui/edit/elements.py:1731
+msgid "Open a file (C-o)"
+msgstr "Apri un file (C-o)"
 
-#: ../lib/advene/gui/views/timeline.py:3064
-msgid "Open an annotation display view"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:1513
+#: ../lib/advene/gui/edit/elements.py:1736
+msgid "Save to a file (C-s)"
+msgstr "Salva in un file (C-s)"
 
-#: ../lib/advene/gui/views/timeline.py:3071
-msgid "Open a slave montage view (coordinated zoom level)"
+#: ../lib/advene/gui/edit/elements.py:1518
+#: ../lib/advene/gui/edit/elements.py:1741
+msgid "Reload the file (C-r)"
+msgstr "Ricarica il file (C-r)"
+
+#: ../lib/advene/gui/edit/elements.py:1524
+msgid "Insert a value from the browser (C-i)"
+msgstr "Inserisci un valore dal browser (C-i)"
+
+#: ../lib/advene/gui/edit/elements.py:1770
+msgid "Begin time is greater than end time"
+msgstr "Il tempo di inizio è più grande di quello finale"
+
+#: ../lib/advene/gui/edit/elements.py:2042
+msgid "Expecting an integer."
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3106
+#: ../lib/advene/gui/edit/elements.py:2074
+#, python-format
 msgid ""
-"<b>Statistics about current selection</b>\n"
+"The %(attribute)s attribute could not be updated:\n"
 "\n"
+"%(error)s\n"
+"\n"
+"Resetting to the original value."
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3113
-msgid "No selected annotation"
+#: ../lib/advene/gui/edit/elements.py:2100
+#, python-format
+msgid ""
+"The following attributes cannot be updated:\n"
+"\n"
+"%s"
 msgstr ""
+"I seguenti attributi non possono essere aggiornati:\n"
+"\n"
+"%s"
 
-#: ../lib/advene/gui/views/timeline.py:3117
+#: ../lib/advene/gui/edit/elements.py:2138
 #, python-format
-msgid "%d selected annotation(s)"
+msgid ""
+"The following attributes could not be updated:\n"
+"\n"
+"%s"
 msgstr ""
+"I seguenti attributi potrebbero non essere aggiornati:\n"
+"\n"
+"%s"
 
-#: ../lib/advene/gui/views/timeline.py:3124
-msgid "Unselect all annotations"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:2155
+msgid "Attribute"
+msgstr "Attributo"
 
-#: ../lib/advene/gui/views/timeline.py:3125
-#, fuzzy
-msgid "Create a static view"
-msgstr "Vista statica predefinita"
+#: ../lib/advene/gui/edit/elements.py:2254
+msgid "Insert an element"
+msgstr "Inserisci un elemento"
 
-#: ../lib/advene/gui/views/timeline.py:3126
-msgid "Highlight selection in other views"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:2255
+msgid "Choose the element to insert."
+msgstr "Scegli un elemento da inserire."
 
-#: ../lib/advene/gui/views/timeline.py:3127
-#: ../lib/advene/gui/views/timeline.py:3713
-msgid "Tag selection"
-msgstr ""
+#: ../lib/advene/gui/edit/elements.py:2325
+#: ../lib/advene/gui/edit/elements.py:2368
+#, python-format
+msgid "Some tags contain invalid characters: %s"
+msgstr "Qualche tag contiene caratteri invalidi: %s"
 
-#: ../lib/advene/gui/views/timeline.py:3128
-msgid "Delete selected annotations"
+#: ../lib/advene/gui/edit/elements.py:2348
+msgid "Tags:"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3129
-msgid "Display selection in a table"
+#: ../lib/advene/gui/edit/transcribe.py:70
+msgid "Transcription importer"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3130
-msgid "Center and zoom on selection"
+#: ../lib/advene/gui/edit/transcribe.py:81
+msgid "Note taking"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3131
-msgid "Edit selected annotations"
+#: ../lib/advene/gui/edit/transcribe.py:83
+msgid "Take notes on the fly as a timestamped transcription"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3132
-msgid "Merge annotations"
+#: ../lib/advene/gui/edit/transcribe.py:149
+msgid "Timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3133
-#, fuzzy
-msgid "Display statistics"
-msgstr "Visualizza %s"
-
-#: ../lib/advene/gui/views/timeline.py:3258
-msgid "Goto previous page"
+#: ../lib/advene/gui/edit/transcribe.py:149
+msgid "Click inserts timestamp marks"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3270
-msgid "Goto next page"
+#: ../lib/advene/gui/edit/transcribe.py:150
+msgid "Insert on single-click"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3324
-msgid "Inspector locked. Click here or in the timeline background to unlock."
+#: ../lib/advene/gui/edit/transcribe.py:150
+msgid "A single click will insert the mark (else a double click is needed)"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3352
-msgid ""
-"Delete the selected annotations or drop an annotation here to delete it."
+#: ../lib/advene/gui/edit/transcribe.py:151
+msgid "Play on scroll"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3374
-msgid ""
-"Drag an annotation type here to remove it from display.\n"
-"Click to edit all displayed types"
+#: ../lib/advene/gui/edit/transcribe.py:151
+msgid "Play the new position upon timestamp modification"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3386
-msgid "Selection actions"
+#: ../lib/advene/gui/edit/transcribe.py:152
+msgid "Generate empty annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3401
-msgid "Display relations"
+#: ../lib/advene/gui/edit/transcribe.py:152
+msgid "If checked, generate annotations for empty text"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3407
-#, fuzzy
-msgid "Display all relations"
-msgstr "Visualizza cronologia di navigazione"
+#: ../lib/advene/gui/edit/transcribe.py:153
+msgid "Reaction time"
+msgstr "Tempo di reazione"
 
-#: ../lib/advene/gui/views/timeline.py:3484
-msgid "Center on current player position."
+#: ../lib/advene/gui/edit/transcribe.py:153
+msgid ""
+"Reaction time (substracted from current player time, except when paused.)"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3500
-msgid "Automatically activate loop when clicking on an annotation"
+#: ../lib/advene/gui/edit/transcribe.py:154
+msgid "Auto-insert"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3524
-msgid "Displayed"
+#: ../lib/advene/gui/edit/transcribe.py:154
+msgid "Automatic timestamp mark insertion"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3532
-msgid "Not displayed"
+#: ../lib/advene/gui/edit/transcribe.py:155
+msgid "Automatic insertion delay"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3580
-msgid "< All <"
+#: ../lib/advene/gui/edit/transcribe.py:155
+msgid ""
+"If autoinsert is active, timestamp marks will be automatically inserted when "
+"text is entered after no interaction since this delay (in ms).\n"
+"1000 is typically a good value."
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3584
-msgid "> All >"
+#: ../lib/advene/gui/edit/transcribe.py:156
+msgid "Font size for text (0 for standard size)"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3600
-msgid "Displayed annotation types"
+#: ../lib/advene/gui/edit/transcribe.py:216
+#: ../lib/advene/gui/edit/transcribe.py:220
+#: ../lib/advene/gui/edit/transcribe.py:378
+#: ../lib/advene/gui/edit/transcribe.py:382
+msgid "Invalid timestamp mark"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3625
-msgid "Relation type"
+#: ../lib/advene/gui/edit/transcribe.py:503
+msgid "Ignore the following text (toggle)"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3625
-msgid "Display relation types"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:507
+msgid "Remove mark"
+msgstr "Rimuovi marchio"
 
-#: ../lib/advene/gui/views/timeline.py:3626
-msgid "Relation content"
+#: ../lib/advene/gui/edit/transcribe.py:511
+msgid "Reaction-time offset"
 msgstr ""
 
-#: ../lib/advene/gui/views/timeline.py:3626
-msgid "Display relation content"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:515
+msgid "-1 sec"
+msgstr "-1 sec"
 
-#: ../lib/advene/gui/views/timeline.py:3627 ../lib/advene/gui/popup.py:516
-msgid "Highlight"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:518
+msgid "-0.5 sec"
+msgstr "-0.5 sec"
 
-#: ../lib/advene/gui/views/timeline.py:3627
-msgid "Highlight active annotations"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:521
+msgid "-0.1 sec"
+msgstr "-0.1 sec"
 
-#: ../lib/advene/gui/views/timeline.py:3714
-msgid "Enter the tag for the selection"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:525
+msgid "+1 sec"
+msgstr "+1 sec"
 
-#: ../lib/advene/gui/views/tree.py:248
-msgid "No children in on_iter_children()!"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:528
+msgid "+0.5 sec"
+msgstr "+0.5 sec"
 
-#: ../lib/advene/gui/views/tree.py:263
-msgid "No children in on_iter_nth_child()"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:531
+msgid "+0.1 sec"
+msgstr "+0.1 sec"
 
-#: ../lib/advene/gui/views/tree.py:317
-msgid "List of views"
+#: ../lib/advene/gui/edit/transcribe.py:618
+msgid "Invalid timestamp"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:318
-msgid "Static views"
+#: ../lib/advene/gui/edit/transcribe.py:738
+#, python-format
+msgid "Invalid timestamp mark in conversion: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:319
-msgid "Dynamic views"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:856
+#, python-format
+msgid "Cannot save the file: %s"
+msgstr "Impossibile salvare il file: %s"
 
-#: ../lib/advene/gui/views/tree.py:320
-msgid "Admin views"
+#: ../lib/advene/gui/edit/transcribe.py:865
+#: ../lib/advene/gui/edit/transcribe.py:947
+msgid "This will overwrite the current textual content. Are you sure?"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:321
-msgid "Adhoc views"
+#: ../lib/advene/gui/edit/transcribe.py:868
+msgid "Select transcription file to load"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:421 ../lib/advene/gui/main.py:1222
-msgid "Tree view"
+#: ../lib/advene/gui/edit/transcribe.py:885
+#, python-format
+msgid "Cannot open %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/tree.py:453
-msgid "Package View"
+#: ../lib/advene/gui/edit/transcribe.py:932
+msgid "Cannot import annotations: no existing interface"
 msgstr ""
 
-#: ../lib/advene/gui/views/editaccumulator.py:42
-msgid "EditAccumulator"
+#: ../lib/advene/gui/edit/transcribe.py:934
+msgid "Select the annotation type to import"
 msgstr ""
 
-#: ../lib/advene/gui/views/editaccumulator.py:70
-#: ../lib/advene/gui/views/annotationdisplay.py:256
-msgid "Validate"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:943
+#, fuzzy, python-format
+msgid "There are no annotations of type %s"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/views/relation.py:68
-msgid "Relations view"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:972
+msgid "Cannot convert the data: no associated package"
+msgstr "Impossibile convertire il dato: nessun pacchetto associato"
 
-#: ../lib/advene/gui/views/caption.py:30 ../lib/advene/gui/main.py:4339
-msgid "Caption"
+#: ../lib/advene/gui/edit/transcribe.py:975
+msgid "Converting transcription"
 msgstr ""
 
-#: ../lib/advene/gui/views/caption.py:32
-msgid "Display a text caption below the video output"
+#: ../lib/advene/gui/edit/transcribe.py:981
+msgid "Choose the annotation-type where to create annotations.\n"
 msgstr ""
 
-#: ../lib/advene/gui/views/scroller.py:29 ../lib/advene/gui/main.py:4338
-msgid "Scroller"
+#: ../lib/advene/gui/edit/transcribe.py:989
+msgid "Delete existing annotations in this type"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:329
-#, python-format
-msgid ""
-"View <b>%(title)s</b>\n"
-"Id: %(id)s"
+#: ../lib/advene/gui/edit/transcribe.py:1012
+msgid "Select type"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:336
-msgid "Open in webbrowser"
+#: ../lib/advene/gui/edit/transcribe.py:1016
+msgid "You want to create a new type. Please specify its schema and title."
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:337
-#, python-format
-msgid "View applied to %s\n"
+#: ../lib/advene/gui/edit/transcribe.py:1028
+msgid "Containing schema"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:342 ../lib/advene/gui/popup.py:496
-msgid "Activate"
+#: ../lib/advene/gui/edit/transcribe.py:1041
+msgid "Export options"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:345
-msgid "Open in GUI"
+#: ../lib/advene/gui/edit/transcribe.py:1046
+msgid "Generate annotations for empty contents"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:347
-msgid "Unknown type of view??"
+#: ../lib/advene/gui/edit/transcribe.py:1071
+#, python-format
+msgid "The %s identifier already exists. Choose another one."
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:372
-msgid "Edit view"
+#: ../lib/advene/gui/edit/transcribe.py:1110
+msgid "Notes converted"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:381
-msgid "Open view"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:1157
+msgid "Open"
+msgstr "Apri"
 
-#: ../lib/advene/gui/views/finder.py:421 ../lib/advene/gui/views/finder.py:487
-#, python-format
-msgid ""
-"%(type)s <b>%(title)s</b>\n"
-"Id: %(id)s"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:1158
+msgid "Save"
+msgstr "Salva"
 
-#: ../lib/advene/gui/views/finder.py:444
-msgid "Try to apply the query on..."
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:1159
+msgid "Save As"
+msgstr "Salva con Nome"
 
-#: ../lib/advene/gui/views/finder.py:464 ../lib/advene/gui/popup.py:829
-msgid "the package"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:1160
+msgid "Import"
+msgstr "Importa"
 
-#: ../lib/advene/gui/views/finder.py:465 ../lib/advene/gui/popup.py:830
-msgid "all annotations of the package"
+#: ../lib/advene/gui/edit/transcribe.py:1160
+msgid "Import from annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:466 ../lib/advene/gui/popup.py:831
-msgid "the first annotation of the package"
-msgstr ""
+#: ../lib/advene/gui/edit/transcribe.py:1161
+msgid "Convert"
+msgstr "Converti"
 
-#: ../lib/advene/gui/views/finder.py:509
-msgid "Edit resource"
+#: ../lib/advene/gui/edit/transcribe.py:1161
+msgid "Convert to annotations"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:523 ../lib/advene/gui/main.py:1223
-msgid "Package finder"
+#: ../lib/advene/gui/edit/transcribe.py:1163 ../lib/advene/rules/actions.py:670
+msgid "Center"
 msgstr ""
 
-#: ../lib/advene/gui/views/finder.py:525
-msgid "Column-based package finder"
+#: ../lib/advene/gui/edit/transcribe.py:1163
+msgid "Center on the current mark"
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:41
-msgid "AnnotationDisplay"
+#: ../lib/advene/gui/edit/transcribe.py:1164
+msgid "Find"
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:43
-msgid "Display the contents of an annotation"
+#: ../lib/advene/gui/edit/transcribe.py:1164
+msgid "Search a string"
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:84
-msgid "No annotation"
+#: ../lib/advene/gui/edit/transcribe.py:1165
+msgid "Scale"
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:110
-#, python-format
-msgid ""
-"Schema %(schema)s (id %(id)s)\n"
-"%(description)s\n"
-"%(stats)s"
+#: ../lib/advene/gui/edit/transcribe.py:1188
+msgid "Automatically scroll to the mark position when playing"
 msgstr ""
 
-#: ../lib/advene/gui/views/annotationdisplay.py:231
-msgid "Screenshot"
+#: ../lib/advene/gui/edit/transcribe.py:1190
+msgid "Autoscroll"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:193
-msgid "Invalid view id"
+#: ../lib/advene/gui/edit/transcribe.py:1197
+msgid "Autoinsert"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:239
-#, python-format
-msgid "Cannot save default options: %s"
+#: ../lib/advene/gui/edit/transcribe.py:1199
+msgid "Automatically insert marks"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:250
-#, python-format
-msgid "Default options saved for view %s"
+#: ../lib/advene/core/webcherry.py:53
+msgid "The webserver requires version 3.0 of CherryPy at least."
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:282
+#: ../lib/advene/core/webcherry.py:169
 #, python-format
-msgid "Saving %s"
-msgstr ""
-
-#: ../lib/advene/gui/views/__init__.py:285
-msgid "Enter a view name to save this parametered view"
+msgid ""
+"\n"
+"            <p>\n"
+"            <a href=\"/admin\">Server administration</a> |\n"
+"            <a href=\"/media\">Media control</a> |\n"
+"            <a href=\"%(path)s?mode=raw\">Raw view</a>\n"
+"            </p>\n"
+"            Location: %(locationbar)s\n"
+"            <hr>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:288 ../lib/advene/gui/main.py:4630
-#, python-format
-msgid "Error: the identifier %s contains invalid characters."
-msgstr ""
+#: ../lib/advene/core/webcherry.py:229
+msgid "Unspecified Error"
+msgstr "Errore non Specificato"
 
-#: ../lib/advene/gui/views/__init__.py:303
+#: ../lib/advene/core/webcherry.py:230
 #, python-format
-msgid "Error: the view %s is not an adhoc view."
-msgstr ""
-
-#: ../lib/advene/gui/views/__init__.py:328
-msgid "HTML export"
+msgid ""
+"\n"
+"        <h1>Error</h1>\n"
+"        <p>An error occurred:</p>\n"
+"        %s\n"
+"        "
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:329
-msgid "Specify a name for the export view"
+#: ../lib/advene/core/webcherry.py:263
+msgid "<h1>No available mediaplayer</h1>"
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:348
+#: ../lib/advene/core/webcherry.py:266
 #, python-format
 msgid ""
-"View successfully exported as %s.\n"
-"Open it in the web browser ?"
+"\n"
+"            <h1>Current STBV: %(currentstbv)s</h1>\n"
+"\n"
+"            <h1>Player status</h1>\n"
+"            <table border=\"1\">\n"
+"            <tr>\n"
+"            <td>Current media</td><td>%(uri)s</td>\n"
+"            <td>Current position</td><td>%(position)s</td>\n"
+"            <td>Duration</td><td>%(duration)s</td>\n"
+"            <td>Player status</td><td>%(status)s</td>\n"
+"            </tr>\n"
+"            </table>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/views/__init__.py:427
-msgid "Actions"
-msgstr ""
+#: ../lib/advene/core/webcherry.py:279
+#, fuzzy
+msgid "No media file"
+msgstr "Scegliere un file"
 
-#: ../lib/advene/gui/views/__init__.py:452
-msgid "Click or drag-and-drop to reattach view"
+#: ../lib/advene/core/webcherry.py:286
+msgid ""
+"\n"
+"            <form action=\"/media/play\" method=\"GET\">\n"
+"            Starting pos: <input type=\"text\" name=\"position\" value="
+"\"0\">\n"
+"            <input type=\"submit\" value=\"Play\">\n"
+"            </form>\n"
+"            <a href=\"/media/stop\">Stop</a> | <a href=\"/media/pause"
+"\">Pause</a><br>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:55
-msgid "Annotation table view"
+#: ../lib/advene/core/webcherry.py:293
+msgid ""
+"<hr />\n"
+"            <form action=\"/media/load\" method=\"GET\">\n"
+"            Add a new file (<em>dvd</em> to play a DVD):\n"
+"            <input type=\"text\" name=\"filename\">\n"
+"            <input type=\"submit\" value=\"Add\">\n"
+"            </form>"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:57
-msgid "Display annotations in a table"
+#: ../lib/advene/core/webcherry.py:299
+msgid ""
+"<h3><a href=\"/media/snapshot\">Access to current packages snapshots</h3>"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:227 ../lib/advene/gui/views/table.py:452
-msgid "Snapshot"
+#: ../lib/advene/core/webcherry.py:308
+#, python-format
+msgid "Unknown STBV identifier: %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:254 ../lib/advene/gui/main.py:4178
-msgid "Duration"
+#: ../lib/advene/core/webcherry.py:383
+msgid "Media information"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:382 ../lib/advene/gui/views/table.py:511
-msgid "Export data to file..."
+#: ../lib/advene/core/webcherry.py:396
+msgid "File added"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:391 ../lib/advene/gui/views/table.py:520
+#: ../lib/advene/core/webcherry.py:397
 #, python-format
-msgid "Error while exporting data to %(filename)s: %(error)s"
+msgid "<p><strong>%s has been loaded.</strong></p>"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "id"
+#: ../lib/advene/core/webcherry.py:408 ../lib/advene/core/webcherry.py:466
+msgid "Access to packages snapshots"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "type"
+#: ../lib/advene/core/webcherry.py:418 ../lib/advene/core/webcherry.py:476
+msgid "Unknown package alias"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "begin"
+#: ../lib/advene/core/webcherry.py:424
+#, python-format
+msgid "Available snapshots for %s"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "end"
+#: ../lib/advene/core/webcherry.py:430
+#, python-format
+msgid ""
+"<p><a href=\"/media/snapshot/%s?mode=inline\">Display with inline images</"
+"a></p>"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:402
-msgid "content"
+#: ../lib/advene/core/webcherry.py:437
+msgid "Done"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:460
-msgid "Generic table view"
+#: ../lib/advene/core/webcherry.py:439
+msgid "Pending"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:462
-msgid "Display Advene elements in a table."
-msgstr ""
+#: ../lib/advene/core/webcherry.py:481
+#, fuzzy, python-format
+msgid "Unknown annotation id: %s"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element title"
+#: ../lib/advene/core/webcherry.py:597 ../lib/advene/core/webcherry.py:715
+#, python-format
+msgid "Cannot activate stbvid %(stbvid)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element type"
+#: ../lib/advene/core/webcherry.py:662
+msgid "<p>No GUI is available."
 msgstr ""
 
-#: ../lib/advene/gui/views/table.py:532
-msgid "Element id"
+#: ../lib/advene/core/webcherry.py:664
+#, python-format
+msgid "<p>Opened adhoc views: %s</p>"
 msgstr ""
 
-#: ../lib/advene/gui/widget.py:327
-#, fuzzy, python-format
-msgid "Set of %s annotations"
-msgstr "Tutte le annotazioni"
-
-#: ../lib/advene/gui/widget.py:1067
-#, fuzzy
-msgid "Save as..."
-msgstr "Pacchetto %s"
-
-#: ../lib/advene/gui/widget.py:1072
-msgid "Use current player position"
+#: ../lib/advene/core/webcherry.py:665
+msgid "<p>Available adhoc views:</p><ul>"
 msgstr ""
 
-#: ../lib/advene/gui/widget.py:1078
-msgid "Adjust timestamp"
+#: ../lib/advene/core/webcherry.py:686
+#, python-format
+msgid "<p>Current stbv: %s</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:193 ../lib/advene/gui/main.py:304
-#, fuzzy
-msgid "_Select player"
-msgstr "Seleziona un DVD"
-
-#: ../lib/advene/gui/main.py:195 ../lib/advene/gui/main.py:287
-msgid "_View"
-msgstr "_Visualizza"
-
-#: ../lib/advene/gui/main.py:197 ../lib/advene/gui/main.py:306
-msgid "Packages"
-msgstr "Pacchetti"
-
-#: ../lib/advene/gui/main.py:200 ../lib/advene/gui/main.py:246
-#, fuzzy
-msgid "Open recent"
-msgstr "Apri"
-
-#: ../lib/advene/gui/main.py:239
-msgid "Input from the keyboard (function keys)"
+#: ../lib/advene/core/webcherry.py:687
+#, python-format
+msgid "<p>You can activate the following STBV:</p><ul>%s</ul>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:243
-msgid "_File"
-msgstr "_File"
-
-#: ../lib/advene/gui/main.py:244
-#, fuzzy
-msgid "_New package"
-msgstr "Nessun pacchetto"
-
-#: ../lib/advene/gui/main.py:244
-msgid "Create a new package"
-msgstr "Crea un nuovo pacchetto"
-
-#: ../lib/advene/gui/main.py:245
-#, fuzzy
-msgid "_Open package"
-msgstr "Apri un file pacchetto"
-
-#: ../lib/advene/gui/main.py:245
-#, fuzzy
-msgid "Open a package"
-msgstr "Apri un file pacchetto"
-
-#: ../lib/advene/gui/main.py:246
-msgid "Show recently opened packages"
+#: ../lib/advene/core/webcherry.py:689
+msgid "Activate and play"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:247
-#, fuzzy
-msgid "_Save package"
-msgstr "Nessun pacchetto"
-
-#: ../lib/advene/gui/main.py:247
-#, fuzzy
-msgid "Save the package"
-msgstr "Tutte le visualizzazioni del pacchetto"
-
-#: ../lib/advene/gui/main.py:248
-#, fuzzy
-msgid "Save package as..."
-msgstr "Pacchetto %s"
-
-#: ../lib/advene/gui/main.py:248
-#, fuzzy
-msgid "Save the package as..."
-msgstr "Salva il pacchetto attuale"
-
-#: ../lib/advene/gui/main.py:249
-#, fuzzy
-msgid "Close package"
-msgstr "Nessun pacchetto"
-
-#: ../lib/advene/gui/main.py:249
-#, fuzzy
-msgid "Close the package"
-msgstr "Tutte le visualizzazioni del pacchetto"
-
-#: ../lib/advene/gui/main.py:251
-msgid "Save session"
-msgstr "Salva sessione"
-
-#: ../lib/advene/gui/main.py:251
-msgid "Save the current session (list of opened packages)"
+#: ../lib/advene/core/webcherry.py:695
+msgid "Application information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:252
-msgid "Save workspace"
+#: ../lib/advene/core/webcherry.py:765
+msgid "Missing element id parameter"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:253
-msgid "...as package view"
+#: ../lib/advene/core/webcherry.py:769
+#, python-format
+msgid "No existing element with id %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:254
-msgid "...as standard workspace"
+#: ../lib/advene/core/webcherry.py:778
+#, python-format
+msgid "<p>The GUI view %s does not exist.</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:254
-msgid "Use the current layout as standard workspace in the future"
+#: ../lib/advene/core/webcherry.py:785
+msgid "Invalid request"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:256
-#, fuzzy
-msgid "Associate a video _File"
-msgstr "Seleziona un file video"
-
-#: ../lib/advene/gui/main.py:256
-#, fuzzy
-msgid "Associate a video file"
-msgstr "Seleziona un file video"
-
-#: ../lib/advene/gui/main.py:257
-#, fuzzy
-msgid "Associate a _DVD"
-msgstr "Seleziona un capitolo da un DVD"
-
-#: ../lib/advene/gui/main.py:257
-#, fuzzy
-msgid "Associate a chapter from a DVD"
-msgstr "Seleziona un capitolo da un DVD"
-
-#: ../lib/advene/gui/main.py:258
-#, fuzzy
-msgid "Associate a _Video stream"
-msgstr "Seleziona un video stream"
-
-#: ../lib/advene/gui/main.py:258
-msgid "Enter a video stream address"
-msgstr "Inserisci un indirizzo di un video stream"
-
-#: ../lib/advene/gui/main.py:260
-msgid "_Import File"
-msgstr "_Importa file"
-
-#: ../lib/advene/gui/main.py:260
-msgid "Import data from an external source"
-msgstr "Importa dati da una sorgente esterna"
-
-#: ../lib/advene/gui/main.py:261
-#, fuzzy
-msgid "_Process video"
-msgstr "Modifica %s"
-
-#: ../lib/advene/gui/main.py:261
-#, fuzzy
-msgid "Import data from video processing algorithms"
-msgstr "Importa dati da una sorgente esterna"
-
-#: ../lib/advene/gui/main.py:263
-msgid "Merge package"
-msgstr "Unisci pacchetto"
-
-#: ../lib/advene/gui/main.py:263
-msgid "Merge elements from another package"
-msgstr "Unisci elementi da un altro pacchetto"
-
-#: ../lib/advene/gui/main.py:264
-msgid "Import _DVD chapters"
-msgstr "Importa capitoli _DVD"
-
-#: ../lib/advene/gui/main.py:264
-msgid "Create annotations based on DVD chapters"
-msgstr "Crea annotazioni basate sui capitoli DVD"
+#: ../lib/advene/core/webcherry.py:790
+msgid "Invalid configuration variable name"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:266
-#, fuzzy
-msgid "_Export..."
-msgstr "Importatore"
+#: ../lib/advene/core/webcherry.py:802
+msgid "Invalid value"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:266
-msgid "Export data to another format"
+#: ../lib/advene/core/webcherry.py:806
+#, python-format
+msgid "Unsupported method %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:267
-msgid "_Website export..."
+#: ../lib/advene/core/webcherry.py:832
+#, python-format
+msgid ""
+"\n"
+"        <h1>Authorized hosts</h1>\n"
+"        <table border=\"1\">\n"
+"        <tr><th>Host</th><th>IP Addr</th><th>Action</th></tr>\n"
+"        %s\n"
+"        </table>\n"
+"        <form method=\"GET\">\n"
+"        Add a new hostname to the list :<br>\n"
+"        <input type=\"text\" name=\"hostname\"><input type=\"submit\" value="
+"\"Add\">\n"
+"        </form>\n"
+"        "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:267
-msgid "Export views to a website"
+#: ../lib/advene/core/webcherry.py:846
+msgid "Access control"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:269
-#, fuzzy
-msgid "_Quit"
-msgstr "_Modifica"
-
-#: ../lib/advene/gui/main.py:271
-msgid "_Edit"
-msgstr "_Modifica"
+#: ../lib/advene/core/webcherry.py:851
+msgid "Access control - add a hostname"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:272
-msgid "_Undo"
+#: ../lib/advene/core/webcherry.py:859 ../lib/advene/core/webcherry.py:873
+#, python-format
+msgid "<strong>Error: %s is an invalid hostname.</strong>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:273
-#, fuzzy
-msgid "_Find"
-msgstr "_File"
+#: ../lib/advene/core/webcherry.py:862
+#, python-format
+msgid "<p>Added %s to authorized hosts list.</p>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:274
-#, fuzzy
-msgid "_Delete"
-msgstr "Elimina"
+#: ../lib/advene/core/webcherry.py:868
+msgid "Access control - delete a hostname"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:275
-msgid "Create"
-msgstr "Crea"
+#: ../lib/advene/core/webcherry.py:876
+msgid "<strong>Cannot remove the localhost access.</strong>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:284
-msgid "P_ackage properties"
-msgstr "Proprietà P_acchetto"
+#: ../lib/advene/core/webcherry.py:881
+#, python-format
+msgid "<p>Removed %s from authorized hosts list.</p>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:284
-msgid "Edit package properties"
-msgstr "Modifica proprietà pacchetto"
+#: ../lib/advene/core/webcherry.py:883
+#, python-format
+msgid "<p>%s is not in authorized hosts list.</p>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:285
-msgid "P_references"
-msgstr "P_referenze"
+#: ../lib/advene/core/webcherry.py:932
+msgid "Server Administration"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:285
-msgid "Interface preferences"
-msgstr "Preference interfaccia"
+#: ../lib/advene/core/webcherry.py:940
+#, python-format
+msgid ""
+"\n"
+"        <p><a href=\"/admin/access\">Update the access list</a></p>\n"
+"        <p><a href=\"/admin/methods\">List available TALES methods</a></p>\n"
+"        <p><a href=\"/action\">List available actions</a></p>\n"
+"        <p><a href=\"/admin/reset\">Reset the server</a></p>\n"
+"        <p><a href=\"/media\">Media control</a></p>\n"
+"        <p><a href=\"/application\">Display GUI status</a></p>\n"
+"        <p><a href=\"/admin/list\">List available files</a></p>\n"
+"        <p><a href=\"/packages\">List loaded packages</a> (%(packagelist)s)</"
+"p>\n"
+"        <p>Display mode : %(displaymode)s</p>\n"
+"        <hr>\n"
+"        <p>Load a package :\n"
+"        <form action=\"/admin/load\" method=\"GET\">\n"
+"        Alias: <input type=\"text\" name=\"alias\" /><br>\n"
+"        URI:   <input type=\"text\" name=\"uri\" /><br>\n"
+"        <input type=\"submit\" value=\"Load\" />\n"
+"        </form>\n"
+"        </body></html>\n"
+"        "
+msgstr ""
 
-#: ../lib/advene/gui/main.py:289
-msgid "_Start Web Browser"
+#: ../lib/advene/core/webcherry.py:970
+msgid "Available files"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:289
-msgid "Start the web browser"
+#: ../lib/advene/core/webcherry.py:996
+msgid "You should specify an alias"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:291
-msgid "Simplify interface"
+#: ../lib/advene/core/webcherry.py:1001
+msgid "You should specify an uri"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:291
-#, fuzzy
-msgid "Simplify the application interface (toggle)"
-msgstr "Visualizza cronologia di navigazione"
+#: ../lib/advene/core/webcherry.py:1007
+#, python-format
+msgid "Package %s loaded"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:292
-msgid "Evaluator"
+#: ../lib/advene/core/webcherry.py:1008 ../lib/advene/core/webcherry.py:1044
+#, python-format
+msgid ""
+"<p>Go to the <a href=\"/packages/%(alias)s\">%(alias)s</a> package, or to "
+"the <a href=\"/packages\">package list</a>."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:292
-msgid "Open python evaluator window"
+#: ../lib/advene/core/webcherry.py:1011
+#, python-format
+msgid "<p>Cannot load package %(alias)s : %(error)s</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:293 ../lib/advene/gui/main.py:4022
-msgid "Webserver log"
+#: ../lib/advene/core/webcherry.py:1022
+#, python-format
+msgid "Package %s deleted"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:296
-msgid "_Player"
+#: ../lib/advene/core/webcherry.py:1023
+msgid "<p>Go to the <a href=\"/packages\">package list</a>."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:297
-msgid "Go to _Time"
+#: ../lib/advene/core/webcherry.py:1026
+#, python-format
+msgid "<p>Cannot delete package %(alias)s : %(error)s</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:297
-msgid "Goto a specified time code"
+#: ../lib/advene/core/webcherry.py:1043
+#, python-format
+msgid "Package %s saved"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:298
-msgid "Save _ImageCache"
+#: ../lib/advene/core/webcherry.py:1047
+#, python-format
+msgid "<p>Cannot save package %(alias)s : %(error)s</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:298
-msgid "Save the contents of the ImageCache to disk"
+#: ../lib/advene/core/webcherry.py:1057
+msgid "Server reset"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:299
-msgid "Reset ImageCache"
+#: ../lib/advene/core/webcherry.py:1063
+msgid "Available TALES methods"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:299
-msgid "Reset the ImageCache"
+#: ../lib/advene/core/webcherry.py:1104
+msgid "Loaded package(s)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:300
-msgid "_Restart player"
+#: ../lib/advene/core/webcherry.py:1106
+msgid ""
+"\n"
+"        <h1>Loaded package(s)</h1>\n"
+"        <table border=\"1\" width=\"50%\">\n"
+"        <tr>\n"
+"        <th>Alias</th>\n"
+"        <th>Action</th>\n"
+"        <th>URI</th>\n"
+"        <th>Annotations</th>\n"
+"        </tr>\n"
+"        "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:300
-msgid "Restart the player"
+#: ../lib/advene/core/webcherry.py:1118
+#, python-format
+msgid ""
+"<tr>\n"
+"            <td><a href=\"/packages/%(alias)s\">%(alias)s</a></td>\n"
+"            <td align=\"center\"><a href=\"/admin/load?alias=%(alias)s&uri="
+"%(uri)s\">Reload</a>|<a href=\"/admin/delete?alias=%(alias)s\">Drop</a>|<a "
+"href=\"/admin/save?alias=%(alias)s\">Save</a></td>\n"
+"            <td>%(uri)s</td>\n"
+"            <td>%(size)d</td>\n"
+"            </tr>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:302
-#, fuzzy
-msgid "Update annotation screenshots"
-msgstr "Tutte le annotazioni"
+#: ../lib/advene/core/webcherry.py:1191 ../lib/advene/core/webcherry.py:1267
+#: ../lib/advene/core/webcherry.py:1276 ../lib/advene/core/webcherry.py:1284
+#: ../lib/advene/core/webcherry.py:1444 ../lib/advene/core/webcherry.py:1452
+#: ../lib/advene/core/webcherry.py:1460 ../lib/advene/core/webcherry.py:2022
+#: ../lib/advene/core/webcherry.py:2029
+msgid "Error"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:302
-msgid "Update screenshots for annotation bounds"
+#: ../lib/advene/core/webcherry.py:1192
+#, python-format
+msgid "The TALES expression %s is not valid."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:303
-msgid "Detect shots"
+#: ../lib/advene/core/webcherry.py:1244
+msgid "Content mode not available on non-content data"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:303
-msgid "Automatically detect shots"
+#: ../lib/advene/core/webcherry.py:1268 ../lib/advene/core/webcherry.py:1277
+#: ../lib/advene/core/webcherry.py:1285 ../lib/advene/core/webcherry.py:1306
+#: ../lib/advene/core/webcherry.py:1310 ../lib/advene/core/webcherry.py:1445
+#: ../lib/advene/core/webcherry.py:1453 ../lib/advene/core/webcherry.py:1461
+#: ../lib/advene/core/webcherry.py:1520 ../lib/advene/core/webcherry.py:1597
+#: ../lib/advene/core/webcherry.py:1717 ../lib/advene/core/webcherry.py:1767
+msgid "<h1>Error</h1>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:304
-msgid "Select the player plugin"
+#: ../lib/advene/core/webcherry.py:1269 ../lib/advene/core/webcherry.py:1311
+#, python-format
+msgid ""
+"<p>There was an error in the template code.</p>\n"
+"                <p>Tag name: <strong>%(tagname)s</strong></p>\n"
+"                <p>Error message: <em>%(message)s</em></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:307
-msgid "No package"
-msgstr "Nessun pacchetto"
+#: ../lib/advene/core/webcherry.py:1278
+#, python-format
+msgid ""
+"<p>An invalid character is in the Context:</p>\n"
+"                <p>Error message: <em>%(error)s</em></p><pre>%(message)s</"
+"pre>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:309
-msgid "_Help"
-msgstr "_Aiuto"
+#: ../lib/advene/core/webcherry.py:1286
+#, python-format
+msgid ""
+"<p>There was an error in the TALES expression.</p>\n"
+"                <pre>%s</pre>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:310
-#, fuzzy
-msgid "Help"
-msgstr "_Aiuto"
+#: ../lib/advene/core/webcherry.py:1307
+#, python-format
+msgid ""
+"<p>There was an error.</p>\n"
+"                <pre>%s</pre>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:311
-msgid "Get support"
+#: ../lib/advene/core/webcherry.py:1331
+#, python-format
+msgid ""
+"\n"
+"            <hr>\n"
+"            <p>\n"
+"            Location: %(location)s<br>\n"
+"            <form name=\"navigation\" method=\"GET\">\n"
+"            <a href=\"%(levelup)s\">Up one level</a> |\n"
+"            Next level :\n"
+"            <select name=\"path\" onchange=\"submit()\">\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:312
-msgid "Check for updates"
+#: ../lib/advene/core/webcherry.py:1349
+msgid ""
+"\n"
+"            </select> View: <select name=\"view\" onchange=\"submit()\">\n"
+"            <option selected></option>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:313
-msgid "Display shortcuts"
+#: ../lib/advene/core/webcherry.py:1367
+#, python-format
+msgid ""
+"<hr>\n"
+"            <p>Evaluating expression \"<strong>%(expression)s</strong>\" on "
+"package %(uri)s returns %(value)s</p>\n"
+"            "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:314
-#, fuzzy
-msgid "Display logfile"
-msgstr "Visualizza %s"
+#: ../lib/advene/core/webcherry.py:1403
+#, python-format
+msgid "<p>Package <strong>%s</strong> not loaded</p>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:314
-#, fuzzy
-msgid "Display log file"
-msgstr "Visualizza %s"
+#: ../lib/advene/core/webcherry.py:1446
+#, python-format
+msgid ""
+"<p>There was an error in the template code.</p>\n"
+"            <p>Tag name: <strong>%(tagname)s</strong></p>\n"
+"            <p>Error message: <em>%(message)s</em></p>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:315
-#, fuzzy
-msgid "Open logfile folder"
-msgstr "Apri un file (C-o)"
+#: ../lib/advene/core/webcherry.py:1454
+#, python-format
+msgid ""
+"<p>There was an error in the expression.</p>\n"
+"            <pre>%s</pre>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:315
+#: ../lib/advene/core/webcherry.py:1462
+#, python-format
 msgid ""
-"Display logfile folder. It can help when sending the advene.log file by e-"
-"mail."
+"<p>Cannot resolve TALES expression %(expr)s on package %(package)s<p><pre>\n"
+"            %(type)s\n"
+"            %(value)s\n"
+"            %(traceback)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:316
-msgid "_About"
-msgstr "_Informazioni"
+#: ../lib/advene/core/webcherry.py:1521 ../lib/advene/core/webcherry.py:1718
+msgid "<p>Cannot set the value : invalid path</p>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:336 ../lib/advene/gui/main.py:3750
+#: ../lib/advene/core/webcherry.py:1583 ../lib/advene/core/webcherry.py:1836
 #, python-format
 msgid ""
-"Cannot load package %(filename)s:\n"
-"%(error)s"
+"<h1>Error</h1><p>When creating resource %(path)s, the resource folder "
+"%(folder)s could not be created.</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:344
-msgid "Open a package file"
-msgstr "Apri un file pacchetto"
+#: ../lib/advene/core/webcherry.py:1592 ../lib/advene/core/webcherry.py:1846
+msgid "Resource successfuly created/updated"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:345
-msgid "Save the current package"
-msgstr "Salva il pacchetto attuale"
+#: ../lib/advene/core/webcherry.py:1601
+msgid "Value successfuly updated"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:346
-msgid "Save the package with a new name"
-msgstr "Salva il pacchetto con un nuovo nome"
+#: ../lib/advene/core/webcherry.py:1603
+#, python-format
+msgid ""
+"Unable to update the attribute %(attribute)s for element %(element)s: "
+"%(error)s."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:347
-msgid "Select movie file..."
+#: ../lib/advene/core/webcherry.py:1714
+msgid "<p>Invalid request</p>."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:348
-msgid "Select DVD"
-msgstr "Seleziona DVD"
+#: ../lib/advene/core/webcherry.py:1778 ../lib/advene/core/webcherry.py:1795
+msgid "Value updated"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:352
-#, fuzzy
-msgid "Create a text annotation"
-msgstr "Trascrizione delle annotazioni"
+#: ../lib/advene/core/webcherry.py:1779
+#, python-format
+msgid ""
+"\n"
+"                <h1>Value updated</h1>\n"
+"                The value of %(path)s has been updated to\n"
+"                <pre>\n"
+"                %(value)s\n"
+"                </pre>\n"
+"                "
+msgstr ""
 
-#: ../lib/advene/gui/main.py:353
-#, fuzzy
-msgid "Create a graphical annotation"
-msgstr "Trascrizione delle annotazioni"
+#: ../lib/advene/core/webcherry.py:1796
+#, python-format
+msgid ""
+"\n"
+"                    <h1>Value updated</h1>\n"
+"                    The value of %(path)s has been updated to\n"
+"                    <pre>\n"
+"                    %(value)s\n"
+"                    </pre>\n"
+"                    "
+msgstr ""
 
-#: ../lib/advene/gui/main.py:359
-msgid "List recently opened packages"
+#: ../lib/advene/core/webcherry.py:1807
+#, python-format
+msgid ""
+"Malformed request: cannot update the value of %(attribute)s in %(tales)s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:389
-msgid "Snapshotter activity"
+#: ../lib/advene/core/webcherry.py:1850
+msgid "Cannot create an element in something else than a package."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:391
+#: ../lib/advene/core/webcherry.py:1867
 #, python-format
-msgid "%d queued requests"
+msgid "The identifier %s already exists."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:392
-msgid "Cancel all requests"
+#: ../lib/advene/core/webcherry.py:1879
+#, python-format
+msgid "<p>Error while creating view %(id)s</p><pre>%(error)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:397
-#, fuzzy
-msgid "No snapshotter"
-msgstr "Visualizza %s"
-
-#: ../lib/advene/gui/main.py:419
-msgid "No snapshotting activity"
+#: ../lib/advene/core/webcherry.py:1885
+msgid "View created"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:423
-msgid "Snapshotting"
+#: ../lib/advene/core/webcherry.py:1886
+#, python-format
+msgid ""
+"\n"
+"                 <h1>View <em>%(id)s</em> created</h1>\n"
+"                 <p>The view <a href=\"%(url)s\">%(id)s</a> was successfully "
+"created.</p>\n"
+"                 "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:440
-#, fuzzy
-msgid "Display application log messages"
-msgstr "Visualizza %s"
+#: ../lib/advene/core/webcherry.py:1902
+#, python-format
+msgid "Missing %s parameter"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:482
-msgid "Quicksearch lists"
+#: ../lib/advene/core/webcherry.py:1905
+#, python-format
+msgid "Relation type %s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:488
-msgid "Please specify the lists of elements to be searched."
+#: ../lib/advene/core/webcherry.py:1912 ../lib/advene/core/webcherry.py:1915
+#, python-format
+msgid "Annotation %s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:507
+#: ../lib/advene/core/webcherry.py:1918
 #, python-format
 msgid ""
-"Searching on %s.\n"
-"Left click to launch the search, right-click to set the quicksearch options"
+"<p>Cannot create relation between %(member1)s and %(member2)s: invalid type</"
+"p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:508
+#: ../lib/advene/core/webcherry.py:1930
 #, python-format
-msgid "String to search in %s"
+msgid ""
+"<p>Error while creating relation between %(member1)s and %(member2)s :</"
+"p><pre>%(error)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:521 ../lib/advene/gui/main.py:525
-msgid "Tracing : "
+#: ../lib/advene/core/webcherry.py:1933
+msgid "Relation created"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:521
-msgid "off"
+#: ../lib/advene/core/webcherry.py:1934
+#, python-format
+msgid "<h1>Relation <em>%s</em> created</h1>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:525
-#, fuzzy
-msgid "on"
-msgstr "Nessuno"
-
-#: ../lib/advene/gui/main.py:545
-msgid "Launch search"
+#: ../lib/advene/core/webcherry.py:1944
+#, python-format
+msgid "Annotation type %s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:550
-msgid "Ignore case"
+#: ../lib/advene/core/webcherry.py:1961
+#, python-format
+msgid ""
+"<p>Error while creating annotation of type %(type)s :<pre>\n"
+"                    %(errortype)s\n"
+"                    %(value)s\n"
+"                    %(traceback)s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:555
-msgid "Searched elements"
-msgstr "Elementi cercati"
-
-#: ../lib/advene/gui/main.py:625
-msgid "Playing"
+#: ../lib/advene/core/webcherry.py:1973
+#, python-format
+msgid "Annotation %s created"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:626
-msgid "Pause"
+#: ../lib/advene/core/webcherry.py:1975
+#, python-format
+msgid "Error: Cannot create an object of type %s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:627
-msgid "Init"
+#: ../lib/advene/core/webcherry.py:1978
+#, python-format
+msgid ""
+"Error: Cannot perform the action <em>%(action)s</em> on <code>%(object)s</"
+"code></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:629
-msgid "Undefined"
+#: ../lib/advene/core/webcherry.py:1991
+msgid "Available actions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:901
-msgid "Enter the new time value"
+#: ../lib/advene/core/webcherry.py:2000
+#, python-format
+msgid "<li>%(name)s: %(value)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:925
+#: ../lib/advene/core/webcherry.py:2023
 #, python-format
-msgid "Replace content in %d elements"
+msgid "<p>Unknown action</p><pre>Action: %s</pre>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:938
-msgid "Find word"
+#: ../lib/advene/core/webcherry.py:2030
+msgid "Missing parameter(s) :<ul>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:945
-msgid "Replace by"
+#: ../lib/advene/core/webcherry.py:2066
+msgid "Advene web resources"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:973
-#, python-format
-msgid "%(search)s has been replaced by %(replace)s in %(count)d element(s)."
+#: ../lib/advene/core/webcherry.py:2072
+msgid "Advene webserver"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:982
-msgid "The video extracting feature is not available."
+#: ../lib/advene/core/webcherry.py:2073
+#, python-format
+msgid ""
+"<p>Welcome on the <a href=\"http://advene.org/\">Advene</a> webserver run by "
+"%(userid)s on %(serveraddress)s.</p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:985
-#, fuzzy
-msgid "Video export"
-msgstr "Seleziona un DVD"
+#: ../lib/advene/core/webcherry.py:2080
+msgid ""
+" <p>No package is loaded. You can access the <a href=\"/admin\">server "
+"administration page</a>.<p>"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:987
+#: ../lib/advene/core/webcherry.py:2090
 #, python-format
-msgid "Exporting video montage/fragment to %%(filename)s"
+msgid ""
+"the <a href=\"/packages/%(alias)s/view/%(view)s\">loaded package's default "
+"view</a>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:989
-msgid "Please choose a destination filename"
+#: ../lib/advene/core/webcherry.py:2092
+#, python-format
+msgid "the <a href=\"/packages/%s\">loaded package's data</a>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1067
-msgid ""
-"No media association is defined in the package. Please use the 'File/"
-"Associate a video file' menu item to associate a media file."
+#: ../lib/advene/core/webcherry.py:2094
+msgid "the <a href=\"/packages\">loaded packages' data</a>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1069
+#: ../lib/advene/core/webcherry.py:2095
 #, python-format
 msgid ""
-"The associated media %s could not be found. Please use the 'File/Associate a "
-"video file' menu item to associate a media file."
+" <p>You can either access %s or the <a href=\"/admin\">server administration "
+"page</a>.<p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1071
+#: ../lib/advene/core/webcherry.py:2097
 #, python-format
 msgid ""
-"You are now working with the following video:\n"
-"%s"
+"<hr><p align=\"right\"><em>Document generated by <a href=\"http://advene.org/"
+"\">Advene</a> v. %s.</em></p>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1188
-msgid "Open this view..."
-msgstr "Apri questa vista..."
+#: ../lib/advene/core/webcherry.py:2182 ../lib/advene/core/webcherry.py:2191
+#, python-format
+msgid "Cannot start HTTP server: %s"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1205
-#, fuzzy
-msgid "_All available views"
-msgstr "Nessun tipo disponibile"
+#: ../lib/advene/core/controller.py:433
+msgid "No available GUI"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1224
-msgid "Transcription of annotations"
-msgstr "Trascrizione delle annotazioni"
+#: ../lib/advene/core/controller.py:452
+msgid "No available event handler"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1227
-msgid "Note-taking editor"
+#: ../lib/advene/core/controller.py:460
+msgid "No available gui"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1228
-msgid "Active bookmarks"
+#: ../lib/advene/core/controller.py:476
+#, python-format
+msgid "Warning: redefining an existing feature %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1229
+#: ../lib/advene/core/controller.py:608
 #, fuzzy
-msgid "Schema editor"
-msgstr "Schema"
+msgid "Annotations in current package"
+msgstr "Salva il pacchetto attuale"
 
-#: ../lib/advene/gui/main.py:1233
-msgid "TALES explorer"
+#: ../lib/advene/core/controller.py:609
+#, fuzzy
+msgid "Annotations in all packages"
+msgstr "Tipo di Annotazione"
+
+#: ../lib/advene/core/controller.py:611
+msgid "Ids"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1234
-msgid "Dynamic montage"
+#: ../lib/advene/core/controller.py:803
+#, python-format
+msgid ""
+"Cannot start the webserver\n"
+"The following processes seem to use the %(port)s port: %(processes)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1238
-msgid "Open a comment view in the web browser"
+#: ../lib/advene/core/controller.py:852 ../lib/advene/core/controller.py:863
+#, python-format
+msgid "Loaded %(uri)s as %(alias)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1239
-#, fuzzy
-msgid "Create or open a comment view"
-msgstr "Vista statica predefinita"
+#: ../lib/advene/core/controller.py:854 ../lib/advene/core/controller.py:866
+#, python-format
+msgid "Cannot load package from file %(uri)s: %(error)s"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1242
-msgid ""
-"Edit window placeholder (annotation and relation edit windows will be put "
-"here)"
+#: ../lib/advene/core/controller.py:905
+msgid "Deactivating web server"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1243
-#, fuzzy
-msgid "Display edition history"
-msgstr "Visualizza cronologia di navigazione"
+#: ../lib/advene/core/controller.py:1013
+#, python-format
+msgid "Cannot get audio volume: %s"
+msgstr ""
+
+#: ../lib/advene/core/controller.py:1025
+#, python-format
+msgid "Cannot open Advene URL %s: the webserver is not running."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:1244
-msgid "Visualise the activity trace preview"
+#: ../lib/advene/core/controller.py:1284
+#, python-format
+msgid "Found matching video file in moviepath: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1245
-msgid "Visualise the activity trace as a timeline"
+#: ../lib/advene/core/controller.py:1310 ../lib/advene/core/controller.py:1312
+msgid "Analysis of "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1274
-msgid "The webserver could not be started. Static views cannot be accessed."
+#: ../lib/advene/core/controller.py:1536
+msgid "Cannot split the annotation: the given position is outside."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1352
+#: ../lib/advene/core/controller.py:1785
 #, python-format
-msgid ""
-"<span background=\"#ff8888\" size=\"large\"><b>Advene %(version)s has been "
-"released</b> on %(date)s, but you are running version %(current)s.\n"
-"You can download the latest version from the Advene website: http://liris."
-"cnrs.fr/advene/</span>"
+msgid "Cannot find the template package %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1357
-msgid "Go to the website"
+#: ../lib/advene/core/controller.py:1832
+#, python-format
+msgid "Cannot read the imported package %(uri)s: %(error)s"
+msgstr ""
+
+#: ../lib/advene/core/controller.py:2064
+msgid "Package URI has changed. Reloading package with new URI."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1363
-msgid "Advene release"
+#: ../lib/advene/core/controller.py:2082
+msgid ""
+"Cannot load package: the following annotations do not have Millisecond "
+"fragments:"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1369
+#: ../lib/advene/core/controller.py:2108
 #, python-format
-msgid "You are using a up-to-date version of Advene (%(current)s)."
+msgid "Cannot handle master attribute, the package %s is not imported."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1369
-msgid "Advene is up-to-date"
+#: ../lib/advene/core/controller.py:2110
+#, python-format
+msgid "Checking master package %s for not yet imported elements."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1383
-msgid "Choose a color"
+#: ../lib/advene/core/controller.py:2150
+msgid "Standard summary"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1415
-msgid "Select an annotation to loop on it"
+#: ../lib/advene/core/controller.py:2155
+msgid "Default view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1417
+#: ../lib/advene/core/controller.py:2197
 #, python-format
-msgid "Looping on %s"
+msgid ""
+"Infinite loop in STBV %(name)s: the %(imp)s view is invoked multiple times."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1476 ../lib/advene/gui/main.py:2367
-msgid "No active dynamic view"
+#: ../lib/advene/core/controller.py:2283
+msgid "Got exception when stopping player."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1487
-msgid "Create a new dynamic view."
-msgstr ""
+#: ../lib/advene/core/controller.py:2335
+#, fuzzy
+msgid "Video player problem"
+msgstr "Seleziona un DVD"
 
-#: ../lib/advene/gui/main.py:1506
-msgid "Edit the current dynamic view."
+#: ../lib/advene/core/controller.py:2362
+msgid "Unable to start the player."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1518
-#, fuzzy
-msgid "No dynamic view"
-msgstr "Vista dinamica"
+#: ../lib/advene/core/controller.py:2569
+#, fuzzy, python-format
+msgid "Comment on set of %d annotations"
+msgstr "Trascrizione delle annotazioni"
 
-#: ../lib/advene/gui/main.py:1550
-msgid "Playing rate"
+#: ../lib/advene/core/controller.py:2571
+#, python-format
+msgid "Comment on %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1698
-msgid "History"
+#: ../lib/advene/core/controller.py:2575
+#, python-format
+msgid ""
+"<h1>Comment on %(title)s</h1>\n"
+"<span class=\"advene:annotation\" advene:annotation=\"%(id)s\" advene:"
+"presentation=\"link:snapshot\"><a title=\"Click to play the movie in Advene"
+"\" tal:attributes=\"href package/annotations/%(id)s/player_url\" href="
+"\"%(href)s\"><img title=\"Click here to play\" width=\"160\" height=\"100\" "
+"tal:attributes=\"src package/annotations/%(id)s/snapshot_url\" src="
+"\"%(imgurl)s\" ></img></a></span>"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1705
-msgid "Popups"
+#: ../lib/advene/core/controller.py:2585
+#, fuzzy, python-format
+msgid "List of %s annotations"
+msgstr "Tutte le annotazioni"
+
+#: ../lib/advene/core/controller.py:2620
+#, fuzzy, python-format
+msgid "Cannot export to %(filename)s: %(e)s"
+msgstr "Impossibile salvare il file: %s"
+
+#: ../lib/advene/core/controller.py:2635
+msgid "Error when exporting text template"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1709
-msgid ""
-"You can drag and drop view icons (timeline, treeview, transcription...) in "
-"notebooks to embed various views."
+#: ../lib/advene/core/controller.py:2644
+msgid "Error when exporting XML template"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:1709
-msgid "Information"
+#: ../lib/advene/plugins/featuredetect.py:45
+msgid "Feature detection (face...)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2004
-msgid "Cannot create annotation. There is no schema to put it in."
+#: ../lib/advene/plugins/featuredetect.py:60
+msgid "Sensitivity level."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2013
-#, fuzzy
-msgid "Default annotation type"
-msgstr "di un tipo di annotazione"
+#: ../lib/advene/plugins/featuredetect.py:63
+msgid ""
+"Scale. Original image size will be divided by this factor, in order to speed "
+"up detection."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:2025
+#: ../lib/advene/plugins/featuredetect.py:66
 #, fuzzy
-msgid "Annotation created"
-msgstr "Tipo di Annotazione"
+msgid "Classifier"
+msgstr "Classe"
 
-#: ../lib/advene/gui/main.py:2057
-msgid "Play/Pause [Control-Tab / Control-Space]"
+#: ../lib/advene/plugins/featuredetect.py:80
+#, python-format
+msgid "Feature %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2058
+#: ../lib/advene/plugins/featuredetect.py:82
 #, python-format
-msgid "Rewind (%.02f s) [Control-Left]"
+msgid "Detected %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2059
+#: ../lib/advene/plugins/featuredetect.py:84
+#, fuzzy
+msgid "Detection started"
+msgstr "Tempo di reazione"
+
+#: ../lib/advene/plugins/featuredetect.py:175
 #, python-format
-msgid "Forward (%.02f s) [Control-Right]"
+msgid "Detected %(count)d feature(s) until %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2060
-msgid "Previous frame [Control-Down]"
+#: ../lib/advene/plugins/ted.py:39
+#, fuzzy
+msgid "TED importer"
+msgstr "Importatore"
+
+#: ../lib/advene/plugins/cutter.py:40
+msgid "Audio segmentation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2061
-msgid "Next frame [Control-Up]"
+#: ../lib/advene/plugins/cutter.py:55
+msgid "Volume threshold (in dB, can be negative) before trigger."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2062
-msgid "Fullscreen"
+#: ../lib/advene/plugins/cutter.py:58
+#: ../lib/advene/plugins/soundenveloppe.py:64
+msgid "Channel selection."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2214
-#, python-format
-msgid "Screenshot saved to %s"
+#: ../lib/advene/plugins/cutter.py:61
+msgid "Length (in ms) of drop below threshold before silence is detected"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2216
+#: ../lib/advene/plugins/cutter.py:104
 #, python-format
-msgid ""
-"Screenshot saved in\n"
-" %s"
+msgid "Detected %(count)d segments until %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2218
-#, fuzzy, python-format
-msgid ""
-"Could not save screenshot:\n"
-" %s"
-msgstr "Tutte le annotazioni"
+#: ../lib/advene/plugins/cutter.py:122
+msgid "Sound segment"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:2226
-#, fuzzy
-msgid "Save screenshot to..."
-msgstr "Salva contenuto in..."
+#: ../lib/advene/plugins/cutter.py:123
+#, python-format
+msgid ""
+"Sound segmentation with a threshold of %(threshold)d dB - channel: "
+"%(channel)s"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:2244
-msgid "Could not take snapshot with enough precision"
+#: ../lib/advene/plugins/cutter.py:141
+msgid "Starting silence detection"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2282
+#: ../lib/advene/plugins/ttl.py:41
 #, fuzzy
-msgid "Export package data"
-msgstr "Nessun pacchetto"
-
-#: ../lib/advene/gui/main.py:2284
-#, fuzzy, python-format
-msgid "Export annotation type %s"
-msgstr "di un tipo di annotazione"
+msgid "TurTLe (RDF) importer"
+msgstr "Importatore"
 
-#: ../lib/advene/gui/main.py:2286
-#, fuzzy, python-format
-msgid "Export element %s"
-msgstr "Crea elemento"
+#: ../lib/advene/plugins/shotdetect.py:38
+#, fuzzy
+msgid "Shotdetect XML importer"
+msgstr "Importatore"
 
-#: ../lib/advene/gui/main.py:2312
-msgid "Export format"
+#: ../lib/advene/plugins/shotdetect.py:82
+msgid "No shots"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2349
-msgid " (modified)"
+#: ../lib/advene/plugins/pocketsphinx.py:44
+msgid ""
+"Cannot register speech recognition: Pocketsphinx plugins not found. See "
+"http://cmusphinx.sourceforge.net/wiki/gstreamer for details."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2352
-#, python-format
-msgid "Activate %s"
+#: ../lib/advene/plugins/pocketsphinx.py:48
+msgid "Speech recognition (PocketSphinx)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2523
-msgid "Saved workspace"
+#: ../lib/advene/plugins/pocketsphinx.py:68
+msgid "Filtering noise level [0..1]."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2575
-msgid "Restoring workspace..."
+#: ../lib/advene/plugins/pocketsphinx.py:72
+msgid ""
+"Minimum amount (in milliseconds) of silence required to terminate the "
+"current annotation and start a new one. Decreasing this length will result "
+"in a large amount of short annotations and increasing this length will "
+"result in a small amount of long annotations."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2581
-#, python-format
-msgid "Do you wish to restore the %s workspace ?"
+#: ../lib/advene/plugins/pocketsphinx.py:76
+msgid "Use default acoustic and language models."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2586
-msgid "Clear the current workspace"
+#: ../lib/advene/plugins/pocketsphinx.py:80
+msgid "Acoustic model (directory)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2607
-#, python-format
-msgid "View %s is not an adhoc view"
+#: ../lib/advene/plugins/pocketsphinx.py:84
+msgid "Phonetic dictionary (.dic file)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2618
-#, python-format
-msgid "Cannot identify the adhoc view %s"
+#: ../lib/advene/plugins/pocketsphinx.py:88
+msgid "Language model (.DMP file)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2632
-msgid "Choose the annotation type to display as transcription."
-msgstr ""
+#: ../lib/advene/plugins/pocketsphinx.py:107
+#: ../lib/advene/plugins/soundenveloppe.py:88
+#: ../lib/advene/plugins/barcode.py:62
+#, fuzzy
+msgid "Generating annotations"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/gui/main.py:2667
+#: ../lib/advene/plugins/pocketsphinx.py:146
+#: ../lib/advene/plugins/barcode.py:87
 #, python-format
-msgid ""
-"Error: unable to find an edit popup for %(element)s:\n"
-"%(error)s"
+msgid "%(count)d utterances until %(time)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2675
-#, fuzzy, python-format
-msgid "Editing %s"
-msgstr "Modifica %s"
-
-#: ../lib/advene/gui/main.py:2687
-#, python-format
-msgid "Comment view (%s)"
+#: ../lib/advene/plugins/pocketsphinx.py:155
+msgid "Speech"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2754
-#, python-format
-msgid "Package %(uri)s saved: %(annotations)s and %(relations)s."
+#: ../lib/advene/plugins/pocketsphinx.py:157
+msgid "Recognized speech"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2765
-#, python-format
-msgid "Activating package %s"
+#: ../lib/advene/plugins/pocketsphinx.py:186
+msgid "Recognizing speech"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2793
-#, python-format
-msgid "Package %(uri)s loaded: %(annotations)s and %(relations)s."
+#: ../lib/advene/plugins/brltty.py:64
+msgid "Input from the braille table."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2826
-msgid "Do you want to restore the saved workspace ?"
+#: ../lib/advene/plugins/brltty.py:68
+msgid "BrlTTY not installed. There will be no braille support."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:2833
-msgid "Advene"
-msgstr "Advene"
+#: ../lib/advene/plugins/brltty.py:80
+msgid "Could not initialize BrlTTY. No braille support."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3038
-#, python-format
-msgid "Got exception %s. Trying to continue."
+#: ../lib/advene/plugins/brltty.py:86
+msgid "Display a message in Braille"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3062 ../lib/advene/gui/main.py:3083
-#: ../lib/advene/gui/main.py:4033
-#, fuzzy
-msgid "Unknown"
-msgstr "Tutte le annotazioni"
+#: ../lib/advene/plugins/brltty.py:87
+msgid "Message to display."
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3153
+#: ../lib/advene/plugins/brltty.py:258
 #, python-format
-msgid ""
-"The package(s) %s are modified.\n"
-"Save them now?"
+msgid "BrlTTY connection error: %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3203
-msgid "Choose an annotation type."
+#: ../lib/advene/plugins/brltty.py:275
+msgid "Braille display: "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3247
-msgid "No annotation type is defined."
+#: ../lib/advene/plugins/brltty.py:281
+msgid "No message"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3256
-msgid "Creating a new type."
+#: ../lib/advene/plugins/transcript.py:34
+msgid "Youtube XML importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3260
-msgid "Title of the new type"
-msgstr ""
+#: ../lib/advene/plugins/transcript.py:71
+#, fuzzy
+msgid "Importing transcript"
+msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/gui/main.py:3261
-msgid ""
-"Id of the new type. It is generated from the title, but you may change it if "
-"necessary."
+#: ../lib/advene/plugins/aeidon_import.py:50
+msgid "Aeidon (subtitles) importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3265
-msgid "Specify the content-type for the annotation type"
+#: ../lib/advene/plugins/anvil.py:38
+msgid "Anvil importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3267
-msgid "Content type"
+#: ../lib/advene/plugins/fcp.py:35
+msgid "Final Cut Pro XML importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3274 ../lib/advene/gui/main.py:3383
-msgid "Create a new schema"
+#: ../lib/advene/plugins/fcp.py:57
+msgid "FCP clipitem"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3287
-msgid "Choose an existing schema for the new type, or create a new one"
-msgstr ""
+#: ../lib/advene/plugins/fcp.py:77
+#, fuzzy
+msgid "Importing subtitles"
+msgstr "_Importa file"
 
-#: ../lib/advene/gui/main.py:3290 ../lib/advene/gui/main.py:3398
-msgid "Specify the schema title"
+#: ../lib/advene/plugins/fcp.py:92
+msgid "Importing clips"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3294
-msgid "Title of the new schema"
+#: ../lib/advene/plugins/fcp.py:95
+msgid "No clip"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3295
-msgid ""
-"Id of the new schema. It is generated from the title, but you may change it "
-"if necessary."
+#: ../lib/advene/plugins/hpi.py:43
+msgid "HPI concept extraction"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3318
-msgid ""
-"You specified a annotation-type identifier that already exists. Aborting."
-msgstr ""
+#: ../lib/advene/plugins/hpi.py:109
+#, fuzzy
+msgid "Type of annotation to analyze"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/main.py:3336
-msgid "You specified a existing schema identifier. Using the existing schema."
+#: ../lib/advene/plugins/hpi.py:114
+msgid "URL of the webservice"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3338
-msgid ""
-"You specified an existing identifier that does not reference a schema. "
-"Aborting."
+#: ../lib/advene/plugins/hpi.py:119
+msgid "Minimum confidence level (between 0.0 and 1.0)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3365
-msgid "Choose a schema."
-msgstr ""
+#: ../lib/advene/plugins/hpi.py:124
+#, fuzzy
+msgid "Use detected position for created annotations"
+msgstr "Trascrizione delle annotazioni"
 
-#: ../lib/advene/gui/main.py:3425
-msgid "You specified an existing identifier. Aborting."
+#: ../lib/advene/plugins/hpi.py:129
+msgid "Split by entity type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3445
-#, python-format
-msgid "Package %s modified"
+#: ../lib/advene/plugins/hpi.py:134
+msgid "Model to be used for detection"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3446
-#, python-format
-msgid ""
-"The package %s has been modified but not saved.\n"
-"Save it now?"
+#: ../lib/advene/plugins/hpi.py:139
+msgid "Create relations between the original annotations and the new ones"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3456
+#: ../lib/advene/plugins/hpi.py:167
+msgid "Cannot connect to VCD server. Check that it is running and accessible."
+msgstr ""
+
+#: ../lib/advene/plugins/hpi.py:179
 #, python-format
-msgid "%s snapshots"
+msgid "%d / %d screenshots are missing. Wait for extraction to complete."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3457
+#: ../lib/advene/plugins/hpi.py:196
 #, python-format
-msgid "Do you want to save the snapshots for media %s?"
+msgid "Concepts for %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3464 ../lib/advene/gui/main.py:3473
-#: ../lib/advene/gui/main.py:4449
+#: ../lib/advene/plugins/hpi.py:264
 #, fuzzy, python-format
-msgid "Cannot save imagecache for %(media)s: %(e)s"
-msgstr "Impossibile salvare il file: %s"
+msgid "Server error: %s"
+msgstr "Seleziona un DVD"
 
-#: ../lib/advene/gui/main.py:3487
-msgid "first frame"
+#: ../lib/advene/plugins/hpi.py:264
+msgid "Server transmission error."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3488
-msgid "last frame"
+#: ../lib/advene/plugins/hpi.py:272
+#, python-format
+msgid "Parsing %d results"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3496
-#, fuzzy, python-format
-msgid "Click on %(bound)s of %(annotation)s"
-msgstr "Trascrizione delle annotazioni"
-
-#: ../lib/advene/gui/main.py:3499
-#, fuzzy, python-format
-msgid "Update %(bound)s of %(annotation)s"
-msgstr "Trascrizione delle annotazioni"
+#: ../lib/advene/plugins/hpi.py:289
+#, python-format
+msgid "%s concept"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:3518
-msgid "Click on the frame corresponding to the timestamp value"
+#: ../lib/advene/plugins/goodshotdetector.py:45
+msgid "Shot detection (Delakis version)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3520
-msgid "Set new timestamp value"
+#: ../lib/advene/plugins/goodshotdetector.py:60
+msgid "Cache histogram alongside video files."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3527
+#: ../lib/advene/plugins/goodshotdetector.py:63
 msgid ""
-"<b>Annotation statistics</b>\n"
-"\n"
+"Parameter profile: safe will detect less cuts, aggressive will detect more "
+"cuts (but more false ones too). default is a compromise."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3599
-#, fuzzy
-msgid "Text annotation"
-msgstr "Tutte le annotazioni"
-
-#: ../lib/advene/gui/main.py:3607 ../lib/advene/gui/main.py:3632
-#, fuzzy
-msgid "Cannot find an appropriate annotation type"
-msgstr "di un tipo di annotazione"
-
-#: ../lib/advene/gui/main.py:3625
-#, fuzzy
-msgid "Graphical annotation"
-msgstr "Trascrizione delle annotazioni"
-
-#: ../lib/advene/gui/main.py:3677
-msgid ""
-"An unsaved template package exists\n"
-"Save it first."
+#: ../lib/advene/plugins/goodshotdetector.py:77
+#, python-format
+msgid "Shot (%s profile)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3686
-msgid "Package modified"
+#: ../lib/advene/plugins/goodshotdetector.py:78
+#: ../lib/advene/plugins/shotdetectapp.py:84
+msgid "Detected shots"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3687
-msgid ""
-"The package that you want to close has been modified but not saved.\n"
-"Save it now?"
+#: ../lib/advene/plugins/goodshotdetector.py:83
+msgid "Loading histogram"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3718
-msgid "Load a package"
+#: ../lib/advene/plugins/goodshotdetector.py:144
+#, fuzzy
+msgid "Computing hdiff"
+msgstr "Relazioni"
+
+#: ../lib/advene/plugins/goodshotdetector.py:151
+msgid "Detecting cuts"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3727
-msgid ""
-"A video file was selected. Pretend that the user selected 'Select a video "
-"file'..."
+#: ../lib/advene/plugins/goodshotdetector.py:178
+msgid "Detecting dissolves"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3732
-#, python-format
-msgid ""
-"The file %s does not look like a valid Advene package. It should have a .azp "
-"or .xml extension. Try to open anyway?"
+#: ../lib/advene/plugins/goodshotdetector.py:263
+#, fuzzy
+msgid "Extracting histogram"
+msgstr "Modifica %s"
+
+#: ../lib/advene/plugins/montagerenderer.py:43
+msgid "Cannot register montage renderer: Gnonlin plugins are not present."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3741
-msgid ""
-"You are trying to load a session file, but there are unsaved packages. "
-"Proceed anyway?"
+#: ../lib/advene/plugins/transcriber.py:43
+msgid "Transcriber importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3769 ../lib/advene/gui/main.py:3825
-msgid "Do you want to save the current workspace ?"
+#: ../lib/advene/plugins/transcriber.py:89
+msgid "Parsing section information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3784 ../lib/advene/gui/main.py:3840
-#, python-format
-msgid "Could not save the package: %s"
+#: ../lib/advene/plugins/transcriber.py:257 ../lib/advene/util/importer.py:1541
+msgid "Creating package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3797
-#, python-format
-msgid "Save the package %s"
+#: ../lib/advene/plugins/transcriber.py:263 ../lib/advene/util/importer.py:1548
+msgid "Creating annotation types"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3810
-msgid "Invalid file extension"
+#: ../lib/advene/plugins/transcriber.py:268 ../lib/advene/util/importer.py:1554
+msgid "Parsing header information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3811
-#, python-format
-msgid ""
-"Your package contains resources,\n"
-"the filename (%s) should have a .azp extension.\n"
-"Should I put the correct extension?"
+#: ../lib/advene/plugins/transcriber.py:279
+msgid "Parsing topic and speaker tables information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3815
-msgid "OK, the resources will be lost."
+#: ../lib/advene/plugins/tts.py:80
+msgid "Pronounce a text"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3817
-msgid "Aborting package saving"
+#: ../lib/advene/plugins/tts.py:81
+msgid "String to pronounce."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3851
-msgid "Save the session in..."
+#: ../lib/advene/plugins/tts.py:159
+msgid "TTS disabled. Cannot find the application 'festival' in PATH"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3862
-#, python-format
-msgid "Session saved in %s"
+#: ../lib/advene/plugins/tts.py:161
+msgid "TTS disabled. Cannot find the application 'aplay' in PATH"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3871
-msgid "Do you confirm the creation of annotations matching the DVD chapters?"
+#: ../lib/advene/plugins/soundenveloppe.py:42
+#: ../lib/advene/plugins/soundenveloppe.py:149
+#: ../lib/advene/plugins/soundenveloppe.py:151
+msgid "Sound enveloppe"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3877
-msgid "Cannot import DVD chapters. Did you install the lsdvd software?"
+#: ../lib/advene/plugins/soundenveloppe.py:58
+msgid "Interval (in ms) at which to take samples."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3885
-msgid "The associated media is not a DVD."
+#: ../lib/advene/plugins/soundenveloppe.py:61
+msgid "Maximum number of samples per annotation."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:3896
+#: ../lib/advene/plugins/soundenveloppe.py:121
 #, fuzzy, python-format
-msgid "Processing %s video"
+msgid "At %s"
 msgstr "Modifica %s"
 
-#: ../lib/advene/gui/main.py:3899
+#: ../lib/advene/plugins/soundenveloppe.py:168
 #, fuzzy
-msgid "No associated video file"
-msgstr "Seleziona un file video"
+msgid "Extracting sound enveloppe"
+msgstr "Modifica %s"
 
-#: ../lib/advene/gui/main.py:3926
-msgid "Standard RuleSet"
+#: ../lib/advene/plugins/barcode.py:39
+msgid "Cannot register barcode extraction: zbar plugin not found."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4042
-#, python-format
-msgid ""
-"Player not active - cached duration   : %(duration)s (%(durationms)d ms)"
+#: ../lib/advene/plugins/barcode.py:43
+msgid "Barcode (qr-code) extraction"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4054
-msgid ""
-"GNU General Public License v. 2\n"
-"See http://www.gnu.org/copyleft/gpl.html for more details"
+#: ../lib/advene/plugins/barcode.py:99
+msgid "Barcode"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4056
-msgid "Visit the Advene web site for examples and documentation."
+#: ../lib/advene/plugins/barcode.py:101
+msgid "Extracted barcode information"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4089 ../lib/advene/gui/main.py:4177
-msgid "Select a movie file"
+#: ../lib/advene/plugins/barcode.py:119
+#, fuzzy
+msgid "Extraction barcodes"
+msgstr "Modifica %s"
+
+#: ../lib/advene/plugins/dcp.py:67
+#, fuzzy
+msgid "DCP importer"
+msgstr "Importatore"
+
+#: ../lib/advene/plugins/dcp.py:122
+#, python-format
+msgid "Converting #%(num)d / %(count)d"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4101
-msgid "Title/Chapter selection"
+#: ../lib/advene/plugins/annotationgraph.py:43
+msgid "AnnotationGraph importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4143
-msgid "Select a video stream"
-msgstr "Seleziona un video stream"
+#: ../lib/advene/plugins/shotdetectapp.py:45
+#, fuzzy
+msgid "ShotdetectApp importer"
+msgstr "Importatore"
 
-#: ../lib/advene/gui/main.py:4144
-msgid "Enter the address of a video stream"
+#: ../lib/advene/plugins/shotdetectapp.py:56
+msgid ""
+"Sensitivity of the algorithm. It should typically be between 50 and 80. If "
+"too many shots are detected, try to increase its value."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4148
+#: ../lib/advene/plugins/shotdetectapp.py:139
 #, python-format
-msgid "Successfully extracted the video stream address (%s) from the url.\n"
+msgid "Detected shot #%(num)d at %(pos)s "
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4173
-msgid "Package properties"
+#: ../lib/advene/plugins/mpeg7.py:57
+msgid "MPEG7 importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4174
-msgid "Author name"
-msgstr ""
+#: ../lib/advene/plugins/cinelab.py:76
+#, fuzzy
+msgid "Cinelab importer"
+msgstr "Importatore"
 
-#: ../lib/advene/gui/main.py:4175
-msgid "Package creation date"
+#: ../lib/advene/plugins/cinelab.py:114 ../lib/advene/plugins/cinelab.py:116
+#, python-format
+msgid "File %s is not an Advene2 zip package."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4176
-msgid "Package title"
-msgstr ""
+#: ../lib/advene/plugins/cinelab.py:171
+#, fuzzy
+msgid "Converting annotation types"
+msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/main.py:4177
-msgid "Associated media"
-msgstr ""
+#: ../lib/advene/plugins/cinelab.py:212
+#, fuzzy
+msgid "Converting views"
+msgstr "Vista statica predefinita"
 
-#: ../lib/advene/gui/main.py:4178
-msgid "Media duration in ms"
+#: ../lib/advene/plugins/cinelab.py:244
+#, fuzzy
+msgid "Importing annotations"
+msgstr "Tutte le annotazioni"
+
+#: ../lib/advene/plugins/owl_import.py:43
+#, fuzzy
+msgid "OWL (schema) importer"
+msgstr "Importatore"
+
+#: ../lib/advene/plugins/owl_import.py:62 ../lib/advene/util/importer.py:398
+#, python-format
+msgid "Converted from %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4237
-msgid "Paths"
+#: ../lib/advene/player/gstreamer.py:344
+msgid "Problem when seeking into media"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4239
-msgid "Data"
+#: ../lib/advene/player/gstreamer.py:385
+msgid "Cannot capture full-resolution snapshot, another capture is ongoing."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4239
-msgid "Standard directory for data files"
+#: ../lib/advene/rules/actions.py:39 ../lib/advene/rules/actions.py:104
+#: ../lib/advene/rules/actions.py:122
+msgid "Message to display"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4240
-msgid "Movie path"
+#: ../lib/advene/rules/actions.py:50
+msgid "Start the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4240
-#, python-format
-msgid ""
-"List of directories (separated by %s) to search for movie files (_ means "
-"package directory)"
+#: ../lib/advene/rules/actions.py:51
+msgid "Start position (in ms)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4241
-msgid "Imagecache"
+#: ../lib/advene/rules/actions.py:54 ../lib/advene/rules/actions.py:380
+msgid "The movie start"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4241
-msgid "Directory for storing the snapshot cache"
+#: ../lib/advene/rules/actions.py:55 ../lib/advene/rules/actions.py:381
+msgid "The annotation begin"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4242
-msgid "Player"
+#: ../lib/advene/rules/actions.py:56 ../lib/advene/rules/actions.py:382
+msgid "The annotation end"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4242
-msgid "Directory of the video player"
+#: ../lib/advene/rules/actions.py:66
+msgid "Goto position (in ms)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4243
-msgid "Shotdetect"
+#: ../lib/advene/rules/actions.py:75
+msgid "Stop the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4243
-#, fuzzy
-msgid "Shotdetect application"
-msgstr "Seleziona un'azione"
+#: ../lib/advene/rules/actions.py:82
+msgid "Pause the player"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4245
-msgid "GUI"
+#: ../lib/advene/rules/actions.py:89
+msgid "Resume the player"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4246
-msgid "Interface language (after restart)"
+#: ../lib/advene/rules/actions.py:96
+msgid "Take a snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4246
-msgid ""
-"Language used for the interface (necessitates to restart the application)"
+#: ../lib/advene/rules/actions.py:103
+msgid "Display a caption"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4252
-msgid "Record activity trace"
+#: ../lib/advene/rules/actions.py:105
+msgid "Duration of the caption"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4253
-msgid "Expert mode"
+#: ../lib/advene/rules/actions.py:133
+#, fuzzy
+msgid "Display a graphical shape"
+msgstr "Visualizza %s"
+
+#: ../lib/advene/rules/actions.py:134
+msgid "Shape (square, circle, triangle)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4253
-msgid "Offer advanced possibilities"
+#: ../lib/advene/rules/actions.py:136
+msgid "x-position (percentage of screen)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4254
-msgid "Prefer WYSIWYG"
+#: ../lib/advene/rules/actions.py:137
+msgid "y-position (percentage of screen)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4254
-msgid "Use WYSIWYG editors when possible (HTML, SVG)"
+#: ../lib/advene/rules/actions.py:138
+msgid "Size (arbitrary units)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4255
-msgid "Player control in edit popups"
+#: ../lib/advene/rules/actions.py:139
+msgid "Duration of the display in ms"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4255
-msgid ""
-"Enable generic player controls in edit windows. This may be undesirable "
-"since it overloads some standard text-edition behaviours (esp. control-left/"
-"right)."
+#: ../lib/advene/rules/actions.py:147
+msgid "A square"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4257
-msgid "Open popups"
+#: ../lib/advene/rules/actions.py:148
+msgid "A circle"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4258
-msgid "Where should we open adhoc views?"
+#: ../lib/advene/rules/actions.py:149
+msgid "A triangle"
+msgstr ""
+
+#: ../lib/advene/rules/actions.py:152
+msgid "White"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4259
-msgid "as a popup window"
+#: ../lib/advene/rules/actions.py:153
+msgid "Black"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4260
-msgid "embedded east of the video"
+#: ../lib/advene/rules/actions.py:154
+msgid "Red"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4261
-msgid "embedded west of the video"
+#: ../lib/advene/rules/actions.py:155
+msgid "Green"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4262
-msgid "embedded south of the video"
+#: ../lib/advene/rules/actions.py:156
+msgid "Blue"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4263
-msgid "embedded at the right of the window"
+#: ../lib/advene/rules/actions.py:157
+msgid "Yellow"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4266
-msgid "History size"
+#: ../lib/advene/rules/actions.py:160
+msgid "At the top of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4266
-msgid "History filelist size limit"
+#: ../lib/advene/rules/actions.py:161 ../lib/advene/rules/actions.py:166
+msgid "In the middle of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4268
-msgid "Remember window size"
+#: ../lib/advene/rules/actions.py:162
+msgid "At the bottom of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4268
-msgid "Remember the size of opened windows"
+#: ../lib/advene/rules/actions.py:165
+msgid "At the left of the screen"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4269
-msgid "Bookmark snapshot width"
+#: ../lib/advene/rules/actions.py:183
+msgid "Zero the volume during the annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4269
-msgid "Width of the snapshots representing bookmarks"
+#: ../lib/advene/rules/actions.py:190
+msgid "Zero the volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4270
-msgid "Bookmark snapshot precision"
+#: ../lib/advene/rules/actions.py:197
+msgid "Restore the volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4270
-msgid "Precision (in ms) of the displayed bookmark snapshots."
+#: ../lib/advene/rules/actions.py:205
+msgid "Activate a STBV"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4272
-msgid "General"
+#: ../lib/advene/rules/actions.py:206
+msgid "STBV id"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4273
-msgid "Weekly update check"
+#: ../lib/advene/rules/actions.py:215
+msgid "Send a user event"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4274
-msgid "On exit,"
+#: ../lib/advene/rules/actions.py:216
+msgid "Identifier"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4275
-msgid "How to handle screenshots on exit"
+#: ../lib/advene/rules/actions.py:217
+msgid "Delay in ms before sending the event."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4276
-msgid "never save screenshots"
+#: ../lib/advene/rules/actions.py:227
+msgid "Open a URL in the web browser"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4277
-msgid "always save screenshots"
+#: ../lib/advene/rules/actions.py:237
+msgid "Open a static view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4278
-msgid "ask before saving screenshots"
+#: ../lib/advene/rules/actions.py:248
+msgid "Set the audio volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4280
-msgid "Auto-save"
+#: ../lib/advene/rules/actions.py:249
+msgid "Volume level (from 0 to 100)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4281
-msgid "Data auto-save functionality"
+#: ../lib/advene/rules/actions.py:258
+msgid "Set the playing rate"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4282
-msgid "is desactivated"
+#: ../lib/advene/rules/actions.py:259
+msgid "Rate (100: normal rate, 200: twice slower)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4283
-msgid "is done automatically"
+#: ../lib/advene/rules/actions.py:268
+msgid "Play a sound resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4284
-msgid "is done after confirmation"
+#: ../lib/advene/rules/actions.py:269
+msgid "Clip id"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4286
-msgid "Auto-save interval (in s)"
+#: ../lib/advene/rules/actions.py:270 ../lib/advene/rules/actions.py:284
+msgid "Volume (0..100)"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4286
-msgid "Interval (in seconds) between package auto-saves"
+#: ../lib/advene/rules/actions.py:271 ../lib/advene/rules/actions.py:285
+msgid "Left-right balance: -1 -> full left, 0 -> center, 1 -> full right"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4288
+#: ../lib/advene/rules/actions.py:282
 #, fuzzy
-msgid "Workspace"
-msgstr "Vista statica predefinita"
+msgid "Play a sound file"
+msgstr "Visualizza %s"
 
-#: ../lib/advene/gui/main.py:4290
-msgid "On package saving,"
+#: ../lib/advene/rules/actions.py:283
+msgid "Sound filename"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4291
-msgid "Do you wish to save the default workspace with the package?"
+#: ../lib/advene/rules/actions.py:295
+msgid "Set a state variable"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4292
-msgid "never save the current workspace"
+#: ../lib/advene/rules/actions.py:296 ../lib/advene/rules/actions.py:308
+msgid "State variable name"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4293
-msgid "always save the current workspace"
+#: ../lib/advene/rules/actions.py:297
+msgid "State value"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4294
-msgid "ask before saving the current workspace"
+#: ../lib/advene/rules/actions.py:307
+msgid "Increment a state variable"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4296
-msgid "Auto-validation of edited elements"
+#: ../lib/advene/rules/actions.py:317
+msgid "Clear all state variables"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4296
-msgid "Automatically validate modified elements when saving the package."
+#: ../lib/advene/rules/actions.py:332
+#, python-format
+msgid "Error in the evaluation of the parameter %s:"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4298
-#, fuzzy
-msgid "On package load,"
-msgstr "Apri un file pacchetto"
-
-#: ../lib/advene/gui/main.py:4299
-msgid "Do you wish to load the workspace saved with the package?"
+#: ../lib/advene/rules/actions.py:537
+#, python-format
+msgid "Cannot find the stbv %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4300
-msgid "never load the saved workspace"
+#: ../lib/advene/rules/actions.py:633
+msgid "The set_rate method is unavailable."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4301
-msgid "always load the saved workspace"
+#: ../lib/advene/rules/actions.py:643
+msgid "No 'soundclips' resource folder in the package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4302
-msgid "ask before loading the saved workspace"
+#: ../lib/advene/rules/actions.py:668
+msgid "Full volume"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4305
-#, fuzzy
-msgid "Video Player"
-msgstr "Seleziona un DVD"
-
-#: ../lib/advene/gui/main.py:4306
-#, fuzzy
-msgid "Autostart"
-msgstr "Autore"
-
-#: ../lib/advene/gui/main.py:4306
-msgid ""
-"Automatically start the player when loading a media file (either directly or "
-"through a package)"
+#: ../lib/advene/rules/actions.py:669
+msgid "Left"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4307
-msgid "Fulscreen timestamp"
+#: ../lib/advene/rules/actions.py:671
+msgid "Right"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4307
-msgid "Display the timestamp over the video when in fullscreen mode"
+#: ../lib/advene/rules/importer.py:29
+msgid "Event history importer"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4308
-#, fuzzy
-msgid "Enable captions"
-msgstr "Relazioni"
-
-#: ../lib/advene/gui/main.py:4308
-msgid "Enable captions over the video"
+#: ../lib/advene/rules/elements.py:144
+msgid "is equal to"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4309
-msgid "Caption font"
+#: ../lib/advene/rules/elements.py:145
+msgid "is different from"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4309
-msgid "TrueType font for captions"
+#: ../lib/advene/rules/elements.py:146
+msgid "contains"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4310
-msgid "Enable SVG"
+#: ../lib/advene/rules/elements.py:147
+msgid "is greater than"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4310
-msgid "Enable SVG captions over the video"
+#: ../lib/advene/rules/elements.py:148
+msgid "is lower than"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4312
-msgid "Enable snapshots"
+#: ../lib/advene/rules/elements.py:149
+msgid "matches the regexp"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4313
-msgid "Snapshot width"
+#: ../lib/advene/rules/elements.py:150
+msgid "is before"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4313
-msgid "Snapshot width in pixels."
+#: ../lib/advene/rules/elements.py:151
+msgid "meets"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4314
-msgid "Verbosity"
+#: ../lib/advene/rules/elements.py:152
+msgid "overlaps"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4314
-msgid "Verbosity level. -1 for no messages."
+#: ../lib/advene/rules/elements.py:153
+msgid "during"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4317
-msgid "Devices"
+#: ../lib/advene/rules/elements.py:154
+msgid "starts"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4319
-msgid "Standard"
+#: ../lib/advene/rules/elements.py:155
+msgid "finishes"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4321
-msgid "DVD drive"
+#: ../lib/advene/rules/elements.py:160
+msgid "is not true"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4321
-msgid "Drive letter for the DVD"
+#: ../lib/advene/rules/elements.py:161
+msgid "is true"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4322
-msgid "GDI"
+#: ../lib/advene/rules/elements.py:165
+msgid "Basic conditions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4323
-msgid "Direct X"
+#: ../lib/advene/rules/elements.py:166
+msgid "Allen relations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4325
-msgid "DVD device"
+#: ../lib/advene/rules/elements.py:229 ../lib/advene/rules/elements.py:235
+msgid "Unknown type for overlaps comparison"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4325
-msgid "Device for the DVD"
+#: ../lib/advene/rules/elements.py:243 ../lib/advene/rules/elements.py:249
+msgid "Unknown type for during comparison"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4326
-msgid "X11"
+#: ../lib/advene/rules/elements.py:518 ../lib/advene/rules/elements.py:524
+#, python-format
+msgid "Unknown action %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4327
-msgid "XVideo"
+#: ../lib/advene/rules/elements.py:525
+#, fuzzy, python-format
+msgid "Unknown parameter %s"
+msgstr "Parametro %s"
+
+#: ../lib/advene/rules/elements.py:530
+#, fuzzy
+msgid "Unknown actions"
+msgstr "Tutte le annotazioni"
+
+#: ../lib/advene/rules/elements.py:982
+msgid "Start of the editing of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4328
-msgid "GL"
+#: ../lib/advene/rules/elements.py:983
+msgid "Cancel of the editing of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4330
-msgid "Video output"
+#: ../lib/advene/rules/elements.py:984
+msgid "Destruction of the edit window of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4330
-msgid "Video output module"
+#: ../lib/advene/rules/elements.py:985
+msgid "Validation of the editing of an element"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4332
-msgid "Recorder options"
+#: ../lib/advene/rules/elements.py:986
+msgid "Ending editing of a package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4333
-#, fuzzy
-msgid "Audio input"
-msgstr "Aggiungi file..."
+#: ../lib/advene/rules/elements.py:987
+msgid "Beginning of an annotation"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4333
-msgid "Device name for audio input (with gstrecorder plugin)"
+#: ../lib/advene/rules/elements.py:988
+msgid "End of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4334
-msgid "Record video"
+#: ../lib/advene/rules/elements.py:989
+msgid "Creation of a new annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4334
-msgid "Record both video and audio"
+#: ../lib/advene/rules/elements.py:990
+msgid "Ending editing of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4337
-msgid "<i>Experimental</i>"
+#: ../lib/advene/rules/elements.py:991
+msgid "Suppression of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4338
-msgid "Embed the caption scroller below the video"
+#: ../lib/advene/rules/elements.py:992
+msgid "Activation of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4339
-msgid "Embed the caption view below the video"
+#: ../lib/advene/rules/elements.py:993
+msgid "Deactivation of an annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4341
-msgid "Time-related"
+#: ../lib/advene/rules/elements.py:994
+msgid "Merging of two annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4342
-msgid "Time format"
+#: ../lib/advene/rules/elements.py:995
+#, fuzzy
+msgid "Moving an annotation"
+msgstr "di un tipo di annotazione"
+
+#: ../lib/advene/rules/elements.py:996
+msgid "Activation of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4342
-msgid "Format used to display timecodes"
+#: ../lib/advene/rules/elements.py:997
+msgid "Deactivation of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4356
-msgid "Default FPS"
+#: ../lib/advene/rules/elements.py:998
+msgid "Creation of a new relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4357
-msgid ""
-"Default FPS (frame-per-second) value, when entering or displaying timestamps "
-"with frame numbers."
+#: ../lib/advene/rules/elements.py:999
+msgid "Ending editing of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4358
-msgid "Time increment"
+#: ../lib/advene/rules/elements.py:1000
+msgid "Suppression of a relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4358
-msgid ""
-"Skip duration, when using control-left/right or forward/rewind buttons (in "
-"ms)."
+#: ../lib/advene/rules/elements.py:1001
+msgid "Creation of a new view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4359
-msgid "Second time increment"
+#: ../lib/advene/rules/elements.py:1002
+msgid "Ending editing of a view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4359
-msgid "Skip duration, when using control-shift-left/right (in ms)."
+#: ../lib/advene/rules/elements.py:1003
+msgid "Suppression of a view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4360
-msgid "Third time increment"
+#: ../lib/advene/rules/elements.py:1004
+msgid "Creation of a new query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4360
-msgid "Skip duration, when using control-shift-up/down (in ms)."
+#: ../lib/advene/rules/elements.py:1005
+msgid "Ending editing of a query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4361
-msgid "Custom Up/Down"
+#: ../lib/advene/rules/elements.py:1006
+msgid "Suppression of a query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4361
-msgid ""
-"Use third time increment for up/down navigation without having to hold shift."
+#: ../lib/advene/rules/elements.py:1007
+msgid "Creation of a new schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4363
-msgid "Scroll increment"
+#: ../lib/advene/rules/elements.py:1008
+msgid "Ending editing of a schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4363
-msgid ""
-"On most annotations, control+scrollwheel will increment/decrement their "
-"bounds by this value (in ms)."
+#: ../lib/advene/rules/elements.py:1009
+msgid "Suppression of a schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4364
-msgid "Second scroll increment"
+#: ../lib/advene/rules/elements.py:1011
+msgid "Ending editing an annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4364
-msgid ""
-"On most annotations, control+shift+scrollwheel will increment/decrement "
-"their bounds by this value (in ms)."
+#: ../lib/advene/rules/elements.py:1012
+msgid "Suppression of an annotation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4366
-msgid "Player sync"
+#: ../lib/advene/rules/elements.py:1013
+msgid "Creation of a new relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4366
-msgid ""
-"Interval (in ms) with which we synchronize slave players. Setting a too-low "
-"value could render the application unusable. Use 0 to disable continuous "
-"synchronization."
+#: ../lib/advene/rules/elements.py:1014
+msgid "Ending editing a relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4367
-msgid "Timeline parameters"
+#: ../lib/advene/rules/elements.py:1015
+msgid "Suppression of a relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4368
-msgid "Font size for annotation widgets"
+#: ../lib/advene/rules/elements.py:1016
+msgid "Creation of a new resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4369
-msgid "Button height"
+#: ../lib/advene/rules/elements.py:1017
+msgid "Ending editing of a resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4369
-msgid "Height of annotation widgets"
+#: ../lib/advene/rules/elements.py:1018
+msgid "Suppression of a resource"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4370
-msgid "Interline height"
+#: ../lib/advene/rules/elements.py:1019
+msgid "Modification of the tag"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4370
-msgid "Height of interlines"
+#: ../lib/advene/rules/elements.py:1020
+msgid "Activating a link"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4372
-#, fuzzy
-msgid "Text content"
-msgstr "template HTML"
-
-#: ../lib/advene/gui/main.py:4373
-#, fuzzy
-msgid "Completion mode"
-msgstr "Relazioni"
+#: ../lib/advene/rules/elements.py:1021
+msgid "Player start"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4373
-#, fuzzy
-msgid "Enable dynamic completion mode"
-msgstr "Relazioni"
+#: ../lib/advene/rules/elements.py:1022
+msgid "Player stop"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4374
-#, fuzzy
-msgid "Abbreviation mode"
-msgstr "Tempo di reazione"
+#: ../lib/advene/rules/elements.py:1023
+msgid "Player pause"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4374
-#, fuzzy
-msgid "Enable abbreviation mode"
-msgstr "Relazioni"
+#: ../lib/advene/rules/elements.py:1024
+msgid "Player resume"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4375
-#, fuzzy
-msgid "Abbreviations"
-msgstr "Relazioni"
+#: ../lib/advene/rules/elements.py:1025
+msgid "Going to a given position"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4375
-msgid ""
-"Text abbreviations. 1 entry per line. Each line consists of the abbreviation "
-"followed by its replacement."
+#: ../lib/advene/rules/elements.py:1026
+msgid "Loading a new package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4377
-msgid "Text-To-Speech"
+#: ../lib/advene/rules/elements.py:1027
+msgid "Activating a package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4378
-msgid "TTS language"
+#: ../lib/advene/rules/elements.py:1028
+msgid "Saving the package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4379
-msgid "What language settings should be used for text-to-speech"
+#: ../lib/advene/rules/elements.py:1029
+msgid "Start of the dynamic view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4380
-msgid "English"
+#: ../lib/advene/rules/elements.py:1030
+msgid "End of the dynamic view"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4381
-msgid "French"
+#: ../lib/advene/rules/elements.py:1031
+msgid "Start of the application"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4382
-msgid "Spanish"
+#: ../lib/advene/rules/elements.py:1032
+msgid "End of the application"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4384
-msgid "TTS Encoding"
+#: ../lib/advene/rules/elements.py:1033
+msgid "User-defined event"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4385
-msgid "What encoding should be used to communicate with the TTS engine"
+#: ../lib/advene/rules/elements.py:1034
+msgid "Modification of the associated media"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4386
-msgid "TTS Engine"
+#: ../lib/advene/rules/elements.py:1035
+msgid "Highlight a bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4387
-msgid ""
-"Which TTS engine should be used (modification requires restarting Advene to "
-"take into account)"
+#: ../lib/advene/rules/elements.py:1036
+msgid "Unhighlight a bookmark"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4388
-#, fuzzy
-msgid "Automatic"
-msgstr "Autore"
+#: ../lib/advene/rules/elements.py:1037
+msgid "Updating duration of the movie"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4389
-msgid "eSpeak"
+#: ../lib/advene/rules/elements.py:1038
+msgid "Displaying a popup"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4390
-msgid "Custom script with standard input"
+#: ../lib/advene/rules/elements.py:1039
+msgid "Updating a snapshot"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4391
-msgid "Custom script with arguments"
+#: ../lib/advene/rules/elements.py:1077
+msgid "Player control"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4392
-msgid "SAPI"
+#: ../lib/advene/rules/elements.py:1078
+msgid "Audio enrichment"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4393
-msgid "MacOS X say"
+#: ../lib/advene/rules/elements.py:1079
+msgid "Image enrichment"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4394
-msgid "Generic (text output)"
+#: ../lib/advene/rules/elements.py:1080
+msgid "External display control"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4438
-msgid "You should restart Advene to take some options into account."
+#: ../lib/advene/rules/elements.py:1081
+msgid "Popup"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4447
-#, python-format
-msgid "Imagecache saved to %s"
+#: ../lib/advene/rules/elements.py:1083
+msgid "State"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4460
-msgid "Restarting player..."
+#: ../lib/advene/rules/elements.py:1084
+msgid "GUI actions"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4512
+#: ../lib/advene/rules/elements.py:1085
 #, fuzzy
-msgid "Advene log"
-msgstr "Advene"
+msgid "Expert"
+msgstr "Relazioni"
 
-#: ../lib/advene/gui/main.py:4581
-msgid "Select the package to merge"
+#: ../lib/advene/util/helper.py:409
+msgid "Annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4602
-msgid "Saving workspace"
+#: ../lib/advene/util/helper.py:410
+msgid "Relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4605
-msgid "Enter a view name to save the workspace"
+#: ../lib/advene/util/helper.py:416
+msgid "Resource Folder"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4606
-#, fuzzy
-msgid "Default workspace"
-msgstr "Vista statica predefinita"
+#: ../lib/advene/util/helper.py:452
+msgid "---- Elements ----"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4607
-msgid "Open this workspace when opening the package"
+#: ../lib/advene/util/helper.py:458
+msgid "---- Attributes ----"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4641
-#, python-format
-msgid "Error: the view %s exists and is not a workspace view."
+#: ../lib/advene/util/helper.py:461
+msgid "---- Methods ----"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4672
+#: ../lib/advene/util/helper.py:534
 #, python-format
-msgid "Cannot save default workspace: %s"
+msgid "Cannot read %(filename)s: %(error)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4682
-msgid "Standard workspace has been saved"
+#: ../lib/advene/util/helper.py:541
+#, python-format
+msgid "File %s is not an Advene zip package - no mimetype."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4689
-msgid "Website export"
+#: ../lib/advene/util/helper.py:543
+#, python-format
+msgid "File %(fname)s is not an Advene zip package - wrong mimetype %(type)s."
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4690
-msgid "Exporting views to a website"
+#: ../lib/advene/util/helper.py:559
+#, python-format
+msgid ""
+"Error:\n"
+"%s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4693
-#, fuzzy
-msgid "Output directory"
-msgstr "Cartella"
-
-#: ../lib/advene/gui/main.py:4702
-msgid "Specify the output directory"
+#: ../lib/advene/util/helper.py:641
+msgid "schema"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4711
-msgid "Maximum recursion depth"
+#: ../lib/advene/util/helper.py:641
+msgid "schemas"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4718
-msgid "Video URL"
+#: ../lib/advene/util/helper.py:642
+msgid "annotation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4720
-msgid ""
-"URL for the video, if it is available on a sharing website (Only Youtube for "
-"the moment).\n"
-" It can also be a h264/ogg file, which will in this case be handled by the "
-"HTML5 video player."
+#: ../lib/advene/util/helper.py:642
+msgid "annotations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4770
-#, fuzzy
-msgid "Could not export data: "
-msgstr "Impossibile salvare il file: %s"
+#: ../lib/advene/util/helper.py:643 ../lib/advene/util/helper.py:644
+msgid "annotation type"
+msgstr ""
 
-#: ../lib/advene/gui/main.py:4772
-#, python-format
-msgid "Website export to %s completed"
+#: ../lib/advene/util/helper.py:643 ../lib/advene/util/helper.py:644
+msgid "annotation types"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4811
-msgid "This video player is not able to grab specific screenshots"
+#: ../lib/advene/util/helper.py:645
+msgid "relation"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4821
-#, python-format
-msgid "Updating %d snapshots"
+#: ../lib/advene/util/helper.py:645
+msgid "relations"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4826
-msgid "No snapshot to update"
+#: ../lib/advene/util/helper.py:646 ../lib/advene/util/helper.py:647
+msgid "relation type"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4835 ../lib/advene/gui/main.py:4947
-msgid "You first must load a movie into Advene"
+#: ../lib/advene/util/helper.py:646 ../lib/advene/util/helper.py:647
+msgid "relation types"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4838 ../lib/advene/gui/main.py:4950
-#, python-format
-msgid "The movie %s does not seem to exist."
+#: ../lib/advene/util/helper.py:648
+msgid "query"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4895
-msgid "Generating screenshots"
+#: ../lib/advene/util/helper.py:648
+msgid "queries"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4900
-msgid ""
-"<b>Screenshot generation</b>\n"
-"\n"
-"Screenshots will be captured approximately every 500ms.\n"
-"\n"
-"If the movie was paused or playing, the capture will begin at the current "
-"position. Else, it will begin at the beginning of the movie.\n"
-"Note that the main interface will not be refreshed as long as this window is "
-"open."
+#: ../lib/advene/util/helper.py:649
+msgid "view"
+msgstr ""
+
+#: ../lib/advene/util/helper.py:649
+msgid "views"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4941
-msgid ""
-"The <b>shotdetect</b> application does not seem to be installed. Please "
-"check that it is present and that its path is correctly specified in "
-"preferences."
+#: ../lib/advene/util/helper.py:650
+msgid "package"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4981
-msgid ""
-"Cannot import shotdetect output. Did you install the shotdetect software?"
+#: ../lib/advene/util/helper.py:650
+msgid "packages"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:4998
-msgid "Incomplete shots"
+#: ../lib/advene/util/helper.py:662
+#, python-format
+msgid "No %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5001
+#: ../lib/advene/util/helper.py:664
 #, python-format
-msgid "Detected %s shots"
+msgid "1 %s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5103
+#: ../lib/advene/util/helper.py:666
 #, python-format
-msgid "Could not run shotdetect: %s"
+msgid "%(count)d %(plural)s"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5107
+#: ../lib/advene/util/website_export.py:63
 #, python-format
-msgid "Detecting shots from %s"
+msgid "%s exists but is not a directory. Cancelling website export"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5160
-msgid "Shot detection"
+#: ../lib/advene/util/website_export.py:69
+#, python-format
+msgid "%s does not exist"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5166
-msgid ""
-"<b>Shot detection</b>\n"
-"\n"
-"Advene will try to detect shots from the currently loaded movie. The "
-"threshold parameter is used to specify the sensitivity of the algorithm, and "
-"should typically be between 50 and 80. If too many shots are detected, try "
-"to augment its value."
+#: ../lib/advene/util/website_export.py:423
+msgid "Starting export"
 msgstr ""
 
-#: ../lib/advene/gui/main.py:5182
-msgid "Sensitivity"
+#: ../lib/advene/util/website_export.py:452
+#, python-format
+msgid "Depth %d"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:138
-msgid "Choose the file to insert"
+#: ../lib/advene/util/website_export.py:456
+#, python-format
+msgid "Depth %(depth)d: processing %(url)s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:146
-msgid "Select a valid identifier"
+#: ../lib/advene/util/website_export.py:478
+msgid "Finalizing"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:147
+#: ../lib/advene/util/website_export.py:512
 #, python-format
 msgid ""
-"The filename %s contains invalid characters\n"
-"that have been replaced.\n"
-"You can modify this identifier if necessary:"
+"<p><strong>You should probably begin at <a href=\"%(href)s\">%(title)s</a>.</"
+"strong></p>"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:158
-#, fuzzy
-msgid "Choose the soundclip to insert"
-msgstr "Scegli un elemento da inserire."
-
-#: ../lib/advene/gui/popup.py:162
-msgid "Choose the directory to insert"
+#: ../lib/advene/util/website_export.py:555
+msgid "Export complete"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:177
-msgid "Named-Entity extraction using NERD"
+#: ../lib/advene/util/importer.py:134
+msgid "Generic importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:181
-msgid ""
-"Give the offset to use\n"
-"on specified element.\n"
-"It is in ms and can be\n"
-"either positive or negative."
+#: ../lib/advene/util/importer.py:188
+msgid "Usage: %prog [options] source-file destination-file"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:225
-#, python-format
-msgid "Replace content in %s"
+#: ../lib/advene/util/importer.py:192
+msgid "Specify the offset in ms"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:228
-#, fuzzy, python-format
-msgid "Replace content in annotations of type %s"
-msgstr "di un tipo di annotazione"
-
-#: ../lib/advene/gui/popup.py:231
-#, fuzzy
-msgid "Replace content in all annotations"
-msgstr "Tutte le annotazioni"
-
-#: ../lib/advene/gui/popup.py:324
-#, python-format
-msgid "Copy id %s"
+#: ../lib/advene/util/importer.py:264
+msgid ""
+"Import filter error. The asynchronous API should be used, please report a "
+"bug."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:358
-#, python-format
+#: ../lib/advene/util/importer.py:266
 msgid ""
-"<b>Statistics about %s</b>\n"
-"\n"
+"Import filter error. No conversion method is defined,  please report a bug."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:364
-#, python-format
-msgid "Renumbering annotations of type %s"
-msgstr ""
+#: ../lib/advene/util/importer.py:532
+#, fuzzy
+msgid "ExternalApp importer"
+msgstr "Importatore"
 
-#: ../lib/advene/gui/popup.py:371
+#: ../lib/advene/util/importer.py:546
+#, python-format
 msgid ""
-"<b>Renumber all annotations according to their order.</b>\n"
-"\n"
-"<i>Note that this action cannot be undone.</i>\n"
-"Replace the first numeric value of the annotation content with the new "
-"annotation number.\n"
-"If no numeric value is found and the annotation is structured, it will "
-"insert the number.\n"
-"If no numeric value is found and the annotation is of type text/plain, it "
-"will overwrite the annotation content.\n"
-"The offset parameter allows you to renumber from a given annotation."
+"The <b>%s</b> application does not seem to be installed. Please check that "
+"it is present and that its path is correctly specified in preferences."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:377 ../lib/advene/gui/popup.py:484
-msgid "Offset"
+#: ../lib/advene/util/importer.py:548
+#, python-format
+msgid "The file %s does not seem to exist."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:399
+#: ../lib/advene/util/importer.py:570
 #, fuzzy, python-format
-msgid "Renumbering %d annotations"
-msgstr "Tutte le annotazioni"
+msgid "Could not run %(appname)s: %(msg)s"
+msgstr "Impossibile salvare il file: %s"
 
-#: ../lib/advene/gui/popup.py:408
+#: ../lib/advene/util/importer.py:572
 #, fuzzy, python-format
-msgid "Annotation #%d"
-msgstr "Tipo di Annotazione"
+msgid "Processing %s"
+msgstr "Modifica %s"
 
-#: ../lib/advene/gui/popup.py:445
-#, python-format
-msgid ""
-"Exporting annotation %(title)s\n"
-"from %(begin)s to %(end)s\n"
-"to %%(filename)s"
+#: ../lib/advene/util/importer.py:576
+msgid "Cleaning up..."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:458
-msgid "Browse"
+#: ../lib/advene/util/importer.py:687
+msgid "Text importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:466 ../lib/advene/gui/popup.py:853
-msgid "Open in web browser"
+#: ../lib/advene/util/importer.py:700 ../lib/advene/util/importer.py:1225
+msgid "Specify the encoding of the input file (latin1, utf8...)"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:479
-#, fuzzy
-msgid "Search/replace content"
-msgstr "Elementi cercati"
+#: ../lib/advene/util/importer.py:703
+msgid "Should the timestamps be encoded relative to the first timestamp?"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:497
-msgid "Desactivate"
+#: ../lib/advene/util/importer.py:706
+msgid "Unit to consider for integers"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:514
-msgid "Loop"
+#: ../lib/advene/util/importer.py:709
+msgid ""
+"What timestamps are present in a line (only begin, both begin and end, or "
+"automatic recognition)"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:515
-msgid "Duplicate"
+#: ../lib/advene/util/importer.py:852
+msgid "lsdvd importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:519
-#, fuzzy
-msgid "Save snapshot..."
-msgstr "Visualizza %s"
+#: ../lib/advene/util/importer.py:879
+msgid "Processing data"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:521
+#: ../lib/advene/util/importer.py:897 ../lib/advene/util/importer.py:957
 #, fuzzy
-msgid "Extract video fragment"
-msgstr "Inserisci un indirizzo di un video stream"
-
-#: ../lib/advene/gui/popup.py:551
-msgid "Incoming"
-msgstr ""
+msgid "DVD Chapter"
+msgstr "Capitolo"
 
-#: ../lib/advene/gui/popup.py:567
-msgid "Outgoing"
+#: ../lib/advene/util/importer.py:901
+msgid "Launching lsdvd..."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:582
-msgid "Related annotations"
+#: ../lib/advene/util/importer.py:913
+msgid "chaplin importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:589
-msgid "Incoming relations"
+#: ../lib/advene/util/importer.py:971
+msgid "Xi importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:596
-msgid "Outgoing relations"
+#: ../lib/advene/util/importer.py:1039
+msgid "ELAN importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:612
+#: ../lib/advene/util/importer.py:1092
 #, python-format
-msgid "Begin: %s"
+msgid "Converting tier %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:614
-#, python-format
-msgid "End: %s"
+#: ../lib/advene/util/importer.py:1189
+msgid "Processing time slots"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:615
-#, fuzzy, python-format
-msgid "Duration: %s"
-msgstr "Relazioni"
+#: ../lib/advene/util/importer.py:1204
+msgid "Fixing forward references"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:622
-msgid "Members:"
+#: ../lib/advene/util/importer.py:1206
+msgid "Creating relations"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:635
-msgid "Edit package properties..."
+#: ../lib/advene/util/importer.py:1218
+msgid "Subtitle (SRT) importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:636 ../lib/advene/gui/popup.py:756
+#: ../lib/advene/util/importer.py:1276
 #, python-format
-msgid "%d annotations(s) - statistics"
+msgid "Subtitles from %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:638 ../lib/advene/gui/popup.py:864
-msgid "Create a new static view..."
+#: ../lib/advene/util/importer.py:1281
+msgid ""
+"Cannot decode subtitle file. Try to specify an encoding (latin1 perhaps?)."
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:639 ../lib/advene/gui/popup.py:865
-msgid "Create a new dynamic view..."
+#: ../lib/advene/util/importer.py:1292
+msgid "PRAAT importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:640 ../lib/advene/gui/popup.py:751
-msgid "Create a new annotation..."
+#: ../lib/advene/util/importer.py:1381
+msgid "CMML importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:642 ../lib/advene/gui/popup.py:867
-msgid "Create a new schema..."
+#: ../lib/advene/util/importer.py:1444
+msgid "Parsing clip information"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:643 ../lib/advene/gui/popup.py:862
-msgid "Create a new query..."
+#: ../lib/advene/util/importer.py:1544
+msgid "Creating CMML schema"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:651
-msgid "Create a new folder..."
+#: ../lib/advene/util/importer.py:1568
+msgid "Parsing stream information"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:652
-msgid "Create a new resource file..."
+#: ../lib/advene/util/importer.py:1602
+msgid "IRI importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:653
-msgid "Insert a new resource file..."
+#: ../lib/advene/util/importer.py:1611
+msgid "Generate one type per view"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:654
-msgid "Insert a new resource directory..."
+#: ../lib/advene/util/importer.py:1630
+#, python-format
+msgid "Parsing ensemble %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:663 ../lib/advene/gui/popup.py:665
-msgid "Insert a soundclip..."
+#: ../lib/advene/util/importer.py:1641
+#, python-format
+msgid "Parsing decoupage %s"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:676
-msgid "Play sound"
+#: ../lib/advene/util/importer.py:1676
+msgid "Parsing views"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:686
-msgid "Create a new annotation type..."
+#: ../lib/advene/util/importer.py:1723 ../lib/advene/util/importer.py:1812
+msgid "Initializing package"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:688
-msgid "Create a new relation type..."
+#: ../lib/advene/util/importer.py:1761
+msgid "IRIData importer"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:699
-#, python-format
-msgid "A caption dynamic view for %s already seems to exist."
+#: ../lib/advene/util/importer.py:1775
+msgid "Parsing sound values"
 msgstr ""
 
-#: ../lib/advene/gui/popup.py:708
-#, fuzzy, python-format
-msgid "Caption %s annotations"
-msgstr "Trascrizione delle annotazioni"
+#: ../lib/advene/util/importer.py:1787
+msgid "Creating annotations"
+msgstr ""
 
-#: ../lib/advene/gui/popup.py:740
-#, fuzzy
-msgid "Create a comment view"
-msgstr "Vista statica predefinita"
+#~ msgid "Preview"
+#~ msgstr "Anteprima"
 
-#: ../lib/advene/gui/popup.py:741
-#, fuzzy
-msgid "Generate a caption dynamic view..."
-msgstr "Vista dinamica predefinita"
+#~ msgid "<h1>No playlist</h1>"
+#~ msgstr "<h1>Nessuna playlist</h1>"
 
-#: ../lib/advene/gui/popup.py:742
-msgid "Display as transcription"
-msgstr ""
+#, fuzzy
+#~ msgid "Cannot export to %(host)s:%(port)s %(error)s"
+#~ msgstr "Impossibile salvare il file: %s"
 
-#: ../lib/advene/gui/popup.py:743
-msgid "Display annotations in table"
-msgstr ""
+#, fuzzy
+#~ msgid "Cannot send data to %(host)s:%(port)s %(error)s"
+#~ msgstr "Impossibile salvare il file: %s"
 
-#: ../lib/advene/gui/popup.py:744
-msgid "Export to another format..."
-msgstr ""
+#, fuzzy
+#~ msgid "Cannot send event %(nb)s to %(host)s:%(port)s %(error)s"
+#~ msgstr "Impossibile salvare il file: %s"
 
-#: ../lib/advene/gui/popup.py:746
-msgid "Extract Named Entities..."
-msgstr ""
+#~ msgid "All annotations"
+#~ msgstr "Tutte le annotazioni"
 
-#: ../lib/advene/gui/popup.py:752
 #, fuzzy
-msgid "Delete all annotations"
-msgstr "Tutte le annotazioni"
+#~ msgid "Display log file"
+#~ msgstr "Visualizza %s"
 
-#: ../lib/advene/gui/popup.py:753
 #, fuzzy
-msgid "Renumber annotations..."
-msgstr "Tutte le annotazioni"
+#~ msgid "Advene log"
+#~ msgstr "Advene"
 
-#: ../lib/advene/gui/popup.py:754
 #, fuzzy
-msgid "Shot validation view..."
-msgstr "Seleziona un'azione"
-
-#: ../lib/advene/gui/popup.py:766
-#, python-format
-msgid "A follow dynamic view for %s already seems to exist."
-msgstr ""
+#~ msgid "WebAnnotation importer"
+#~ msgstr "Tipo di Annotazione"
 
-#: ../lib/advene/gui/popup.py:775
-#, fuzzy, python-format
-msgid "Follow %s relation-type"
-msgstr "Tipo di Annotazione"
+#, fuzzy
+#~ msgid "Schema editor"
+#~ msgstr "Schema"
 
-#: ../lib/advene/gui/popup.py:784
-msgid "Follow the relation"
-msgstr ""
+#, fuzzy
+#~ msgid "Mean duration"
+#~ msgstr "Seleziona un'azione"
 
-#: ../lib/advene/gui/popup.py:804
-msgid "Delete all relations..."
-msgstr ""
+#, fuzzy
+#~ msgid "Display"
+#~ msgstr "Visualizza %s"
 
-#: ../lib/advene/gui/popup.py:805
 #, fuzzy
-msgid "Create montage from related annotations"
-msgstr "Trascrizione delle annotazioni"
+#~ msgid "Remove relation type"
+#~ msgstr "Tipo di Annotazione"
 
-#: ../lib/advene/gui/popup.py:806
-msgid "Create dynamic view following relations"
-msgstr ""
+#, fuzzy
+#~ msgid "Remove annotation type"
+#~ msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/popup.py:824
-msgid "Apply query on..."
-msgstr ""
+#, fuzzy
+#~ msgid "New schema"
+#~ msgstr "Schema"
 
-#: ../lib/advene/gui/popup.py:849
-msgid "Activate view"
-msgstr ""
+#, fuzzy
+#~ msgid "New annotation type"
+#~ msgstr "di un tipo di annotazione"
 
-#: ../lib/advene/gui/popup.py:851
-msgid "Open adhoc view"
-msgstr ""
+#, fuzzy
+#~ msgid "New relation type"
+#~ msgstr "Tipo di Annotazione"
 
 #, fuzzy
 #~ msgid "Adjust annotation bounds..."
@@ -9186,10 +9209,6 @@ msgstr ""
 #~ msgid "Info"
 #~ msgstr "Se"
 
-#, fuzzy
-#~ msgid "Export trace"
-#~ msgstr "Importatore"
-
 #~ msgid "No valid importer"
 #~ msgstr "Nessun importatore valido"
 
@@ -9215,10 +9234,6 @@ msgstr ""
 #~ "Impossibile leggere il dato:\n"
 #~ "%s"
 
-#, fuzzy
-#~ msgid "Resource"
-#~ msgstr "Modifica %s"
-
 #~ msgid "Attributes"
 #~ msgstr "Attributi"
 
diff --git a/pyinstaller/advene-bin.spec b/pyinstaller/advene-bin.spec
index 6476253..a6401ab 100644
--- a/pyinstaller/advene-bin.spec
+++ b/pyinstaller/advene-bin.spec
@@ -3,10 +3,10 @@ Name: advene-bin
 Version: 0.21
 Release: 1
 License: GPL
-Packager: Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+Packager: Olivier Aubert <contact at olivieraubert.net>
 Group: Video
-URL: http://liris.cnrs.fr/advene/
-Source: http://liris.cnrs.fr/advene/download/
+URL: http://advene.org/
+Source: http://advene.org/download/
 Buildroot: FIXME
 
 %define _rpmdir ../
diff --git a/scripts/dummy_server.py b/scripts/dummy_server.py
new file mode 100755
index 0000000..590b762
--- /dev/null
+++ b/scripts/dummy_server.py
@@ -0,0 +1,99 @@
+#!/usr/bin/python
+
+import logging
+logger = logging.getLogger(__name__)
+
+import BaseHTTPServer
+import itertools
+import json
+import random
+import urlparse
+
+CONCEPT_LIST = [ "dog", "cat", "bird", "tree", "human" ]
+
+HOST_NAME = 'localhost'
+PORT_NUMBER = 9000
+
+class RESTHandler(BaseHTTPServer.BaseHTTPRequestHandler):
+    def do_HEAD(s):
+        s.send_response(200)
+        s.send_header("Content-type", "application/json")
+        s.end_headers()
+
+    def do_GET(s):
+        s.send_response(200)
+        s.send_header("Content-type", "application/json")
+        s.end_headers()
+        json.dump({"status": 200, "message": "OK", "data": {
+            "capabilities": {
+                "minimum_batch_size": 1, # # of frames
+                "maximum_batch_size": 500, # # of frames
+                "available_models": [ {
+                    "id": "standard", # id of the model
+                    "label": "Standard detection", # user-readable label for the model
+                    "image_size": 224 # width/height for squared images
+                }, {
+                    "id": "dummy", # id of the model
+                    "label": "Dummy detection", # user-readable label for the model
+                    "image_size": 512 # width/height for squared images
+                }
+                ]
+            }
+        }}, s.wfile)
+
+    def do_POST(s):
+        length = int(s.headers['Content-Length'])
+        body = s.rfile.read(length).decode('utf-8')
+        if s.headers['Content-type'] == 'application/json':
+            post_data = json.loads(body)
+        else:
+            post_data = urlparse.parse_qs(body)
+        logger.info("Got a POST request [%d annotations, %d bytes]", len(post_data['annotations']), length)
+        s.send_response(200)
+        s.send_header("Content-type", "application/json")
+        s.end_headers()
+
+        for a in post_data['annotations']:
+            logger.debug("Extracting for %s", a['annotationid'])
+            # Emulate data extraction. 3 concepts max per annotation.
+            concepts = []
+            for _ in range(3):
+                # The pseudo-detection takes place here :-)
+                label = random.choice(CONCEPT_LIST)
+
+                concepts.append({
+                    'annotationid': a['annotationid'],
+                    'confidence': random.random(),
+                    # The following formula is here to make sure that
+                    # we have a valid range even if the annotation
+                    # bounds are invalid (begin == end or begin >
+                    # end). In real code, it should be derived from
+                    # the first annotation thumbnail were the concept
+                    # is detected.
+                    'timecode': random.randrange(a['begin'], a['begin'] + (max(a['end'] - a['begin'], 0) or 5000)),
+                    'label': label,
+                    'uri': 'http://concept.org/%s' % label
+                    })
+            a['concepts'] = concepts
+
+        json.dump({
+            "status": 200,
+            "message": "OK",
+            "data": {
+                'media_filename': post_data.get('media_filename', ''),
+                'media_uri': post_data.get('media_uri', ''),
+                'model': post_data.get('model', ''),
+                'concepts': list(itertools.chain(c for a in post_data['annotations'] for c in a['concepts']))
+            }
+        }, s.wfile)
+
+if __name__ == '__main__':
+    logging.basicConfig(level=logging.DEBUG)
+    server_class = BaseHTTPServer.HTTPServer
+    httpd = server_class((HOST_NAME, PORT_NUMBER), RESTHandler)
+    logger.info("Starting dummy REST server on %s:%d", HOST_NAME, PORT_NUMBER)
+    try:
+        httpd.serve_forever()
+    except KeyboardInterrupt:
+        pass
+    httpd.server_close()
diff --git a/scripts/package_sorter.py b/scripts/package_sorter.py
index 5299ddc..0967199 100755
--- a/scripts/package_sorter.py
+++ b/scripts/package_sorter.py
@@ -24,17 +24,13 @@ import sys
 import xml.etree.ElementTree as ET
 from xml.etree.ElementTree import parse, Element, ElementTree, QName
 import string
+import operator
 
 def tag(name):
     """Return the namespaced tag.
     """
     return '{%s}%s' % (ns, name)
 
-def cmp_id(a, b):
-    """Compare id
-    """
-    return cmp(a.attrib['id'], b.attrib['id'])
-
 def sort_id(source):
     """Sort the source Element elements along their id.
 
@@ -44,17 +40,12 @@ def sort_id(source):
     dest.attrib.update(source.attrib)
     
     res=[ e for e in source ]
-    res.sort(cmp_id)
+    res.sort(key=lambda a: a.attrib['id'])
     
     for e in res:
         dest.append(e)
     return dest
 
-def cmp_time(a, b):
-    """Compare time
-    """
-    return cmp(a._begin, b._begin)
-
 def sort_time(source):
     """Sort the source Element elements along their time (for annotations) and id (for relations).
 
@@ -67,7 +58,7 @@ def sort_time(source):
     reltag=tag('relation')
 
     rel=[ e for e in source if e.tag == reltag ]
-    rel.sort(cmp_id)
+    rel.sort(key=operator.itemgetter('_begin'))
 
     an=[ e for e in source if e.tag == antag ]
     # Pre-parse begin times
@@ -78,7 +69,7 @@ def sort_time(source):
         else:
             print "Error: cannot find begin time for ", a.attrib['id']
             a._begin = 0
-    an.sort(cmp_time)
+    an.sort(key=operator.itemgetter('_begin'))
     
     for e in an:
         dest.append(e)
diff --git a/scripts/parse_objgraph b/scripts/parse_objgraph
new file mode 100755
index 0000000..469e569
--- /dev/null
+++ b/scripts/parse_objgraph
@@ -0,0 +1,76 @@
+#! /usr/bin/env python3
+
+# Parse objgraph.show_growth output to display data in a graph.
+# The output can be fed directly to gnuplot:
+# parse_objgraph file.log | gnuplot -p -
+
+# The considered format for the input log file is that any line that
+# does not start with a timestamp is considered as a objgraph data
+# line.
+# Any line starting with a timestamp will be used as a clock reference.
+# The idea is to log the current date before each call to show_growth:
+#
+#
+#
+# 2017-09-25T17:32:07.665522 - ------------ Object growth ---------------
+# builtins.function                      19123    +19123
+# builtins.dict                          12501    +12501
+# builtins.tuple                         10409    +10409
+# builtins.builtin_function_or_method     4839     +4839
+#
+
+import re
+import sys
+import gzip
+
+timestamp_re = re.compile('^\d\d\d\d-\d\d-\d\d')
+# Dict indexed by object
+data = {}
+current_timestamp = None
+input_filename = sys.argv[1]
+if input_filename.endswith('.gz'):
+    open_function = gzip.open
+else:
+    open_function = open
+with open_function(sys.argv[1], 'rt') as f:
+    for l in f:
+        if timestamp_re.search(l):
+            current_timestamp = l[:19]
+            continue
+        # Not starting with 2017-: for the moment, it can only be
+        # show_growth output
+        (obj, absolute, relative) = l.strip().split()
+        data.setdefault(obj, []).append([current_timestamp, absolute])
+
+try:
+    outname = sys.argv[2]
+except IndexError:
+    outname = "-"
+if outname == "-":
+    outfile = sys.stdout
+else:
+    outfile = open(outname, 'w')
+
+series = []
+# Dump data for gnuplot
+for obj, values in data.items():
+    if len(values) < 5:
+        continue
+    name = obj.replace('.', '_')
+    series.append(name)
+    outfile.write("${} << EOD\n".format(name))
+    for (d, v) in values:
+        outfile.write("%s %s\n" % (d, v))
+    outfile.write("EOD\n\n")
+
+# Cf https://stackoverflow.com/questions/12818797/gnuplot-plotting-several-datasets-with-titles-from-one-file
+#plot $series for [IDX=1:{}] datafile index (IDX-1) using 2:3 with lines title columnheader(1)
+outfile.write("""
+set xdata time
+set timefmt "%Y-%m-%dT%H:%M:%S"
+set format x "%H:%M:%S"
+
+plot {}
+""".format(',\\\n'.join('${name} using 1:2 with lines title "{obj}"'.format(name=s, obj=s.replace('_', '.')) for s in series)))
+outfile.close()
+
diff --git a/scripts/release b/scripts/release
new file mode 100755
index 0000000..0bc4d45
--- /dev/null
+++ b/scripts/release
@@ -0,0 +1,35 @@
+#! /bin/sh
+
+SYNTAX="$0 version_number"
+
+VERSION=${1:?$SYNTAX}
+errors=""
+
+cd "$(dirname $0)/.." || exit
+
+# Things to do/check upon release
+
+# Check translations
+# FIXME
+
+# Check that changelog is up-to-date
+if ! head -1 CHANGES.txt | grep -q "$VERSION"
+then
+    errors="${errors}Update CHANGES.txt\n"
+fi
+
+# Update core/version.py + date
+if ! grep -q "version='$VERSION'" lib/advene/core/version.py
+then
+    errors="${errors}Update version.py\n"
+fi
+
+if [ ! -z "$errors" ]
+then
+    echo "$errors"
+    exit 1
+fi
+
+echo "All checks ok for release. Tagging release/${VERSION}"
+# Tag -a release/N.N
+git tag -a "release/${VERSION}"
diff --git a/scripts/seq2package.py b/scripts/seq2package.py
index b93ce68..adc29db 100755
--- a/scripts/seq2package.py
+++ b/scripts/seq2package.py
@@ -1,4 +1,4 @@
-#! /usr/bin/env python
+#! /usr/bin/env python3
 
 """Convert a sequence to advene annotations.
 
@@ -34,7 +34,7 @@ def ts2ms(ts):
 
 filename=sys.argv[0]
 
-f=open(filename, 'r')
+f=open(filename, 'r', encoding='utf-8')
 regexp=re.compile('(\d+:\d+)\s(\d+:\d+)\s(.*)')
 
 for l in f:
@@ -43,9 +43,8 @@ for l in f:
         (t1, t2, data) = m.groups()
     begin=ts2ms(t1)
     end=ts2ms(t2)
-    print """<annotation type='#sequence' id='i%s%s'>
+    print("""<annotation type='#sequence' id='i%s%s'>
       <millisecond-fragment begin='%s' end='%s'/>
       <content>%s</content>
-    </annotation>    
-    """ % (begin, end, begin, end, data)
-
+    </annotation>
+    """ % (begin, end, begin, end, data))
diff --git a/scripts/update_doc b/scripts/update_doc
index 818da2e..87d5b74 100755
--- a/scripts/update_doc
+++ b/scripts/update_doc
@@ -12,11 +12,11 @@ then
 fi
 
 # Shortcuts
-wget --quiet 'http://liris.cnrs.fr/advene/wiki/index.php/AdveneShortcuts' -O $shortcuts
+wget --quiet 'http://advene.org/wiki/index.php/AdveneShortcuts' -O $shortcuts
 
 if [ $? == 0 ]
 then
-    perl -pi -e 's/<(style|link|script).+?<\/\1>//; s/<span class=.editsection.+?<\/span>//; s/<div id=.jump-to-nav.+?<\/div>//; s/.+siteSub.+//; s!<head>!<head><link rel="stylesheet" type="text/css"  href="http://liris.cnrs.fr/advene/advene.css" />!; exit(0) if /Retrieved/' $shortcuts
+    perl -pi -e 's/<(style|link|script).+?<\/\1>//; s/<span class=.editsection.+?<\/span>//; s/<div id=.jump-to-nav.+?<\/div>//; s/.+siteSub.+//; s!<head>!<head><link rel="stylesheet" type="text/css"  href="http://advene.org/advene.css" />!; exit(0) if /Retrieved/' $shortcuts
 	echo "Shortcuts help updated in $shortcuts"
 else
 	echo "Wget error. $shortcuts is now corrupted."
diff --git a/scripts/vcd/Dockerfile b/scripts/vcd/Dockerfile
new file mode 100644
index 0000000..fe092df
--- /dev/null
+++ b/scripts/vcd/Dockerfile
@@ -0,0 +1,15 @@
+FROM ubuntu:17.04
+
+RUN apt-get update && apt-get install -y python \
+    python-pip \
+    python-pil \
+    python-h5py
+
+RUN pip install keras==2.0.5 tensorflow==1.2.0rc2
+
+ADD vcd-server.py /vcd-server.py
+
+VOLUME [ "/root/.keras/" ]
+VOLUME [ "/var/vcd/cache" ]
+
+ENTRYPOINT [ "python" , "/vcd-server.py"]
diff --git a/scripts/vcd/vcd-server.py b/scripts/vcd/vcd-server.py
new file mode 100755
index 0000000..8b4a709
--- /dev/null
+++ b/scripts/vcd/vcd-server.py
@@ -0,0 +1,125 @@
+#!/usr/bin/python
+
+import logging
+logger = logging.getLogger(__name__)
+
+import http.server
+import json
+import urllib.parse
+import os
+
+from keras.applications.resnet50 import ResNet50
+from keras.preprocessing import image
+from keras.applications.resnet50 import preprocess_input, decode_predictions
+import numpy as np
+from PIL import Image
+from io import BytesIO
+import base64
+import itertools
+
+HOST_NAME = ''
+PORT_NUMBER = 9000
+
+CACHE_DIR = "/var/vcd/cache"
+
+model = ResNet50(weights='imagenet')
+target_size = (224,224)
+top_n_preds = 3
+
+#create cachedir
+if not os.path.exists(CACHE_DIR):
+    os.makedirs(CACHE_DIR)
+
+class RESTHandler(http.server.BaseHTTPRequestHandler):
+    def do_HEAD(s):
+        s.send_response(200)
+        s.send_header("Content-type", "application/json")
+        s.end_headers()
+
+    def do_GET(s):
+        s.send_response(200)
+        s.send_header("Content-type", "application/json")
+        s.end_headers()
+        json.dump({"status": 200, "message": "OK", "data": {
+            "capabilities": {
+                "minimum_batch_size": 1, # # of frames
+                "maximum_batch_size": 500, # # of frames
+                "available_models": [
+#                    {
+#                    "id": "concept_id",
+#                    "label": "concept_label",
+#                    "image_size": NNN # width/height for squared images
+#                }
+                ]
+            }
+        }}, s.wfile)
+
+    def do_POST(s):
+        length = int(s.headers['Content-Length'])
+        body = s.rfile.read(length).decode('utf-8')
+        if s.headers['Content-type'] == 'application/json':
+            post_data = json.loads(body)
+        else:
+            post_data = urllib.parse.parse_qs(body)
+
+        target_size
+        batch_x = np.zeros((len(post_data['frames']),target_size[0],target_size[1],3), dtype=np.float32)
+        for i,frame in enumerate(post_data['frames']):
+            # Load image to PIL format
+            img = Image.open(BytesIO(base64.b64decode(frame['screenshot'])))
+            # cache frame - FIXME: currently there is no mean to identify the video - same timstamp will overwrite an old frame (hash?)
+            img.save('/var/vcd/cache/{0}.png'.format(frame['timecode']))
+            if img.mode != 'RGB':
+                img = img.convert('RGB')
+            # ResNet50 expects images at 224x224 scale:
+            hw_tuple = (target_size[1], target_size[0])
+            if img.size != hw_tuple:
+                img = img.resize(hw_tuple)
+            x = image.img_to_array(img)
+            x = np.expand_dims(x, axis=0)
+            x = preprocess_input(x)
+            batch_x[i] = x[0,:,:,:]
+        preds = model.predict_on_batch(np.asarray(batch_x))
+
+        # decode the results into a list of tuples (class, description, probability)
+        # (one such list for each sample in the batch)
+        decoded = decode_predictions(preds, top=top_n_preds)
+        confidences = dict()
+        for t in itertools.chain.from_iterable(decoded):
+            if t[1] in confidences:
+                confidences[t[1]].append(float(t[2]))
+            else:
+                confidences[t[1]] = [float(t[2])]
+
+        s.send_response(200)
+        s.send_header("Content-type", "application/json")
+        s.end_headers()
+        json.dump({
+            "status": 200,
+            "message": "OK",
+            "data": {
+                # FIXME: JSON skeleton only, fix detection iself (cf
+                # dummy_server.py)
+                'media_filename': 'repeat_from_query',
+                'media_uri': 'repeat from query',
+                'concepts': [
+                    {
+                        'annotationid': aid,
+                        'confidence': max(confidences[l]),
+                        'timecode': timestamp_in_ms,
+                        'label': l,
+                        'uri': 'http://concept.org/%s' % l
+                    } for l in confidences
+                ]
+            }
+        }, s.wfile)
+
+if __name__ == '__main__':
+    server_class = http.server.HTTPServer
+    httpd = server_class((HOST_NAME, PORT_NUMBER), RESTHandler)
+    logger.info("Starting dummy REST server on %s:%d", HOST_NAME, PORT_NUMBER)
+    try:
+        httpd.serve_forever()
+    except KeyboardInterrupt:
+        pass
+    httpd.server_close()
diff --git a/setup.cfg b/setup.cfg
index 633e152..fe8394b 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,5 +1,5 @@
 [bdist_rpm]
-packager = Olivier Aubert <olivier.aubert at liris.cnrs.fr>
+packager = Olivier Aubert <contact at olivieraubert.net>
 doc_files = CHANGES.txt
 	    doc/
 group = Video
diff --git a/setup.py b/setup.py
index 9206fff..628f38a 100755
--- a/setup.py
+++ b/setup.py
@@ -1,25 +1,21 @@
-#!/usr/bin/python 
+#! /usr/bin/env python3
 
 import sys
 from distutils.core import setup
-from distutils.extension import Extension
+from distutils import log
+from setuptools import find_packages
 import os
-import string
-import re
-import sys
 
 # We define the main script name here (file in bin), since we have to change it for MacOS X
 SCRIPTNAME='advene'
 
 def check_changelog(maindir, version):
     """Check that the changelog for maindir matches the given version."""
-    f=open(os.path.join( maindir, "CHANGES.txt" ), 'r')
+    f=open(os.path.join( maindir, "CHANGES.txt" ), 'r', encoding='utf-8')
     l=f.readline()
     f.close()
     if not l.startswith('advene (' + version + ')'):
-        print "The CHANGES.txt does not seem to match version " + version
-        print l
-        print "Update either the CHANGES.txt or the lib/advene/core/version.py file"
+        log.error("The CHANGES.txt does not seem to match version %s\n%s\nUpdate either the CHANGES.txt or the lib/advene/core/version.py file", version, l)
         sys.exit(1)
     return True
 
@@ -76,20 +72,20 @@ if sys.platform == 'win32':
 	    "includes": "email.header,pango,pangocairo,cairo,atk,gtk,gio,pygst,gst,gtk.keysyms,gobject,encodings,encodings.latin_1,encodings.utf_8,encodings.cp850,encodings.cp437,encodings.cp1252,encodings.utf_16_be," + ",".join( get_plugin_list('plugins') + get_plugin_list('gui', 'plugins') + get_plugin_list('gui', 'views') + get_plugin_list('gui', 'edit') ),
 	    "excludes": [ "Tkconstants","Tkinter","tcl" ],
 	    "dll_excludes": ["libgstvideo-0.10.dll","libgstpbutils-0.10.dll","libgstinterfaces-0.10.dll","libgstdataprotocol-0.10.dll","libgstbase-0.10.dll","libgstnet-0.10.dll","libgstcontroller-0.10.dll","libgstaudio-0.10.dll","libgsttag-0.10.dll","libgstreamer-0.10.dll","libvlc.dll","libvlc-control.dll", "libglade-2.0-0.dll"],
-	    #         		 ["iconv.dll","intl.dll","libatk-1.0-0.dll", 
+	    #         		 ["iconv.dll","intl.dll","libatk-1.0-0.dll",
 	    #                          "libgdk_pixbuf-2.0-0.dll","libgdk-win32-2.0-0.dll",
 	    #                          "libglib-2.0-0.dll","libgmodule-2.0-0.dll",
 	    #                          "libgobject-2.0-0.dll","libgthread-2.0-0.dll",
 	    #                          "libgtk-win32-2.0-0.dll","libpango-1.0-0.dll",
 	    #                          "libpangowin32-1.0-0.dll"],
-	    
+
          }
 	}
 elif sys.platform == 'darwin':
     import py2app
     SCRIPTNAME='advene_gui.py'
     platform_options['app'] = [ 'bin/%s' % SCRIPTNAME ]
-    platform_options['options'] = dict(py2app=dict( 
+    platform_options['options'] = dict(py2app=dict(
                     iconfile='mac/Advene.icns',
                     #includes=",".join( [ l.strip() for l in open('mac_includes.txt') ]),
                     includes="AppKit,_hashlib,hashlib,email.header,pango,cairo,ctypes,gtk,gtk.keysyms,atk,gobject,encodings,encodings.latin_1,encodings.utf_8,encodings.cp850,encodings.cp437,encodings.cp1252,encodings.utf_16_be,cPickle,optparse,sets,pprint,cgi,webbrowser,sgmllib,zipfile,shutil,sched,imghdr,BaseHTTPServer,Cookie,ConfigParser,xmlrpclib,Queue,csv,filecmp," + ",".join( get_plugin_list('plugins') + get_plugin_list('gui', 'plugins') + get_plugin_list('gui', 'views') + get_plugin_list('gui', 'edit') ),
@@ -103,7 +99,7 @@ elif sys.platform == 'darwin':
                        CFBundleExecutable         = "Advene",
                        CFBundleIdentifier         = "com.oaubert.advene",
                    ),
-                 ) 
+                 )
                )
 
 def get_packages_list():
@@ -112,20 +108,11 @@ def get_packages_list():
     Return a list of packages (dot notation) suitable as packages parameter
     for distutils.
     """
-    l=[]
-    def ispackage(pl, dirname, fnames):
-        if 'linux' in sys.platform and ('cherrypy' in dirname or dirname.endswith('simpletal')):
-            # On linux (at least, Debian and Ubuntu), cherrypy and
-            # simpletal are packaged. So do not consider them in the
-            # packages list.
-            fnames[:]=[]
-        elif '__init__.py' in fnames:
-            l.append(dirname)
-    os.path.walk('lib', ispackage, l)
-    res=[ ".".join(name.split(os.path.sep)[1:]) for name in l ]
-    return res
-
-                 
+    if 'linux' in sys.platform:
+        return find_packages('lib', exclude=["cherrypy.*"])
+    else:
+        return find_packages('lib')
+
 def generate_data_dir(dir_, prefix="", postfix=""):
     """Return a structure suitable for datafiles from a directory.
 
@@ -137,15 +124,14 @@ def generate_data_dir(dir_, prefix="", postfix=""):
     """
     l = []
     installdir=prefix+dir_+postfix
-    def store(pl, dirname, fnames):
-	if dirname.find('.svn') < 0 and fnames:
+    for dirname, dnames, fnames in os.walk(dir_):
+        if fnames:
             if dirname.startswith(dir_):
                 installdirname=dirname.replace(dir_, installdir, 1)
-            pl.append((installdirname, [ absf
-                                         for absf in [ os.path.sep.join((dirname,f)) 
-                                                       for f in fnames  ]
-                                         if not os.path.isdir(absf) ]))
-    os.path.walk(dir_, store, l)
+            l.append((installdirname, [ absf
+                                        for absf in [ os.path.sep.join((dirname,f))
+                                                      for f in fnames  ]
+                                        if not os.path.isdir(absf) ]))
     return l
 
 def generate_data_files():
@@ -165,21 +151,21 @@ def generate_data_files():
     if os.path.isdir("locale"):
         r.extend(generate_data_dir("locale", prefix=prefix))
     else:
-        print """**WARNING** You should generate the locales with "cd po; make mo"."""
+        log.warn("""**WARNING** You should generate the locales with "cd po; make mo".""")
     if sys.platform.startswith('linux'):
         # Install specific data files
         r.append( ( 'share/applications', [ 'debian/advene.desktop' ] ) )
     return r
 
 myname = "Olivier Aubert"
-myemail = "olivier.aubert at liris.cnrs.fr"
+myemail = "contact at olivieraubert.net"
 
 setup (name = "advene",
        version = _version,
        description = "Annotate DVds, Exchange on the NEt",
        keywords = "dvd,video,annotation",
        author = "Advene project team",
-       author_email = "advene at liris.cnrs.fr",
+       author_email = "contact at olivieraubert.net",
        maintainer = myname,
        maintainer_email = myemail,
        url = "http://www.advene.org/",
@@ -214,11 +200,11 @@ setup (name = "advene",
 """,
 
        package_dir = {'': 'lib'},
-       
+
        packages = get_packages_list(),
 
        scripts = [ 'bin/%s' % SCRIPTNAME ],
-       
+
        data_files = generate_data_files(),
 
        classifiers = [
@@ -231,6 +217,6 @@ setup (name = "advene",
     'Operating System :: OS Independent',
     'Topic :: Multimedia :: Video :: Non-Linear Editor'
     ],
- 
+
     **platform_options
 )
diff --git a/share/advene.css b/share/advene.css
new file mode 100644
index 0000000..4a9040d
--- /dev/null
+++ b/share/advene.css
@@ -0,0 +1,65 @@
+#fullscreen_player {
+    background-color: #000;
+    color: #fff;
+}
+
+.advene_drag_icon {
+    background-color: #000;
+    color: #fff;
+}
+
+.black_on_black {
+    background-color: #000;
+    color: #000;
+}
+
+.advene_caption {
+    background-color: #000;
+    color: #fff;
+}
+
+.restrict_playing_button {
+    margin: 0;
+    padding: 0;
+}
+
+.frameselector_before {
+    background-color: #fcc;
+}
+
+.frameselector_after {
+    background-color: #000;
+}
+
+.frameselector_frame {
+    border-width: 4px;
+}
+
+.frameselector_frame_both:focus {
+    border-color: green;
+}
+.frameselector_frame_left:focus {
+    border-color: green;
+    border-left-color: #ff8888;
+}
+.frameselector_frame_right:focus {
+    border-color: green;
+    border-right-color: #ff8888;
+}
+
+.frameselector_frame_both.frameselector_selected {
+    border-left-color: red;
+    border-right-color: red;
+}
+
+.frameselector_frame_left.frameselector_selected {
+    border-left-color: red;
+}
+
+.frameselector_frame_right.frameselector_selected {
+    border-right-color: red;
+}
+
+.timestamp_label {
+    font-size: x-small;
+}
diff --git a/share/default_rules.xml b/share/default_rules.xml
index 71d6ed7..abd7bb4 100644
--- a/share/default_rules.xml
+++ b/share/default_rules.xml
@@ -1,17 +1,5 @@
 <?xml version='1.0' encoding='UTF-8'?>
 <ruleset xmlns='http://experience.univ-lyon1.fr/advene/ns/advenetool'>
-  <rule name='Take snapshot on begin'>
-    <event name='AnnotationBegin'/>
-    <action name='Snapshot'>
-      <param name='position' value='annotation/fragment/begin'/>
-    </action>
-  </rule>
-  <rule name='Take snapshot on end'>
-    <event name='AnnotationEnd'/>
-    <action name='Snapshot'>
-      <param name='position' value='annotation/fragment/end'/>
-    </action>
-  </rule>
   <rule name='Package load warning'>
     <event name='PackageLoad'/>
     <action name='Message'>
diff --git a/share/exporters.xml b/share/exporters.xml
index b6167b2..c5e91f7 100644
--- a/share/exporters.xml
+++ b/share/exporters.xml
@@ -51,8 +51,8 @@
         <title xmlns="http://purl.org/dc/elements/1.1/">SVG</title>
 	<extension xmlns="http://experience.univ-lyon1.fr/advene/ns/advenetool">svg</extension>
       </meta>
-      <content mime-type="image/svg+xml"><?xml version="1.0"  encoding="UTF-8"?>
-<svg tal:define="hoffset python:150 ; voffset python: 30 ; line_height python: 30 ; duration package/meta/advenetool/duration"  xmlns='http://www.w3.org/2000/svg'  xmlns:xlink='http://www.w3.org/1999/xlink'  xmlns:tal='http://xml.zope.org/namespaces/tal' version='1'   x='0' y='0' tal:attributes="width python:hoffset + long(duration) ; height python:line_height * (2 + len(package.annotationTypes))">
+      <content encoding="utf-8" mime-type="image/svg+xml"><?xml version="1.0"  encoding="UTF-8"?>
+<svg tal:define="hoffset python:150 ; voffset python:30 ; line_height python:30 ; duration package/meta/advenetool/duration"  xmlns='http://www.w3.org/2000/svg'  xmlns:xlink='http://www.w3.org/1999/xlink'  xmlns:tal='http://xml.zope.org/namespaces/tal' version='1'   x='0' y='0' tal:attributes="width python:int(hoffset) + int(duration) ; height python:int(line_height) * (2 + len(package.annotationTypes))">
 
 <script type="text/ecmascript">
       var hoffset = <span tal:replace="hoffset">150</span>;
@@ -125,10 +125,10 @@
 
 <g id="scale_layout" tal:attributes="transform string:translate(${hoffset} 0)">
 <!-- Header generation -->
-<span tal:omit-tag="" tal:repeat="i python:range(int(duration) / 60000)">
-  <span tal:omit-tag="" tal:define="t python:i*60000 ; pos python:t">
+<span tal:omit-tag="" tal:repeat="i python:range(int(int(duration) / 60000))">
+  <span tal:omit-tag="" tal:define="t python:int(i)*60000 ; pos python:t">
     <line tal:attributes="x1 pos ; x2 pos" y1="0" y2="20" stroke="black" ></line>
-    <text tal:attributes="x python:pos-20" y="10" tal:content="t/formatted"  font-family="sans-serif" font-size="10" stroke="black">Timestamp</text>
+    <text tal:attributes="x python:int(pos)-20" y="10" tal:content="t/formatted"  font-family="sans-serif" font-size="10" stroke="black">Timestamp</text>
   </span>
 </span>
 </g>
@@ -136,9 +136,9 @@
 <g id="legend_layout" tal:attributes="transform string:translate(0 ${voffset})">
 <!-- Looping on annotation types -->
 <span tal:omit-tag="" tal:repeat="at here/annotationTypes">
-   <span tal:omit-tag="" tal:define="vpos python:line_height*repeat['at'].getIndex() + 30" >
+   <span tal:omit-tag="" tal:define="vpos python:int(line_height)*repeat['at'].getIndex() + 30" >
      <a tal:attributes="xlink:href at/absolute_url">
-        <rect x="1" tal:attributes="y python:vpos-15 ; width python:hoffset-5 ; style string:fill:${at/color | string:none}"  height="20" stroke="black"></rect>
+        <rect x="1" tal:attributes="y python:int(vpos)-15 ; width python:int(hoffset)-5 ; style string:fill:${at/color | string:none}"  height="20" stroke="black"></rect>
         <text x="3" tal:attributes="y vpos ; id at/id"  tal:content="at/title" stroke="black" font-size="13" font-family="sans-serif">Titre</text>
     </a>
    </span>
@@ -149,10 +149,10 @@
 <!-- Looping again on annotation types -->
   <span tal:omit-tag="" tal:repeat="at here/annotationTypes">
 
-      <span tal:omit-tag="" tal:define="vpos python:line_height*repeat['at'].getIndex()+30" >
+      <span tal:omit-tag="" tal:define="vpos python:int(line_height)*repeat['at'].getIndex()+30" >
  
       <!-- Looping on annotations -->
-         <span tal:omit-tag=""   tal:define="rpos python:vpos-15" tal:repeat="a at/annotations">
+         <span tal:omit-tag=""   tal:define="rpos python:int(vpos)-15" tal:repeat="a at/annotations">
 
 	    <a class="transcript" tal:attributes="xlink:href a/player_url ; title a/content/data ; data-annotation a/id">
                <rect tal:attributes="x python:a.fragment.begin ; width python:a.fragment.duration ; y rpos ; style string:fill:${a/color | string:none}"  height="20" stroke="black"></rect>
@@ -722,6 +722,51 @@ ktbs:hasSubject "<span tal:replace="package/author"></sp
     </span>
     ]
  }
+ </content></view><view dc:creator="oaubert" dc:date="2017-02-02" id="WebAnnotation" viewable-class="*"><meta><title xmlns="http://purl.org/dc/elements/1.1/">WebAnnotation</title>
+	<extension xmlns="http://experience.univ-lyon1.fr/advene/ns/advenetool">json</extension>
+ </meta><content encoding="utf-8" mime-type="text/plain">{
+  "@context": [ 
+       "http://www.w3.org/ns/anno.jsonld",
+        { "local": "http://advene.org/ns/local#" } 
+        ],
+  "id": "<span tal:omit-tag="" tal:replace="here/uri">container_uri</span>",
+  "type": "AnnotationCollection",
+  "label": <span tal:omit-tag="" tal:replace="here/representation/json">container_title</span>,
+  "total": <span tal:omit-tag="" tal:replace="here/annotations/length">annotation_count</span>,
+  "first": {
+    "id": ""<span tal:omit-tag="" tal:replace="here/uri">container_uri</span>/page1",
+    "type": "AnnotationPage",
+    "startIndex": 0,
+    "items": [
+         <span tal:omit-tag="" tal:repeat="a here/annotations/sorted" >
+         {
+            "@context": "http://www.w3.org/ns/anno.jsonld",
+            "id": "<span tal:omit-tag="" tal:replace="a/uri/json">annotation_uri</span>",
+            "type": [ "Annotation", "local:<span tal:omit-tag="" tal:replace="a/type/id">type</span>" ],
+            "creator": {
+                "id": <span tal:omit-tag="" tal:replace="a/author/json">author</span>,
+                "type": "Person",
+                "nick": <span tal:omit-tag="" tal:replace="a/author/json">author</span>
+            },
+            "created": <span tal:omit-tag="" tal:replace="a/date/json">created</span>,
+            "body": {
+                "type": "TextualBody",
+                "value": <span tal:omit-tag="" tal:replace="a/content/data/json">annotation_data</span>,
+                "format": <span tal:omit-tag="" tal:replace="a/content/mimetype">content type</span>
+            },
+            "target": {
+                "source": "<span tal:omit-tag="" tal:replace="package/meta/advenetool/mediafile/urlquote">movie</span>",
+                "selector": {
+                    "type": "FragmentSelector",
+                    "conformsTo": "http://www.w3.org/TR/media-frags/",
+                    "value": "t=<span tal:omit-tag="" tal:replace="a/fragment/begin/formatted">begin</span>,<span tal:omit-tag="" tal:replace="a/fragment/end/formatted">end</span>"
+                }
+            }
+        }<span tal:omit-tag="" tal:condition="not:repeat/a/end">,</span>
+        </span>
+     ]
+  }
+}
 </content></view>
   </views>
-</package>
+</package>
\ No newline at end of file
diff --git a/share/web/shortcuts.html b/share/web/shortcuts.html
index 6ddf1ca..083f0f3 100644
--- a/share/web/shortcuts.html
+++ b/share/web/shortcuts.html
@@ -1,197 +1,216 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
-	<head><link rel="stylesheet" type="text/css"  href="http://liris.cnrs.fr/advene/advene.css" />
-		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-		<meta name="keywords" content="AdveneShortcuts" />
-<link rel="shortcut icon" href="/favicon.ico" />
-<link rel="search" type="application/opensearchdescription+xml" href="/advene/wiki/opensearch_desc.php" title="AdveneWiki (English)" />
-<link title="Creative Commons" type="application/rdf+xml" href="/advene/wiki/index.php?title=AdveneShortcuts&action=creativecommons" rel="meta" />
-<link rel="copyright" href="http://www.gnu.org/copyleft/fdl.html" />
-		<title>AdveneShortcuts - AdveneWiki</title>
-		
-		<link rel="stylesheet" type="text/css" media="print" href="/advene/wiki/skins/common/commonPrint.css?42b" />
-		<link rel="stylesheet" type="text/css" media="handheld" href="/advene/wiki/skins/monobook/handheld.css?42b" />
-		<!--[if lt IE 5.5000]><![endif]-->
-		<!--[if IE 5.5000]><![endif]-->
-		<!--[if IE 6]><![endif]-->
-		<!--[if IE 7]><![endif]-->
-		<!--[if lt IE 7]>
-		<meta http-equiv="imagetoolbar" content="no" /><![endif]-->
-		
-		<script type= "text/javascript">/*<![CDATA[*/
-var skin = "monobook";
-var stylepath = "/advene/wiki/skins";
-var wgArticlePath = "/advene/wiki/index.php/$1";
-var wgScriptPath = "/advene/wiki";
-var wgServer = "http://liris.cnrs.fr";
-var wgCanonicalNamespace = "";
-var wgCanonicalSpecialPageName = false;
-var wgNamespaceNumber = 0;
-var wgPageName = "AdveneShortcuts";
-var wgTitle = "AdveneShortcuts";
-var wgArticleId = "6";
-var wgIsArticle = true;
-var wgUserName = null;
-var wgUserLanguage = "en";
-var wgContentLanguage = "en";
-var wgBreakFrames = false;
-var wgCurRevisionId = "350";
-/*]]>*/</script>
-                
-		
-		
-		<style type="text/css">/*<![CDATA[*/
- at import "/advene/wiki/index.php?title=MediaWiki:Common.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
- at import "/advene/wiki/index.php?title=MediaWiki:Monobook.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
- at import "/advene/wiki/index.php?title=-&action=raw&gen=css&maxage=18000";
-/*]]>*/</style>
-		<!-- Head Scripts -->
-			</head>
-<body  class="mediawiki ns-0 ltr page-AdveneShortcuts">
-	<div id="globalWrapper">
-		<div id="column-content">
-	<div id="content">
-		<a name="top" id="top"></a>
-				<h1 class="firstHeading">AdveneShortcuts</h1>
-		<div id="bodyContent">
-
-			<div id="contentSub"></div>
-												<!-- start content -->
-			<!-- Bad Behavior 2.0.11 run time: 12.660 ms --><table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1"><a href="#Advene_shortcuts"><span class="tocnumber">1</span> <span class="toctext">Advene shortcuts</span></a>
-<ul>
-<li class="toclevel-2"><a href="#Generic_player_shortcuts"><span class="tocnumber">1.1</span> <span class="toctext">Generic player shortcuts</span></a></li>
-<li class="toclevel-2"><a href="#Main_GUI"><span class="tocnumber">1.2</span> <span class="toctext">Main GUI</span></a></li>
-<li class="toclevel-2"><a href="#Timeline"><span class="tocnumber">1.3</span> <span class="toctext">Timeline</span></a>
-<ul>
-<li class="toclevel-3"><a href="#Timeline_background"><span class="tocnumber">1.3.1</span> <span class="toctext">Timeline background</span></a></li>
-<li class="toclevel-3"><a href="#Annotation_widget"><span class="tocnumber">1.3.2</span> <span class="toctext">Annotation widget</span></a></li>
-<li class="toclevel-3"><a href="#Quick_edit_mode"><span class="tocnumber">1.3.3</span> <span class="toctext">Quick edit mode</span></a></li>
-<li class="toclevel-3"><a href="#Annotation-type_widget"><span class="tocnumber">1.3.4</span> <span class="toctext">Annotation-type widget</span></a></li>
-</ul>
-</li>
-<li class="toclevel-2"><a href="#Active_bookmarks"><span class="tocnumber">1.4</span> <span class="toctext">Active bookmarks</span></a></li>
-<li class="toclevel-2"><a href="#Note-taking"><span class="tocnumber">1.5</span> <span class="toctext">Note-taking</span></a></li>
-<li class="toclevel-2"><a href="#Element_Edition_popup"><span class="tocnumber">1.6</span> <span class="toctext">Element Edition popup</span></a>
-<ul>
-<li class="toclevel-3"><a href="#Text_and_generic_content_handler"><span class="tocnumber">1.6.1</span> <span class="toctext">Text and generic content handler</span></a></li>
-<li class="toclevel-3"><a href="#Fragment_value_edition"><span class="tocnumber">1.6.2</span> <span class="toctext">Fragment value edition</span></a></li>
-</ul>
-</li>
-<li class="toclevel-2"><a href="#Evaluator"><span class="tocnumber">1.7</span> <span class="toctext">Evaluator</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<a name="Advene_shortcuts"></a><h1> <span class="mw-headline"> Advene shortcuts </span></h1>
-<p>This wiki documents the shortcuts available in the most recent version of Advene (0.40).
-</p>
-<a name="Generic_player_shortcuts"></a><h2> <span class="mw-headline"> Generic player shortcuts </span></h2>
-<p>These shortcuts are available in most parts/views of the interface.
-</p>
-<ul><li> <b>Control+Tab</b> or Control-Space : play/pause the movie. <i>Note:</i> Using simply Space is a frequent request, but cannot be used here since Advene is about annotating videos. We need to be able to enter a space character, hence it cannot be used for control.
-</li><li> Control+right/left : go forward/backward in the movie by 2 s (customizable through Edit/Preferences/Time related)
-</li><li> Control+Shift-right/left : go forward/backward in the movie by 5 s (customizable through Edit/Preferences/Time related)
-</li><li> Control+down/up : go forward/backward in the movie by 1/25 s
-</li><li> Control+Shift-down/up : go forward/backward in the movie by 1ms (customizable through Edit/Preferences/Time related)
-</li><li> Control+Home : go to the beginning of the movie
-</li><li> Control+End : go to the end of the movie
-</li><li> Insert (Linux, Windows) or Alt-Space (Linux, Mac OS X): create a new bookmark
-</li><li> Insert + Shift or Alt-Space + Shift: create a new bookmark next to the current one
-</li><li> Numeric/symbolic keypad shortcuts:
-<ul><li> 0 or Insert: create a new bookmark
-</li><li> 5 or Begin: play/pause
-</li><li> 8/2 or Up/Down: go forward/backward in the movie by 1/25 s
-</li><li> 4/6 or Left/Right: go forward/backward in the movie by 2 s (5 s with Shift)
-</li><li> 7 or Home: go to the beginning of the movie
-</li><li> 1 or End: go to the end of the movie
-</li></ul>
-</li></ul>
-<a name="Main_GUI"></a><h2> <span class="mw-headline"> Main GUI </span></h2>
-<ul><li> Control-q : quit the application
-</li><li> Control-o : open a package
-</li><li> Control-s : save the package
-</li><li> Control-e : get the evaluator window (for advanced users)
-</li><li> Control-k : select the quicksearch entry
-</li><li> Control-a : open the EditAccumulator
-</li></ul>
-<a name="Timeline"></a><h2> <span class="mw-headline"> Timeline </span></h2>
-<a name="Timeline_background"></a><h3> <span class="mw-headline"> Timeline background </span></h3>
-<ul><li> p : play the movie at the cursor position
-</li><li> single-click in the snapshots zone: play at the cursor position
-</li><li> double-click in the background: play at the cursor position
-</li><li> c : center the timeline on the current player position
-</li></ul>
-<a name="Annotation_widget"></a><h3> <span class="mw-headline"> Annotation widget </span></h3>
-<ul><li> e or double-click : edit the annotation
-</li><li> a : adjust annotation begin time
-</li><li> A : adjust annotation end time
-</li><li> h : toggle highlight annotation (in all views)
-</li><li> Return : quickly edit the annotation (textual content only).
-</li><li> p : play the annotation (either at the beginning or the end, depending on the cursor position)
-</li><li> space : play the focused annotation (even if the cursor is not on the annotation widget)
-</li><li> control+click : set the annotation begin or end (depending on the cursor position) to the current movie time
-</li><li> control+scroll : update the annotation begin or end (depending on the cursor position) time. Holding Shift uses a larger increment
-</li><li> control+return : split the annotation at the current player position (if the position is in the annotation's bounds)
-</li><li> shift+delete : delete the annotation
-</li><li> Drag-and-drop of an annotation on another one: popup a menu to propose to create a relation, merge annotations or align bounds.
-</li></ul>
-<a name="Quick_edit_mode"></a><h3> <span class="mw-headline"> Quick edit mode </span></h3>
-<ul><li> Return: validate the new content
-</li><li> Escape: cancel the editing
-</li><li> Tab: validate the content and quick-edit the following annotation
-</li></ul>
-<a name="Annotation-type_widget"></a><h3> <span class="mw-headline"> Annotation-type widget </span></h3>
-<ul><li> e : edit the annotation-type
-</li><li> return : create a new annotation with the current position as begin time, edit it, and use the new current position value as end time when validating
-</li><li> space : restrict playing to annotations of the given annotation-type (toggle)
-</li></ul>
-<a name="Active_bookmarks"></a><h2> <span class="mw-headline"> Active bookmarks </span></h2>
-<ul><li> Shift+DND on a timestamp: move the timestamp
-</li><li> Control+DND on a timestamp : copy the timestamp
-</li><li> Control+D: duplicate a bookmark
-</li><li> See also the bookmark creation shortcuts (Insert/Alt-Space) in the <a href="#Generic_player_shortcuts" title="">#Generic_player_shortcuts</a>
-</li></ul>
-<a name="Note-taking"></a><h2> <span class="mw-headline"> Note-taking </span></h2>
-<ul><li> Control-s : save the transcription
-</li><li> Control-Return : insert a timestamp mark (if the movie is playing)
-</li><li> Control-Shift-Return : pause and insert a timestamp mark
-</li><li> Control-PageDown/PageUp : go to next/previous mark
-</li><li> Control-Scroll on a mark: update the mark timestamp. If the play-on-scroll option is set, the player will be set to the new position when the control key is released.
-</li><li> Control-Shift-Scroll: update the timestamp with a larger step (customizable through Edit/Preferences/Time related)
-</li><li> Control-Click in the text in single-click-insert mode : move cursor (instead of inserting a mark)
-</li></ul>
-<a name="Element_Edition_popup"></a><h2> <span class="mw-headline"> Element Edition popup </span></h2>
-<a name="Text_and_generic_content_handler"></a><h3> <span class="mw-headline"> Text and generic content handler </span></h3>
-<ul><li> Control-s : save the content
-</li><li> Control-o : get the content from a file
-</li><li> Control-r : reload the content (re-uses the filename used to save)
-</li><li> Control-i : insert a TALES expression or result from the package browser (text content only)
-</li></ul>
-<a name="Fragment_value_edition"></a><h3> <span class="mw-headline"> Fragment value edition </span></h3>
-<ul><li> Click on image: play the movie
-</li><li> Control+click on image: set the value to current time
-</li><li> Control+scroll on image: modify the value
-</li></ul>
-<a name="Evaluator"></a><h2> <span class="mw-headline"> Evaluator </span></h2>
-<ul><li> F1: display the help message
-</li><li> Control-w: close the window
-</li><li> Control-Return: evaluate the expression
-</li></ul>
-<ul><li> Control-l: clear the expression buffer
-</li><li> Control-S: save the expression buffer
-</li><li> Control-n: next item in history
-</li><li> Control-p: previous item in history
-</li></ul>
-<ul><li> Control-PageUp/PageDown: scroll the output window
-</li><li> Control-s: save the output
-</li></ul>
-<ul><li> Control-d: display completion possibilities
-</li><li> Tab: perform autocompletion
-</li><li> Control-h:   display docstring for element before cursor
-</li><li> Control-H:   display source for element before cursor
-</li></ul>
-
-<!-- Saved in parser cache with key advene-public_:pcache:idhash:6-0!1!0!!en!2 and timestamp 20100610133353 -->
-<div class="printfooter">
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8"></meta>
+    <meta name="viewport" content="width=device-width"></meta>
+    <title>Advene Shortcuts</title>
+  </head>
+
+  <body>
+    <pre>
+Advene shortcuts
+================
+
+This wiki documents the shortcuts available in the most recent version
+of Advene (3.3).
+
+Generic player shortcuts
+------------------------
+
+These shortcuts are available in most parts/views of the
+interface. The *Control* prefix can be changed to some other special
+key on the keyboard (Alt, Meta, Shift...) through `Edit/Preferences`.
+
+-   **Control+Tab** or Control-Space : play/pause the movie. *Note:*
+    Using simply Space is a frequent request, but cannot be used here
+    since Advene is about annotating videos. We need to be able to
+    enter a space character as annotation content, hence it cannot be
+    used for control.
+-   Control+right/left : go forward/backward in the movie by 2 s
+    (customizable through `Edit/Preferences/Time related`)
+-   Control+Shift-right/left : go forward/backward in the movie by 5 s
+    (customizable through `Edit/Preferences/Time related`)
+-   Control+down/up : go forward/backward in the movie by 1/25 s
+    (customizable through `Edit/Preferences/Time related`)
+-   Control+Shift-down/up : go forward/backward in the movie by 1ms
+    (customizable through `Edit/Preferences/Time related`)
+-   Control+Home : go to the beginning of the movie
+-   Control+End : go to the end of the movie
+-   Insert (Linux, Windows) or Alt-Space (Linux, Mac OS X): create a new
+    bookmark
+-   Insert + Shift or Alt-Space + Shift: create a new bookmark next to
+    the current one
+-   Numeric/symbolic keypad shortcuts:
+    -   0 or Insert: create a new bookmark
+    -   5 or Begin: play/pause
+    -   8/2 or Up/Down: go forward/backward in the movie by 1/25 s
+    -   4/6 or Left/Right: go forward/backward in the movie by 2 s (5 s
+        with Shift)
+    -   7 or Home: go to the beginning of the movie
+    -   1 or End: go to the end of the movie
+
+Fullscreen shortcuts
+--------------------
+
+In addition to the generic player shortcuts, additional shorcuts are
+available in fullscreen mode.
+
+-   **Tab** or Space : play/pause the movie (no *Control* is needed if
+    we are not entering text yet).
+-   right/left : go forward/backward in the movie by 2 s (customizable
+    through Edit/Preferences/Time related)
+-   shift-right/left : go forward/backward in the movie by 5 s
+    (customizable through Edit/Preferences/Time related)
+-   up/down : go forward/backward in the movie by 1/25 s (optionally
+    customizable)
+-   Shift-down/up : go forward/backward in the movie by 1ms
+    (customizable through Edit/Preferences/Time related)
+-   Home : go to the beginning of the movie
+-   End : go to the end of the movie
+-   1 to 0 keys (top row of the keyboard) display the *n* 10th of the
+    movie, i.e. 1 displays the first 10% (goes to the beginning), 2
+    displays the second 10%, etc. As a convenience for french users
+    (AZERTY keyboard), the Shift key does not have to be pressed to get
+    the behaviour, simply press the key with the number on it.
+
+Main GUI
+--------
+
+-   Control-q : quit the application
+-   Control-s : save the package
+-   Control-k : select the quicksearch entry
+-   Control-a : open the EditAccumulator
+-   Control-e : get the evaluator window (for advanced users)
+
+Timeline
+--------
+
+### Timeline background
+
+-   `p` : play the movie at the cursor position
+-   single-click in the snapshots zone/timescale: play at the cursor
+    position
+-   double-click in the background: play at the cursor position
+-   single-click in the background: unlock the inspector if it was
+    locked
+-   `c` : center the timeline on the current player position
+-   draw a rectangle on the background: if the area covers at least one
+    annotation, select covered annotations. Else, propose to either
+    create an annotation or to zoom on the selected area.
+
+### Annotation widget
+
+-   simple click: player the annotation and lock the inspector on this
+    annotation
+-   `e` or double-click : edit the annotation
+-   `a` : adjust annotation begin time
+-   `A` : adjust annotation end time
+-   `h` : toggle highlight annotation (in all views)
+-   `Return` : quickly edit the annotation (textual content only).
+-   `p` : play the annotation (either at the beginning or the end,
+    depending on the cursor position)
+-   `space` : play the focused annotation (even if the cursor is not
+    on the annotation widget)
+-   control+click : set the annotation begin or end (depending on the
+    cursor position) to the current movie time
+-   control+scroll : update the annotation begin or end (depending on
+    the cursor position) time. Holding Shift uses a larger increment
+-   control+return : split the annotation at the current player position
+    (if the position is in the annotation's bounds)
+-   `Delete` or `Backspace` : delete the annotation
+-   Drag-and-drop of an annotation on another one: popup a menu to
+    propose to create a relation, merge annotations or align bounds.
+
+### Quick edit mode
+
+Quick-edit mode is obtained in the timeline by pressing Enter while the
+mouse pointer is over an annotation. It allows to edit the annotation
+content through a small text entry with the following shortcuts:
+
+-   `Return`: validate the new content
+-   `Escape`: cancel the editing
+-   `Tab`: validate the content and quick-edit the following annotation
+
+### Annotation-type widget
+
+-   `e` : edit the annotation-type
+-   `a` : display the Shot validation interface
+-   `Return` : create a new annotation with the current position as begin
+    time, edit it, and use the new current position value as end time
+    when validating
+-   `Space` : restrict playing to annotations of the given annotation-type
+    (toggle)
+
+Active bookmarks
+----------------
+
+-   Shift+DND on a timestamp: move the timestamp
+-   Control+DND on a timestamp : copy the timestamp
+-   Control+D: duplicate a bookmark
+-   See also the bookmark creation shortcuts (Insert/Alt-Space) in the
+    [\#Generic\_player\_shortcuts](#Generic_player_shortcuts "wikilink")
+
+Note-taking
+-----------
+
+-   `Control-Return` : insert a timestamp mark (if the movie is playing)
+-   `Control-Shift-Return` : pause and insert a timestamp mark
+-   `Control-PageDown/PageUp` : go to next/previous mark
+-   Control-Scroll on a mark: update the mark timestamp. If the
+    play-on-scroll option is set, the player will be set to the new
+    position when the control key is released.
+-   Control-Shift-Scroll: update the timestamp with a larger step
+    (customizable through Edit/Preferences/Time related)
+-   Control-Click in the text in single-click-insert mode : move cursor
+    (instead of inserting a mark)
+-   `Control-C`: convert transcription into annotations
+
+Table view
+----------
+
+- `Return` edits the content of the annotation
+- `Control-<`/`Control->` modifies begin/end time
+- `Space` or `Control-Return` plays the selected annotation
+
+Element Edition popup
+---------------------
+
+### Text and generic content handler
+
+-   `Control-s` : save the content
+-   `Control-o` : get the content from a file
+-   `Control-r` : reload the content (re-uses the filename used to save)
+-   `Control-i` : insert a TALES expression or result from the package
+    browser (text content only)
+
+### Timecode edit widget
+
+-   Click on image: play the movie
+-   Control+click on image: set the value to current player time
+-   Control+scroll on image: modify the value
+-   Right click: display a popup menu, which offers to save the
+    screenshot, adjust the timestamp through the frame selector or use
+    the current player time.
+
+Evaluator
+---------
+
+For advanced users, a python shell is available to directly access the
+internal API. Feel free to tinker with it but there are no safeguards.
+
+-   F1: display the help message
+-   Control-w: close the window
+-   Control-Return: evaluate the expression
+-   Control-l: clear the expression buffer
+-   Control-S: save the expression buffer
+-   Control-n: next item in history
+-   Control-p: previous item in history
+-   Control-PageUp/PageDown: scroll the output window
+-   Control-s: save the output
+-   Control-d: display completion possibilities
+-   Tab: perform autocompletion
+-   Control-h: display docstring for element before cursor
+-   Control-H: display source for element before cursor
+    </pre>
+  </body>
+</html>
diff --git a/share/web/user.html b/share/web/user.html
index f416689..3cdca57 100644
--- a/share/web/user.html
+++ b/share/web/user.html
@@ -5,7 +5,7 @@
 </head><body bgcolor="white">
 
 <h1>Advene user guide</h1>
-<p>The <a href="http://liris.cnrs.fr/advene/wiki/index.php/Main_Page">Advene user guide</a> is only available online at
-  the URL <a href="http://liris.cnrs.fr/advene/wiki/index.php/Main_Page">http://liris.cnrs.fr/advene/wiki/index.php/Main_Page</a>
+<p>The <a href="http://advene.org/wiki/">Advene user guide</a> is only available online at
+  the URL <a href="http://advene.org/wiki/">http://advene.org/wiki/</a>
 </p>
 </body></html>

-- 
advene packaging



More information about the pkg-multimedia-commits mailing list